Microsoft Dynamics C5 Version 2012 ® Programmering III Copyright © 2011 Microsoft. C5 er et varemærke, der tilhører Microsoft. Produkter og firmaer nævnt i dette dokument er varemærker, der tilhører deres respektive ejere. Indholdet i dette dokument må på ingen måde gengives - helt eller delvist hverken på tryk eller i anden form uden forudgående tilladelse fra Microsoft. Indholdet i dette dokument kan ændres uden varsel. Der tages forbehold for tryk- og stavefejl. Microsoft Development Center Copenhagen, Frydenlunds Allé 6, DK-2950 Vedbæk, Danmark Tlf.: +45 4567 8000, www.microsoft.dk/C5 Indholdsfortegnelse Indledning ................................................................................................................................................................. 7 1. Repetition af forms ........................................................................................ 8 Formens opbygning .............................................................................................................................................. 8 Formens vindue ....................................................................................................................................................... 9 Blokke i formen .....................................................................................................................................................10 Opsætning af blokke ...........................................................................................................................................11 Felter i blokke .........................................................................................................................................................12 Macroer til styring og synkronisering af poster i forms ........................................................................15 Triggere ....................................................................................................................................................................16 Eksempel - Form med to blokke ....................................................................................................................17 Eksempel - Form med én blok kaldt fra anden form .............................................................................18 Eksempel - Form med to blokke kaldt fra anden form .........................................................................19 Eksempel - Virtuelle felter styret fra blokke og kartoteksfelter .........................................................20 Feltgrupper ..............................................................................................................................................................21 Opgaver ....................................................................................................................................................................23 2. Macroen #Frm_BLKBAR ............................................................................... 27 Anvendelse af #Frm_BLKBAR ...........................................................................................................................27 Visning af cursorens vej gennem flere blokke ..........................................................................................28 Opgaver ....................................................................................................................................................................29 3. Labels ............................................................................................................. 30 Filerne i labelsystemet ........................................................................................................................................30 Label editoren ........................................................................................................................................................32 Label funktioner ....................................................................................................................................................35 Hotkeys .....................................................................................................................................................................36 Indføring af labels i partner- eller brugerelementer. ..............................................................................36 Opgaver ....................................................................................................................................................................38 4. Database definition (DBD).......................................................................... 39 DBD/Opret ...............................................................................................................................................................40 DBD/Ret ....................................................................................................................................................................41 DBD/List ....................................................................................................................................................................48 DBD/Oversæt .........................................................................................................................................................48 DBD/Udskriv ...........................................................................................................................................................48 2 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale DBD/Export .............................................................................................................................................................49 DBD/Import .............................................................................................................................................................49 DBD/Diverse ...........................................................................................................................................................50 5. Behandling af data (Data) .......................................................................... 51 DATA/Opret ............................................................................................................................................................52 DATA/Ret (Datamanipulation) .........................................................................................................................52 DATA/Udskriv (Rapportgenerator) ................................................................................................................52 DATA/Export ...........................................................................................................................................................53 DATA/Import ..........................................................................................................................................................53 Data/Diverse ...........................................................................................................................................................54 Vedligeholdelse af applikationsfiler ..............................................................................................................56 6. Temporære kartoteker ................................................................................. 57 Generelt om temporære kartoteker ..............................................................................................................57 Macrobiblioteket TMP_File ...............................................................................................................................58 Fordele og ulemper ved TMP kartoteker ....................................................................................................58 Opgaver ....................................................................................................................................................................60 7. Temporære index ......................................................................................... 61 Opbygning af temporære index .....................................................................................................................61 GetTempId ...............................................................................................................................................................62 CREIDX ......................................................................................................................................................................62 GENIDX .....................................................................................................................................................................63 ADDIDX .....................................................................................................................................................................64 DELIDX ......................................................................................................................................................................64 CheckCREIDX ..........................................................................................................................................................65 Triggere ....................................................................................................................................................................65 Eksempel på form med to blokke ..................................................................................................................68 Opgaver ....................................................................................................................................................................70 8. XAL Systemsammenhænge ......................................................................... 72 Datadictionary ........................................................................................................................................................72 Databaserelationer ...............................................................................................................................................73 Versionskontrollen ...............................................................................................................................................73 Funktioner under versionskontrollen ............................................................................................................76 Sammenhænge .....................................................................................................................................................77 Opgaver ....................................................................................................................................................................79 3 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 9. Gennemgang af Bilag Scope ....................................................................... 80 SEARCH .....................................................................................................................................................................80 Extern .........................................................................................................................................................................80 IF 1 THEN .................................................................................................................................................................81 INTRODUCE ............................................................................................................................................................84 Scope i forbindelse med en form ...................................................................................................................84 Variabel erklæring ................................................................................................................................................84 10. Dobbelte direkte opslag .............................................................................. 85 Enkelt opslag ..........................................................................................................................................................85 Dobbelte direkte opslag ....................................................................................................................................87 11. Kartoteket Notes .......................................................................................... 88 Felter i kartoteket Notes ....................................................................................................................................88 Sammenhæng mellem oprettet notat og Kartoteket Notes ...............................................................89 Index på kartoteket Notes ................................................................................................................................89 Eksport og import af notater ...........................................................................................................................89 Import........................................................................................................................................................................91 Notater i Forms......................................................................................................................................................92 Notater i rapporter ...............................................................................................................................................95 Udledning af notater i Rapport-XAL .............................................................................................................95 Udledning af notater i Rapport-QT ...............................................................................................................96 Udledning af notater med #OutPutNotes ..................................................................................................97 12. Prompt macroer............................................................................................ 99 Gennemgang af prompt macroerne .............................................................................................................99 Dialogboks med ledetekster og indtastningsfelter .............................................................................. 101 13. Parameters kartoteket ...............................................................................102 Opbygningen af parametre kartoteket ..................................................................................................... 102 Macroerne ParameterSave og ParameterGet ......................................................................................... 102 Macrobiblioteket Parameters........................................................................................................................ 103 14. Funktioner ...................................................................................................104 Oprettelse af funktion ...................................................................................................................................... 104 Kald af funktion .................................................................................................................................................. 106 Opgaver ................................................................................................................................................................. 107 15. Pick funktionerne .......................................................................................108 16. KeyQueue ....................................................................................................110 4 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgaver ................................................................................................................................................................. 112 17. Funktionen Directory .................................................................................115 Parametre ............................................................................................................................................................. 116 Eksempler.............................................................................................................................................................. 117 18. Kodning af listbilleder ...............................................................................119 Listbilleder generelt .......................................................................................................................................... 119 Oprettelse af listbilleder .................................................................................................................................. 119 Kald fra udviklingsmenuen ............................................................................................................................ 121 Kald via referencer på kartoteksfelter ........................................................................................................ 121 Kald af listbilleder med parametre uden reference ............................................................................. 123 GetField, SearchField, Mode=Select og PutField. ................................................................................. 124 Macroen #ParmTable ....................................................................................................................................... 124 Listbillede-kalds-generator ............................................................................................................................ 124 Opgaver ................................................................................................................................................................. 125 19. TTS – Transaction Tracking System .........................................................126 Databasen ............................................................................................................................................................. 126 Metatransaktioner ............................................................................................................................................. 126 TTSBEGIN .............................................................................................................................................................. 127 TTSCOMMIT ......................................................................................................................................................... 128 TTSABORT ............................................................................................................................................................. 129 Eksempel på metatransaktion ...................................................................................................................... 129 20. Macroer ........................................................................................................131 Opbygning af en macro .................................................................................................................................. 131 Gennemgang af macroer ................................................................................................................................ 133 Indirektioner ........................................................................................................................................................ 134 21. Løkker og betingelsesstrukturer ...............................................................136 Betinget algebra ................................................................................................................................................. 136 Kommandoen ”For” .......................................................................................................................................... 137 #Switch / #Case Macroen .............................................................................................................................. 138 Opgaver ................................................................................................................................................................. 140 22. Forms triggere ............................................................................................141 Event triggeren ................................................................................................................................................... 141 Refresh triggeren ............................................................................................................................................... 142 Lookup triggeren ............................................................................................................................................... 143 5 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgaver ................................................................................................................................................................. 144 23. Globalisering ..............................................................................................145 Parameter overførsel ........................................................................................................................................ 145 Overførte værdier .............................................................................................................................................. 147 &Parm .................................................................................................................................................................... 148 Globalisering ........................................................................................................................................................ 149 Ubegrænset og begrænset globalisering ................................................................................................ 149 Globalisering af XAL kørsler, QT’er og rapporter .................................................................................. 153 #Frm_Find ............................................................................................................................................................. 155 #Frm_Mode .......................................................................................................................................................... 156 Defaultværdier .................................................................................................................................................... 157 24. COMAPI .......................................................................................................159 Handle .................................................................................................................................................................... 159 COMAPI kald ....................................................................................................................................................... 160 Kald til ekstern funktion .................................................................................................................................. 161 Eksempel på brugen af COMAPI ................................................................................................................. 163 Opgaver ................................................................................................................................................................. 165 25. Appendix – Genvejstaster ..........................................................................166 Værktøjslinjen ..................................................................................................................................................... 166 Generelle genvejstaster ................................................................................................................................... 166 Navigation i C5 ................................................................................................................................................... 167 Vedligeholdelse af stamdata ......................................................................................................................... 167 Søgning og filtrering af poster ..................................................................................................................... 168 Øvrige genvejstaster ......................................................................................................................................... 168 6 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Indledning Velkommen til kurset Microsoft Dynamics C5 Programmering III. Kurset er berammet til 4 dage. Kursusmaterialet er udarbejdet til version 2012. Målgruppe Kurset henvender sig til konsulenter der skal arbejde med komplekse programmeringsopgaver. Forudsætninger Deltagelse på kurserne C5 Supervisor, C5 Programmering I og C5 Programmering II. Endvidere forventes en vis fortrolighed med almindelige programmeringsopgaver i C5. Formål På kurset gennemgås følgende emner: Repetition af forms Macroen #Frm_BLKBAR Labels Database definition Behandling af data Temporære kartoteker Temporære index XAL System sammenhænge Gennemgang af Bilag Scope Dobbelt direkte opslag Kartoteket Notes Prompt macroer Parameter kartoteket Pick funktionerne KeyQueue Funktionen Directory Kodning af listbilleder TTS – Transaction Tracking System Macroer Funktioner Løkker og betingelsesstrukturer Forms triggere Globalisering COMAPI Beskrivelse af materialet Materialet er opbygget i uafhængige lektioner, der hver behandler et emne eller funktion i C5. Det skal pointeres, at materialet ikke er beregnet til selvstudium, men som supplement til instruktørens gennemgang og til at genopfriske funktionerne efter endt kursus. 7 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 1. Repetition af forms Formål Formålet med denne lektion er at repetere opbygningen af forms. Emnerne der repeteres er formens vindue, blokke og felter samt kontrol macroer til styring forms. Desuden behandles synkronisering mellem forskellige forms, synkronisering mellem blokke i samme form samt indførelsen af feltgrupper. Emner Oprettelse af forms med flere blokke Styring og synkronisering af poster i forms med kontrol macroer Opsætning af feltgrupper. Formens opbygning En form består af ét vindue, en eller flere blokke i form af enkelt eller multi record blokke og felter i form af kartoteksfelter eller virtuelle felter. Enkelt record blok Formens Vindue Felter: Multi record blok (Kan være fra kartotek eller virtuelle) 8 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Formens vindue Opsætning Formens vindue er altid det første der opsættes. I opsætningsvinduet beskrives formen ved udfyldelse af nogle felter. De vigtigste fremgår af nedenstående skema. Felt Betydning Søgenavn i liste Navn der kendetegner formen fremover, og som der søges på i processer og menuer. Tekst i rammen Tekst der vises i vinduets ramme under afvikling. Vinduets højde / bredde Vinduets højde i antal Linjer og bredde i antal kolonner. Felterne indeholder defaultværdier, der evt. kan ændres efter behov. Farvesæt Standard anvendes altid farvesæt 2. Vindue Angivelse af hvorledes vinduet skal vises på skærmen. Fast Den angivne vinduesstørrelse benyttes. (default) Vinduet kan kun skaleres ned. Felter flyttes ikke. Skalerbart Den angivne vinduesstørrelse benyttes. Vinduet kan skaleres både op og ned. Felter flyttes automatisk ved autogenererede multi record blokke, men ikke ved enkelt record blokke. Dynamisk Fylder hele skærmbilledet som default uanset angivet vinduesstørrelse. Virker ellers som skalerbart. Lukket Lukker af for aktivering af form (trigger kode kan dog fortsat afvikles) Nedarvet Arbejder skjult i det øjeblikkelige vindue. Dette benyttes ikke standard i applikationen Forms formler Triggere i form af XAL editorbokse. Anvendes til indtastning af XAL kode til styring af forms og deres poster. 9 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Blokke i formen Blokke i forms opsættes enten som enkelt eller multi record blokke. Blokkenes fysiske udseende Blokkenes fysiske udseende adskiller sig ved, at enkelt record blokke kun indeholder enkeltstående felter og kun indeholder én post ad gangen. Multi record blokke består af felter, der viser mere end en record ad gangen. Felterne har en vis sammenhæng, idet hver post der vises går på tværs af felterne. Eksempel på enkelt record blok fra tidligere kursus Udlånskartotek UdlånsNr..: DebitorKto....: UdlånsType: KontaktPerson.: UdlånsDato: ReturDato: ForsikringsSum: Eksempel på multi record blok fra tidligere kursus Udlånslinjer Udlånsnr Varenr Serienr Status Varenavn DebitorKto 10 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opsætning af blokke Opsætning af blokke udføres i vinduet ’Opsætning for blok’. I vinduet udfyldes nogle felter til beskrivelse af blokken. De vigtigste felter fremgår af nedenstående skema. Felter i opsætning af blokke Felt Betydning Blok navn Navn til identifikation af blokken. Bemærk! Det er det navn kartoteket kaldes i forbindelse med de specielle forms kontrol kommandoer. Det er en god idé at give blokken samme navn, som det kartotek der tilknyttes. Kartotek Navn på kartotek der skal tilknyttes blokken, når den skal anvendes til visning og indtastning af data i kartoteket. Autogenerér blok En autogenereret blok er det samme som en multi record blok. (Forskellen på en enkelt og en multi record blok ligger i besvarelsen af dette felt.) NEJ = Blokken autogenereres ikke (enkelt record blok). Felterne skal placeres manuelt i blokken JA = Blokken autogenereres (multi record blok). Felterne placeres automatisk i blokken, hvor der er plads til det. Felterne placeres desuden i kolonner, der kan vise mange records på én gang. 11 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Felter i blokke Felter i blokke kan enten være i form af kartoteksfelter, virtuelle felter eller trykknap felter. Alle felttyperne oprettes på blokken med funktionen ’Opret felt’ der startes med <F2>. Kartoteksfelter Kartoteksfelter oprettes ved at hente felterne fra en liste over felter i det kartotek, der er tilknyttet den aktuelle blok. Virtuelle felter og trykknap felter Virtuelle felter og trykknap felter oprettes ved at indtaste navnet på feltet, i stedet for at finde det i listen over kartoteksfelter. Virtuelle felter og trykknap felter fungerer i forms, som om det er variabler, og de foranstilles automatisk med & tegnet. Forskellen på en ’rigtig’ variabel og et virtuelt felt er at en ’rigtig’ variabel altid skal erklæres i INIT triggeren. Det skal et virtuelt felt ikke. Placering af felter i blokke Der er forskel på hvordan felter placeres i blokke. Enkelt record blokke I enkelt record blokke placeres felterne manuelt på skærmen. Cursoren placeres der hvor selve feltet skal være, og ikke der hvor ledeteksten starter. Multi record blokke I multi record blokke placeres felterne automatisk som kolonner ved siden af hinanden. Er der ikke plads til, at placere alle felter i kolonner, indsættes de resterende felter i bunden af blokken som enkeltstående felter. Opsætning af felter I vinduet ’Opsætning af felt’ på de enkelte felter, kan disse justeres på forskellig vis afhængig af deres felttype. Opsætningen udføres, når der oprettes nye felter med <F2> og når der rettes i felter med <F6>. Nedenstående skema indeholder en samlet oversigt over alle justeringsmuligheder. De første seks kolonner viser ved hjælp af et bogstav, hvilke felttyper der kan justeres på de enkelte Linjer. Bogstaverne er som flg.: H=Heltal, K=Kommatal, T=Tekst, D=Dato, F=Fasttekst, X=Trykknap 12 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Mulige justeringer på felter i forms Felttype Felt i opsætning Muligheder Feltnavn Navn på felt (kan ikke ændres) H K T D F H K T D F X Feltets bredde Antal tegn H K T D F X Feltets justering Venstrestillet, Højrestillet, Centreret F Store bogstaver Nej eller Ja Rette i feltets indhold Nej eller Ja T H K T D F H K T D F X Hvor mange Linjer vises Alle Linjer eller én Linje H K T D F X Skal feltet autoplaceres Nej eller Ja H K T D F X Vis automatisk ledetekst Nej eller Ja H K T D F Autohop til næste felt Nej eller Ja H K T D F Kopier felt Nej eller Ja H K T D F Skal feltet vises Nej eller Ja H K T D F X Ledetekst Evt. ny ledetekst (hvis blank bruges databasens) Ved trykknap er dette variablens startværdi H K T D F X Må feltet brugeropsættes Nej eller Ja H K T D F Spring feltet over Nej eller Ja H K T D F Søgning efter input Nej eller Ja H K T D F Formler på feltet Enter og der åbnes for triggere D Rækkefølge (DMÅ) DMÅ (Dag, Måned, ÅR) D 2 separatorer / - , mellemrum # D År skrives som Skrives ej, 2 cifre, 4 cifre D Måned skrives som Skrives ej, 1/ 2 cifre, altid 2, fuldt navn, 3 bogstaver D Dag skrives som Skrives ej, 1 eller 2 cifre, altid 2 cifre H K Hvordan vises minus Ej fortegn, -NNNN,DD, NNNN,DD-, (NNNN,DD) H K Vend fortegn Nej eller JA H K Vis tallet 0 (nul) Nej eller Ja H K Negativ forskydning Antal tegn K 1000 separator Ingen, Komma, Punktum, Mellemrum K Decimal tegn Komma (,) eller Punktum (.) K Antal decimaler Antal 13 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Felttype Felt i opsætning Muligheder Automatisk dec. Tegn Nej eller Ja X Skygge Nej eller Ja X Start/sluttegn i ender Nej eller Ja X Tænd/sluk knap Nej eller Ja (indeholder 0 for slukket 1 for tændt) X Farve for inaktiv Farvens tal (vises når feltet er inaktivt med SKIP) K H=Heltal, K=Kommatal, T=Tekst, D=Dato, F=Fasttekst, X=Trykknap 14 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Macroer til styring og synkronisering af poster i forms Styring af poster i forms udføres med forskellige specielle control macroer, der har hver sin funktion. De control macroer der blev behandlet på de tidligere kurser fremgår også af nedenstående skema. Macroer til styring af poster i forms (fra tidligere kurser) Kontrol macro Anvendelse #MacroLoad(FORMS) Åbner for macroerne i biblioteket FORMS #FormError Udskriver fejlmeddelelser #Frm_Index(Blok,Index,X) Angiver index til styring af posterne i formen #Frm_Search(Bloknavn) Slår op på første post iflg. angivne index #Frm_SearchTop(Bloknavn) Slår op på første post iflg. angivne index #Frm_SearchEnd(Bloknavn) Slår op på sidste post iflg. angivne index Kommandoer der også anvendes til styring af poster i forms Kommando Anvendelse EXTERN buffer Åbner for buffer til et andet kartotek, hvorfra nuværende form f.eks. er startet fra lokalmenu SET Anvendes til tildeling af værdier fra buffer eller blok til anden blok Ovenstående macroer indsættes i forskellige triggere i formens vindue, blokke eller felter afhængigt af hvilken styring der skal opnås. 15 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Triggere Triggere i vinduet Kommando Anvendelse Init Aktiveres når en form startes. Anvendes f.eks. til macroload af biblioteker, og erklæring af variabler der skal benyttes i andre triggere i formen Error Viser fejlmeddelelser i et vindue på skærmen Pre-form Aktiveres efter Init triggeren. Anvendes til styring af poster i den første blok, også hvis der kun er en blok. Hvis formen kaldes fra en anden form anvendes triggeren også til at åbne for den anden forms buffer, og værdier tildeles den første blok. Triggere i blokke Kommando Anvendelse Pre-Record Anvendes til styring af poster i den næste blok. Init-Record Aktiveres ved oprettelse af nye poster. Anvendes ofte til tildeling af værdier til nøglefelter i blokken selv. Eksempel - Form med én blok Efterfølgende vises forskellige eksempler på styring af forms. Triggere i vindue Trigger XAL kode Kommentar Init #Macroload(FORMS) Åbner biblioteket FORMS Error #FormError Udskriver fejlmeddelelser Pre-form #Frm_Index(Blok,Index) Index til sortering i blok #Frm_Search(Blok) Første post i index i blok 16 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel - Form med to blokke Triggere i vindue Trigger XAL kode Kommentar Init #Macroload(FORMS) Åbner biblioteket FORMS Error #FormError Udskriver fejlmeddelelser Pre-form #Frm_Index(Blok1,Index) Index til sortering i blok1 #Frm_Search(Blok1) Første post i index i blok1 Triggere i blok1 (styrer hvad der skal ske i blok2) Trigger XAL kode Kommentar Pre-record SET Blok2.Nøglefelt = Blok1.Nøglefelt Tildeling af værdier til record i blok2 fra record i blok1. (Gentages ved flere tildelinger) Feltet skal indgå som første komponent i indekset herunder #Frm_Index(Blok2,Index,X) Index til sortering i blok2 ’X’ angiver hvor mange felter i indekset, der kendes. Dvs. er tildelt værdier inden denne macro. Første post i index i blok2 #Frm_Search(Blok2) Triggere i underblok Trigger XAL kode Kommentar Initrecord SET Blok2.Nøglefelt = Blok1.Nøglefelt Tildeling af værdier til record i blok2 fra record i blok1. i blok2 (Gentages ved flere tildelinger) Som regel alle felter der indgår i indeksene, men kan også være andre startværdier der skal tildeles felter i recorden 17 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel - Form med én blok kaldt fra anden form Triggere i vindue Trigger XAL kode Kommentar Init #Macroload(FORMS) Åbner biblioteket FORMS Error #FormError Udskriver fejlmeddelelser Pre-form EXTERN Buffer Åbner buffer fra anden form SET Blok.Nøglefelt = Buffer.Nøglefelt Tildeler værdier til blokkens record fra bufferens record. Feltet skal indgå som første komponent i indekset #Frm_Index(Blok,Index,X) Index til sortering i blok ’X’ angiver hvor mange felter i indekset, der kendes. Dvs. tildelte værdier inden denne macro. #Frm_Search(Blok) Første af udvalgte poster i blokken iflg. ’X’ i givne index. Triggere i blok Trigger XAL kode Kommentar Initrecord EXTERN Buffer Åbner for adgang til for data fra den record der var åben ved kaldet af denne form. SET Blok.Nøglefelt = Buffer.Nøglefelt Tildeling af værdier til blokkens record fra ekstern record. Feltet skal indgå som første komponent i indekset 18 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel - Form med to blokke kaldt fra anden form Triggere i vindue Trigger XAL kode Kommentar Init #Macroload(FORMS) Åbner biblioteket FORMS Error #FormError Udskriver fejlmeddelelser Pre-form EXTERN Buffer Åbner buffer fra anden form SET Blok1.Nøglefelt = Buffer.Nøglefelt Tildeling af værdier til blok1 #Frm_Index(Blok1,Index,X) Index til sortering i blok1 Skal være første del af indekset ’X’ angiver antal kendte felter Første af udvalgte poster i blok1 iflg. ’X’ i givne index. #Frm_Search(Blok1) Triggere i blok1 Trigger XAL kode Kommentar Prerecord SET Blok2.Nøglefelt = Blok1.Nøglefelt Tildeling af værdier til record i blok2 fra record i blok1. (Gentages ved flere tildelinger) Feltet skal indgå som første komponent i indekset herunder #Frm_Index(Blok2,Index,X) Index til sortering i blok2 ’X’ angiver kendte felter der er tildelt værdier inden macroen. Initrecord #Frm_Search(Blok2) Første post i index i blok2 EXTERN Buffer Åbner for adgang til for data fra den record der var åben ved kaldet af denne form. SET Blok.Nøglefelt = Buffer.Nøglefelt Tildeling af værdier til blokkens record fra ekstern record. Feltet skal indgå som første komponent i indekset 19 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Triggere i underblok Trigger XAL kode Kommentar Init-record SET Blok2.Nøglefelt = Blok1.Nøglefelt Tildeling af værdier til record i blok2 fra record i blok1. i blok2 (Gentages ved flere tildelinger) Som regel alle felter der indgår i indeksene, men kan også være andre startværdier der skal tildeles felter i recorden Eksempel - Virtuelle felter styret fra blokke og kartoteksfelter Triggere på blok Trigger XAL kode Kommentar Post-load SET &VirtueltFelt = Ny værdi Tildeling af værdi til virtuelt felt. Post-load udføres hver gang en post vises på skærmen Triggere på felt (på det felt der styrer det virtuelle felt) Trigger XAL kode Kommentar Post-change SET &VirtueltFelt = Ny værdi Tildeling af værdi til virtuelt felt på grundlag af ændringer i styrefelt. Styrefelt kan f.eks. være feltet ItemNumber der er afgørende for værdien i et virtuelt felt med varenavn. Post-change udføres hver gang der ændres i feltet. 20 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Feltgrupper Det er muligt at gruppere felter efter deres funktion og samle dem under en overskrift. For eksempel kan alle felter med relation til moms samles under overskriften ’Moms’. Gruppering af felter gør de enkelte forms mere overskuelige, og derfor nemmere at arbejde med for brugeren. Forudsætninger Bemærk at denne funktionalitet kun virker under følgende forudsætninger: Blokken autogenereres (feltet Autogenerer blok under Opsætning for blok er sat til Ja) Felter er sat op til at vises i kolonner (Feltet Placer i kolonner under Auto options i formen Opsætning for blok er sat til Ja) Linjer pr. post er sat til 1 Maks. poster er sat til 1 Sådan forbindes et felt til en feltgruppe Når du har oprettet alle de feltgrupper du ønsker, kan du forbinde de enkelte felter til grupperne. Dette gøres således: Tast Ctrl+G for at åbne listen over feltgrupper Vælg den feltgruppe hvorunder du ønsker at gruppere felter. Tast Enter. Dialog boksen Feltgruppe fremkommer Flyt markøren til feltet (knappen) Felter tilknyttet gruppen og tryk Enter. Dialogboksen Tilknyttede felter fremkommer Tast Insert for at tilknytte flere felter til feltgruppen. Listen Vælg felt vises med en oversigt over felter, der endnu ikke er tilknyttet en feltgruppe Flyt markøren til et felt du ønsker at tilknytte til den aktuelle feltgruppe og tast Enter. Gentag denne procedure for alle felter som ønskes tilknyttet den aktuelle feltgruppe Tast ESC for at afslutte. (Når du vælger det sidste felt fra listen lukkes listen automatisk, og det er ikke nødvendigt at taste ESC) Tast F3 for at godkende Sådan fjernes en feltgruppe Tast Ctrl+G Vælg den feltgruppe du ønsker at slette Tast Delete Bemærk! Når du sletter en feltgruppe vil alle tilknytninger mellem feltgruppen og felter også slettes. Felterne bliver "frie" og kan eventuelt tilknyttes en anden feltgruppe. 21 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Sådan fjernes et felt fra en feltgruppe Hvis du ønsker at slette et felt fra en feltgruppe, gøres det sådan: Tast Ctrl+G Vælg feltgruppe og tast Enter Flyt markøren til feltet Felter tilknyttet gruppen og tast Enter Flyt markøren til det tilknyttede felt og tast Delete Gentag punkt 3 og 4 hvis du ønsker at slette tilknytningen for flere felter Bemærk! Felterne på formen placeres i henhold til deres sekvensnummer, og bliver ikke automatisk ordnet under den feltgruppe de tilhører. For at samle felterne under en overskrift, skal alle felter tilknyttet den samme feltgruppe have fortløbende numre. Eksempel Felterne med sekvensnummer 1, 2, 5 og 6 er tilknyttet feltgruppen ’Generelt’. Felterne 3, 4, 7 og 8 er tilknyttet feltgruppen ’Opsætning’. På formen vil du se overskriften Generelt med felt 1 og 2 nedenunder. Derefter kommer overskriften Opsætning med felterne 3 og 4. Derefter kommer igen overskriften Generelt med felterne 5 og 6 og så videre. For at samle alle felter under hhv. feltgruppen Generelt og Opsætning skal du ændre sekvensnumrene så de bliver fortløbende. Det vil sige 1, 2, 3, 4 for felterne under Generelt og 5, 6, 7, 8 for felter under Opsætning osv. 22 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgaver Opgave 1: Multiimport Formål med opgaven At udføre en multi import af kartoteker, XAL kørsler, forms og rapporter Beskrivelse Der skal udføres en multiimport af kartoteker, XAL kørsler, forms og rapporter fra et tidligere kursus. Filen med elementerne fås hos underviseren. Indhold i filen (Ikke alt skal importeres): DBDUDLUdlånsKart UDLUdlånsPost UDLUdlånsSats LSTUDLUdlånsKart.UdlånsNummer UDLUdlånsPost.UdlånsNummer UDLUdlånsSats.ItemNumber XALImportUdl UDLDeleteSats UDLExportSats UDLFastSats10 UDLImportSats UDLPrisOpdatposter MACUDLSatser UDLUdlånsSummering FRMCustTable UDLUdlånsKart REPUDLSatser UDLUdlånPrKunde UDLUdlånStatus UDLUdlånStatusKolonner UDLOrdre 23 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgave 2: Opret nyt modul i gittermenuen Formål med opgaven At oprette et nyt modul som en søjle i gittermenuen Beskrivelse Der skal oprettes et nyt modul i gittermenuen i form af en kolonne med overskriften Udlån. Der skal oprettes forskellige menupunkter med nogle af de applikationselementer der blev importeret i multiimporten fra forrige opgave. Menupunkter, elementer og placering fremgår af skemaet herunder. Linje Menupunkt Type Element Kartotek Udlånskartotek FRM UDLUdlånsKart Udskrifter Udlånssatser REP UDLSatser Udlån pr. Kunde REP UDLUdlånPrKunde Udlån status REP UDLUdlånStatus Udlån status i kolonner REP UDLUdlånStatusKolonner Udlån REP UDLOrdre Oprette faste udlånssatser XAL UDLFastSats10 Eksportere udlånssatser XAL UDLExportSats Slette udlånssatser XAL UDLDeleteSats Importere udlånssatser XAL UDLImportSats Opdatere priser i udlånsposter XAL UDLPrisOpdatPoster Dagligt Periodisk Tilpasning 24 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgave 3: Form med tre blokke Formål med opgaven At oprette en form med tre blokke, der er synkroniseret med hinanden Beskrivelse Der skal oprettes en form med tre blokke, der tilhører hvert sit kartotek. Kartotekerne er CustTable, UDLUdlånsKart og UDLUdlånsPost. Alle blokke oprettes som multi record blokke, og felterne placeres automatisk. Debitorudlån CustTable UDLUdlånsKart UDLUdlånsPost Se forløb med yderligere forklaring på næste side 25 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Forløb 1 √ Opret formen ’DebitorUdlån’ med tre blokke som vist herover. Alle blokke oprettes som multi record blokke 2 Felter i blokken CustTable Account, Name og Group 3 Felter i blokken UDLUdlånsKart UdlånsNummer, DebitorKonto, UdlånsDato, UdlånsType, Attention, ReturDato og ForsikringsSum. Feltet DebitorKonto skal sættes til at springes over 4 Felter i blokken UDLUdlånsPost UdlånsNummer, ItemNumber, VareNavn (*), SerieNummer, UdlånsStatus, DebitorKonto, Udlejningsværdi og forsikringsværdi * Feltet VareNavn er et virtuelt felt, der skal opdateres med et direkte opslag fra InvenTable. Felterne UdlånsNummer, DebitorKonto og VareNavn sættes til at springes over. 5 Styring og synkronisering Indtast nødvendige control macroer for styring og synkronisering af blokkene. 6 Godkend og afprøv formen Afprøv om synkroniseringen virker korrekt, og afprøv om der kan oprettes nye debitorer, Udlån og Udlånsposter. Indeholder alle udlån og udlånsposter de rigtige nøgleværdier, når der oprettes nye. 7 Fjern feltet Debitorkonto Når formen er afprøvet og synkroniseringen fungerer skal feltet DebitorKonto fjernes fra blokken UDLUdlånsKart og felterne UdlånsNummer, og DebitorKonto skal fjernes fra UDLUdlånsPost. 8 Blok Mode sættes til Watch Til sidst sættes Blok Mode til Watch 26 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 2. Macroen #Frm_BLKBAR Formål Formålet med denne lektion er at give kursisterne indblik i anvendelsen af macroen #Frm_BLKBAR, der svarer til control kommandoen BLKBAR. Emner Anvendelse af macroen #Frm_BLKBAR i blokke i forms Generelt Blokke i forms er enten enkelt eller multi record blokke. I enkelt record blokke viser cursoren altid hvilket felt, der er aktivt lige nu i den viste record. I Multi record blokke viser cursoren hvilken record, der er aktiv lige nu. Cursoren vises som en bar eller bjælke, der dækker samtlige felter i recorden. Bjælken kan styres ved hjælp af macroen #Frm_BLKBAR. Anvendelse af #Frm_BLKBAR Macroen #Frm_BLKBAR anvendes til at tænde og slukke for bjælken i multi record blokke. Når bjælken er slukket, er cursoren stadig aktiv og viser blot hvilket felt den er placeret i. Syntaks #Frm_BLKBAR([<bloknavn>],’ON’|’OFF’|’ALL’|’CUR’) Som vist i syntaksen angives blokkens navn som første parameter. Dette medfører at bjælken kan tændes og slukkes i hver enkelt blok for sig. Angives blokkens navn ikke, gælder det den aktuelle blok afhængigt af den værdi, der indsættes som parameter 2. Værdier i parameter to Værdi Betydning ON Bjælken tændes i angivne eller aktuel blok OFF Bjælken slukkes i angivne eller aktuel blok ALL Bjælken tændes i samtlige blokke, og slukkes enkeltvis med OFF CUR Bjælken tændes i aktuelle blok, og slukkes i alle andre blokke 27 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel 1 I eksemplet slukkes bjælken i en blok med navnet CustTable. #Frm_BLKBAR(CustTable,’OFF’) Eksempel 2 I dette eksempel tændes bjælken for den aktuelle post i alle blokke samtidig. Hvis blokkene er synkroniserede stiller bjælken sig i realiteten på den første Linje i hver blok. #Frm_BLKBAR(,’ALL’) Triggere Koden kan f.eks. indsættes i INIT triggeren eller PRE-FORM triggeren, så den træder i kraft allerede ved formens start. Visning af cursorens vej gennem flere blokke I forms med flere blokke der er synkroniserede med hinanden som en kæde, er det ofte ønskeligt, at bjælken kun tændes, når cursoren går ind i næste blok i kæden. På denne måde kan det hele tiden følges, hvilken post cursoren forlod i forrige blok, så sammenhængen mellem posterne i de forskellige blokke kan ses. Efterhånden som blokkene forlades igen i modsat rækkefølge skal bjælken desuden slukkes. Skemaet herunder viser, hvordan et sådant forløb kan udføres. Styring af bjælker i blokforløb Trigger Macroer Forklaring Pre-Form #Frm_BLKBAR(,’ALL’) Bjælken tændes i alle blokke Preblok(1) #Frm_BLKBAR(Blok2,’OFF’) #Frm_BLKBAR(blok3,’OFF’) #Frm_REPAINT Ved indgang i blok 1 slukkes bjælken i blok 2 og 3 Preblok(2) #Frm_BLKBAR(Blok2,’ON’) #Frm_BLKBAR(blok3,’OFF’) #Frm_REPAINT Ved indgang i blok 2 tændes bjælken og holdes slukket i blok 3 Preblok(3) #Frm_BLKBAR(Blok2,’ON’) #Frm_BLKBAR(blok3,’ON’) #Frm_REPAINT Ved indgang i blok 3 tændes blok 2 og blok 3 Macroen #Frm_REPAINT svarer til control kommandoen REPAINT. Den gentegner skærmen og opdaterer således selve skærmbilledet. Det kan f.eks. være nødvendigt, når bjælken tændes og slukkes i de forskellige blokke. 28 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgaver Opgave 1: Styring af bjælke med #Frm_BLKBAR Formål med opgaven At styre bjælken i en form med tre blokke, der er synkroniseret med hinanden Beskrivelse I sidste opgave i forrige lektion blev der oprettet en form med tre blokke. I denne form skal bjælken i hver enkelt blok styres med macroen #Frm_BLKBAR. Styringen skal udføres således, at bjælkerne tændes efterhånden som cursoren går ind i blokkene, og først slukkes igen når blokkene forlades i modsat rækkefølge. De tre blokke anvender kartotekerne er CustTable, UDLUdlånsKart og UDLUdlånsPost. DebitorUdlån CustTable UDLUdlånsKart UDLUdlånsPost √ Forløb 1 Gå ind i formen ’DebitorUdlån’ fra sidste opgave i forrige lektion. 2 Indsæt nødvendig kode i form af macroerne #Frm_BLKBAR og #REPAINT 3 Sørg for at bjælken tændes i blokkene efterhånden som cursoren går ind i dem og slukkes igen når blokkene forlades i samme rækkefølge. 4 Afprøv formen 29 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 3. Labels Formål Formålet med denne lektion er at give et overblik over, hvordan labelsystemet er opbygget, samt hvilke funktioner der kan benyttes i forbindelse med skrivning og læsning af labels. Efter denne lektion skal kursisterne: Have en forståelse af filerne i labelsystemet. Kunne benytte labeleditoren. Kunne finde, oprettet, opdatere og slette labels. Generelt I C5 er der implementeret understøttelse for flere sproglag også kaldet labels. I praksis betyder dette, at hele grænsefladens tekst er flyttet ud i en separat tekst fil kaldet c5sysald.dk. Med labelsystemet er det muligt at skifte sproglag uden at skifte applikationen. Dette betyder at to forskellige brugere kan bruge den samme applikation med to forskellige brugersprog. Brugeren kan specificere det applikationssprog der ønskes benyttet ved at bruge start opstartsparameteren -C<ekstension> for eksempel -CUK. En label er en tekst. Hvis en tekst har et specifikt format, vil kernen genkende formatet som en label: .@. + <Modul> + <seqno> Eksempel: ”@SYS123”. Bemærk at <Modul> er en del af label navnet. Dette betyder, at <Modul> skal angives, når en ny label bliver dannet. Filerne i labelsystemet Hvert sproglag består af 4 filer: Label filen C5 + <modul> + ALD + ... + <sprog> C5 Standard prefix for label filerne. <Modul> 3-bogstavs lag specifikation – f.eks. SYS. ALD Forkortelse for Application Language Dictionary <Sprog> Fil ekstension. Relateret til sproget der benyttes i label filen. Eksempel C5sysald.dk 30 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Label index filen C5 + <lag> + ALI + ... + <Sprog> C5 Standard prefix for label filerne. <Modul> 3-bogstavs lag specifikation – f.eks. SYS. ALI Forkortelsen for Application Language Index <Sprog> Fil ekstension. Relateret til sproget der benyttes i label filen Eksempel C5sysali.dk Label com filen C5 + <modul> + ALC + ... + <Sprog> C5 Standard prefix for label filerne. <Modul> 3-bogstavs lag specifikation – f.eks. SYS. ALC Forkortelsen for Application Language Compiled. Kernen opdaterer ALC filer når ALD filer er ændret. <Sprog> Fil ekstension. Relateret til sproget der benyttes i label filen Eksempel C5sysalc.dk Label modifications filen C5modalt + <Sprog> Master label filen bliver automatisk opdateret med ændringer når kernen lukkes ned. Eksempel C5modalt.dk 31 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Label editoren C5 indeholder et multifunktions-udviklingsværktøj, som bliver aktiveret med Ctrl+F1. Label editoren bliver brugt alle steder, hvor tekst benyttes. For eksempel i menubuilder eller formbuilder. Man kan til enhver tid åbne label editoren ved at taste Ctrl+F1. Labelfil Nye labels samt ændringer til labels bliver gemt i labelfilen med den extension der er angivet i feltet Labelfil. Hvis man opretter en label i ”sys-labelfilen” risikerer man, at denne overskrives i forbindelse med opdatering af systemet. Derfor bør man altid oprette nye labels i en brugerdefineret labelfil – f.eks. USR. Oprettelse af ny labelfil Man opretter en ny labelfil således: Vælg sprog Angiv en tre-karakter ekstension til labelfilen i feltet Labelfil og tast Enter. En dialogbox vises, hvor der spørges om der ønskes oprettet en ny label fil med den angivne extension. Vælg Ja Søgning efter specifik label Via labeleditoren kan man søge efter en specifik label ved enten at benytte Søg efter eller Labelnr. felterne. Hvis den label man søger findes, vil man have mulighed for at rette i enten teksten eller kommentaren. Hvis man søger efter en tekst, som ikke findes, vil systemet foreslå, at oprette en label med teksten. Bemærk! Denne label vil blive oprettet i den labelfil, som er angivet i feltet Labelfil. 32 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Hvordan begrænses søgningen Ofte vil en søgning finde flere labels som indeholder den angivne tekst. For at undgå uønskede resultater kan man begrænse søgningen og derved filtrere uønskede hits fra. Man kan for eksempel bruge < og > for at få en mere detaljeret søgning. Hvis man angiver <tekst> som søgetekst, vil systemet kun søge efter labels uden tekst før < eller efter >. Oprettelse af ny label En ny label kan oprettes på to måder. Enten ved at søge efter en tekst som beskrevet ovenfor, og svare ja til at få oprettet teksten som en ny label, såfremt den indtastede tekst ikke allerede findes som en label. Alternativt kan en label oprettes således: Åbn labeleditoren med Ctrl+F1 Vælg sprog og label fil Tast Shift+F8 for at hoppe ned i næste blok Angiv label teksten i feltet Tekst Tast Pil ned én gang for at opdatere linien. Bemærk at systemet automatisk tilknytter et labelnummer til den nye label Sprogvalg i labeleditoren Ved at taste ALT+V i labeleditoren kan den aktuelle labeltekst ses for andre sprog (de sprog man har adgang til). Sletning af en label Man bør ikke slette en label med mindre man er helt sikker på at den ikke bliver benyttet. Hvis det er nødvendigt kan labels slettes på følgende made: Vælg sprog Vælg label fil Søg efter den label der ønskes slettet Når labelen eller listen af labels vises, tastes Shift+F8 for at hoppe til listen i den næste blok Markér den label som ønskes slettet Tast Alt+F9 BEMÆRK! Der vil ikke komme en advarsel når man taster Alt+F9. Den valgte label vil blive slettet omgående og kan ikke blive gendannet som den var. Man kan oprette en ny label med samme tekst indhold, men labelkoden vil være en anden da label numre genereres automatisk. 33 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel på brugen af labeleditoren Hver gang man har brug for at angive en tekst, der skal vises i applikationen, bør man benytte label editoren. Dette kan bedst illustreres med et eksempel. Det følgende eksempel viser brugen af labeleditoren når der oprettes et nyt felt i en form: Når der indsættes et felt i en form skal man først angive feltnavn og type Herefter vises Opsætning af tekst-felt dialog boksen I feltet Ledetekst kan man angive en prompt tekst for feltet (hvis dette ikke udfyldes benyttes teksten fra databasen) Placer cursoren i feltet Ledetekst, og angiv prompt teksten der skal benyttes Tryk Ctrl+A for at forlade dialog boksen midlertidigt og åbne label editoren Label editoren søger straks efter den angivne tekst. Hvis den eksakte tekststreng ikke er fundet, vil man blive tilbudt at den angivne tekst oprettes som ny label Vælg ja og en label vil blive oprettet Placer cursoren på den nye label og tast Alt+P for at lukke label editoren og indsætte labelkoden ind i Ledetekst feltet dialog boksen Bemærk venligst at når man placerer cursoren i et felt der indeholder en label, vil label nummeret blive vist. Når cursoren ikke er placeret I feltet er det label tekst der vises. 34 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Label funktioner Funktion Beskrivelse LabelSearchFirst Returnerer den første label, der opfylder søgekriterierne. Der bliver søgt alle filer med den specifikke sprog ekstension Syntax: STR LabelSearchFirst(STR udtryk, STR sprog) Eksempel: LabelSearchFirst(.Finanskonto.,.DK.) LabelSearchNext Returnerer den næste label efter brug af funktionerne LabelSearchFirst() eller LabelSearchNext() Syntax: STR LabelSearchNext(STR sprog) Eksempel: LabelSearchNext(.DK.) LabelGetText Returnerer teksten for den angivne label og sprog. Syntaks: STR LabelGetText(STR label, STR sprog) Eksempel: LabelGetText(.@.+.SYS12068.,.DK.) LabelGetComment Returnerer kommentarer for den specifikke label. Syntaks: STR LabelGetComment(STR label, STR sprog) Eksempel: LabelGetComment(.@.+.SYS12068.,.DK.) LabelInsert Returnerer den oprettede label (kode). Syntaks: STR LabelInsert(STR tekst, STR kommentar, STR modul, STR sprog) Eksempel: LabelInsert(.Finanskonto.,.Prompt på kontonummer i finanskartotek.,.DK.) LabelUpdate Returnerer 1, hvis labelen blev opdateret succesfuldt og 0 hvis ikke. Syntaks: INT LabelUpdate(STR label, STR tekst, STR kommentar, STR sprog) Eksempel: LabelUpdate(.Finanskonto.,.Prompt på kontonummer i finanskartotek.,.DK.) LabelDelete Returnerer 1, hvis sletningen af labelen var en succes. Ellers returneres 0. Syntaks: INT LabelDelete(STR label, STR sprog) Eksempel: LabelDelete(.@.+.SYS12345.,.DK.) LabelExists Returnerer 1, hvis labelen eksisterer og 0 hvis ikke. Syntaks: INT LabelExists(STR label, STR sprog) Eksempel: LabelExists(.@.+.SYS12345.,.DK.) 35 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Funktion Beskrivelse StrExpandLabels Returnerer strengen, som er sent til funktionen som argument med ekspanderet label. Syntaks: STR StrExpandLabels(STR 255 Søgetekst) Eksempel: StrExpandLabels(Hej Verden @SYS5555 Hej Verden2 @SYS5577) Hvor @SYS5555 = Test1 og @SYS5577 = Test2 returneres: Hej Verden Test1 Hej Verden Test2 Hotkeys Applikationsudvikleren bør ikke specificere hotkeys i hovedmenu, sub-menuer eller lokalmenuer. I stedet vil en ny kerne feature automatisk generere hotkeys. Uafhængigt af hvilket sprog der benyttes vil hotkeys være tilgængelige. Men hot keys vil ikke være de samme for alle sprog. Kernen genererer automatisk hotkeys med følgende prioritering: 1. Kernen leder efter hotkeys, der er hardkodet. Hvis der findes nogle hotkeys, vil disse bogstaver blive reserveret. 2. Alle menupunkter, der ikke har en direkte angivet hotkey, vil få et bogstav tilføjet på følgende måde: Det første bogstav i navnet på det første menupunkt uden en hotkey vil blive tildelt menupunktet. Hvis bogstavet allerede benyttes, vil det andet bogstav blive benyttet osv. Hvis der ikke findes et bogstav til menupunktet, vil der ikke blive tilknyttet en hotkey til menupunktet. Processen gentages for alle menupunkter I menuen. Indføring af labels i partner- eller brugerelementer. Dette afsnit beskriver, hvordan man introducerer labels i egne tilretninger. Før man begynder at anvende label konverteringsværktøjet, er der nogle indledende ting, der skal gøres for at sikre at labels introduceres korrekt. Husk at sikre at tekst, man ønsker at konvertere, er i dobbelt anførselstegn (”). Tekst, som ikke skal konverteres, er i enkelt anførselstegn (’). Sikre at der kun benyttes hele sætninger (brug StrFmt() for at samle dele af sætninger). En måde at gøre dette på er at udføre en test labelkonvertering. Når man gør dette, kan det checke den generede label fil, og se om der er findes tekst som det er nødvendigt at anføre i enkelt anførselstegn, og om der er sætninger der ikke giver mening. Ret fejlene i applikationen og udfør den endelige konvertering. En anden fremgangsmåde er at checke elementet, mens elementet bliver opgraderet. Efter at have sikret at de ovenstående ting er i orden, kan man starte label konverteringen. 36 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Labelkonvertering Udfør en multi-eksport af de elementer der skal konverteres.. Brug det automatiske label konverteringsværktøj (XAL: ToolConvertTxt2Labels). Efter at man har konverteret, bør man checke label filen (eksempelvis c5usrald.dk) for at sikre, at kun tekst, som var tiltænkt konvertering, er korrekt. (f.eks. skal proces kald ikke lables). Man kan manuelt oprette nye labels ved at taste Ctrl+F1, når man står på tekst i anførselstegn. 37 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgaver Opgave 1: Oprettelse af ny tekst i nyt tekstlag Formål med opgaven At oprette et nyt tekstlag samtidig med, at man opretter en ny tekst. Beskrivelse Opret en XAL-kørsel som indsætter dit navn i tekstlaget ’MBS’. Valider efterfølgelse via label editoren at teksten er oprettet. Opgave 2: ToolConvertTxt2Labels Formål med opgaven At benytte XAL-kørslen ’ToolConvetTxt2Labels’. Beskrivelse Opret følgende XAL-kørsel under navnet ’MBStestafkonverteing’ STR STR 30 30 &tekst1 &tekst2 SET &tekst1 = ”Denne streng skal konverteres til label” SET &tekst2 = ’Denne streng skal ikke konverteres til label’ Eksporter kørslen via multiexport og oversæt den med ’ToolConvertTxt2Labels’. Sæt lablepræfix til ’MBS’. Importer kørsel igen og verificer, at koden er korrekt oversat. 38 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 4. Database definition (DBD) Formål Formålet med denne lektion er at give en gennemgang af hovedpunkterne i kolonnen DBD med Database Definition. Emner Oprettelse og vedligeholdelse kartoteker Oprettelse af avancerede index Oversættelse af XAL kode i kartoteker Eksport og import af kartoteker Generelt En del af menupunkterne i kolonnen DBD er behandlet på tidlige kurser og berøres kun ganske kort i lektionen. Hovedformålet med DBD kolonnen er oprettelse og vedligeholdelse af kartoteker i databasen. Der findes dog under menupunktet Diverse funktioner til bl.a. oprettelse og vedligeholdelse af brugere og grupper med rettigheder. Kolonnen DBD med Database definition Menu i DBD Anvendelse (* = ingen funktion) Kør * Opret Oprettelse af kartotek Ret Vedligeholdelse af kartoteker List Der vælges kartotek fra listen, kartoteksmenuen vises Trim * Debug * Oversæt Oversættelse af XAL kode i kartotekernes triggere Udskriv Skriver dokumentation over ét kartotek Export Eksport af kartoteker Import Import af kartoteker Slet * Diverse Bl.a. fasttekster, SQL og bruger rettigheder Som det fremgår af listen, er det ikke alle menupunkter, der fungerer i forbindelse med oprettelse og vedligeholdelse af kartoteker. Hovedpunkterne behandles efterfølgende forskelligt, afhængigt af hvor meget de har været anvendt på tidligere kurser. 39 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale DBD/Opret Oprettelse af kartotek I menupunktet DBD/Opret aktiveres skærmbilledet ’Opret / se kartotek’, hvori der oprettes nye kartoteker. I billedet opsættes den overordnede beskrivelse af kartoteket. Billedet indeholder felterne i skemaet herunder. Bemærk! Kartoteker kan IKKE slettes igen, når de først er oprettet. Felt Betydning Navn på kartotek Navn til identifikation af kartotek f.eks. ’CustTable’. Printnavn Tekst på skærm i stedet for kartoteksnavn f.eks. ’Debitorkartotek’. F.eks. i QT’er og ’Database Status’. Ref. Formnavn Form der hoppes til, når der tastes Ctrl+F4. Uden navn hop til form med samme navn som kartotek Titel felt Feltnavn og indhold vises i rammen på forms Hvor ligger data Hvert regnskab / Midlertidig fil / Kun ”DAT” regnskabet Applikationsgruppe Evt. hvilken applikationsgruppe kartoteket tilhører. Navngivning af kartotek Nye moduler der kodes til C5 af andre end Microsofts egne udviklere, skal overholde følgende syntaks for navngivning af kartoteker. Syntaks <3 første tegn i modulets navn med kapitæler><kartoteksnavn> Kartoteks navn startes således med modulnavnets tre første bogstaver stavet med STORT efterfulgt kartoteks navn. Eksempel BOODestinationer I eksemplet er der f.eks. oprettet et Bookingmodul til et rejsebureau, og der oprettes et kartotek med destinationer. Kartoteknavnet bliver derfor BOODestinationer. 40 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale DBD/Ret I menupunktet DBD/Ret vedligeholdes kartoteker. Det er her der oprettes felter, index, passwords osv. Vedligeholdelsen udføres i en af de to undermenuer Kerne eller Oversigt. DBD/Ret/Kerne I menupunktet Kerne fremkommer en liste over kartoteker i databasen. Efter valg af et kartotek fra listen vises en menu med kartotekets navn som overskrift. Menupunkter i Kerne Menu Anvendelse Feltbehandling Opret og ret felter Indexbehandling Opret, ret og slet index Formler for kartoteket Oprettelse af kode på triggere Password beskyttelse Opret eller ret password Oprydning Slet ALLE poster Navn Samme indtastningsboks som under Opret Fast-Tekst-Typer Opret, ret og slet Fast-Tekst-Typer Alle menupunkterne vedrører kun det valgte kartotek. Feltbehandling Når der oprettes et nyt felt på et kartotek, vælges først felttype. Felttyperne svarer til de fem datatyper, der også anvendes til erklæring af variabler. Felttyper Felttyper Beskrivelse Datatyper Alfanumerisk Tekst STR Heltal Max. 8 cifre INT Kommatal Beløb/Værdi REAL Dato Datoer DATE Fast-Tekst-Type Faste tekster ENUM Bemærk! Det er ikke muligt at slette et felt eller at ændre type på det. Hvis et felt f.eks. er blevet oprettet som et kommatalsfelt, og det i virkeligheden skal være et tekstfelt, kan det ikke lade sig gøre at ændre typen. Da feltet heller ikke kan slettes, er der kun en udvej, at give det et andet navn og undlade at bruge det, og derefter oprette et nyt felt i stedet. 41 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Udvej til ændring eller sletning af felter Der er en måde at ’snyde’ systemet på, så der alligevel kan slettes og ændres type på et felt. Dette kan ske ved at: Eksportere kartoteksdefinitionen ud i en tekstfil Redigere den eksporterede tekstfil Importere den redigerede tekstfil, hvorved den gamle overskrives Denne metode må dog kun benyttes på kartoteker, der er fuldstændigt tomme, da der ellers er risiko for, at ødelægge sammenhængen mellem data og kartoteksdefinition, hvorefter dataene er ubrugelige. Specielt ved nye kommatalsfelter Felt Betydning National valuta Nej = Vis kun beløb i national valuta. Ja = Vi beløb i den valuta der vælges med <Alt W> inden en form åbnes eller en rapport startes. (Ledeteksterne ændres til at vise valuta i brugeropsætning i feltet ’Vis præsentationsvaluta’) Indexbehandling Oprettelse af index Index oprettes på de enkelte kartoteker ved at angive følgende feltværdier. Felter der udfyldes ved oprettelse af Index Felt Betydning Indexnavn Index navngives ofte ud fra de felter, de består af, og afsluttes som regel med bogstaverne Idx. Ens nøgler tilladt Nej eller Ja til om der må være ens nøgler i indekset Er indekset aktivt Nej eller Ja til om indekset skal være aktivt med automatisk vedligeholdelse Beskrivelse af index Beskrivelse i form af kartoteksfelter adskilt med komma. Navngivning af Index i nye moduler Nye moduler der kodes til C5 af andre end Microsofts egne udviklere, skal overholde følgende syntaks for navngivning af Index Syntaks <3 første tegn i modulets navn med kapitæler><indexnavn> 42 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Indexnavn startes således med modulnavnets tre første bogstaver stavet med STORT efterfulgt af indexnavnet. Indexnavnet skal desuden altid bestå af de tre første tegn i de indgående felters navne, hvor første tegn skrives med stort. Afslut navnet med Idx. Navn på index må højst være 16 tegn. Det kan sagtens være længere, men der kan så opstå uforudsigelige situationer. Eksempel I eksemplet er der oprettet et Bookingmodul til et rejsebureau, og der er oprettet et kartotek med felterne Destination, Land, Hotel osv. Et index med ovenstående felter kommer derfor til at hedde: BOODesLanHotIdx Avanceret anvendelse af index Alle de standard index der findes i kartotekerne, er udelukkende opbygget af felter adskilt med kommaer. I skemaet herunder vises eksempler på standard index i kartoteket CustTable. Standard index i CustTable IndexNavn Felter i Indexformel AccountIdx Account GroupIdx Group, Account Til trods for denne anvendelse af felter i standard index, er der gode muligheder for en avanceret opbygning af index, som vist i eksemplerne herunder. Eksempler på avanceret anvendelse af felter i indexformler Anvendelse Felter i Indexformel Stigende sortering Account ASCEND Faldende sortering AmountMST DESCEND Stigende og faldende Account ASCEND, Date_ DESCEND Faldende første ’x’ antal tegn Name DESCEND 3 {Navn faldende 3 tegn} Tekst i fastteksttype Enum2Str(UnitCode) Uden specialtegn #NamesIndex(ItemName) Stigende og faldende sortering Stigende og faldende sortering udføres ved at sætte kommandoen ASCEND eller DESCEND efter navnet på feltet. Stigende sortering er default, hvis der ikke angives nogen sorteringsvej. Der kan godt være et felt sorteret stigende, mens et andet felt sorteres faldende i samme index. 43 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Faldende første ’x’ antal tegn Faldende sortering på første ’x’ antal tegn udføres på tekstfelter. Tekstfelter behøver ikke at være sorteret på hele teksten i feltet. Der kan udmærket sorteres på et udvalgt antal tegn i feltet begyndende med første tegn i teksten. De udvalgte tegn kan desuden sorteres enten stigende eller faldende. Tekst i fastteksttype Index med felter af typen ’Fasttekst’ sorteres normalt på teksternes nummer i fastteksttypen. Der kan dog også sorteres på selve teksten. Dette kræver anvendelse af funktionen ENUM2STR, der henter teksten i stedet for nummeret. Uden specialtegn Index med felter af typen tekst sorteres normalt på hele tekstens indhold inkl. mellemrum, kommaer, punktummer osv. I nogle situationer er det ønskeligt at disse specielle tegn udelades under sortering i indekset. Til dette formål er der lavet en macro med navnet #NamesIndex, der netop fjernes disse specielle tegn Macroen #NamesIndex Macroen #NamesIndex benyttes til at fjerne visse tegn fra navne i felter, når disse felter anvendes i index. Syntaks for #NamesIndex #NamesIndex(Feltnavn) Af syntaksen fremgår det, at macroen kun skal have én parameter, hvilket er navnet på det felt, der skal fjernes tegn fra. Eksempel #NamesIndex(ItemName1) I eksemplet er parameter nummer ét udfyldt med feltet ItemName1. De tegn der fjernes fra det angivne felt fremgår af macroens indhold. Indhold i macroen #NamesIndex StrRem(%1,’ .,;/-:\\+’) Af indholdet i macroen fremgår det, at den blot anvender funktionen StrRem med fast opsætning af parameter nummer to. Parameter nummer et er sat til %1, og skal således angives hver gang macroen benyttes. 44 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale StrRem StrRem er en funktion, der fjerner alle de tegn, der findes i parameter nummer to fra teksten i parameter nummer 1. I macroen drejer det sig om tegnene: Mellemrum, punktum, komma, semikolon, skråstreg, minus (bindestreg), kolon, baglæns skråstreg og plus. Når macroen anvendes fjernes alle disse tegn således fra teksten i det felt der angives som parameter i parentesen. I indekset sorteres der på denne måde kun efter indholdet af bogstaver og tal i navnene. Index med tekstfelter Hvis et tekstfelt, der har et tal indhold, skal indgå i et index, og sorteringen skal ske i forhold til tal indholdet, som f.eks. feltet Account i kartoteket CustTable, er det vigtigt at feltet er højrestillet. En højrestilling af feltet betyder således, at eventuelle blanke tegn altid placeres til venstre og værdien af feltet placeres til højre. Hvis feltet er venstrestillet, kan indholdet ikke behandles som en talværdi, men vil blive behandlet som en tekst, hvilket umuliggør en korrekt sortering i både stigende og faldende nummerorden. (Medmindre længden og sammensætningen af alle tal og tegn er ens for alle poster). DBD/Ret/Oversigt I menupunktet Oversigt aktiveres et skærmbillede med en oversigt over samtlige kartoteker. Skærmbilledet består af fire sider som følger: Sider i skærmbilledet til ’Oversigt’ Side Indhold Oversigt over: 1 Kartoteker Kartoteker og triggere 2 Felter Felter og triggere til kartotek fra side 1 3 Index Index til kartotek fra side 1 4 Fast-Tekster Samtlige Fast-Tekst-Typer med tekster Der kan på de enkelte sider oprettes og rettes kartoteker, felter, index og fasttekster. Forskellen på Kerne og Oversigt er at oversigten viser flere af de enkelte komponenter ad gangen, så det er mere overskueligt hvad der er oprettet i forvejen. Der skiftes mellem siderne med funktioner Alt+F7 og Alt+F8 eller via lokalmenuen. Følgende funktioner kan desuden med fordel anvendes i oversigten. 45 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Funktioner i ’Oversigt’ Funktion Forklaring Load XAL Funktionen Alt+L læser XAL koden fra triggerne ind i oversigten. Det markeres med farve på knapperne om der er kode i dem. Kun knapper med kode kan aktiveres. Alt+L Indlæsningen omfatter både triggerne på kartoteket og felterne. Bogmærke Funktionen Ctrl+Ins gemmer cursorens aktuelle position i oversigten Ctrl+Ins Hop til bogmærke Ctrl+ Home Sortering Alt+S Funktionen Ctrl+ Home vises en lister over alle bogmærker med gemte positioner. Der springes til placeringen i det bogmærke der vælges. Funktionen Alt+S sorterer kartotekerne efter Nummer, Kartotek eller Modul. Bemærkninger til felter i ’Oversigt’ De fleste felter på siderne er selvforklarende, eller deres anvendelse forklares i hjælpeteksten. Feltet Navn på alle sider Navne på kartoteker, felter og index på hver enkelt side kan ikke ændres, da det resulterer i fejlagtig kode de steder, hvor navnene anvendes i forvejen. Feltet Type på side 1 med kartoteker $$$ = Midlertidig temporær fil DAT = Dat regnskabet (C5data.Dat) Blank = Hvert regnskab Feltet Reference på side 2 med felter: Referencer indtastes som <Kartotek>.<Felt> Knapper (triggere) på side 1 i kartotek På side 1 Kartoteker er der yderst til højre en række knapper, der repræsenterer nedenstående triggere. Knapperne er som standard inaktive, men funktionen Alt+L kan indlæse koden fra triggerne. Efter indlæsningen fremgår det af knapperne, om der er kode i dem. Kun knapper med kode kan åbnes for læsning eller ændring. 46 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Triggere (knapper) Forklaring Post-Change Afvikles efter manuel inddatering i poster, inden opdatering i selve kartoteket. Returnering af værdien nul bevirker at posten ikke opdateres Post-Load Anvendes f.eks. til udfyldelse af felter der ikke opdateres i kartoteket. Init Afvikles ved introduktion af en ny post. Benyttes typisk til udfyldelse af standardværdier Pre-Delete Afvikles umiddelbart før posten slettes Post-Delete Afvikles umiddelbart efter posten slettes. Benyttes typisk til følge sletninger i relaterede kartoteker f.eks. Notater Pre-Update Afvikles umiddelbart før posten opdateres Post-Update Afvikles umiddelbart efter posten er opdateres. Benyttes typisk til vedligeholdelse af summer o.l. Pre-Insert Afvikles umiddelbart før posten indsættes i kartoteket Insert OK Afvikles umiddelbart efter posten er indsat i kartoteket Insert Fail Afvikles umiddelbart efter posten er forsøgt indsat i kartoteket, men oprettelsen er fejlet. Sker typisk pga. Konflikter med entydige index o.l. Notatknappen er ikke aktiv. Knapper (triggere) på side 2 med felter Nederst til højre på side 2 Felter er der en række knapper, der repræsenterer nedenstående triggere på feltet. Som standard er knapperne inaktive, men funktionen Alt+L kan indlæse koden i triggerne. Det kan ses på knapperne hvis der er kode i dem. Knapperne kan åbnes for læsning af koden. Koden kan evt. Ændres. Triggere (knapper) Forklaring Check-Field Anvendes til check af feltets værdi efter en indtastning Pre-Field Afvikles umiddelbart før der rettes i feltet Post-Field Afvikles umiddelbart efter der er rettet i feltet Notatknappen kan ikke aktiveres. 47 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale DBD/List I menupunktet DBD/List fremkommer der en liste over en af de forskellige typer applikationselementer der findes. Med Alt+T kan der ændres type. Således kan der også vælges kartoteker. List fungerer ens i alle kolonner i udviklingsmenuen. Vælges der ’kartoteker’, vises en liste over samtlige kartoteker. Der kan vælges et kartotek, hvorefter samme menu fremkommer som under DBD/Ret/Kerne. DBD/Oversæt I menupunktet DBD/Oversæt fremkommer en menu med nedenstående punkter. Begge menupunkter anvendes til oversættelse af den XAL kode der findes i triggerne i kartoteket og felterne. Oversættelsen starter direkte ved aktivering af menupunkterne. Menupunkter i ’Oversæt’ Menu Anvendelse Kartotek XAL kode oversættes i kartotek valgt fra liste over kartoteker Database XAL kode oversættes i samtlige kartoteker på en gang DBD/Udskriv I menupunktet DBD/Udskriv udskrives dokumentation for valgte kartoteker. Efter aktivering af menupunktet og valg af printer med mere fremkommer der en liste med alle kartotekerne, hvorfra det ønskede kartotek vælges. 48 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale DBD/Export I menupunktet DBD/Export fremkommer en menu med nedenstående punkter. Menupunkter i ’Import’ Menu Anvendelse Kartotek Eksport af ét valgt kartotek ekskl. Enum. Kartoteket vælges fra en liste med kartoteker. Nye Eksport af alle nye kartoteker ekskl. Enum. Der eksporteres alle nye kartoteker der er tilføjet, samt kartoteker med nye felter og index. Der eksporteres ikke Fast-Tekst-Typer. Nye + Enum Eksport af alle nye kartoteker inkl. Enum. Alle Eksport af samtlige kartoteker ekskl. Enum. Der eksporteres alle nye kartoteker der er tilføjet, samt kartoteker med nye felter og index. Desuden eksporteres samtlige Fast-Tekst-Typer. Der eksporteres samtlige kartoteker i databasen, dog uden nogen Fast-Tekst-Typer. Alle + Enum Eksport af samtlige kartoteker inkl. Enum Der eksporteres samtlige kartoteker i databasen. Desuden eksporteres samtlige FastTekst-Typer. Menupunkterne anvendes til eksport af databasens kartoteksdefinitioner til en ASCII fil. Der promptes for navnet på ASCII filen. DBD/Import I menupunktet DBD/Import fremkommer en menu med nedenstående punkter. Punkterne anvendes til indlæsning af tidligere eksporterede kartoteksdefinitioner. Menupunkter i ’Import’ Menu Anvendelse Tilføj Import af kartoteker med tilføjelse af nye felter. Importen omfatter kun kartoteker, der ikke eksisterer i forvejen. Overskriv Import af kartoteker, overskriver eksisterende kartoteker med samme navne Alle kartoteker importeres, og eksisterende kartoteker ændres hvis der er ændringer. Bemærk! Denne funktion skal benyttes med forsigtighed, da der er risiko for ødelæggelse og tab af data ved ændring af eksisterende kartoteksdefinitioner. 49 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale DBD/Diverse I menupunktet DBD/Diverse fremkommer en menu med nedenstående punkter. Menupunkter i ’Diverse’ Menu Anvendelse Fasttekst Kun vedligeholdelse af tekster i Fast-Tekst-Typer Nye Fast-Tekst-Typer oprettes under kartoteker Oversigt Samme oversigt som under DBD / Ret. Der kan dog kun læses, ikke oprettes eller ændres. Der kan således spørges på kartoteksdefinitioner uden at låse filen C5DIRECT.SYS gennem rettelse i denne. Flere brugere kan derfor spørge på kartoteksdefinitionerne samtidigt. SQL Der henvises til hjælpefilen for yderligere information om SQL Brugere/ Grupper Samme som under Adgangskontrol Rettigheder Samme som under Adgangskontrol Koder Samme som under Adgangskontrol 50 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 5. Behandling af data (Data) Formål Formålet med denne lektion er at give en gennemgang af hovedpunkterne i kolonnen DATA. Emner Oprettelse af nye regnskaber Reindeksering af data Check og fix af data Generelt Nogle af menupunkterne i kolonnen DATA er behandlet på tidlige kurser og berøres kun ganske kort i denne lektion. Hoved formålet med DATA kolonnen er behandling af data i form af reindeksering og kontrol med og uden fix. Desuden findes menupunkter til datamanipulation og import og eksport af data. Kolonnen DATA Menupunkter i DATA Anvendelse (* = ingen funktion) Kør * Opret Oprettelse af nye regnskaber Ret Datamanipulation List * Trim * Debug * Oversæt * Udskriv Ad Hoc Rapportgeneratoren Export Total eksport af database fra aktuelle regnskab Import Import af kommafiler Slet * Diverse Database Status, Reindexering samt Check og Fix Som det fremgår af listen, er det ikke alle menupunkter, der fungerer i forbindelse med behandling af data. Hovedpunkterne behandles efterfølgende forskelligt, afhængigt af hvor meget de har været anvendt på tidligere kurser. 51 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale DATA/Opret I menupunktet DATA/Opret kan der oprettes nye regnskaber, når der er købt rettigheder til at have flere regnskaber i virksomheden. Når menupunktet aktiveres vises følgende promptboks til indtastning af extension til regnskabets navn. Promptboks til oprettelse af regnskab Ekstension for de to regnskaber der findes som standard i C5 er: DAT = standard regnskabet DMO= Demo regnskabet Infoboks Efter oprettelsen af regnskabet vises følgende infoboks: Det skal således huskes at skifte til det nye regnskab, inden der kan indtastes data i det. DATA/Ret (Datamanipulation) I menupunktet DATA/Ret kan der manipuleres med data på forskellig vis. Når menupunktet aktiveres vises skærmbilledet til Datamanipulation. Det er samme menupunkt som findes under Generelt/Periodisk/Datamanipulation og når der vælges CtrlF+12 og Manipulation. DATA/Udskriv (Rapportgenerator) I menupunktet DATA/Udskriv kan der udskrives ad hoc rapporter direkte fra kartotekerne. Der udskrives fra ét kartotek ad gangen. Når menupunktet aktiveres vises skærmbilledet til ‘Rapportgenerator’. Det er samme menupunkt som findes under Generelt/Rapporter/Rapportgenerator. 52 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale DATA/Export Menupunktet anvendes til eksport af alle kartoteker i den aktuelle database i én arbejdsgang. Ved aktivering af menupunktet fremkommer følgende prompt: I promptboksen angives en sti til det sted, hvor de eksporterede data skal placeres. Det skal bemærkes, at datamodellen i standardapplikationen indeholder en række relationer, der er forbundet med de enkelte posters fysiske placering i databasen. Da disse ændres ved en senere import, er det vigtigt, at kørslen kender disse specielle relationer. Relationer er defineret i databasedefinitionerne, som reference til feltet RecId enten i et konkret kartotek eller i det generelle kartotek Common. I det omfang tilretninger af applikationer også benytter denne metode til relationer mellem poster, skal databasedefinitionerne tilrettes, så disse indeholder de tilføjede relationer. Efter udfyldelse og accept af promptboksen foretages eksporten af alle kartotekerne til hver sin kommafil i den valgte mappe. Desuden udskrives der en definitionsfil med navnet Exp00000.def, der indeholder en liste over alle de eksporterede filer. Det er vigtigt, at den senere import foretages i en database med identiske databasedefinitioner. DATA/Import Menupunktet benyttes til import af en tidligere eksport af alle kartoteker. Kørslen forudsætter at den aktuelle database er uden poster inden importen. Ved aktivering af menupunktet fremkommer følgende prompt: Her angives stien til det sted, hvor de eksporterede data er placeret. Efter udfyldelse og accept af promptboksen foretages importen af alle kommafilerne. Det er vigtigt, at importen foretages i en database med identiske databasedefinitioner, som blev benyttet under eksport. I det mindste skal den databasedefinition, der eksporteret fra, være en ægte delmængde af de databasedefinitioner, der importeres i. Dette betyder, at der gerne må være nye kartoteker, index og felter ved importen. Disse kartoteker og felter vil dog ikke blive udfyldt ved importen. 53 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Data/Diverse I menupunktet Data/Diverse fremkommer en menu med punkterne i nedenstående skema. Menu punkter i Diverse Anvendelse Database status Skærmbillede til kontrol af kartotekernes status. Reindex Reindexering af enkelte kartoteker og hele databasen Check Check og fix af data i kartotekerne De enkelte menupunkter behandles efterfølgende. Database status Ved aktivering af menupunktet vises skærmbilledet Database Status. Skærmbilledet anvendes ikke til indtastning af data. Punktet viser den øjeblikkelige status, hvad angår antallet af poster i kartotekerne og den forbrugte mængde af databasen i procent for det aktuelle regnskab. Øverst vises det aktuelle regnskabs navn, installationens serienummer og version af C5. Herunder vises databasens aktuelle og maximale størrelse og forbrug af maximum i %. Felter i kartotekerne Menu Anvendelse Database Blank Kartoteket er placeret i det aktuelle regnskabs database DAT Kartoteket er placeret i C5DATA.DAT og er tilgængeligt fra alle regnskaber. Temporær Kartoteket er placeret i sin egen temporære fil, der slettes, når C5 forlades. Applikation Modulet det enkelte kartotek er tilknyttet. Kartotekerne er sorteret efter moduler. Kartotek Kartotekets kaldenavn Antal Antal poster i det enkelte kartotek i den aktuelle database Indlæst og forskel Felterne benyttes til sammenligning med en tidligere gemt database status. Ved hjælp af lokalmenuen kan den aktuelle status skrives til en fil der gemmes. Filen kan senere indlæses og sammenlignes med den aktuelle status Skærmbilledet vil med mellemrum genlæse antallet af poster i de enkelte kartoteker, og kan derfor benyttes som monitor for den enkelte database. 54 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Reindexering Menupunktet benyttes til reindexering af kartotekerne i den aktuelle database. Reindexering medfører at alle data lægges i rigtig rækkefølge i indexene til de enkelte kartoteker. Det anbefales at reindexere en gang imellem, for at opnå den bedste hastighed. Reindexering kan også udføres fra menuerne: Generelt/Tilpasning/Vedligeholdelse/Database/Reindex Generelt/Tilpasning/Udviklingsmenu/Data/Diverse/Reindex Ved aktivering af menupunktet fremkommer en undermenu, hvor der kan vælges mellem ét kartotek eller alle databasens kartoteker. Menupunkter til Reindexering Menupunkt Anvendelse Reindex kartotek Reindeksering af valgt kartotek Samme som reindex der hvor kartoteker oprettes. Reindex database Total reindeksering af alle kartoteker i aktuelle database Bemærk! Reindexering af kartoteker med mange poster og/eller mange index kan tage lang tid. En total reindexering af hele databasen kan tage meget lang tid, og eventuelle andre brugere SKAL være ude af programmet. Check Under menupunktet Check kontrolleres data dictionary filen C5DIRECT.SYS og datafilerne C5DATA.* I menupunktet undersøges konsistensen af den interne struktur i den aktuelle database, idet der checkes for opståede ’huller’ og ’krydslinks’. Denne undersøgelse kræver at den aktuelle bruger kan få eksklusiv adgang til filen med den aktuelle database. ’Check’ kan også udføres i menuerne: Generelt/Tilpasning/Vedligeholdelse/Database/Check Generelt/Tilpasning/Udviklingsmenu/Data/Diverse/Check Ved aktivering af menupunktet fremkommer en ny menu med følgende indhold: 55 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Menupunkter under Check Anvendelse Check Check af databasens interne opbygning uden korrektion Fix Check af databasens interne opbygning med korrektion af fejl. Kan i sjældne tilfælde resultere i tab af enkelte poster. Det er derfor tilrådeligt at benytte skærmbilledet Database Status før og efter undersøgelsen til check for mistede poster. Nuller Skrivning af binære nuller i ubrugte dele af databasen. Herved vil denne kunne pakkes bedre ved brug af diskkomprimeringsprogrammer -, backup- og pakkeprogrammer Oprydning Frigivelse af ”gamle” versioner af databasens indhold Menupunktet udfører en oprydning af de ældste versioner af alle poster, der har været opdateret efter den første indsættelse i databasen. Bemærk! Der ryddes IKKE op i gamle poster, og der slettes ingen data. Funktionen rydder op i systemets interne ’låse’. Når kartotekerne benyttes ved f.eks. udskrifter og kørsler låses de. Hvis disse låse af en eller anden grund ikke låses op igen, kan brugerne komme til at hænge fast i systemet. Funktion er ikke mulig under den normale behandling af databasen, da dette kræver eksklusiv adgang til hele databasen. Vedligeholdelse af applikationsfiler I de ovenstående afsnit behandles informationer vedr. kolonnen DATA. Vedligeholdelse af applikationsfilerne udføres i kolonnen Multi, men medtages her da applikationsfilerne også kan reindexeres, checkes og fixes på samme måde som kartotekerne i databasen. Vedligeholdelse af applikationsfilerne finder sted under Multi/Diverse/C5UTIL. I menupunktet findes der en XAL kørsel, hvori det er muligt at udføre flere af ovennævnte punkter på én gang. I kørslen er det ikke databasen der kontrolleres, men filerne C5UTIL.*, der indeholder alle applikationselementerne. Når menupunktet aktiveres startes der en indtastningsboks i form af en matrix, hvor C5UTIL filerne er placeret i venstre side og de forskellige funktioner til vedligeholdelse som overskrifter. Ved at kombinere filer med overskrifter og svare ja i krydspunkterne, vil de valgte funktioner blive udført for de valgte filer, når indtastningsboksen forlades og godkendes med F3. 56 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 6. Temporære kartoteker Formål Formålet med denne lektion er at give deltagerne kendskab til hvordan man bruger og anvender temporære kartoteker Emner Anvendelsen af temporære kartoteker Anvendelsen af SessonId. Makrobiblioteket TMP_File Fordele og ulemper ved temporære kartoteker Generelt om temporære kartoteker Temporære kartoteker har flere anvendelses områder, hvor følgende for eksempel kan nævnes: Lave en sammenlægning af data fra flere kartoteker for at lette udskriften. Lave en ting midlertidigt (simulering) så brugeren har mulighed for at gennemgå resultatet før man siger ok. Specielt med SQL databaserne kan man forbedre hastigheden ifm. en kørsel ved at bruge Temp In Native. De temporære kartoteker har alle bogstaverne ”TMP” foran kartoteksnavnet, hvilket medfører at de nemt kan genkendes i Udviklingsmenuen under DBD/Ret/Kerne. Selve strukturen (dvs. kartoteks definitionen) kan, som alle kartoteker i C5, ikke slettes eller omdøbes, men data som er indeholdt i det pågældende temporære kartotek bliver ikke gemt, og optager derved ikke disk-plads. Når man bruger temporære kartoteker, har man altid et felt der skal hedde SessionId. Dette felt bruges til at styre hvem data tilhører. Derudover indgår feltet som første komponent i alle de index der oprettes. Dette felt skal oprettes som det første felt i det midlertidige kartotek. Dette skyldes, at systemet skal kunne adskille kartotekerne fra hinanden, i det tilfælde hvor der er flere brugere som benytter sig af det samme midlertidige kartotek. SessionId bruges til at adskille de forskellige kørsler fra hinanden og derved de data der måtte lige i det midlertidige kartotek. Dette betyder, at hver gang man skal bruge et temporært kartotek skal man bruge et nyt sessionId. Man kan med fordel benytte funktionen SESSIONID() eller macroen #GetTempId alt efter om det skal være entydigt pr. bruger eller pr. Session / Gang man skal bruge et sessionId som returnere et heltal som er lig med sessionsnummeret. Hvis man derudover har behov for flere instanser i den samme session så kan man anvende macrobiblioteket TMP_File, som indeholder en mængde macro’er til brug i midlertidige kartoteker. Se tabellen nedenfor. Der er mange, der mener, at man bør bruge et TMP kartotek så ofte som muligt. Man bruger derved det samme kartotek til flere forskellige opgaver og benytter kun kartoteks felterne og ikke feltnavnene. Det centrale er derfor kartotekets felt typer (REAL, INT, ENUM, STR; DATE osv.) Der kan opstå visse uhensigtsmæssigheder ved ”genbrug” af temporære kartoteker idet overblikket over felterne risikere at forsvinde ved gentagne brug af disse, oftest pga. manglende eller fejlbehæftede feltnavne. Det anbefales derfor, at oprette nye temporære kartoteker efter behov i 57 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale stedet for at genbruge de gamle temporære kartoteker. Koden bliver mange gange lettere at læse samt kartoteket nemmere at overskue. Et eksempel på brug af midlertidige (temporære) kartoteker kan være pris-opdateringer, hvor alle pris ændringerne laves i en form der bygger på et midlertidigt kartotek. Når brugeren forlader formen, spørges han om data skal gemmes. Svarer der ja til dette, køres der et program som opdaterer det permanente kartotek på baggrund af de data der ligger i det midlertidige kartotek. Macrobiblioteket TMP_File Dette makrobibliotek indeholder en masse lokalmakroer der med fordel kan anvendes i forbindelse med temporære kartoteker. Parametre med streg under er ikke påkrævet. Navn Funktion Parametre TMP_GETID Genererer et entydigt sessionnr til brug i et TMP kartotek %1 = Entydigt INT #GetTempId Kalder ovenstående macro op til 8 gange alt efter hvor mange parametre man har sat ind i macroen. %1 = Entydigt INT Sletter alle poster i et TMP kartotek med en bestemt session ID %1 = TMP Kartotek #TMP_Delete_EN %2-8 = Entydigt INT %2 = Index %3 = SessionId #TMP_Delete Sletter alle poster i et TMP kartotek med ovenstående macro for op til 5 sessionid’s %1 = TMP Kartotek %2 = Index %3 = SessionId %4-7 = SessionId #DeleteDatoSum, #DeleteKontoSum, #DeleteVirtuel, Disse macroer sletter ved hjælp af ovenstående macro det temporære kartotek, som hvis man udskifter Delete med TMP i macro navnet er et bibliotek #DeleteBetaling, #DeleteSum %1 = SessionId %2-5 = SessionId %6 som er angivet i macroen kan ikke anvendes da den macro der kaldes kun kan modtage 5 sessionid’s Fordele og ulemper ved TMP kartoteker Fordele Man samler data et sted under en nøgle Man kan opnå store hastigheds forbedringer specielt under SQL databaserne Man kan lave simuleringer som ikke behøver at opdateres. 58 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Ulemper Det kan være svært at overskue. Man skal huske at overføre sessionid mellem forskellige XAL elementer 59 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgaver Opgave 1: Temporære priser Formål med opgaven At lave en kørsel der kan vise en prisforhøjelse, og eventuelt korrigere dem individuelt. Hvis prisforhøjelserne godkendes skal de skrives ned i kartotekerne. Beskrivelse Du skal oprette et TMP kartotek TMPUdlPriser. Derefter skal du ændre kørslen InvenChangePrice, så den i stedet for at skrive ændringerne direkte, lægger ændringerne ned i TMPUdlPriser. Derefter skal der laves en form, der skal vise indholdet af TMPUDLPriser, og hvis man godkender skal oplysningerne skrives ind i kartoteket. Hvis ikke der godkendes skal TMPUDLPriser slettes. Forløb √ 1 Opret det nye Tmp kartotek TMPUDLPriser med felterne Session, Udlånsnummer, ItemNumber, Udlånsstatus, Udlejningsværdi, Forsikringsværdi, UdlejningsPct og ForsikringsPct. Du skal selv definere de index du skal bruge. 2 Gå ind iQTXkørslen InvenChangePrice og tilret denne så TMPUDLPriser bliver udfyldt. 3 Lav en Form til TMPUDLPriser. Der skal sorteres på ItemNumber og udlånsstatus. 4 Man skal kunne ændre UdlejningsPct og ForsikringsPct manuelt. Dette skal så slå igennem på alle de Linjer med samme ItemNumber. 5 Hvis man godkender skal oplysningerne opdateres ned i Post og Sats kartotekerne. 6 Hvis man ikke godkender skal oplysningerne i TMPUDLPriser slettes 60 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 7. Temporære index Formål Formålet med denne lektion er at forklare begrebet temporære index, og lære om control-makroer til oprettelse og vedligeholdelse af disse. Emner Muligheder for anvendelse af temporære index Oprettelse af temporære index i en form med flere blokke Generelt Temporære index anvendes i forms, hvor der skal fremfindes og bladres i poster, hvortil der ikke findes et passende index. Situationen kan f.eks. opstå i en form med to blokke, hvor hovedblokken sorteres på Group, og underblokken skal vise debitorer, der tilhører den valgte gruppe i hovedblokken. Posterne i underblokken skal vises sorteret efter sprogkode, men da der ikke findes et index med sprogkode som første komponent, udføres sorteringen med et temporært index. Opbygning af temporære index Opbygning af temporære index udføres med controlmacroer, der alle findes i biblioteket FORMS. Desuden anvendes en macro i biblioteket TMP_FILE. Macroerne er listet i nedenstående skema, og forklares hver for sig i efterfølgende afsnit. Til sidst gives et samlet eksempel. Macroer til temporære index Bibliotek Macro Anvendelse TMP_FILE GetTempId Udleverer nummer til temporære index FORMS CREIDX Danner temporære index i forms GENIDX Indsætter samtlige records i temporære index ADDIDX Indsætter udvalgte records i temporære index DELIDX Sletter temporære index CheckCREIDX Checker oprettelsen af temporære index 61 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale GetTempId Macroen GetTempId der betyder Get Temporær Id, anvendes til at hente et entydigt nummer, der kan tildeles det temporære index. Syntaks #GetTempId(&Variabel) Macroen kræver som parametre, angivelse af en variabel, der kan opbevare nummeret. Den anvendes før CREIDX, sammen med erklæringen af variablen. Eksempel #MacroLoad(TMP_FILE) INT &IndexId #GetTempId(&IndexId) I dette eksempel macroloades biblioteket TMP_FILE, idet macroen #GetTempId findes i dette bibliotek. Variablen &IndexId erklæres, og tildeles med macroen #GetTempId en værdi i form af et nummer. CREIDX Macroen CREIDX der betyder Create Index, anvendes til at oprette temporære index i forms. Indexformlen opbygges af felter på samme måde som under oprettelse af index i kartotekerne i databasen. Syntaks #Frm_CREIDX(bloknavn,indexnavn,formel) Bloknavn er navnet på den blok indekset tilhører, og indexnavn er navnet på det temporære index. Formel er en liste over de felter der indgår i indekset, og kan angives på samme måde som i index oprettet direkte på kartoteker. Eksempel #MacroLoad(TMP_FILE) INT &IndexId #GetTempId(&IndexId) #Frm_CREIDX(CustTable,’Tmp’+Num2Str(&IndexId,0,0,0,0),Language_) #CheckCREIDX 62 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale I ovenstående eksempel oprettes et index med navnet ’Tmp’+et nummer fra #GetTempId. Da nummeret er et tal konverteres det til en tekst med funktionen Num2Str, så det kan tilføjes efter ordet ’Tmp’. Efter oprettelsen kontrolleres om det var muligt at gennemføre funktionen. Indexnavnet skal også anvendes i de øvrige macroer, og hvis det synes besværligt at anvende indexnavnet som beskrevet i eksemplet, kan der laves en lokalmacro til opbygning af indexnavnet, som vist i herunder. Eksempel på lokalmacro til opbygning af indexnavn #MacroLoad(TMP_FILE) INT &IndexId #GetTempId(&IndexId) #LocalMacro.IndexNavn ’Tmp’+Num2Str(&IndexId,0,0,0,0) #EndMacro #Frm_CREIDX(CustTable,#IndexNavn,Sprog) #CheckCREIDX Ved at anvende metoden fra ovenstående eksempel bliver det nemmere at anvende indexnavnet i efterfølgende macroer. Indexdefinitionen oprettes så snart macroen udføres, og kan anvendes umiddelbart efter i en anden indexmacro f.eks. #Frm_Index. Indekset indeholder ikke nogen records. Disse indsættes med GENIDX eller ADDIDX. Indekset kan slettes med DELIDX. Hvis det ikke slettes med denne kommando, slettes det under alle omstændigheder, når C5 forlades. GENIDX Macroen GENIDX der betyder Generate Index, anvendes til at indsætte records i temporære index, der er oprettet med CREIDX. Macroen indsætter samtlige records i kartoteket. Hvis det ikke er alle records der skal indsættes, anvendes macroen ADDIDX. Syntaks #Frm_GENIDX(bloknavn,indexnavn) Bloknavn er navnet på den blok indekset tilhører, og indexnavn er navnet på det temporære index. Eksempel #Frm_GENIDX(CustTable,#IndexNavn) 63 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale I ovenstående eksempel tilføjes samtlige poster til indekset ’IndexNavn’ der tilhører blokken CustTable. ADDIDX Macroen ADDIDX der betyder Add Index, anvendes til at indsætte records i temporære index der er oprettet med CREIDX. Macroen indsætter udvalgte records i kartoteket. Recordens RecId indsættes i variablen med navnet &RecNo, hvorefter macroen ADDIDX kaldes. Funktionen anvendes typisk i en søgeløkke, hvori der udvælges de records der skal indsættes i det temporære index. Syntaks #Frm_ADDIDX(bloknavn,indexnavn) Bloknavn er navnet på den blok indekset tilhører, og indexnavn er navnet på det temporære index. Eksempel #Frm_ADDIDX(CustTable,#IndexNavn) I ovenstående eksempel tilføjes der udvalgte records til indekset ’SprogKode’ der tilhører blokken CustTable. Se afsnittet med komplet eksempel. DELIDX Macroen DELIDX der betyder Delete Index, anvendes til at slette index der er oprettet med CREIDX. Hvis index ikke slettes på denne måde, slettes de automatisk når brugeren forlader C5. Syntaks #Frm_DELIDX(bloknavn,indexnavn) Bloknavn er navnet på den blok indekset tilhører, og indexnavn er navnet på det temporære index. Eksempel #Frm_DELIDX(CustTable,#IndexNavn) I ovenstående eksempel slettes indekset ’#IndexNavn’ der tilhører blokken CustTable. 64 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale CheckCREIDX Macroen CheckCREIDX der betyder Check Create Index, anvendes til at kontroller om index kan oprettes. Det kan f.eks. være at der ikke er plads i memory. Syntaks #CheckCREIDX Macroen kræver ingen parametre. Den anvendes efter CREIDX. Eksempel #Frm_CREIDX(CustTable,#IndexNavn,Language_) #CheckCREIDX I ovenstående eksempel oprettes indekset ’IndexNavn’ der tilhører blokken CustTable. Efter oprettelsen kontrolleres om det er muligt at gennemføre funktionen. Triggere Når der skal anvendes temporære index i forms, opbygges indeksene med ovenstående macroer. Macroerne angives i forskellige triggere afhængigt af hvilken funktionalitet formen skal have. Der kan således ikke opstilles en entydig regel for i hvilke triggere macroerne anvendes. Nedenstående skema viser hvornår nogle af triggerne aktiveres i forms. Forms-triggere i vinduet Triggere Aktivering Init Første trigger der startes Exit Når der tastes F3 eller Esc Abort Når der tastes Alt+Q Refresh Når #Frm_Refresh er anvendt Pre-key Når der trykkes på en lokal procestaste Post-key Når en lokal procestaste er blevet udført Mouse Når musen aktiveres i formen Error Under afvikling ved fejl i control kommandoer Event Når system events indtræffer f.eks. resize vindue Pre-form Umiddelbart efter Init triggeren Post-form Umiddelbart inden Exit og Abort triggerne 65 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Event-triggere i blokken Triggere Aktivering Pre-record Når der skiftes til en ny post i formen Post-record Når den aktuelle post forlades Pre-block Når der skiftes til en anden blok i formen Post-block Når den aktuelle blok forlades Post-load Umiddelbart før poster skrives på skærmen Pre-insert Inden poster indsættes i selve kartoteket Post-insert Efter en vellykket indsættelse af en post i kart. Pre-update Før opdatering af poster i en blok Post-update Efter en vellykket opdatering af poster i en blok Pre-delete Før sletning af poster Post-delete Efter en vellykket sletning af poster Post-fail Efter opdatering, indsættelse eller sletning der fejlede. Pre-menu Når et menupunkt vælges Post-menu Efter et menupunkt er valgt Init-record Når der oprettes en ny post i en form Filter Hver gang en post findes frem f.eks. med #Frm_Search Lookup Fremfinding af poster 66 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Key-triggere i blokke Triggere Aktivering NXTFLD Næste felt PRVFLD Forrige felt TOPREC Første post i kartotek ENDREC Sidste post i kartotek NXTREC Næste post (record) PRVREC Forrige post (record) NXTBLK Næste blok PRVBLK Forrige blok NXTFRM Næste side med poster PRVFRM Forrige side med poster NXTPGE Næste side PRVPGE Forrige side CLRBLK Clear blok (slet data i blok) BLKMNU Blokmenu kaldes FNDREC Find specifikke poster ADDREC Tilføj post DELREC Slet post COMMIT Opdatér post i databasen Userkey-triggere i blokke Triggere Aktivering USRKEY0 Userkey nr. 0 USRKEY1 Userkey nr. 1 USRKEY2 Userkey nr. 2 USRKEY3 Userkey nr. 3 USRKEY4 Userkey nr. 4 USRKEY5 Userkey nr. 5 USRKEY6 Userkey nr. 6 USRKEY7 Userkey nr. 7 USRKEY8 Userkey nr. 8 USRKEY9 Userkey nr. 9 67 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Felt-triggere Triggere Aktivering Pre-field Før cursoren går ind i feltet Post-field Når cursoren forlader feltet Post-change Når feltet forlades og der er udført ændringer Post-load Som Post-load på blokke, men kun for synlige felter Post-edit Efter ændring i et felt inden værdien gemmes Mouse Når musen aktiverer feltet Eksempel på form med to blokke Nedenstående eksempel omhandler en form med to blokke: CustGroup CustTable CustGroup er hovedblokken der styrer aktiviteterne i underblokken CustTable. I hovedblokken vises gruppe med navn, og i underblokken vises debitorernes konto, navn og sprogkode. I underblokken vises kun de poster der tilhører gruppen, der vises i hovedblokken, og posterne vises sorteret efter sprogkode i et temporært index. Triggere i vinduet Trigger XAL kode Kommentar Init #Macroload(FORMS) #MacroLoad(TMP_FILE) Åbner biblioteker INT &IndexId #GetTempId(&IndexId) Erklærer variabel #LocalMacro.IndexNavn ’Tmp’+Num2Str(&IndexId,0,0,0,0) #EndMacro Lokalmacro til indexnavn #Frm_CREIDX(CustTable,#IndexNavn, Language_) Temporært idx dannes #CheckCREIDX Check opret Exit #Frm_USRKEY(CustGroup,9) Kald usrkey 9 Abort #Frm_USRKEY(CustGroup,9) Kald usrkey 9 Error #FormError Fejlmacro Pre-form #Frm_Index(CustGroup,GroupIdx) Sorteringsidx #Frm_Search(CustGroup) Første post 68 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Triggere i hovedblok ’CustGroup’ (styrer opslag i underblok ’CustTable’) Trigger XAL kode Kommentar Prerecord #Frm_USRKEY(CustGroup,8) Kald UsrKey 8 USRKEY #Frm_DELIDX(CustTable,#IndexNavn) #Frm_CREIDX(CustTable,#IndexNavn, Language_) Danner poster til temporære index. SEARCH CustTable WHERE CustTable.Group == CustGroup.Group AND CustTable.Language_ &Language Poster fra CustTable tildeles til variablen &RecNo. Indsættes i temporære index. nr 8 == SET &RecNo = CustTable.Recid #Frm_ADDIDX(CustTable,#IndexNavn) END #Frm_INDEX(CustTable,#IndexNavn) #Frm_Search(CustTable) USRKEY Nr 9 Index og Første post IF &IndexId THEN #Frm_DELIDX(CustTable,#IndexNavn) ENDIF Temporært index slettes Triggere i feltet &Sprogkode i hovedblokken Trigger XAL kode Kommentar Post-Field #Frm_USRKEY(CustGroup,8) Kald UsrKey 8 69 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgaver Opgave 1: Form med to blokke og temporære index Formål med opgaven At oprette en form med to blokke, hvor underblokkens poster styres med et temporært index Beskrivelse Der skal oprettes en form med to blokke, der tilhører hvert sit kartotek. Kartotekerne er InvenTable og UDLUdlånsPost. InvenTable er en ’Enkelt record blok’ og UDLUdlånsPost er en ’multi record blok’. Debitorudlån InvenTable UDLUdlånsPost Posterne i underblokken UDLUdlånsPost styres med et temporært index, idet der kun skal vises poster fra det ItemNumber der vises i hovedblokken. Desuden skal posterne sorteres efter UdlånsStatus og Serienummer, hvortil der ikke er noget index, og der skal anvendes et temporært index i stedet. Desuden skal det være muligt, kun at få vist poster med et bestemt udlånstype, der indtastes i et virtuelt felt i hovedblokken. 70 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale √ Forløb 1 Opret formen ’VareUdlånUdlån’ med to blokke som vist herover. Blokken InvenTable til kartoteket med samme navn skal være en Enkelt Record Blok. Blokken UDLUdlånsPost til kartoteket med samme navn, skal være en multi record blok. 2 Felter i blokken InvenTable ItemNumber, ItemName1 og det virtuelle felt Status 3 Felter i blokken UDLUdlånsPost Account, SerieNummer, UdlånsStatus og ItemNumber. Alle felter sættes til at springes over. 4 Styring, synkronisering og temporære index Indtast nødvendige control macroer for styring og synkronisering af blokkene. Anvend temporære index så poster i underblokken kun tilhører det aktuelle ItemNumber og desuden sorteres efter UdlånsStatus og SerieNummer. Når der vælges status i det virtuelle felt &Status i hovedblokken skal der i formen straks skiftes til visning af poster med den indtastede status. 6 Godkend og afprøv formen Afprøv om synkroniseringen og det temporære index virker korrekt, og afprøv om der kan. 71 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 8. XAL Systemsammenhænge Formål Formålet med denne lektion er at give deltagerne kendskab til de værktøjer, der i C5 benyttes til at få et overblik over systemsammenhænge. Emner Oprettelse og anvendelse af Datadictionary Kort gennemgang af Visio Brugen af formen Databaserelationer Opsætning og brug af versionskontrollen Datadictionary Dette begreb er noget af det sværeste at forklare, da alle der kender til det, helst vil bruge sin egen eller en af de store teoretikers måde. Et datadictionary er en tegning, der viser sammenhænge i databasen mellem de forskellige tabeller/Kartoteker. Der er en hel masse forskellige måder, at vise dette på. Vi har valgt at vise det på følgende måde: Tabel En til mange relation VendTable VendTrans En til en relation Det lille eksempel til højre viser, hvordan VendTable og VendTrans har en ’en til mange’-relation. Man kan udvide dette eksempel, ved at skrive det eller de felter, som relationen består af. Man kan derudover også lave et procesdiagram, som er en oversigt over, hvordan systemet er opbygget og hvilke arbejds- og IT processer der foregår. 72 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Databaserelationer Databaserelationer kan bruges til mange ting, men der er en del situationer, hvor de ikke kan bruges. Men kan man bruge relationer, bør man det. En anden del af relationerne er, hvis man f.eks. har et notat på en post. Så skal man selv sørge for at slette disse notater, hvis posten slettes. Dette bør gøres nede på DBD triggerne, for at sikre at det sker uanset hvorfra det sker. Der kan altså være relationer uden at der er opsat database relationer på databasen. Man kan generelt sige, at der en del situationer, hvor man bør undersøge om der er relationer mellem forskellige kartoteker. Et af problemerne i XAL sproget er, at mange af de regler der er, ligger i de forskellige forms i stedet for der, hvor man logisk set ville placere dem. De situationer og steder hvor man bør undersøge om der er en relation er følgende: DBD Triggerne DBD Felterne FRM Triggerne FRM Er der direkte opslag FRM Er der en search på noget. XAL Er der direkte opslag XAL Er der search på noget Er der notat på felterne Er der notat på notatet Er der relationer opsat Eksempel hvor databaserelationer ikke kan anvendes Hvis man i en virksomhed har behov for, at kunne oprette en ordrelinje uden at have et ordrehoved på, fordi man skal kunne køre ud til kunder i nød, uden at kende til hvem kunden er på forhånd. Man har derfor ikke de nødvendige oplysninger til at udfylde Ordrehovedet. Versionskontrollen C5 indeholder en funktion til styring af tilretningerne i applikationen. Funktionen hedder versionskontrollen og findes under Generelt/Tilpasning/Vedligeholdelse/Versionskontrol og omfatter nedenstående funktioner. Oversigt Versionskontrollen indeholder en oversigt over alle database- og applikationselementer med direkte mulighed for editering og afvikling af de enkelte elementer. Historik Til alle tilretninger, der er foretaget i versionskontrol-systemet, er der mulighed for tilknytning af kommentarer. Derudover registreres sidste rettelse med dato og tidspunkt, samt hvem der har foretaget rettelsen. 73 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Sammenhænge Der er mulighed for gennem scanning af applikationers elementer, at få en oversigt over sammenhængen mellem de enkelte database- og applikationselementer. Låsning Alle tilretninger foretaget i versionskontrollen sker ved låsning af det aktuelle element, så andre brugere ikke kan rette i elementet gennem versionskontrollen. Bemærk! Ovenstående fordele kan kun opnås gennem brug af versionskontrollen. Historik og låsning tager ikke højde for direkte kald til de enkelte udviklingsprocesser udenom versionskontrollen. Informationen vedrørende versionskontrollen kan med fordel placere i sin egen selvstændige database, dvs. regnskab (VCS). Ved opstart af versionskontrollen forsøges skift af database til C5DATA.VCS. Hvis dette ikke lykkedes, benyttes den aktuelle database. Ved opstart af versionskontrollen fremkommer en meddelelse om, at der er fejl i opsætningen af versionskontrollen. Dette skyldes, at forkortelsen på versionskontroldatabasen skal angives under opsætningen, som foretages via lokalmenuen. Elementtyper i versionskontrollen Der er følgende elementtyper der kan indeholdes i versionskontrollen: DBD Kartotek ENM Fasttekst IDX Index FRM Form LMC Lokalmacro LST Listbilleder MAC Macro PRD Printer QTX Søgninger REP Rapport SXL System-trigger XAL XAL-kørsel UXL User-Hook MNU Undermenuer MNX Gittermenuer 74 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Beskrivelse af elementer Det enkelte element er beskrevet med følgende felter: Type Felt angiver elementets type. Der er følgende muligheder: DBD: Kartotek ENM: Enum FNC: Funktion FRM: Form IDX: Index LMC: Localmacro LST: Listbillede MAC: Macro MNU: Lokalmenu PRD: Printer QTX: Søgning REP: Rapport SXL: Systemtrigger TRG: Databasetrigger UXL: Userhook XAL: XAL-kørsel Navn Feltet indeholder navnet på det aktuelle element. Index og listbilleder tilføjes kartoteknavnet før navnet, mens lokalmacroerne er tilføjet macrobiblioteket efter navnet. Fil Angivelse af hvilket niveau, det aktuelle element er tilgængeligt fra. Elementet kan også være placeret i andre niveauer, men disse er overskygges af angivne niveau. Date Dato for sidste rettelse af elementet igennem versionskontrollen. Time Copyright © 2011 Microsoft. C5 er et varemærke, der tilhører Microsoft. Produkter og firmaer nævnt i dette dokument er varemærker, der tilhører deres respektive ejere. Indholdet i dette dokument må på ingen måde gengives - helt eller delvist hverken på tryk eller i anden form uden forudgående tilladelse fra Microsoft. Indholdet i dette dokument kan ændres uden varsel. Der tages forbehold for tryk- og stavefejl. Microsoft Development Center Copenhagen, Frydenlunds Allé 6, DK-2950 Vedbæk, Danmark Tlf.: +45 4567 8000, www.microsoft.dk/C5 Tidspunkt for sidste rettelse af elementet igennem versionskontrollen. User Brugernavn, der har foretaget den sidste rettelse af elementet igennem versionskontrolsystemet. Låst og Af Angivelse af om elementet aktuelt er låst samt brugeren der har låst elementet. Eksport, Dato, Tid og Størrelse Angivelse af elementets eksportfils navn med tilhørende dato, tid og størrelse for den sidste eksport af elementet. Funktioner under versionskontrollen Versionskontrollen indeholder følgende funktioner i lokalmenuen: Opsætning/Opsætning Menupunktet benyttes til opsætning af versionskontrollen virkemåde. Versionsdatabase Her angives forkortelsen på den aktuelle versionskontrol databasen. Afviklingsdatabase Her angives forkortelsen på den ønskede database, som benyttes ved afvikling af elementerne med funktionen Alt+R. Automatisk scan Her angives om versionskontrollen automatisk skal gennemlæse elementet efter ændringer for at opdaterer kartoteket med sammenhænge mellem elementerne. Dette sikrer at kartoteket er ajour, men kræver en ekstra tid for hver rettelse. Alternativt kan der periodisk køres en generel gennemlæsning af alle elementer. Denne gennemlæsning kan evt. afgrænses med hensyn til dato for sidste rettelse. Eksportsti Her angives hvilket directory elementerne eksporteres til og importeres fra med funktionerne Eksport og Import. Brugernavn Her angives hvilket brugernavn, der skal fremgå af overskriften på notaterne omkring ændringer i applikationen. Opsætning/Opdatering Menupunktet benyttes til oprettelsen af poster i applikationskartoteket for elle eksisterende databaseog applikationselementer. Ved aktivering af menupunktet gennemlæses database- og applikationsfilerne, og kartoteket opdateres. Opdateringen tager et stykke tid. Under opdateringen vises det aktuelle element på skærmen. Opsætning/Brugere Menupunktet aktiverer skærmbilledet til oprettelse og vedligeholdelse af brugere, grupper og sammenhængen mellem disse. Opsætning/Rettigheder Menupunktet aktiverer skærmbilledet til vedligeholdelse af gruppernes rettigheder. Benyttelse 76 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Menupunktet benyttes til forespørgsler vedrørende det aktuelle elements sammenhænge med de øvrige elementer. Skærmbilledet skifter til fanebladet Benyttelser, hvor de fundne sammenhænge vises. Menupunktet benyttes til undersøgelse af ændringerne mellem standardapplikationens element og det tilrettede element. Undersøgelsen benytter MS-DOS programmet FC.EXE og kan derfor kun benyttes under MSDOS v5.0 eller højere. Skærmbilledet indeholder elementet med markering af Linjer, der kun eksisterer i den ene eller anden version af elementet. Dette er dels markeret med farver på Linjerne, dels med mærker i venstre side, som viser, om Linjen er indsat ”>” eller fjernet ”<” i den tilrettede version. Med tasterne Ctrl+PgDn og Ctrl+PgUp er det muligt at bladre direkte mellem de fundne forskelle. Via lokalmenuen er der mulighed for at udskrive sammenligningen i en rapport. I rapporten er tilføjet linjenumre i de to eksporterede elementer. Forskelsrapport Menupunktet benyttes også til undersøgelse af forskelle mellem elementer i standardapplikationen og tilretningerne. Kørslen er beskrevet nedenfor. Udviklingsrapport Menupunktet benyttes til udskrivning af notaterne på de ændrede elementer. Rapporten sorteres og afgrænses valgfrit på de enkelte elementer. Efter opsætningen af sortering og afgrænsning promptes der for, om rapporten er ekstern, hvilket betyder, at information omkring datoer og brugere fjernes fra rapporten. Menu Menupunktet aktiverer menueditoren på den aktuelle menu. Kartotek oversigt Menupunktet aktiverer skærmbilledet med oversigt over kartoteker, felter og index. Skærmbilledet er beskrevet under DBD/Diverse/Oversigt. Shell Menupunktet aktiverer en midlertidig shell til operativsystemet. Sammenhænge Som nævnt ovenfor er det muligt at opdatere og forespørge på sammenhængen mellem de enkelte database- og applikationselementer. Ved aktivering af funktionen benyttelse i lokalmenuen skiftes til fanen Benyttelser under versionskontrollen. Øverst vises det aktuelle element. Nedenfor vises dels hvor det aktuelle element er benyttet i andre elementer, og hvilke andre elementer det aktuelle element benytter. De enkelte benyttelser er beskrevet ved hjælp af følgende felter: Type Feltet indeholder typen på det pågældende element. Navn Feltet indeholder navnet på det pågældende element og er ligesom Type identisk med navnene på fanen Versionskontrol. Kald Ved benyttelse af kartoteker og index er der angivet her, hvilkenform benyttelsen har. 77 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Specifikation Ved benyttelse i elementer, som består af en række selvstændige kørsler (Triggere) er det angivet her, i hvilken af disse den givne benyttelse er fundet. Linje Feltet indeholder linjenummeret, hvor den pågældende benyttelse er fundet. Ved elementer med flere Triggere er det linjenummeret i den enkelte trigger. 78 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgaver Opgave 1: E / R diagram på CustTable Formål med opgaven At lave en gruppe opgave der viser relationer og sammenhænge for kartotekerne CustTable og CustTrans. Beskrivelse I skal i hver gruppe tegne et E/R diagram der viser relationerne mellem kartotekerne. Både dem der er lavet på DBD niveau, og dem der er kodet i formen og andre steder. 79 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 9. Gennemgang af Bilag Scope Formål Formålet med denne lektion er at give deltagerne overblik over, hvornår man har adgang til en buffer (Kartotek). Emner SEARCH, EXTERN, IF 1 THEN og INTRODUCE Scope i forbindelse med en form Variabel erklæring. Hvad er Scope? Scope er når man har adgang til en buffer (Kartotek eller Variabel), dvs. at man kan få fat i indholdet af de enkelte variabler. SEARCH Når man gennemløber et kartotek (med SEARCH kommandoen) får man automatisk scope til det kartotek man gennemløber. Man har scope mellem kommandoerne SEARCH og END. Eksempel på hvor man har scope i en search løkke: STR 10 &Til Ingen Scope SEARCH VendTable SET &Til = Account Scope dvs. adgang til felterne PRINT Account END PAUSE Ingen Scope Extern Når man skal overføre parametre fra et element til et andet, kan det gøres på to måder. Nemlig med Globale variabler eller med en buffer. I de globale variabler har man scope til og fra alle elementer, f.eks. &Parm. Mens man selv kan styre en buffer på en helt anden måde. Hvis man laver et menukald (f.eks. via lokalmenuen F10) bliver denne bloks record automatisk lavet til en buffer. Hvis man derimod laver et proceskald skal man bruge USING for at i kaldet for at få lavet en buffer. 80 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel på proceskald INTRODUCE InvenTable[ItemIdx=="1.44"] PROCESS 17 "Form=InvenTable" USING InvenTable For at få adgang til denne buffer skal man bruge kommandoen EXTERN, derved får man adgang til alle de felter der i bufferen. Man er nødt til at lave et EXTERN kald i hver enkelt trigger/XAL, hvor man har behov for at bruge bufferen. Eksempel på brug af Extern {Dette er en XAL til demo af EXTERN den er blevet kaldt fra CustTable via et menu punkt d.v.s. der er dannet en buffer med navnet CustTable} STR 10 &Debkonto EXTERN CustTable SET &DebKonto = CustTable.Account SEARCH CustTrans WHERE CustTrans.Account == &DebKonto PRINT CustTrans.Open,CustTrans.Account,CustTrans.RowNumber END IF 1 THEN Dette lille trick bruges til at afgrænse scope i forbindelse med INTRODUCE og andet. 81 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel på IF 1 THEN (Udsnit af XAL=PayCalculate) .... #DefIdxTable(Periods,STR 10,DATE,,25) #IniIdxTable(Periods,1) // Memory Cache with periods SET &Err_Num = 0 SET &Err_Log[0] = '' IF 1 THEN // Limitation of scope EXTERN PayEmplTable IF Employee THEN #Element(&Parm,&TmpTxt) // &TempId #Element(&Parm,&TmpTxt) SET &Statement = Str2Date(&TmpTxt,123) SET &Debug = Str2Num(&Parm) SET &PayRun = 0 SET &Simulate = 1 #GetTempId(&LogId) INTRODUCE TmpPayCalculate SET Session = &LogId SET Employee = PayEmplTable.Employee INSERT TmpPayCalculate SET &CheckSession = Num2Str(&LogId,0,0,0,0) SET &Available = &Statement #Prompt #StrPrompt("@SYS9989") GET(&Available FIELDHELP "@SYS8869" ), #PromptAbort(10,4) ELSE EXTERN Parameters #Element(&Parm,&TmpTxt) // TempId SET &LogId = Str2Num(&Parm) SET &Statement = Date1 SET &Available = Date2 SET &PayRun = Int1 SET &CheckSession = &Parm SET &CheckBlocked = NoYes15 ENDIF ENDIF .... 82 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale {+--------------------------------------------------------------------+} {¦ Initialization of temporary calculation ¦} {+--------------------------------------------------------------------+} TTSBEGIN PayEmplTable TTSBEGIN TmpPayCalculate TTSBEGIN TmpPaySum #GetTempId(&SumId) #DeletePaySum(&SumId) {+--------------------------------------------------------------------+} {¦ Scanning of the individual employee ¦} {+--------------------------------------------------------------------+} INTRODUCE PayTableRate INTRODUCE TmpPayCalculate RENAME Calculate SEARCH TmpPayCalculate RENAME EmplLog USING EmplNumIdx WHERE Session == &LogId AND Type == 0 SET Amount = #SysLoadTime SET &Err_PreFix = #StrPrompt(Employee,10) INTRODUCE Employee[EmplIdx,Employee] INTRODUCE PayEmplTable[EmplIdx,Employee] .... I eksemplet ovenfor, som er taget fra XAL’en ’Paycalculate’, bruges kartoteket PayEmplTable senere i kørslen, og for at afgrænse den første brug af PayEmplTable bruges IF 1 THEN til at afgrænse/afskærme mellem de to gange PayEmplTable bruges. 83 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale INTRODUCE Introduce åbner en buffer med samme navn som kartoteket. Man kan derudover vælge, hvilket index og hvilken styrende variabel man vil bruge, til at identificere den præcise record med. Hvis man finder den præcise record, bliver den pågældende buffer fyldt med en kopi af recorden. 3 eksempler på brug af introduce {1 eksempel:} INTRODUCE VendTable {Så har man scope til en tom buffer med alle felter fra VendTable kartoteket.} {2 eksempel:} INTRODUCE VendTable[AccountIdx] {Så har man scope til en tom buffer med alle felter fra VendTable kartoteket. Man kan derudover bruge FIND, NEXT, PREV, FIRST, LAST i den rækkefølge som indekset angiver} {3 eksempel:} INTRODUCE VendTable[AccountIdx,”11”] {Så har man scope til en buffer med alle felter fra VendTable kartoteket fra lige netop den record med Account ”11”.} Scopet i de tre ovenstående eksempler varer lige indtil det pågældende element/trigger bliver nedlagt. Scope i forbindelse med en form Når man opretter en blok i en form, får man samtidig scope til en buffer med samme navn som blokken. Dette betyder dog, at man ikke får fyldt sin/sine buffere med data før, man har lavet ”#Frm_Search”. Men man har adgang til bufferen i alle triggere. Man kan derudover lave en almindelig Introduce. Variabel erklæring Variabler skal erklæres i starten af en XAL/Trigger. I forms og QT’ere kan man erklære ”globale” variabler i init triggeren. I den forbindelse betyder global at de kan bruges i hele det pågældende applikationselement. Derudover kan man i hver trigger erklære lokale variabler, som kun kan bruges i den pågældende trigger. 84 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 10. Dobbelte direkte opslag Formål Formålet med denne lektion er, at lære deltagerne at opbygge dobbelte direkte opslag. Emner Opbygning af dobbelte direkte opslag Direkte opslag generelt Direkte opslag er som navnet hentyder, til et ’opslag direkte’ i et andet kartotek end det der behandles lige nu. I nogle situationer kan det være nødvendigt at gå gennem flere kartoteker, for at finde frem de ønskede data. I sådanne situationer anvendes dobbelte direkte opslag. Enkelt opslag Enkelt direkte opslag består af fire hovedkomponenter. Komponenter i et direkte opslag Denne værdi er kendt og kan evt. stamme fra det aktuelle kartotek Kartoteksnavn[IndexNavn, Udtryk].Feltnavn Disse tre værdier tilhører alle det kartotek, der skal slås op i. Bemærk placeringen af de firkantede parenteser, kommaet og punktummet. De enkelte komponenter behandles i efterfølgende skema. 85 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Betydning af de enkelte komponenter i direkte opslag Komponent Betydning Kartoteksnavn Navn på opslagskartotek hvorfra der skal hentes en værdi. IndexNavn Navn på et Index i opslagskartoteket. Udtryk Et udtryk der består af en værdi, der findes i det angivne index. Skal der angives mere end én værdi for at slå op i indekset, adskilles disse med kommaer. Værdien kan anføres direkte, eller i form af navn på et felt eller en variabel. Feltnavn Navn på felt i opslagskartotek, hvorfra der skal hentes en værdi. [] Direkte opslag skal altid indeholde et sæt skarpe parenteser omkring indexnavnet og udtrykket. Komma Når der skal hentes en bestemt værdi i opslagskartoteket, skal den hentes vha. af et opslag i indekset. I opslaget sættes index lig med udtryk. Dette angives ved at sættet et komma eller dobbelte lighedstegn mellem Indexnavn og Udtryk. Punktum Punktum sættes som angivelse af, at der efterfølger et felt. Eksempel på XAL kørsel med direkte opslag Direkte opslag kan anvendes i XAL kørsler, forms, rapporter osv. I nedenstående eksempel på en XAL kørsel anvendes direkte opslag til at hente sælgernavn i Employee kartoteket. Search CustTable PRINT Name PRINT ”Sælger: ”, Employee[EmplIdx==CustTable.SalesRep].Name PRINT ”” END PAUSE Resultat Toftmark møbel Sælger: Lone Jensen Interiør Bolig Sælger: Ole Pedersen .... 86 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Dobbelte direkte opslag Dobbelte direkte opslag består af ét direkte opslag indbygget i et andet. Komponenter i dobbelte direkte opslag Udtrykket er den værdi der bruges til opslaget i indekset. Ved dobbelte direkte opslag erstattes udtrykket af et andet direkte opslag Kartoteksnavn[IndexNavn, Udtryk].Feltnavn Disse tre værdier tilhører alle det kartotek, der skal slås op i. Kartoteksnavn2[IndexNavn2,Udtryk].Feltnavn2 Bemærk placeringen af de firkantede parenteser, kommaet og punktummet. Eksempel på XAL kørsel med direkte opslag efter bynavn SEARCH CustTable PRINT Account, ” ”, Name, ” ”, LedTable[AccountIdx, CustGroup[GroupIdx, CustTable.Group].GroupAccount].Account END PAUSE Resultat 45999300 42983214 Microsoft Data A/S Debitorer Superfos korn A/A Debitorer I eksemplet med XAL kørslen er det dobbelte direkte opslag fordelt over flere linjer. Dette er kun for at vises hele opslaget i eksemplet. I XAL editoren er det også tilladt at dele direkte opslag på denne måde, i stedet for at lade dem gå ud over kanten når de fylder for meget. 87 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 11. Kartoteket Notes Formål Formålet med denne lektion er at give deltagerne kendskab til opbygningen af kartoteket Notes. Desuden vises hvordan notater kan eksporteres og importeres. Emner Opbygning af kartoteket Notes Eksport og import af notater Generelt om notater Notater kan oprettes i næsten alle skærmbilleder i C5. Oprettelsen foregår ved i skærmbilledet at taste Alt+N. Herved åbnes et notatvindue til indtastning af teksten i notatet. Når notatet er indtastet og godkendt lukkes vinduet igen. Alle notater der oprettes på de enkelte skærmbilleder, gemmes ikke i de tilhørende kartoteker, men i kartoteket Notes. Felter i kartoteket Notes Kartoteket Notes indeholder notater fra samtlige skærmbilleder der findes i C5. Notater gemmes således kun ét sted dvs. i kartoteket Notes. Felt Forklaring RowNumber Postens RowNumber i kartoteket Notat LastChanged Dato for sidste ændring i denne post NotesFileId FileId på andet kartotek der ejer notatet NotesRecId RecId på post i andet kartotek der ejer notatet LineNumber Benyttes til sortering Txt Tekst med notat som det indtastes i et skærmbillede Date_ RecId Notatpostens egen RecId i kartoteket Notat FileId Notatkartotekets egen FileId i kartoteket i Notat 88 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Sammenhæng mellem oprettet notat og Kartoteket Notes CustTable Notes RowNumber RowNumber LastChanged LastChanged Account NotesRecId Name NotesFileId Osv. LineNumber Txt RecId FileId I ovenstående eksempel ses det, hvordan Notatposten “arver” RecId og FileId fra den post i CustTable der dannede notatet, og værdierne gemmes i felterne NotesRecId og NotesFileIdi Notes kartoteket. I kartoteket Notes ligger der således informationer om hvor notater hører til. Index på kartoteket Notes På kartoteket Notes er der et index med følgende indexformel: Indexnavn Indexformel NotesIdx NotesFileId, NotesRecId, LineNumber Ved oprettelse af et nyt notat i et skærmbillede vedligeholdes indekset automatisk, så notaterne altid kan findes frem igen. Bemærk! Hvis der oprettes en XAL kørsel eller en form hvori der kan slettes f.eks. debitorer uden at notaterne også slettes, kan notaterne ikke genfindes, idet nøglerne til notatet ikke længere findes i Debitorkartoteket (CustTable). Der findes så notater uden ”ejer”. Eksport og import af notater Ved eksport og import data i kartoteker er det vigtigt at gøre sig klart, hvilke felter der er behov for at eksportere. Det gælder specielt ved eksport og import af notater, da disse har en speciel sammenhæng til de kartoteker og poster der ejer dem. Alle kartoteker har systemfelterne FileId og RecId, og som det er vist tidligere i denne lektion har kartoteket Notes også felterne NotesFileId og NotesRecId, der indeholder identifikationen til det kartotek og den post, der ejer den aktuelle notatpost. 89 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Vigtigt! De to felter FileId og RecId er systemfelter, som systemet selv vedligeholder. Felterne er meget vigtige i forbindelse med at holde styr på dataene i databasen. Derfor må der ikke importeres feltværdier oven i disse to felter. Lad systemet styre værdien i disse felter, da der ellers er stor risiko for at ødelægge sammenhængen mellem poster og index i databasen. De to felter kan udmærket eksporteres, hvis der er behov for det, men de må ikke importeres direkte i de samme felter, da det under uheldige omstændigheder kan ødelægge databasen. Nøglefelter ved eksport og import Ud over de normale data der skal eksporteres og importeres, skal der tages højde for, hvilke nøglefelter der er brug for. Efterfølgende to eksempler er eksport og import af debitorkartoteket (CustTable) og notatkartoteket (Notes). Eksport af CustTable Ved eksport af CustTable er det vigtigt at få feltet Account med da det er nøglefelter i indexet AccountIdx. (Group skal med, da der altid skal være en gruppe angivet på debitorer) Felterne FileId og RecId har ingen betydning, da det er Account der er nøglen til debitorerne. Husk at FileId og RecId styres automatisk af systemet. Eksport af notat Ved eksport af notater er der flere vigtige felter der skal med. Indekset i NotesIdx indeholder felterne NotesFileId, NotesRecId og LineNumber. Alle felterne er vigtige, da de indeholder informationer om den post. der ejer notaterne, da de indgår i indexet. Felterne FileId og RecId har heller ingen betydning her, da det er NotatFileId, NotesRecId og LineNumber der er nøglen til debitorerne. Husk at FileId og RecId styres automatisk af systemet. I eksemplet er det således vigtigt at eksporteres filens nummer (FileId) og Linjenummer (LineNumber). Der er ikke noget formål i at eksportere notatposternes eget recordnummer, da det ikke er sikkert at posten får samme nummer, der hvor den importeres. Der er heller ikke noget formål i at eksportere NotesRecId der er ejerens record nummer (RecId). Det er jo heller ikke sikkert, at ejeren får samme nummer, der hvor denne bliver importeret. Det der skal eksporteres er ejerens ’Nøgleværdi’ der i tilfældet her er Account på debitoren. Da Account ikke findes i Notes, skal dette findes med et direkte opslag ved hjælp af NotesRecId, som vist i eksemplet. 90 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel på Eksport af CustTable med tilhørende Notat STR 254 &FilNavn1 STR 254 &FilNavn2 PROMPT "Eksport af CustTable",,, "Indtast filnavn1 : " GET (&FilNavn1 LENGTH 30), "Indtast filnavn2 : " GET (&FilNavn2 LENGTH 30) INPUT AT 20,5 SEARCH CustTable WRITE &FilNavn1 AS COMMA FROM (Account, Name, Group) END SEARCH Notes WHERE Notes.NotesFileId== FILENAME2ID("CustTable") WRITE &FilNavn2 AS COMMA FROM (NotatFileId, CustTable[RecID,NotesRecId].Account, LineNumber, Txt) END Import Ved import af notater er også vigtigt at holde sig for øje, at felterne FileId og RecId er systemfelter der vedligeholdes af systemet, og ikke bør modtage værdier via en import fra en fil. I eksemplet herunder indlæses posterne med READ kommandoen. Posterne læses ind i variabler, hvoraf nogle indeholder nøgleværdier, der kan bruges i INTRODUCE af kartotekerne. Efter INTRODUCE tildeles de øvrige variablers værdier til kartoteksfelterne, hvorefter disse opdateres eller indsættes med macroen #DbUpdate. I INTRODUCE til Notes kartoteket anvendes variablen med det indlæste Account, til i det direkte opslag at hente værdien i feltet RecId, på den debitor kontoen tilhører. På denne måde opstillet de rigtige parametre til INTRODUCE så den rigtige post kan opstilles til Notes kartoteket. Efter INTRODUCE tildeles feltet Txt værdien fra variablen af samme navn, og kartoteket opdateres med #DbUpdate. 91 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel på Import af CustTable og Notes STR 254 STR 254 STR 20 STR 30 STR 10 INT STR 20 REAL STR 250 &FilNavn1 &FilNavn2 &Account &Name &Group &NotesFileId &NotesAccount &LineNumber &Txt PROMPT "Eksport af CustTable",,, "Indtast filnavn1 : " GET (&FilNavn1 LENGTH 30), "Indtast filnavn2 : " GET (&FilNavn2 LENGTH 30) INPUT AT 20,5 READ &FilNavn1 AS COMMA INTO (&Account, &Name, &Group) INTRODUCE CustTable [AccountIdx, &Account] SET Name = &Name SET Group = &Group #DbUpdate(CustTable) END READ &FilNavn2 AS COMMA INTO (&NotesFileId, & NotesAccount, &LinieNumber, &Txt) INTRODUCE Notes[NotesIdx== &NotesFileId, CustTable[AccountIdx,& NotesAccount].RecID, &LineNumber] SET Txt = &Txt #DbUpdate(Notes) END Notater i Forms Til behandling af notater i forms skal der oprettes en procestaste til kald af notatvinduet. Der skal oprettes et felt, der kan vise om der er notater eller ej, og der skal indtastes flere forskellige macroer, der kan styre det hele. Herunder findes to skemaer, der er tiltænkt som en hjælp til at huske alt, hvad der skal udføres ved forms med én blok og ved forms med flere blokke. 92 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Notater på forms med én blok Procestast Opret procestaste Alt+P Proces .............: Parametre til proces: Hjælpetekst ........: Tast ...............: Notatfelt Form-afvikling Form=Notes (eller kun Notat) Notater Alt N Oprette virtuelt notatfelt F2 Opret et virtuelt heltalsfelt til notatvisning Pre-key Macro til notatvindue #NotesPreKey(Blok,Bredde,Højde,Kollonne,Linje,”Tekst”) Pre-form Macro til ændring af mærke i notatfelt (0 – 1 til n – N) #Frm_NotesMark(Blok,felt) Post-key Macro til ajourføring af notatfelt ved ændringer #NotesPostKeyMark(Blok,felt) Post-load Macro til ajourføring af notatfelt ved bladring #NotesMark(Blok,felt) Mouse Macro til åbning af notatvindue med mus #NotesKey 93 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Notater på forms med flere blokke Procestast Opret procestaste Alt+P Proces .............: Parametre til proces: Hjælpetekst ........: Tast ...............: Notatfelt Form-afvikling Form=Notat (eller kun Notat) Notater Alt N Oprette virtuelt notatfelt F2 I blok nr. 1: Opret et virtuelt heltalsfelt til notatvisning Notatfelt Oprette virtuelt notatfelt F2 I blok nr. 2: Opret et virtuelt heltalsfelt til notatvisning Pre-key Macro til notatvinduer IF &CurBlk == Blok1 THEN #NotesPreKey(Blok1,Bredde,Højde,Kollonne,Linje,”Tekst”) ELSE #NotesPreKey(Blok2,Bredde,Højde,Kollonne,Linje,”Tekst”) ENDIF Pre-form Macroer til ændring af mærke i notatfelter (0 – 1 til n – N) #Frm_NotesMark(Blok1,felt1) #Frm_NotesMark(Blok2,felt2) Post-key Macroer til ajourføring af notatfelter ved ændringer #NotesPostKeyMark(Blok1,felt1) #NotesPostKeyMark(Blok2,felt2) Post-load Macroer til ajourføring af notatfelter ved bladring #NotesMark(Blok1,felt1) #NotesMark(Blok2,felt2) Mouse 1 Macroer til åbning af notatvindue med mus (i blok 1) #Frm_GoBlk(Blok1) #NotesKey Mouse 2 Macroer til åbning af notatvindue med mus (i blok 2) #Frm_GoBlk(Blok2) #NotesKey 94 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Notater i rapporter Notater kan også udskrives i rapporter, og udtræk af notaterne kan udføres på tre forskellige måder: I Rapport-XAL I Rapport-QT Med macroer i Rapport-XAL eller Rapport-QT Udtræk ved hjælp af macroer er den nemmeste, og det anbefales at anvende denne metode i dagligdagen. Rapport Linje For at udskrive notaterne skal der først oprettes en Body Linje i Rapport definition’. Body Linjen består af Linjetypen ’Body’, kartoteket Notes og feltet Txt. Eksempel Body Notes Blød linje ’Blød linje’ Alt+B anvendes i skærmbilleder til notater, til at sørge for at de indtastede notater ikke går ud over kanten på skærmen. ’Blød linje’ kan også anvendes i Rapport layout med samme formål, at sørge for at hele teksten udskrives. Hvis ’Blød linje’ ikke anvendes er der risiko for at teksterne afkortes af systemet. Bløde linjer kendetegnes ved, at de starter med en lodret streg lige i starten af layoutområdet. Udledning af notater i Rapport-XAL Når notater udledes ved hjælp af SEARCH kommandoen, er det vigtigt at holde sig for øje at felterne NotesRecId og NotesFileId indeholder nøglerne til de poster der ejer notaterne. Disse nøgler anvendes derfor i WHERE sætninger for at sikre at det er de rigtige notater der udledes. Se eksemplet herunder. 95 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel (søgeløkke) SEARCH CustTable OUTPUT CustTable SEARCH Notes WHERE Notes.NotesRecId == CustTable.RecId AND Notes.NotesFileId== CustTable.FileId OUTPUT Notes END END Body Body CustTable Notes Account Name Txt I eksemplet hentes kun de notater, der tilhører de aktuelle debitorer, der gennemløbes i søgeløkken. Udledning af notater i Rapport-QT Notaterne kan også hentes i Rapport-QT. Eksemplet fra forrige afsnit om Rapport-XAL vises herunder udført i Rapport-QT. Eksempel på Rapport QT med notater Kartotek Afgrænsning CustTable Sortering...: Filter......: Kørsler.....: Notes Sortering...: Filter......: Kørsler.....: Fra Til Status Kørsler Åben Åben Skjul Kørsler Åben Åben Skjul 96 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opstilling af relation I Rapport QT opstilles relationerne i ’Relationsvinduet’ på underkartoteket, som i dette tilfælde er Notes. Relationsvindue til underkartoteket Notes Relater CustTable Notes Felt Felt RecId FileId NotesRecId NOtesFileId Output Altid Før join Tilføj Alle felter I rapport-QT er det også felterne NotesFileId og NotesRecId der sørger for, at det er de rigtige notater der udledes. Udledning af notater med #OutPutNotes Notater kan også udledes med macroen #OutputNotes, der findes i biblioteket REPORTS. Macroen anvendes til at hente notater til et givent kartotek, uden at kartoteket indsættes som søgeløkke i Rapport XAL eller som søgekartotek i Rapport QT. Syntaks #OutputNotes(<kartoteksnavn>) 97 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Rapport XAL I Rapport XAL skal biblioteket loades som det første i XAL koden, som vist i følgende eksempel. Eksempel (macro) #MacroLoad(REPORTS) SEARCH CustTable OUTPUT CustTable #OutputNotes(CustTable) END Body Body CustTable Notes Account Name Txt Bemærk at der ud over SEARCH løkken på CustTable, kun er indsat de to macroer. Det er således nemmere at udskrive notater ved hjælp af macroen, hvorfor dette anbefales i det daglige. Rapport QT Anvendes macroen i Rapport QT er Noteskartoteket overflødigt i afgrænsningsvinduet. Det vigtigst er at vælge den rigtige trigger i QT’en. Trigger Init Macroen #MacroLoad(REPORTS) skal ALTID indsættes i triggeren Init i ’Opsætningsvinduet’. Det er denne trigger, der aktiveres ført, når rapporten startes. Triggerne Post-OutPut og Post-Body Macroen #OutputNotes() kan indsættes i forskellige triggere afhængigt af hvornår, notaterne skal udskrives i forhold til hovedkartoteket. Post-output eller Post-body anvendes typisk når notaterne skal udskrives efter, posten i hovedkartoteket. 98 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 12. Prompt macroer Formål Formålet med denne lektion er at give deltagerne kendskab til Prompt macroerne. Emner Prompt macroer Generelt om promptmacroerne Grunden til at prompt macroerne bruges er, at de i modsætning til prompt kommandoen, ikke gemmer det sidst indtastede til næste gang den samme prompt bliver brugt. Der gøres brug af parameter kartoteket til at gemme de felter, man skal spørge om. Gennemgang af prompt macroerne Navn / Bibliotek Funktion Parametre #Prompt / Global Laver en prompt, macroloader Prompt_Util og laver en INTRODUCE på parameter kartoteket %1 = <UserID> %2 = <Navn> (Hvor navn er det navn man ønsker recorden gemt under i parameter kartoteket) #PromptLen / Prompt_Util Indeholder default længde på indledende tekster til prompt (20 tegn) Ingen parametre #StrPrompt / Prompt_Util Indeholder StrPrompt med mulighed for default Promptlængde %1 = <LedeTekst> #EmptyPrompt / Prompt_Util Laver en tom prompt med default længde #PromptLen %1 = <Længde på prompten> #EmptyField / Prompt_Util Bruges til at nulstille eventuelle str felter eller variabler med mulighed for default længde %1 = <Længde på prompten> # StrFile / Prompt_Util Returner tabelnavnet I en prompt med mulighed for default længde %1 = <Tabelnavn> # StrField / Prompt_Util Returner feltnavn I en prompt med mulighed for default længde %1 = <Tabelnavn> %2 = <Længde på prompten> %2 = <Længde på prompten> %2 = <Feltnavn> %3 = <Længde på prompten> 99 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Navn / Bibliotek Funktion Parametre #PromptAbort / Prompt_Util Benyttes til afslutning af prompt inkl. test for afslutning med alt Q %1 = <AT Kolonne> %2 = <AT Linje> %3 = <Kartoteksnavn> #PromptFromTo / Prompt_Util Laver en prompt med teksten Fra og Til med en default afstand på 10 %1 = <Afstand mellem fra og til> #GET_Field / Prompt_Util Bruges I stedet for GET kommandoen. Der laves en automatisk ledetekst fra databasen samt med REF til %3,%4 derudover kan man lave længden på promptfeltet om. %1 =<Feltnavn> %2 =<Længde af prompten> %3 =<Kartoteksnavn> %4 =<Feltnavn> %5 =<Længde af promptfelt %1> #GetDat / Prompt_Util Bruges i stedet for GET kommandoen men med en fast længde på indtastningsfeltet %1 = <Feltnavn> #NoYes / Prompt_Util Bruges i stedet for GET kommandoen men med en fast længde på 5 på indtastningsfeltet og kun på NejJa felterne %1 = <Feltnavn> #NoYes10 / Prompt_Util Bruges i stedet for GET kommandoen men med en fast længde på 10 på indtastningsfeltet og kun på NejJa felterne %1 = <Feltnavn> #NameDate / Prompt_Util Dette er kun en indirektion Ingen parametre Eksempel #MACROLOAD(PROMPT_UTIL) #PROMPT(CURUSERID(),’TESTNAVN’) ”Overskrift”,, #STRPROMPT(”Sigende Ledetekst 1”) GET(Txt1), #PROMPTABORT(2,10,PARAMETERS) Det ovenstående eksempel gør følgende: Macroen #Prompt laver en INTRODUCE på parameter kartoteket med værdierne aktuelt brugerId og navnet TESTNAVN, derudover laver den en prompt kommando. Så følger en overskrift med to Linjeskift. Macroen #STRPROMPT laver en ledetekst af default længde 20 ” Sigende Ledetekst 1”. Derefter kommer der en normal GET kommando. Macroen #PROMPTABORT laver et check af om du er gået ud af prompten med ALT-Q ellers laver den en opdatering i parameter kartoteket og derefter en normal INPUT AT kommando. 100 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel #MACROLOAD(PROMPT_UTIL) #PROMPT(CURUSERID(),’TESTNAVN’) ”Overskrift”,, #PROMPTFROMTO(9), #EMPTYPROMPT GET(Txt1 LENGTH 10 REF CustTable.Account) " " GET(Txt2 LENGTH 10 REF CustTable.Account) #PROMPTABORT(2,10,PARAMETERS) Det ovenstående eksempel gør følgende: Macroen #Prompt laver en INTRODUCE på parameter kartoteket med værdierne aktuelt brugerId og navnet TESTNAVN, derudover laver den en prompt kommando. Så følger en overskrift med to Linjeskift. Macroen #PromptFromTo laver først en tom prompt på 20 tegn derefter indsætter den ’Fra’ og ’Til’ med et mellemrum på 9 tegn (Default er 10 Tegn). Macroen #TomPrompt laver en tom streng på 20 tegn hvor efter der kommer to GET kommandoer med length og ref. Macroen #PROMPTABORT laver et check af om du er gået ud af prompten med ALT-Q ellers laver den en opdatering i parameter kartoteket og derefter en normal INPUT AT kommando. Dialogboks med ledetekster og indtastningsfelter Grundlæggende promptboks med REF STR 15 &Varenr STR 30 &VareNavn PROMPT ”Indtast vareinformationer”,,, ”ItemNumber ..: ” GET (&Varenr REF InvenTable.ItemNumber), ”Varenavn ....: ” GET (&VareNavn),, ”Hvis det ønskes, må ItemNumber”, ”gerne være alfanumerisk.” INPUT AT 15,4 REF efterfølges altid af navne på kartotek og felt der refereres til. Navnene adskilles med et punktum. Hvis man anvender Prompt macroerne i ovenstående eksempel. 101 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 13. Parameters kartoteket Formål Formålet med denne lektion er at give deltagerne kendskab til parameter kartoteket, og hvad der gemmes i dette kartotek. Emner Opbygning af parameterkartotek Macroerne ParameterSave og ParameterGet Macrobiblioteket Parametre Opbygningen af parametre kartoteket Felt Navn Type UserId Int Name STR 30 Txt1 - 14 STR 20 Txt 50 STR 100 INT 1 - 10 INT REAL 1 - 6 REAL DATE 1 - 5 DATE ENUM NoYes 1 - 15 ENUM NoYes Dvs. at man gemmer alle mulige parametre med et bruger Id og et navn, og derudover er der frit spil. Dette betyder, at man kan gemme en hvilken som helst oplysning i alle de andre felter. Dog bør man lige kontrollere, at de ikke er brugt i forvejen. Macroerne ParameterSave og ParameterGet Disse macroer bruges overalt i standarden til at gemme og hente parametre. Macroen #ParameterGet { Benyttes til at hente parameter fra kartoteket Parameters { Kald: #ParameterGet(<Variabel>,<ParameterNavn>,<Felt>)} SET %1 = Parameters[UserNameIdx,CurUserId(),%2].%3 } 102 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Macroen #ParameterSave { Benyttes til at gemme parameter fra kartoteket Parameters { Kald: #ParameterSave(<Variabel>,<ParameterNavn>,<Felt>) } IF 1 THEN { Begrænsning af virkefelt } INTRODUCE Parameters[UserNameIdx,CurUserId(),%2] IF Parameters.%3 <> %1 THEN SET Parameters.%3 = %1 #DbUpdate(Parameters) ENDIF ENDIF } På grund af at macroen #Dbupdate bliver brugt, kan man nemt komme til at overskrive et parameternavn der brugt i forvejen. Macrobiblioteket Parameters Dette macro bibliotek bliver brugt til en masse indirektioner i forbindelse med standarden. Derudover ligger der lokalmacroer til styring af autonummerering og til lagring af applikations afhængige data (Afd, bærer og formål). 103 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 14. Funktioner Formål Formålet med denne lektion er at give et overblik over, hvordan funktioner er opbygget, samt hvordan de kan benyttes i andre kodeelementer. Emner: Opbygning af funktioner. Både globale funktioner og funktioner tilknyttet en tabel Kald af funktioner fra andre kodeelementer Forskellen mellem ByRef og ByVal Generelt En funktion kan sammenlignes med en macro. Det er et separat stykke kode, der kaldes fra foreksempel et XAL-script, og som udfører en given opgave. Når en funktion kaldes indeni et programelement, er det kun funktionskaldet som kompileres i koden for det kaldende element. På denne måde kan man undgå problemer med 64-kb grænsen. Der er to væsentlige forskelle mellem macro’er og funktioner: En funktion oversættes selvstændig, og ikke som en macro, der oversættes sammen med den kode den kaldes fra En funktion kan returnere en værdi. Eksempel 1 funktion FUNCTION INT QtrOfYr(DATE &RefDate) RETURN ((MthOfYr(&RefDate)+2) DIV 3) Ovenstående funktion kaldes med en dato og returnerer en integer-værdi indeholdende kvartalet som datoen indgår i. Eksempel 2 Kald af funktion INT &kvartal SET &kvartal = QtrOfYr(Today()) &kvartal vil nu indeholde 1, 2, 3 eller 4 – alt efter hvilket kvartal den kaldes fra. Oprettelse af funktion Funktioner kan oprettes som enten globale eller tilknyttet et kartotek. Ved oprettelse vælges <Global> for at oprette en global funktion eller kartoteksnavn for at tilknytte den det specifikke kartotek. 104 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel 3 FUNCTION eksempel1 () RETURN Når en funktion oprettes navngives den efter det navn, som blev angivet ved oprettelsen. Navnet kan frit ændres i koden, da hovednavnet ikke benyttes i XAL-kald. Denne funktion har ingen returværdi-type og tager ingen argumenter. Disse skal angives manuelt. Retur type angives mellem nøgleordet “FUNCTION” og funktions navnet (se eksempel 2). Parametrene angives inden i parentesen. Kun simple XAL typer og kartoteksfelter supporteres, og kartoteksfelter kun med værdi. Arrays kan afleveres til en funktion. Eksempel 4 FUNCTION INT eksempel2 (STR 10 &s, INT &i = 1) RETURN Som vist i eksempel 2 er det også muligt at tildele en defaultværdi til en parameter, hvilket betyder, at hvis parameteren udelades ved kald af funktionen, så tildeles den værdien, som er angivet (her &i = 1). Parametre videregives implicit som værdi. For at videregive parametre som reference skal du tilføje det reserverede ord “BYREF” (hvilket vil sige, at man sender en variabel til funktionen). For klart at videregive parametre som værdi, kan du bruge nøgleordet “BYVAL” (hvilket vil sige, at man sender en værdi til funktionen). Når du bruger parametre som reference, så husk at kartoteksfelter ikke kan videregives som reference. Eksempel 5 FUNCTION eksempel3 (BYREF INT &total) SET &total = &total * 2 RETURN XAL-kode: INT &total SET &total = 50 SET &total = eksempel3(&total) &total vil nu have værdien 100, da variablen &total blev tildelt en ny værdi 105 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel 6 FUNCTION eksempel4 (BYVAL INT &total) SET &total = &total * 2 RETURN XAL-kode: INT &total SET &total = 50 SET &total = eksempel4(&total) &total vil stadig have værdien 50, da variablen &total er upåvirket af funktionskaldet, det er kun værdien af &total, som sendes til funktionen. I tilfælde hvor kartoteksbuffere videregives, skal de videregives som den sidste parameter til funktionen, og derefter er det muligt at kalde kartoteket via ”EXTERN katotek” i funktionen. Kald af funktion Funktioner kan som nævnt være globale eller forbundet til et kartotek. Hvor funktionen er forbundet til, fremgår når funktionen kaldes. I eksempel 3 og 4 er funktionerne erklæret globalt, og kaldet til funktionerne er i XAL-koden angives som: SET &total = eksempel4(&total) Hvis eksempel 4 havde været forbundet til kartoteket INVENTABLE, ville kaldet se således ud: SET &total = InvenTable::eksempel4(&total) 106 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgaver Opgave 1: Medarbejdernavn Formål med opgaven At lave en global funktion, som returnerer en medarbejders fulde navn. Beskrivelse Der skal laves en funktion, som kaldes med medarbejderID (Employee i Employee-kartoteket). Funktionen skal returnere medarbejderes fulde navn (Name i Employee-kartoteket). Opret medarbejderen: Medarbejder: ABC; Navn: Anne B. Christensen Opret derefter en XAL-kørsel, der kalder funktionen med parameteren ’ABC’ Opgave 2: Forfalden saldo Formål med opgaven At lave en funktion, som tilknyttes et kartotek og som benytter BYREF. Beskrivelse I skal lave en funktion, som returnerer antallet af kunder, hvor en given medarbejder er tilknyttet som sælger, samt tildele den summerede værdi af forfalden saldo på disse kunder til variablen &TotalForfalden. Funktionen skal kaldes fra Employee-formen og skal vise resultatet på skærmen. 107 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 15. Pick funktionerne Formål Formålet med denne lektion er, at give deltagerne kendskab til Pick funktionerne og brugen af disse. Derudover gennemgås flere andre funktioner der har relation til disse. Emner Pick funktionerne Pick funktionerne Disse funktioner bruges til at hente kartoteksattributter (Navne, Index osv.) Navn Returnere Parametre PickFile INT (Kartoteksnummer) Ingen PickField INT (Felt nummeret) INT (Kartoteksnummer) PickIndex INT (IndexNummeret) INT (Kartoteksnummer) PickGroup INT (Group ID) Ingen PickUser INT (UserId) INT (GroupId) (Hvis man vælger 0 så vælges userid uden hensyntagen til Group) FieldId2Name STR (Feltnavn) INT (KartoteksId) INT (FeltId) FieldName2Id INT (FeltId) INT (KartoteksId) STR (FeltNavn) FileId2Name STR (Kartoteksnavn) INT (KartoteksId) FileName2Id INT (Kartoteksnummer) STR (Kartoteksnavn) GroupId2Name STR (Groupnavn) INT (GroupId) GroupName2Id INT (GroupId) STR (Groupnavn) IndexId2Name STR (IndexNavn) INT (IndexId) IndexName2Id INT (IndexId) STR (IndexNavn) NumFld STR (Kartoteksnavn) INT (Antal felter) UserInGroup INT (0 hvis falsk 1 hvis sand) INT (UserId) INT (FeltId) STR (Kartoteksnavn) FieldNum INT (GroupId) STR (FeltNavn) FieldPName STR (Ledetekst eller Feltnavn) STR (Kartoteksnavn) STR (FeltNavn) 108 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Navn Returnere Parametre FieldStr STR (Feltnavn) STR (Kartoteksnavn) STR (FeltNavn) FileNum INT (FeltId) STR (Kartoteksnavn) FilePName STR (Kartotekets printnavn) STR (Kartoteksnavn) IndexNum INT (IndexId) STR (Kartoteksnavn) STR (Indexnavn) 109 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 16. KeyQueue Formål Formålet med denne lektion er, at give deltagerne kendskab til KeyQueue funktionen. Emner KeyQueue funktionen Macrobibliotekerne KeyCodes og Tasks. Generelt om KeyQueue KeyQueue funktionen tager en tekst og flytter denne tekst ind i Taskbufferen (Tastaturbufferen). Man kan også få oversat tastatur tryk og indsat i Taskbufferen. Dog skal man være opmærksom på, at tastaturtryk kan overskrives eller ændres. Derfor er det altid at foretrække at bruge Tasks i stedet for, da disse ikke er så nemme at ændre. Funktionen returner en værdi 1 hvis der er plads i tastaturbufferen, og 0 hvis der ikke er plads i tastaturbufferen. Der kan med fordel anvendes MacroBibliotekerne KeyCodes og Tasks, når der skal indsættes tastaturtryk og Tasks. MacroBiblioteket KeyCodes indeholder en mængde tastekombinationer som er foruddefineret i Lokalmacro’erne. Disse kan med fordel benyttes i stedet for scankode-tallet, i det Lokal-macro’erne bliver syntaks-tjekket ved oversættelse af programmet. Desuden fortolker Lokal-macro’en scankode-tallet som en Task, og indsætter derefter denne i Task-køen. Ligeledes indeholder macrobiblioteket Tasks en mængde foruddefineret Tasks, der kan benyttes. Forskellen mellem Tasks og KeyCodes er, at KeyCodes kan ændres og KeyCodes i sig selv kalder Tasks. Tasks kan ikke ændres så let og kan kaldes direkte. Eksempel på brug af KeyQueue funktionen INT &U SET &U = KEYQUEUE("{Tekst og Andet}") Hvis den kode der står ovenfor er alt, hvad der er i en XAL, og man knytter en procestast til den, så bliver resultatet at når man trykker på tasten så bliver følgende tekst skrevet: {Tekst og Andet} Variablen &U bruges, da KeyQueue som funktion returnerer et hel tal, men variabler bruges ikke som sådan i selve kørslen. Systematikken og syntaksen minder om BOX-funktionen, hvor syntaksen er SET BOX() for at få en Info/Advarsels/NejJa og/eller Pickliste box frem. Syntaksen SET KeyQueue( ) bliver også accepteret af systemet og kan derved også benyttes. 110 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Da man også kan indsætte funktioner og macroer betyder det, at man kan lave standard kommentarer. Faktisk kan man lave alle Forms triggere med et taste tryk. Eksempel på automatiserede Forms-Trigger programmering Eksemplet herunder viser hvorledes man kan lave en automatiseret proces, som opretter og indsætter kode i en Form’s triggere samt hvorledes MacroBibliotekerne KeyCodes og Tasks bliver anvendt. #Macroload(KeyCodes) #Macroload(Tasks) INT &File INT &Indexe SET &File = PICKFILE() SET &Indexe = PICKINDEX(&File) #Clearkeyqueue SET KEYQUEUE("##Macroload(Forms)") SET KEYQUEUE(#KeyF3) SET KEYQUEUE(#KeyUp) SET KEYQUEUE(#KeyUp) SET KEYQUEUE(#KeyUp) SET KEYQUEUE(#KeyUp) SET KEYQUEUE(#TaskEnter) SET KEYQUEUE("##FormError") SET KEYQUEUE(#KeyF3) SET KEYQUEUE(#KeyDown) SET KEYQUEUE(#KeyDown) SET KEYQUEUE(#TASKENTER) SET KEYQUEUE("##Frm_Index("+FILEID2NAME(&File)+", "+INDEXID2NAME(&File,&Indexe)+")") SET KEYQUEUE(#TASKENTER) SET KEYQUEUE("##Frm_Search("+FILEID2NAME(&File)+")") SET KEYQUEUE(#TASKENTER) For at bruge dette program, skal man først have knyttet XAL-kørslen til en tastekombination under Generelt/Tilpasning/Taster/Processer. Derefter skal der oprettes en Form og INIT-Triggeren åbnes (Ctrl+F6/Formler/Init). Når man er i Init-Triggeren, skal man trykke på den procestast som afvikler programmet. Derefter benyttes macro’en PickFile() til at spørge, hvilket kartotek den første blok skal tilhøre, og macro’en PickIndex(&File) spørger, hvilket index der skal bruges til at indlæse data ind med. Macro’en #Clearkeyqueue bliver brugt til at rydde tastaturbufferen for eventuelle gamle data. Derefter bliver MacroLoad(FORMS) indsat i INIT_Triggeren, #FormError indsat i Error-Triggeren og Frm_Index og Frm_Search indsat i PreForm Triggeren, med de nødvendige blok- og index angivelser. Macro’en #TaskEnter er en Task-macro som svarer til at man trykker Enter. Det kan opleves, at processen ikke er helt tidstro. Dette er fordi tastatur bufferen først skal fyldes før der udskrives fra den, hvilket medfører en vis forsinkelse, men alt i alt kan sådanne værktøjer lette arbejdet for programmøren, hvis der bliver brugt lidt tid på dem. 111 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgaver Opgave 1: Rettelse begynd Formål med opgaven At lave en kørsel der kan indsætte en kommentar om, at der er blevet rettet i det pågældende element. Beskrivelse Du skal oprette en XAL der ved hjælp af KeyQueue og Parameter kartoteket kan indsætte en rettelses start kommentar. Derudover skal der tilknyttes en procestast til XAL'en, så man kan trykke på den hvornår man vil. Opgave 2: Rettelse slut Formål med opgaven At lave en kørsel der kan indsætte en kommentar om, at der er blevet rettet i det pågældende element. Beskrivelse Du skal oprette en XAL der ved hjælp af KeyQueue kan indsætte en rettelses slut kommentar. Derudover skal der tilknyttes en procestast til XAL'en, så man kan trykke på den hvornår man vil. Opgave 3: Standard kommentar Formål med opgaven At lave en kørsel der kan indsætte en kommentar, når man opretter et nyt XAL element. Beskrivelse Du skal oprette en XAL der ved hjælp af KeyQueue og parameter kartoteket kan indsætte en standard kommentar. Derudover skal der tilknyttes en procestast til XAL’en, så man kan trykke på den hvornår man vil. Opgave 4: Form opretter Formål med opgaven At lave en kørsel der kan oprette en ny form med hjælp af standard kommentar kørslen, et par Pick funktioner og keyQueues Beskrivelse Du skal oprette en XAL der ved hjælp af KeyQueue og parameter kartoteket kan oprette en helt ny form, og ved hjælp af det du lavede i opgave 3 indsætter en standard kommentar. Derudover skal der være Macroload, Formerror, Frm_Index og Frm_Search med i formen, når den er færdig. 112 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgave 5: Blokopretter Formål med opgaven At lave en kørsel der kan oprette en ny blok med hjælp af et par Pick funktioner og keyQueues Beskrivelse Du skal oprette en XAL der ved hjælp af KeyQueue kan oprette en helt ny blok. Derudover skal der være spørgsmål om, hvorvidt den skal være autogenereret. For de rigtig skrappe må der godt laves en liste med de felter der skal indsættes i blokken, som så indsættes til sidst, når den er færdig. Opgave 6: Feltviser Formål med opgaven At lave en kørsel der i et vindue kan vise, hvilke felter der er i et kartotek samt hvilken type de er. Beskrivelse Du skal oprette en XAL der ved hjælp af Pick funktionerne og sysinfo macroerne i et vindue forneden på skærmen viser felterne og deres type. Opgave 7: Indexviser Formål med opgaven At lave en kørsel der i et vindue kan vise hvilke felter, der er i et index samt hvilken type de er. Beskrivelse Du skal oprette en XAL der ved hjælp af Pick funktionerne og sysinfo macroerne i et vindue til højre på skærmen viser felterne og deres type. Opgave 8: Macrofinder Formål med opgaven At importere en DBD og en FRM så vi får en macrofinder funktion. Beskrivelse Du skal importere XXX.dbd og XXX.frm samt lave den procestast der står beskrevet i formens init trigger. Derefter skal du vælge formens lokalmenu, og køre læsningen af alle macrobiblioteker og macroer en gang. 113 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgave 9: Oprettelse af indirektioner (Ekstra opgave) Formål med opgaven At lave en kørsel der ved hjælp af en Pick funktion vælger en ENUM, og opretter den som macro indirektioner med en macro pr. Udfald. Beskrivelse Du skal lave en funktion der laver alle enum udfald for en bestemt enum som du først vælger med en pickliste derefter skal du indsætte lige så mange macroer som der er udfald på enum'en. 114 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 17. Funktionen Directory Formål Formålet med denne lektion er, at give et overblik over funktionen Directory og dens muligheder til behandling af filer uden for C5. Emner Anvendelsesmuligheder i funktionen Directory Funktionen Directory Directory er en funktion, der inde fra C5 kan anvendes til at behandle filer i styresystemet uden for programmet. Filer kan ved hjælp af forskellige modes (tilstande) søges, kopieres, slettes osv. Directory er en funktion på lige fod med andre funktioner i C5. Den kendetegnes med ordet Directory(). Syntaks Directory(Ledetekst:STR, PrimPath:STR, SecPath:STR, Mode:INT, Rettigheder:INT, Warning:INT):STR Som det fremgår af syntaksen skal der angives 6 forskellige parametre til funktionen. De tre første parameter er tekststrenge og de sidste tre er heltal. Returværdien er en tekst. 115 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Parametre Funktionen Directory skal tildeles værdier i form af parametrene: Ledetekst, PrimPath, SecPath, Mode, Rettigheder og Warning. Parameter Forklaring Ledetekst Ledetekst til en eventuel verificering af den primære sti af filer PrimPath Primær sti til filer som funktionen arbejder på SecPath Sekundær sti til filer som funktionen arbejder på Mode 0 = Work-mode muligheder fremgår af Rettigheder 1 = Slet filer i PrimPath Direkte 2 = Slet filer i PrimPath Filmanager 3 = Rename filer i PrimPath til navne i SecPath Direkte 4 = Rename filer i PrimPath til navne i SecPath Filmanager 5 = Kopiér filer i PrimPath til filnavn i SecPath Direkte 6 = Kopiér filer i PrimPath til filnavn i SecPath Filmanager 7 = Check filer i PrimPath for eksistens Direkte 8 = Start filer i PrimPath med argumenter i SecPath Direkte 9 = Start filer i PrimPath med argumenter i SecPath Filmanager 10 = Opretter filer i PrimPath Direkte 11 = Opretter filer i PrimPath Filmanager 64 = Hvis til de interaktive modes 0, 2, 4, 6, 9, 11 lægges 64 ændres den default dialog boks fra en Open Box til en Save Box Filmanager 128 = Hvis der til modes 0, 10 og 11 lægges 128 Directory funktionaliteten fra at operere på filer til at operere på mapper. Filmanager Rettigheder 0 = Ingen funktioner Anvende kun ved MODE = 0 1 = Editere 2 = Editere, oprette 3 = Editere, oprette, rename 4 = Editere, oprette, rename og slette Warning 0 = Ingen advarsler 1 = Advarsler 2 = Advarsler, verificering af PrimPath 3 = Advarsler, verificering af PrimPath og SecPath 116 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempler Macroen FileDelete {+----------------------------------------------------------+} {¦ Sletning af fil %1,%2,..... uden prompt ¦} {+----------------------------------------------------------+} #IFNOT.EMPTY(%2) #IFNOT.EMPTY(%3) #IFNOT.EMPTY(%4) #IFNOT.EMPTY(%5) #IFNOT.EMPTY(%6) SET SET SET SET SET NB: Directory("",%1,"",1,0,0) Directory("",%2,"",1,0,0) Directory("",%3,"",1,0,0) Directory("",%4,"",1,0,0) Directory("",%5,"",1,0,0) Max 5 filer #ENDIF #ENDIF #ENDIF #ENDIF #ENDIF Macroen FileExists Directory("",%1,"",7,0,0) 117 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Dirmanager {+----------------------------------------------------------+} {¦ Kørsel til demonstration af mulighederne i XalFunktionen ¦} {¦ Directory ¦} {+----------------------------------------------------------+} STR STR STR STR INT INT INT 60 60 60 60 &ReturStr &PromptStr &PriPath &SecPath &Action &Rights &Info WHILE 1 #Prompt "Dirmanager:",, #StrPrompt("Ledetekst") GET(&PromptStr LENGTH 30), #StrPrompt("Første streng")GET(&PriPath LENGTH 30), #StrPrompt("Anden streng") GET(&SecPath LENGTH 30),, #StrPrompt("Aktion") GET(&Action LENGTH 30 ASENUM #Asenum("Browse", "Slet Alt", "Slet selektivt", "Rename alle", "Rename selektivt", "Copy alle", "Copy selektivt", "Eksisterer fil")), #StrPrompt("Rettigheder") GET(&Rights LENGTH 30 ASENUM #Asenum("Plain", "Editer", "Opret", "Rename", "Slet")), #StrPrompt("Advarsel") GET(&Info LENGTH 30 ASENUM #Asenum("Ingen", "Advarsler", "Spørgsmål box 1", "Spørgsmål box 2/Bekræft")),, #StrPrompt("Retur") + &ReturStr #PromptAbort(20,7) SET &ReturStr = Directory(&PromptStr, &PriPath, &SecPath, &Action, &Rights, &Info) END 118 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 18. Kodning af listbilleder Formål Formålet med denne lektion er at lære deltagerne, hvorledes der arbejdes med listbilleder. Emner Opsætning og kodning af listbilleder Benyttelse af listbilleder uden DBD reference Anvendelse af opsætningsformen if. med listbilleder Macroen #ParmTable Den lille udviklingsmenus parm-kalds-generator Listbilleder generelt C5 leveres med listbilleder, der er oprettet i forvejen til forskellige kartoteker. Men brugeren har selv mulighed for at oprette flere listbilleder, hvis der er behov for det. Et listbillede er et rullebillede med poster fra ét givent kartotek, dvs. at et listbillede kun kan vise data fra ét kartotek ad gangen Anvendelse Listbilleder kan i skærmbilleder eller i andre listbilleder kaldes med Alt+H via et referencefelt i databasen, og feltværdien kan overføres til det felt, der blev kaldt fra. Listbilleder kan også anvendes i udviklingsmenuen til direkte at oprette, rette og slette poster. Oprettelse af listbilleder Man opretter et listbillede ved, i udviklingsmenuen, at vælge: LST / OPRET. Når der skal oprettes et listbillede, åbnes der for et indtastningsbillede med en del felter, der kan udfyldes med informationer om størrelse, farve osv. iflg. nedenstående skema. I realiteten er det nok at angive, hvad billedet skal hedde i feltet ’Søgenavn i liste’, og så indsætte de felter der skal vises på billedet. 119 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opsætning af listbilledets vindue Felt Betydning Søgenavn i liste Navn der kendetegner formen fremover, og som der søges på i processer og menuer. Når formen godkendes, bliver den gemt som en brugertilretning, og navnet foranstilles med et $ tegn. Tekst i rammen Den tekst der vil blive vist i vinduets ramme. Vinduets højde / bredde Angivelse af vinduets højde i antal Linjer og bredde i antal kolonner. Felterne indeholder defaultværdier, der evt. kan ændres efter behov. Farvesæt Standard anvendes altid farvesæt 2. Vindue Angivelse af hvorledes vinduet skal vises på skærmen. Fast Den angivne vinduesstørrelse benyttes. (default) Vinduet kan kun skaleres ned. Felter flyttes ikke. Skalerbart Den angivne vinduesstørrelse benyttes. Vinduet kan skaleres både op og ned. Felter flyttes automatisk ved autogenererede blokke, dvs. multi record blokke og ikke ved enkelt record blokke. Dynamisk Fylder hele skærmbilledet som default uanset angivet vinduesstørrelse. Virker ellers som skalerbart. Lukket Lukker af for aktivering af form (trigger kode kan dog fortsat afvikles) Nedarvet Arbejder skjult i det øjeblikkelige vindue. Dette benyttes ikke standard i applikationen Selve felterne indsættes på billedet ved at indsætte dem i en tabel. Listbilledet viser felterne i den rækkefølge, de står i denne tabel. Det er muligt at ændre opsætningen af de enkelte felter i listbilledet f.eks. længden af et tekstfelt, eller hvor mange decimaler et kommatalsfelt skal vises med. Eksempel Et listbillede til Debitorkartoteket (CustTable) kunne f.eks. bestå af felterne i nedenstående tabel, og indtastet i samme rækkefølge: Feltnavn Account Name Phone 120 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Resultat Resultatet ville blive et listbillede som nedenstående: Debitorer Account Name Phone Hvis felterne blev indtastet i modsat rækkefølge, ville de også blive vist i modsat orden i listbilledet dvs. Phone, Name og Account. Kald fra udviklingsmenuen I udviklingsmenuen kan listbilleder kaldes direkte og afvikles i forskellige tilstande, alt efter hvilken funktion der skal udføres. Listbilleder kan således anvendes til afprøvning af kartoteker, idet der i listbilleder kan manipuleres med data direkte i det tilhørende kartotek. Funktioner i udviklingsmenuen Funktion Muligheder Vis Vise Ret Vise, rette Opret Vise, rette, oprette Slet Vise, rette, oprette, slette Bemærk! Kald af listbilleder i udviklingsmenuen med ovenstående funktioner bør ikke anvendes i driften. Eventuelle inddatakontroller, der er indbygget i skærmbilleder, fungerer ikke i listbilleder. Data manipuleres direkte i kartoteket. Kald via referencer på kartoteksfelter Listbilleder kan ikke alene kaldes via processen listbilled-afvikling, som det foregår i udviklingsmenuen. De kan også kaldes i skærmbilleder og andre listbilleder via feltreferencer på kartoteksfelter i databasen, som vist i nedenstående illustration. 121 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Ved kald af listbilleder via feltreferencer kan der dog kun vises og overføres feltværdier. Der kan ikke oprettes, rettes og slettes, som ved kald via udviklingsmenuen. Kald af listbillede via referencefelter SalesTabel (Skærmbillede) SalesTabel (Kartotek) CustTable (Ref. Kartotek) CustTable.Account CustTable.Account Account (Reference) (felt) Alt+H (felt) CustTable (Ref. Kartotek) Account (Ref. felt) Listbilleder på CustTable Listbillede = Index Listbilledet sorters efter: 1. Index med Ref.felt som første component, hvis det findes. 2. Ellers efter første index hvis det findes Listbillede = Listbillede = CustGroup Hvis der er et billede med same navn som ref. feltet benyttes dette. Ellers vises en pickliste med de eksisterende listbilleder. På kartoteksfelter kan der refereres til andre kartoteker og felter, eller der kan refereres til samme kartotek og samme felt. Opslag med Alt+H fungerer kun på de felter, hvor der er indtastet referencer. Hvis der, til det kartotek der refereres til, findes et listbillede med samme navn som selve referencefeltet, vil listbilledet blive aktiveret i samme øjeblik, der tastes Alt+H. Hvis der ikke findes et listbillede med samme navn som referencefeltet, vil der først blive vist en pickliste med de eksisterende listbilleder, også hvis der kun findes ét listbillede. Sorteringsrækkefølge i listbilleder Sorteringsrækkefølgen i listbilledet afhænger af index som flg.: Hvis der på referencekartoteket er et index med referencefeltet som første komponent benyttes dette index. Hvis der ikke på referencekartoteket er et index med referencefeltet som første komponent benyttes det først oprettede index 122 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Hvis der slet ikke er noget index på referencekartoteket benyttes indtastningsrækkefølgen Værdien i referencefeltet overføres fra den post cursoren står på i listbilledet, også selv om feltet ikke vises i listbilledet. Kald af listbilleder med parametre uden reference Man kan fra et hvilket som helst sted i xal koden kalde et listbillede direkte og samtidig overføre diverse parametre, der fortæller listbilledet, hvordan det skal opføre sig. Parametre i direkte kald Parametre Forklaring File=<kartoteksnavn> Kartotek som listbilledet er defineret i. List=<Listbillednavn> Listbillede navn. Index=<Indexnavn> Det ønskede index I kartoteket specificeres, som default benyttes første index. Mode=Watch Her kan man kun se eksisterende data. Mode=Select=Feltnavn Variant af ”Mode=Watch” der gør at en værdi valgt I listbilledet automatisk bliver overført til den aktive buffer. Værdien der bliver valgt kan kun ses ikke ændres, da ”select” automatisk indeholder værdien ”watch” Mode=Edit Her kan man se og ændre eksisterende data. Mode=Add Her kan man se, ændre og tilføje data. Mode=All Her kan man se, ændre, tilføje og slette data GetField=<Feltnavn> Feltnavn der skal bruges som udgangspunkt for fremsøgningen af data. SearchField=<Feltnavn> Felt I listbillede der skal søges på. PutField=<Feltnavn> Til felt i form som feltindhold (fra Mode=Select=Feltnavn) skal returneres i. Command=Search Viser kun de records som opfylder søgekriteriet (givet ved SearchField/GetField) I Listbilledet Command=Find Viser den første record som opfylder søgekriteriet men det er stadig muligt at bladre mellem alle øvrige records. Counter=<Feltnavn> Ved angivelse af REAL felt, benyttes felt som Linje tæller I listbilledet Pos=<x,y> Ved angivelse af x,y skærmposition, placeres listbilledet I det angivne koordinat Eksempler PROCESS 7 "File=VendTable "+ "List=Account " 123 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Dette er den mest simple form for kald af listbilleder, man kan lave. Dette kald vil kalde listbilledet ”Account” på kartoteket VendTable, men der vil ikke ske andet. Der er en række parametre der gør det muligt, for brugeren at flytte værdier mellem listbilledet over til andre processer så som forms og xal’er. GetField, SearchField, Mode=Select og PutField. Hvis listbilledet bliver kaldt direkte fra en menu, og ikke fra en proces, har systemet ikke noget aktivt felt , der kan bruges som udgangspunkt for et listbillede. I det tilfælde er det ikke muligt, at bruge GetField, Mode=Select og PutField. Det er derimod muligt at definere SearchField direkte i parameter linjen. Eksempel PROCESS 7 File=Employee "+ "List=Employee "+ "SearchField= Employee =AH "+ "Command=Find "+ "Index=EmplIdx" Macroen #ParmTable I forms macrobiblioteket ligger #ParmTable macroen. Denne laver et parameter prekey kald fra feltet man ønsker et kald fra. Macrobibliotek / Navn Funktionalitet Parametre Forms / #ParmTable Denne macro afvikler et listbillede som er oprettet i forvejen og hvor der ikke er en relation opsat på databasen , f.eks. brugt på virtuelle felter %1= <Kartotek> %2= <Felt (Søge)> %3= <Værdi til søgefelt> %4= <Index> Listbillede-kalds-generator For selve brugen af denne henvises til hjælpefilen i C5. Under den lille udviklingsmenu (Ctrl+F12) findes menupunktet Listbilleder, hvor man kan opsætte kopiere, indsætte det kald der skal ligge i Prekey på det enkelte felt. 124 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgaver Opgave 1: Kodning af listbillede i PreField Formål med opgaven At lave Alt+H funktionalitet på ItemNumber uden relation på kartoteket Beskrivelse Du skal oprette et listbillede på kartoteket TMPUDLPriser på feltet ItemNumber. Desuden skal der også på feltet sættes op, at man kan springe hen på det ItemNumber man vælger. Da det er et TMP kartotek skal du derudover huske, at du kun vil se linjer med det rigtige sessionId. 125 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 19. TTS – Transaction Tracking System Formål Formålet med denne lektion er at give et indblik i TTS systemet og de tilhørende kommandoer. Emner TTS systemets virkemåde Anvendelse af TTS kommandoerne i kørsler Generelt om TTS Det er ofte ønskeligt at kunne udføre forskellige transaktioner på kartotekerne i C5, uden risiko for at andre kan ændre i dataene samtidig. Transaktioner er typisk opdateringer, indsættelser eller sletninger af poster. TTS – Transaction Tracking Systemet giver netop mulighed for at låse kartotekerne for andre brugere. Databasen Databasen i C5 er en versionsdatabase. Dette betyder, at der til hver en tid er to versioner af databasen: En arbejdsversion og en grundversion. Da grundversionen altid er konsistent, sker der ikke noget ved at systemet bryder ned midt i en transaktion, og gør databasen inkonsistent. Det er kun arbejdsversionen der er inkonsistent, og der kan efterfølgende arbejdes videre på den originale grundversion. Metatransaktioner En samling af transaktioner kan sikres ved en metatransaktion, dvs. transaktioner der i programmet er omgivet af kommandoerne TTSBEGIN og TTSCOMMIT. Den ene kommando låser kartoteker, og den anden låser dem op igen. Medens kartoteker er låst kan brugerne kun tilgå dem, men ikke ændre i dem. Kommandoerne PROMPT, PAUSE, OUTPUT, PROCESS og CONTROL bør ikke anvendes i programmer medens kartotekerne er låst. Kommandoerne kan stille kørslen i bero i længere tid, og forhindre brugere i at få adgang. Situationen kan f.eks. opstå, hvis der er indlagt en PAUSE. Denne kommando stopper kørslen til der tastes Enter. Hvis brugeren er gået hjem og ikke opdager at programmet venter med en pause, kan det forhindre kørslen i at blive færdig, og de andre brugere kan ikke få adgang til kartotekerne. TTS systemet består af kommandoerne TTSBEGIN, TTSCOMMIT og TTSABORT 126 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale TTSBEGIN TTSBEGIN starter en metatransaktion for et givet kartotek. Kommandoen anvendes typisk før kartoteket får virkefelt. Det kunne være før starten på en søgeløkke. TTSBEGIN låser det kartotek transaktionerne skal foretages på, og sætter således flerbrugermiljøet midlertidigt ud af kraft for det pågældende kartotek. Syntaks TTSBEGIN <kartotek> I syntaksen fremgår det at kommandoen skal efterfølges af navnet på et kartotek. Kartoteket skal senere afsluttes med TTSCOMMIT eller TTSABORT. Bemærk at både TTSBEGIN og TTSCOMMIT efterfølges af navnet på et kartotek. Det betyder at hvert kartotek der skal indgå i en metatransaktion skal stå på sin egen programlinje. Der kan ikke indsættes flere kartoteker til kommandoerne på samme Linje. Det anbefales derfor også at låse og åbne kartotekerne i samme rækkefølge for eksempel alfabetisk. Eksempel TTSBEGIN InvenTable I eksemplet udføres TTSBEGIN på InvenTable kartoteket, hvorefter det er låst for alle brugere. 127 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale TTSCOMMIT TTSCOMMIT stopper metatransaktionen for et givet kartotek. Kommandoen anvendes typisk efter ophør af kartotekets virkefelt. Det kunne være efter afslutningen af en søgeløkke. Kommandoen sørger for at alle transaktionerne der blev udført i meta-transaktionen, også bliver gennemført i virkeligheden. Desuden sætter flerbrugermiljøet i kraft igen på det givne kartotek. Syntaks TTSCOMMIT <kartotek> I syntaksen fremgår det at kommandoen skal efterfølges af navnet på et kartotek. Det skal være et af de kartoteker der i forvejen er startet med TTSBEGIN. Bemærk at både TTSBEGIN og TTSCOMMIT efterfølges af navnet på et kartotek. Det betyder at hvert kartotek, der skal indgå i en metatransaktion, skal stå på sin egen programlinje. Der kan ikke indsættes flere kartoteker til kommandoerne på samme linje. Det anbefales derfor også at låse og åbne kartotekerne i samme rækkefølge - for eksempel alfabetisk. Eksempel TTSCOMMIT InvenTable I eksemplet udføres TTSCOMMIT på InvenTable, hvorefter det er åbent for alle brugere igen. 128 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale TTSABORT TTSABORT stopper samtlige igangværende metatransaktioner. Den virker modsat i forhold til TTSCOMMIT, idet den forkaster alle de transaktioner, der er blevet udført i metatransaktionen. TTSABORT åbner kartotekerne igen og sætter flerbrugermiljøet i kraft for de pågældende kartoteker. Det er vigtigt at fastslå at ingen af transaktionerne i metatransaktionen bliver udført. Syntaks TTSABORT Bemærk at kommandoen i syntaksen kun består af kommandoen selv. Det betyder, at det ikke er muligt at abortere et enkelt kartotek ad gangen. TTSABORT afbryder på én gang metatransaktionen for alle kartoteker, der er startet med TTSBEGIN. Eksempel på metatransaktion Ved anvendelse af metatransaktioner i XAL kørsler, er det vigtigt at have overblik over formålet med kørslen, og specielt med funktionaliteten omkring kommandoen TTSABORT Formålet med XAL kørslen i nedenstående eksempel er at sætte hver enkelt vares salgspris lig med det dobbelte af kostprisen. Det skal ske på samtlige varer uden undtagelser, og hvis der er varer uden kostpris skal kørslen afbrydes. 129 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel TTSBEGIN InvenPrice SEARCH InvenTable USING ItemIdx INTRODUCE InvenPrice[InvenTable.ItemNumber,’Salg’] SET Price = InvenTable.CostPrice * 2 UPDATE InvenPrice PRINT ItemNumber IF CostPrice <= 0 THEN TTSABORT SET BOX(2,"Der er varer uden kostpris!\n\n"+ "Kørslen afbrydes uden opdatering.",0) RETURN 0 ENDIF END TTSCOMMIT InvenPrice PRINT "Slut!" PAUSE Da der ikke må være brugere, der kan ændre i varerne medens kørslen står på, startes der en metatransaktion med TTSBEGIN. Den afsluttes med TTSCOMMIT. Dette låser effektivt for andre brugeres adgang til InvenTable kartoteket. TTSBEGIN og TTSCOMMIT giver ingen problemer, de fungerer som forventet. Kommandoen TTSABORT og dens indflydelse på XAL kørslen skal der til gengæld holdes øje med. Hvis TTSABORT og RETURN 0 ikke medtages i kørslen opdateres alle varer. Er der en vare uden kostpris vises boksen med fejlmeddelelsen, men kørslen fortsætter som intet var hændt. Hvis TTSABORT indsættes alene uden RETURN 0 opdateres alle varer, indtil der kommer en vare uden kostpris. I det øjeblik der kommer en vare uden kostpris træder TTSABORT i kræft og metatransaktionen abortes. Det betyder at alle varer, der indtil videre er opdateret, ikke opdateres alligevel. Bemærk at metatransaktionen ikke længere er i kræft, og at kørslen alligevel fortsætter uden metatransaktion. Dette medfører at alle efterfølgende varer opdateres som intet var hændt. De første varer bliver således ikke opdateret, mens de sidste bliver det. Hensigten med kørslen var at samtlige varer uden undtagelser skulle opdateres på en gang. I betragtning af det der sker i punkt 2, mangler der noget, der kan stoppe kørslen, når der opstår en fejl. Ved at indsætte RETURN 0, stoppes kørslen øjeblikkeligt, efter at metatransaktionen ophæves. RETURN 0 bevirker således at kørslen stoppes og ikke fortsætter med at opdatere resten af varerne. Pointen er at programmøren selv skal styre, at kommandoen TTSABORT får den tilsigtede virkning. 130 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 20. Macroer Formål Formålet med denne lektion er, at give deltagerne indsigt i hvordan macrosystemet er opbygget, og lærer hvordan man laver en ny macro. Emner Macroers virkemåde Oprettelse af nye macroer Gennemgang af enkelte macroer Indirektioner Macro systemet Der findes tre lag af macroer. Disse er nævnt nedenfor. Macro Lag / Typer Egenskaber / Hensyn Scope Globale Kan bruges overalt Kan bruges overalt Macrobiblioteker Samling af lokal macroer der kan bruges overalt Kan bruges overalt hvis der macroloades Lokale macroer Samling af localmacroer bør undgås og bruges macrobiblioteker i stedet. Kan kun bruges i det element hvor det er lavet. En macro er en stump kode der sættes ind i det øjeblik, man har godkendt, og sætter kernen til at kompilere koden. Dvs. at en macro ikke er en funktion med selvstændig hukommelse og retur typer osv., men bare en stump kode, der bliver sat ind i koden, på det sted hvor macrokaldet er. Dette medfører, at macrokoden bliver talt med i programmets totale størrelse som jo ikke må overstige 64 kb. Når man laver en macro skal man gøre sig klar over hvilke variabler og kartoteker der skal benyttes. Opbygning af en macro I nedenstående eksempel, gennemgås en opbygning af en macro. Kaldet af en macro i en xal INT INT &Tal1 = 2 &Tal2 = 1 #Add(&Tal1,&tal2) Koden i #Add() macroen SET %1 = %1 + %2 131 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Dette betyder, at når vi oversætter XAL’en, så vil koden i virkeligheden være som følger: INT INT &Tal1 = 2 &Tal2 = 1 %1 %2 SET &Tal1 = &Tal1 + &Tal2 {#Add(&Tal1,&tal2)} Dette betyder, at parametrene bliver taget i den rækkefølge som de står, hvor %1 er den første parameter osv. Man skal derudover være opmærksom på, at der ikke sker nogen kompilering af macroerne, før de bliver kaldt. Derfor bør man lave macroen som en xal kørsel først, kontrollere at den kan køre, og så lave den om til en macro. Dette eksempel er vist med en global macro. Hvis man skulle lave en localmacro enten i et macrobibliotek eller i et xal element ville eksemplet se ud som følger: #LocalMacro.Add SET %1 = %1 + %2 #EndMacro 132 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Gennemgang af macroer Følgende macroer bliver forklaret med hvad de gør, hvilke parametre de har, samt i hvilke macrobiblioteker de eventuelt kan findes. Macro navn Global / Bibliotek Funktion Parametre #Dump Global Denne macro skriver indholdet af en kartoteksbuffer ud på skærmen %1 = Kartoteksnavn #Macroload Global Denne macro giver adgang til macroerne i et macro bibliotek %1 = Macrobiblioteksnavn #Num2Str Funktioner Indsætter default værdierne til funktionen NUM2STR %1 = REAL Default værdierne er: %3 = Sat default til 0 Num2Str(Real,0,0,1,2) %4 = Sat default til 1 Parameter 2-5 er valgfrie. #Add Global %2 = Sat default til 0 %5 = Sat default til 2 Denne macro lægger A sammen med sig selv og B %1 = A %2 = B A og B kan være en INT, REAL, STR, DATE, ENUM #Sub Global Denne macro lave A – B og returner det i A %1 = A A 0g B kan være en INT, REAL, DATE, ENUM %2 = B #Dump Macroen #MacroLoad(C5UTIL) PROCESS #PROC_XalRun 'Xal=PrintBuffer' USING %1 #Macroload Macroen #IFNOT.INCL_%1 #MACROLIB.%1 #DEFINE.INCL_%1 #ENDIF 133 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale #Num2Str Macroen #LOCALMACRO.Num2Str Num2Str(%1, #IFNOT.EMPTY(%2) #IF.EMPTY(%2) #IFNOT.EMPTY(%3) #IF.EMPTY(%3) #IFNOT.EMPTY(%4) #IF.EMPTY(%4) #IFNOT.EMPTY(%5) #IF.EMPTY(%5) #ENDMACRO %2 0 %3 0 %4 1 %5 2 #ENDIF #ENDIF, #ENDIF #ENDIF, #ENDIF #ENDIF, #ENDIF #ENDIF) #Add Macroen SET %1 = (%1) + (%2) #Sub Macroen SET %1 = (%1) - (%2) Indirektioner Når man koder med ENUMs så kan det være svært at læse, hvad det egentlig er, man ønsker med de forskellige betingelses strukturer. Et eksempel kan være nedenstående kode, hvor man spørger på sprog enum'en. ENUM Language_ &Landesprog PROMPT ”Indtast sproget : ” GET(&Landesprog) INPUT IF &Landesprog == 1 THEN #Add(&Landesprog,1) ENDIF PRINT &Landesprog PAUSE Den ovenstående kode betyder, at hvis man vælger Engelsk som bruger, vil den alligevel skrive Tysk. Men det kan man kun finde ud af, ved at gå ud af koden og gå ind i DBD kolonnen i udviklingsmenuen. Men læsbarheden og hastigheden man kan rette en enum med, kan sættes betragteligt op med dette lille kunstgreb. Først laver man et macro bibliotek med navnet Indirektion. 134 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale #Macro biblioteket Indirektioner #Localmacro.Sprog_Dansk #Localmacro.Sprog_Engelsk #Localmacro.Sprog_Tysk 0 #Endmacro 1 #Endmacro 2 #Endmacro Derefter retter man eksemplet som følger: #Macroload(Indirektioner) ENUM Language_ &Landesprog PROMPT ”Indtast sproget : ” GET(&Landesprog) INPUT IF &Landesprog == #Sprog_Engelsk THEN #Add(&Landesprog,1) {Engelsk til Tysk} ENDIF PRINT &Landesprog PAUSE Fordelen ved at bruge denne metode er, at hvis du senere har behov for at ændre i rækkefølgen på dine enums, så du f.eks. får den første værdi til at blive tom, så skal du ikke ind og rette koden. Du kan bare lave om i macroerne og så multi kompilere. Så vil ændringen slå igennem overalt. (Du skal selvfølgelig også ændre enum’en). 135 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 21. Løkker og betingelsesstrukturer Formål Formålet med denne lektion er at give deltagerne kendskab til For-løkker samt til betinget algebra. Emner Betinget algebra For-løkken #Case macroen #Switch macroen Betinget algebra Betinget algebra er en IF sætning i en linje. Syntaks <Boolesk udtryk> ’?’ <Udtryk 1> ’:’ <Udtryk 2> Dette svarer til følgende program kode: IF <Boolesk udtryk> THEN <Udtryk 1> ELSE <Udtryk 2> ENDIF Hvor ”IF”, ”THEN”, ”ELSE”, og ”ENDIF” erstattes af ”?” og ”:” tegnene. Det man skal være særligt opmærksom på er, at hvis betinget algebra bruges i en regneoperation, skal både <Udtryk 1> og <Udtryk 2> passe til denne regne operation. INT &Total INT &Input PROMPT ”Indtast et Input” GET(&Input) INPUT SET &Total = &Input >= 5000 ? &Input * 1.1 : &Input PRINT &Input PAUSE Man skal derudover være opmærksom på at man kan indsætte en betingelse direkte i en operation som f.eks. PRINT kommandoen 136 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale INT &Total INT &Input PROMPT ”Indtast et Input” GET(&Input) INPUT PRINT &Input >= 5000 ? ”Over 5000”: ”Under 5000” PAUSE Man skal være opmærksom på, at meget få tiltag kan gøre det meget lettere at læse. F.eks. ved at bruge parenteser. INT &Total INT &Input PROMPT ”Indtast et Input” GET(&Input) INPUT Print (&Input >= 5000 ? ”Over 5000”: ”Under 5000”) PAUSE Man kan derudover også lave betinget algebra i <Udtrykket> INT &Total INT &Input PROMPT ”Indtast et Input” GET(&Input) INPUT Print (&Input >= 5000 ? ”Over 5000”: (&Input >= 2500 ? ”Over 2500 Under 5000” : ”Under 2500”)) PAUSE Der er i princippet ikke nogen grænse for, hvor mange gange betinget algebra kan anvendes inde i hinanden. Dog bør man nok begrænse sig til 254 tegn. Desuden skal der gøres opmærksom på, at selve strukturen meget hurtigt kan blive uoverskuelig. Kommandoen ”For” Det er muligt at benytte kommandoen ”FOR” i XAL-sproget. FOR bruges til at gentage en række af udsagn et bestemt antal gange. Eksempel på brugen af FOR INT &I FOR &I = 1 TO 5 PRINT &I END PAUSE 137 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Outputtet til dette eksempel 1 2 3 4 5 Eksempel med STEP INT &I FOR &I = 2 TO 10 STEP 2 PRINT &I END PAUSE Outputtet til dette eksempel: 2 4 6 8 10 Hvis du ønsker at danne en baglæns løkke, skal du bruge nøgleordet DOWNTO i stedet for TO. Trinværdien skal dog stadig være positiv. Eksempel med DOWNTO: INT &I FOR &I = 10 DOWNTO 10 STEP 2 PRINT &I END PAUSE Outputtet til dette eksempel: 10 8 6 4 2 #Switch / #Case Macroen Disse macroer bliver brugt til at implementere en Case struktur. Det kræver brugen af følgende macroer: #Switch() #Case() #EndSwitch() (Case bliver genbrugt lige så mange gange som der er udfald) 138 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel 1 INT &I PROMPT "Vælg" GET(&I ASENUM "A\nB\nC\nD") INPUT #Switch(&I) #Case(0) #Case(1) #Case(2) #Case(3) #EndSwitch PAUSE PRINT PRINT PRINT PRINT "Du "Du "Du "Du valgte valgte valgte valgte bogstavet bogstavet bogstavet bogstavet A" B" C" D" Som man kan se af eksemplet, starter en Case struktur med macroen #Switch, som har en parameter. Parameteren er case variablen, som kan have forskellige udfald. Derefter kommer selve udfaldsrummet, med de udfald af case variablen, som man gerne vil definere nogle handlinger for. Man bruger #Case macroen til de enkelte udfald af case variablen. Man skal være opmærksom på, at man ikke med case macroen kan lave intervaller, men kun specifikke udfald. Til gengæld kan man overføre op til 9 specifikke udfald til #Case macroen (Se eksempel 2). Det hele afsluttes med macroen #EndSwitch. Eksempel 2 INT &I PROMPT "Vælg" GET(&I ASENUM "A\nB\nC\nD") INPUT #Switch(&I) #Case(0) PRINT "Du valgte bogstavet A" #Case(1,2) PRINT "Du valgte bogstavet B eller C" #Case(3) PRINT "Du valgte bogstavet D" #EndSwitch PAUSE En anden ting man skal være opmærksom på, er at man ikke kan lave en case struktur inde i en case struktur. Dette skyldes at casecount så ikke kan finde ud af, hvor mange ENDIF der skal sættes. Til sidst skal bemærkes, at #Switch og #Case kan håndtere alle typer variabler (DATE, INT, REAL; STR og ENUM). 139 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgaver Opgave 1: Opdateringskørsel Formål med opgaven Rettelse af prisopdateringskørslen, således at hvis man godkender, så skal der kun opdateres hvis udlånsstatus er udlånt eller bortkommet. Beskrivelse Du skal rette jævnfør det ovenstående. Dette skal gøres med en switch / Case struktur. 140 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 22. Forms triggere Formål Formålet med denne lektion er, at give deltagerne kendskab til Event, Refresh og Lookup triggerne. Derudover gennemgås flere andre funktioner der har relation til disse. Emner Anvendelse af Event triggeren Anvendelse af Refresh triggeren Anvendelse af Lookup triggeren Event triggeren Event triggeren bruges til at opfange Events. Events kan være en af følgende ting: Event(Handling) Forklaring Værdi af &Event #EventRef Spring til hovedkartotek 1 #EventResizeStart Ændre størrelsen af vinduet start 2 #EventResize Ændre størrelsen af vinduet 3 #EventResizeEnd Ændre størrelsen af vinduet slut 4 #EventClearUser Ændre brugeren 5 #EventQTFilter Bruge et QTFilter 6 Grunden til at der er et nummertegn foran de forskellige events, er at der i Forms macrobiblioteket er 6 indirektioner (Macroer). For at opfange en Event, checker man værdien af &Event variablen. Derefter kan man evt. ændre den event, der skal til at ske. Hvis &Event er lig med 1, altså spring til hovedkartotek, så kan man f.eks. bruge macroen #JumpToTable og i kaldet #FormRef. Macrobibliotek / Navn Funktion Parametre Forms / JumpToTable Denne macro springer til et bestemt kartotek og åbner den form der er angivet i %2 og hvis den form forventer en parameter så kan man sætte den ind i %3 %1= <Feltnavn> Denne macro henter den form der opsat på databasen til reference hvis kartotek og form ikke hedder det samme. %1= <Kartoteksnavn> Forms / Formref %2= <Formnavn> %3= <Parameter / Feltværdi> 141 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel {Eksempel på Event triggeren } IF &Event == #EventRef THEN IF &CurBlk == FileStr(Blok1) THEN #JumpToTable(FieldStr(Parameters,Txt1), #FormRef(CustTable) ,Blok1.Txt1) #JumpToTable (FieldStr(Parameters,Txt2), #FormRef(CustTable) ,Blok1.Txt2) #JumpToTable (FieldStr(Parameters,Txt3), #FormRef(CustGroup),Blok1.Txt3) #JumpToTable (FieldStr(Parameters,Txt4), #FormRef(CustGroup),Block1.Txt4) ELSE IF &CurBlk == FileStr(Blok2) THEN #JumpToTable (FieldStr(Parameters,Txt1), #FormRef(CustTable) ,Blok2.Txt1) #JumpToTable (FieldStr(Parameters,Txt2), #FormRef(CustTable) ,Blok2.Txt2) #JumpToTable (FieldStr(Parameters,Txt3), #FormRef(CustGroup),Blok2.Txt3) #JumpToTable (FieldStr(Parameters,Txt4), #FormRef(CustGroup),Blok2.Txt4) ENDIF ENDIF ENDIF Refresh triggeren Refresh triggeren bruges til at gennemløbe en stump kode flere gange med et bestemt interval. For at bruge refresh funktionaliteten skal man bruge macroen #Frm_Refresh Macrobibliotek / Navn Funktionalitet Parametre Forms / #Frm_Refresh Frm_Refresh bruges til at kalde Refresh triggeren med et bestemt interval. %1= <Refresh Tid> %2= <Start Tid> %3= ’KEEP’ <Refresh Tid> er den tid der skal gå mellem hver gang refresh triggeren bliver kaldt. Tiden er specificeret som tusinddele sek. Når XAL refresh triggeren er blevet udført, springer cursoren tilbage, hvor den kom fra, og refresh triggeren vil så blive udført igen efter <Refresh Tid> tusinddele af et sekund. Hvis man sætter denne tid til 0, deaktiverer man refresh. Man skal være opmærksom på, at refresh triggeren sletter det aktuelle felts data input, og sletter den rettelse man var i gang med, med mindre man bruger 3 parameteren ’KEEP’, da den så beholder det man var i gang med at skrive. 142 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Lookup triggeren Lookup er en blok trigger som selv skal styre opslag og indhentning af data til blok bufferen, hvis man skriver noget som helst i denne trigger. Til at styrer opslaget bruges &Lookup system variablen, der kan antage nogle forskellige værdier. Der er lavet et sæt indirektioner til disse: Macrobibliotek / Macro navn Værdi af indirektionen Forms / #LookTOPREC 'TOPREC' Forms / #LookENDREC 'ENDREC' Forms / #LookPRVREC 'PRVREC' Forms / #LookNXTREC 'NXTREC' Forms / #LookCURREC 'CURREC' Forms / #LookRECNO 'RECNO' Det man så gør er, at introduce en buffer med samme navn som blokken. Derefter laver man så en FIND med de pågældende værdier. Det sidste man laver i IF sætningen er at checke, at der et recid ellers bliver der return 0. 143 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgaver Opgave 1: Hop til hovedkartotek Formål med opgaven At rette i TMPUDLPriser formen så man på sats felterne kan springe til hovedkartoteket UDLUdlånssats form. Beskrivelse Du skal rette TMPUdlPriser formen, sådan at hvis man står på forsikringssats og udlejningssats, og trykker CTRL+F4 så springer man til UDLUdlånssats formen. Opgave 2: Autoretur Formål med opgaven At lave formen TMPUDLPriser således at et af felterne kun skal have 3 tre bogstaver, så springer den til næste felt og skriver hele navnet. Beskrivelse Du skal oprette et virtuelt felt på formen TMPUDLPriser, hvor man indtaster initialer, og når disse er tastet ind finder den selv ud af slå op i medarbejderkartoteket, og skriver det fulde navn og springer videre til næste felt. Opgave 3: Feltet Blinker Formål med opgaven At lave formen TMPUDLPriser således at feltet udlånsstatus står og blinker, hvis feltets værdi er lig med = Udlånt. Beskrivelse Du skal rette feltet udlånsstatus, så det blinker hvis det er udlånt. Opgave 4: Printer opsætning Formål med opgaven I skal gruppevis lave en printer driver til en HP 895c, hvor man skal kunne skrive med rød skrift og alm. skrift. Beskrivelse I skal oprette en printer driver til HP 895c med to fonte som minimum, hvoraf den ene er med rød skrift. 144 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 23. Globalisering Formål Formålet med denne lektion er at give deltagerne indsigt i globalisering af forms og rapporter. Det forklares hvad globalisering er, og der gives eksempler på anvendelsen. Emner Globalisering af forms Globalisering af rapporter Generelt om globalisering Forms og rapporter kan som regel altid afvikles direkte fra udviklingsmenuen. Nogle af dem skal dog også kunne afvikles fra andre menuer og med forskellige parametre. Elementer der skal kaldes fra forskellige menuer, skal først globaliseres for at virke efter hensigten. Globalisering er nødvendig, da de parametre der overføres kan være forskellige fra menupunkt til menupunkt. Desuden kan det kaldte element være afhængigt af de overførte parametre. Parameter overførsel Overførsel af værdier eller parametre mellem to elementer, foregår enten når de startes fra menupunkter, eller når de kaldes med kommandoen PROCESS. Overførsel via menupunkter Menupunkt Buffer Kaldt element (Automatisk) (EXTERN Buffer) Parm Kaldt element (Fra menupunkt) IF &Parm SET Felt=&Parm PRINT &Parm osv. Parm Hver gang et element kaldes fra en lokalmenu i en form, overføres indholdet i den aktuelle post automatisk til en buffer, der kan åbnes og læses i det kaldte element. Der kan samtidig overføres andre værdier gennem variablen &Parm. Værdien der skal overføres indtastes under opsætningen af menupunktet i feltet ’Parametre til proces’. Det er valgfrit hvilken værdi, der skal overføres, men det skal betænkes, at værdien skal anvendes i det kaldte element. 145 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Efterfølgende vises to eksempler på opsætning af feltet ’Parametre til proces’ i ’Opsætning af menupunkt’. Et med og et uden overførsel af parametre. Menupunkt uden Parm Proces..................: Form-afvikling Parametre til proces....: Form=CustTable Menupunkt med Parm Proces..................: Form-afvikling Parametre til proces....: Form=CustTable Parm=”965842” Bemærk! I menupunkter angives variablen &Parm uden & foran. Overførsel via kommandoen PROCESS PROCESS Buffer Kaldt element USING Buffer (Fra PROCESS) (EXTERN Buffer) Parm Kaldt element (Fra PROCESS) IF &Parm SET Felt=&Parm PRINT &Parm osv. Parm= PROCESS kommandoen overfører ikke automatisk data til en buffer. Skal der overføres data til en buffer udføres dette med tillægskommandoen USING efterfulgt af kartoteksnavn. Der kan samtidig overføres andre værdier gennem variablen &Parm. Værdien angives efter navnet på elementet og inden for de samme citationstegn. Det er valgfrit hvilken værdi, der skal overføres, men det skal betænkes, at værdien skal anvendes i det kaldte element. Efterfølgende vises nogle eksempler på XAL kørsler med PROCESS kommandoen. 146 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale XAL kørsel uden overførsler PROCESS 17 ”Form=CustTable” XAL kørsel med angivelse af buffer INTRODUCE CustTable[AccountIdx==’33344’] PROCESS 17 ”Form=CustJournal” USING CustTable XAL kørsel med angivelse af Parm INTRODUCE CustTable[AccountIdx==’33344’] PROCESS 17 ”Form=CustTable Parm=” + CustTable.Account Bemærk! I proceskald angives variablen &Parm uden &-tegn foran. Bemærk! USING kan kun anvendes på kartoteker, der har virkefelt, dvs. har været anvendt med INTRODUCE eller SEARCH. Desuden angives USING efter citationstegnene. Overførte værdier EXTERN Buffere kan åbnes med kommandoen EXTERN. Kommandoen giver adgang til alle feltværdier i dem. Eksempel på anvendelse af EXTERN Account i CustJournal sættes lig med bufferens Account. EXTERN CustTable SET CustJournal.InvoiceAccount = CustTable.Account Eksempel på anvendelse af EXTERN med RENAME EXTERN CustTable RENAME Ny SET CustTable.Account = Ny.Account Har den overførte buffer samme navn som kartoteket i det kaldte element, er det nødvendigt, at give den et nyt midlertidigt navn i elementet. Dette udføres med kommandoen RENAME efterfulgt af det nye navn. Det er frivilligt hvilket navn bufferen omdøbes til. Da alle buffere kan åbnes, kan det være nødvendigt, at kontrollere om de er tomme eller udfyldte. Dette kan kontrolleres med en IF sætning, der undersøger feltet RowNumber. 147 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Alle poster har et RowNumber, idet dette felt er et systemfelt, der udfyldes og vedligeholdes automatisk. Er der et RowNumber, er der også en post. Er der ikke noget RowNumber, er der heller ingen post. Anvendelse af EXTERN og RowNumber kontrol EXTERN CustTable IF RowNumber THEN SET CustJournal.InvoiceAccount = CustTable.Account ELSE SET BOX(2,”Bufferen er tom”,1) ENDIF Er der et RowNumber sættes InvoiceAccount i formen CustJounralDebFlgJour lig med Account i bufferen til formen CustTable, ellers udskrives en advarselsboks med teksten ”Bufferen er tom!”. &Parm I kaldte elementer kan de værdier, der overføres via &Parm anvendes på forskellige måder med f.eks. PRINT, SET og IF. SET SET Account = &Parm Hvis et Account er overført i &Parm, kan denne værdi tildeles til feltet Account med SET kommandoen, eller den udskrives med PRINT. PRINT PRINT ”Account: ”,&Parm IF IF &Parm == ”KunSe” THEN #Frm_Mode(CustTable,”WATCH”) ENDIF I ovenstående eksempel forudsættes det, at ordet ”KunSe” (Kun se) overføres til formen CustTable. I Init eller Pre-Form triggerne indsættes den viste kode. Hvis &Parm indeholder ordet ”KunSe”, udføres IF sætningen, og formen startes i tilstanden ”WATCH”, der medfører, at der kun kan læses men ikke røres. (Se selvstændig forklaring til macroen #Frm_Mode sidst i lektionen) 148 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Bemærk! I forms indeholder &Parm kun den overførte værdi så længe Init og Pre- Form triggerne er aktive. Derefter tildeles variablen automatisk andre værdier afhængigt af hvilken trigger, der udføres. Globalisering Globalisering anvendes i de tilfælde hvor ét element f.eks. en form eller en rapport, skal kunne afvikles fra flere forskellige andre elementer. Det kan f.eks. være, at en form skal anvendes på én måde, når den startes fra udviklingsmenuen, og på en anden måde hvis den kaldes fra en lokal menu i en form, eller hvis den kaldes fra en XAL kørsel med PROCESS kommandoen. Menu Anvendelse Metode 1 Element Anvendelse XAL kørsel Metode 1 Hvorfor globalisere Macroen #Frm_Index indsættes i Init eller Pre-Form triggerne i forms for, at angive hvilket index, der skal anvendes til fremfinding og visning af posterne. Desuden er det muligt med #Frm_Search og #Frm_SearchEnd, at angive om cursoren skal stille sig på den første eller den sidste af de fundne poster. Globalisering udføres f.eks. for, at styre hvilket index og hvor mange låste felter der skal være, ligesom det kan bestemmes, om cursoren skal stå på første eller sidste post. Indstillingerne kan afhænge af hvilke værdier, der overføres i kaldet via Parm eller buffer. Der er mange forskellige muligheder, men der er ingen specielle regler for, hvordan globaliseringen udføres, eller hvor meget der skal kontrolleres med den. Det vigtigste er, at sikre sig at formen fungerer i de tænkte tilfælde. Ubegrænset og begrænset globalisering Globalisering kan udføres meget forskelligt og med forskellige former for begrænsning. Det hele afhænger af, hvor mange forskellige steder elementet skal kunne kaldes fra. Udtrykkene ’Ubegrænset globalisering’ og ’Begrænset globalisering’ dækker ikke alle de former og metoder til afgrænsninger, der kan opfindes. De anvendes i denne lektion kun til at danne en fælles ramme om ordet globalisering. Ubegrænset globalisering Ubegrænset globalisering betyder her, at et element f.eks. en form kan fungere lige meget hvilket andet element, der kaldes fra. Kartoteker med stamdata 149 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Ét eksempel på ubegrænset globalisering er alle de forms, der er oprettet til kartotekerne med stamdata f.eks. CustTable, VendTable, InvenTable osv. Disse forms skal alle mindst kunne kaldes fra: Linjen ’Kartotek’ i hovedmenuen Direkte i udviklingsmenuen Funktionen ’Hop til hovedkartotek’ via Ctrl+F4 Ubegrænset globalisering (anvendelse) Ubegrænset globalisering udføres i forms ved i Init eller Pre-Form triggerne, at undersøge om variablen &Parm har fået overført en værdi. Har den det, tildeles dens indhold til nøglefeltet i indekset. Er variablen derimod tom, hentes den sidste post brugeren havde fremme i den aktuelle form. Efter angivelse af index til søgning følger to IF sætninger, hvor den første finder den aktuelle post, medens den anden finder den sidste postering. Ubegrænset globalisering (overblik i Init eller Pre-form i forms) Åbne &Parm Tildele nøgleværdier IF &Parm THEN SET Er &Parm tom ELSE Hent sidst anvendte nøgle Angive index #Frm_Index &Custdefault Findes nøglefelt Akutelle post findes IF Account #Frm_Find Eksisterer posten ikke Første post findes #Frm_Search IF NOT RowNumber Efterfølgende vises et virkeligt eksempel fra Init triggeren i formen CustTable i C5. Formen er ubegrænset global. Ud over linjerne i eksemplet indeholder Init triggeren nogle få linjer mere. Disse er udeladt, da de ikke har nogen betydning for forståelsen af globaliseringen. Macroerne #Forminit, #Frm_Find samt defaultværdier behandles senere i lektionen. 150 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Eksempel Init triggeren i formen CustTable #MacroLoad(FORMS) IF NOT &Parm THEN SET &Parm = &CustDefault ENDIF … #FormInit(Overview,AccountIdx,Account,CustTable,0) … #FormInit #MacroLoad(FORMS) #Frm_INDEX(%1,%2#IFNOT.EMPTY(%5),%5#ENDIF) IF &Parm THEN SET %1.%3 = &Parm #Frm_FIND(%1,1) IF NOT %1.RowNumber THEN SET %1.%3 = &Parm #Frm_FNDNEQ(%1,1) ENDIF ELSE #IF.EMPTY(%4) EXTERN %1 RENAME Buffer #ENDIF #IFNOT.EMPTY(%4) EXTERN %4 RENAME Buffer #ENDIF IF RowNumber THEN SET %1.%3 = Buffer.%3 #Frm_FIND(%1,1) ELSE #Frm_SEARCHEND(%1) ENDIF ENDIF I hovedtræk sker der følgende: Hvis &Parm ikke er udfyldt hentes brugerens sidst anvendte Account med &CustDefault. Macroen #FormInit kaldes med blok, index, felt og tabel Macroen #Frm_Find henter den pågældende post, hvis der er en. Macroen #Frm_SearchEnd henter den sidste post, hvis der ikke er en rigtig post med RowNumber. Bemærk! Lige gyldigt hvorfra formen CustTable kaldes, vil den altid aktiveres med et index og Find eller Search. Formen er ubegrænset global. Forskel på #Frm_Find og #Frm_SearchEnd Forskellen på #Frm_Find og #Frm_SearchEnd er at ’Find’ finder den pågældende post og viser denne i formen, hvorefter der kan bladres i de andre poster. 151 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale #Frm_SearchEnd findes også den pågældende post og viser denne i formen, men der kan ikke bladres i de andre poster. Der kan kun bladres i poster der passer iflg. indekset, var der f.eks. mulighed for flere med samme nummer, ville der kunne bladres i disse, men ikke i de andre. Begrænset globalisering Begrænset globalisering betyder her, at en form kun kan kaldes fra bestemte andre forms eller elementer. Begrænsningen udføres ved på skift at åbne bufferne til de forskellige andre forms eller elementer, der kan kaldes fra. Ved hver åbning undersøges med en IF sætning, om bufferen er tom eller indeholder en post. (Undersøges vha. RowNumber) Er der en post, tildeles værdier fra posten til nøglefelterne, der indgår i det givne index. Poster findes frem og cursor placeres på første eller sidste post. Er der ingen post dvs. at bufferen er tom, fortsættes til næste buffer. Er alle bufferne tomme, afsluttes undersøgelsen med RETURN 0, der returnerer til den form der blev kaldt fra. Begrænset globalisering (overblik i Init eller Pre-form i forms) Åbne buffer 1 Tildele nøgleværdier Angive index EXTERN SET #Frm_Index Åbne buffer 2 Tildele nøgleværdier Angive index EXTERN SET #Frm_Index Er bufferen tom IF RowNumber Er bufferen tom IF RowNumber Afslut uden at åbne formen RETURN 0 Første eller sidste post findes #Frm_Search #Frm_SearchEnd Globaliseringen styres i Init eller Pre-Form triggerne i den form der kaldes. Efterfølgende vises et virkeligt eksempel fra Pre-Form triggeren i formen DebFlgJour. Formen kan kun kaldes fra VendTable, hvilket fremgår af, at det kun er denne buffer, der åbnes med EXTERN. 152 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Er denne buffer tom afsluttes med RETURN 0, der returnerer til den form, der kaldtes fra. Formen er begrænset global. Eksempel fra triggeren Pre-Form i formen VendContact EXTERN VendTable #Frm_INDEX(VendContact,AccountIdx) IF VendTable.Account THEN SET VendContact.Account= VendTable.Account #Frm_SEARCH(VendContact,1) ELSE RETURN 0 ENDIF I eksemplet er der udeladt nogle få linjer, da disse ikke har betydning for forståelsen af selve globaliseringen. Det vigtigste i opbygningen er anvendelsen af EXTERN med de tilhørende IF sætninger og afslutningen med RETURN 0. Formen kan altså kun startes fra det angivne kartotek. Forsøges det at starte formen direkte i udviklingsmenuen eller et hvilket som helst andet sted, sker der ingen ting. Bemærk! I #Frm_Index macroerne er der ingen af indeksene, der har låsning af samtlige indgående felter. Dette bevirker, at alle poster, der passer til de låste indekskomponenter, findes frem. Der fremfindes således ikke én enkelt specifik post med et RowNumber, men flere poster, der kun kendes ud fra de låste felter i indekset. Globalisering af XAL kørsler, QT’er og rapporter I standard C5 anvendes globalisering af XAL kørsler, QT’er og rapporter ikke så meget som i forms. Generelt anvendes overførsel af parametre i bredere forstand, så elementerne blot opfører sig på forskellig vis, uden at der tages højde for alle muligheder. Efterfølgende vises nogle få eksempler fra XAL kørsler, QT’er og rapporter. XAL kørsler Eksemplet herunder er et uddrag fra XAL kørslen CopyOrder, der Kopierer en salgsordre, projektordre eller indkøbsordre. 153 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale XAL kørslen CopyOrder … EXTERN SalesTableArch IF RowNumber THEN #Copy(SalesTable,SalesLine,"@SYS485",CustTrans,"@SYS485"+'?') ENDIF EXTERN ProjTableArch IF RowNumber THEN #Copy(ProjTable,ProjLine,"@SYS25165",CustTrans, "@SYS25165"+'?') ENDIF EXTERN PurchTableArch IF RowNumber THEN #Copy(PurchTable,PurchLine,"@SYS422",VendTrans, "@SYS422"+'?') ENDIF RETURN Kørslen har begrænset globalisering til SalesTableArch, ProjTableArch og PurchTableArch. Hvis alle buffere er tomme, returneres med RETURN til sted kørslen kaldtes fra, så den ikke afvikles. QT’er Eksemplet herunder er hentet fra QT’en ProjBalances, der Efterberegner projektstatistik. Init triggeren i QT’en DebitorBeregnSaldo STR 10 &Id = &Parm IF &Id THEN IF &Id == 'ALL' THEN #QT_Clear(ProjTable) ELSE SET &Auto = 1 FIND ProjTable[NumTransIdx, &Id] #QT_Fill(ProjTable,Number) ENDIF #QT_Skip ELSE EXTERN ProjTable RENAME Buffer IF Buffer.RowNumber THEN FIND ProjTable[RecId, Buffer.RecId] #QT_Fill(ProjTable) #QT_Skip ENDIF ENDIF 154 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale I Init triggeren der vises herover, kontrollerer om der er overført en værdi i &Parm. Hvis der er det, tømmes og overspringes felterne i QT’en, der så udføres med gennemløb af samtlige poster. Hvis den ikke blev kaldt med &Parm, undersøges om QT’en er startet fra f.eks. en form eller en XAL kørsel, der har udfyldt bufferen ’ProjTable’. Hvis den er det udfyldes QT’en med QT control macroerne. Hvis QT’en heller ikke blev kaldt med en et ekstern kartortek, udføres den alligevel, idet begge IF sætninger springes over og medfører, at QT boksen vises med mulighed for at udfyldes samtlige felter manuelt. QT’en kan således afvikles fra mange forskellige steder, og er derfor ’ubegrænset global’. Rapporter Efterfølgende vises et eksempel på begrænset globalisering af rapporten SalesPackingSlip. Begrænset globalisering i rapporten SalesPackingSlip INT &Id = Str2Num(&Parm) IF &Id THEN FIND SalesTableArch[RecId, &Id] #QT_Fill(SalesTableArch) #QT_Clear(SalesLineArch) IF SalesTableArch.RecID THEN #QT_Skip ELSE #LOCALMACRO.InvalidRecID "@SYS65578" #ENDMACRO SET Box(2,#InvalidRecID,1) RETURN 0 ENDIF ENDIF I eksemplet kaldes &Parm, som indeholder RecID fra SalesTableArch. Mangler &Parm eller kan RecID ikke findes i SalesTableArch, returneres der i IF sætningen med RETURN 0, til det sted hvor rapporten blev kaldt. NB! I standarden er det meget sjældent at &Parm og EXTERN forekommer samtidigt i de samme rapporter. Side #Frm_Find Macroen anvendes til at finde poster og vise disse i formen. Posterne findes ved at søge i blokken ved hjælp af det aktuelle index, med de aktuelle indexkomponenter. Som regel er antallet af indexkomponenter angivet sammen med indekset i macroen #Frm_Index, men som det fremgår af syntaksen, er det muligt i #Frm_Find at angive antallet af indexkomponenter her. 155 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Syntaks #Frm_Find(<bloknavn>,[<antal indexkomponenter>]) I syntaksen er det blokkens navn, der angives som første parameter. Derudover er det muligt at angive antallet af indexkomponenter. Søgeværdierne til macroen tages fra felterne i blokken, hvorfor disse skal sættes inden macroen angives. Cursoren stiller sig på den første post, der matcher søgningen, men der kan bladres i alle andre poster, også de der ikke matcher søgningen. Trigger Macroen indsættes som regel i triggeren Pre-Form under macroen #Frm_Index(). Eksempel (Triggeren Init eller Pre-Form) #Frm_Index(CustTable, AccountIdx) #Frm_Find(CustTable,1) Husk at det er blokkens navn, der angives som parameter og ikke kartoteksnavnet. #Frm_Mode Macroen #Frm_Mode svarer til control kommandoen ’MODE’, der sætter en blok i en form i bestemt editeringstilstand. Angives der ingen ’MODE’ macro eller control kommando, startes blokken altid i tilstanden ’ALL’. Der er følgende muligheder: Editeringsmode Parameter Betydning Watch Kun se Edit Se og rette Add Se, rette og oprette All Se, rette, oprette og slette * Search Se og rette, men der foretages ingen opdatering i databasen. * Tilstanden Search anvendes f.eks. til, at se hvad der sker i virtuelle felter, når der foretages ændringer i en blok, uden at databasefelternes værdi opdateres i selve databasen. 156 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Syntaks #Frm_Mode(<bloknavn>,<”mode”>) I syntaksen er det blokkens navn, der angives som første parameter, hvorefter mode eller tilstand angives. Bemærk at tilstanden skal sættes i anførselstegn. Trigger Macroen indsættes som regel i Init eller Pre-Form triggerne. Eksempel (Triggeren Init eller Pre-Form) #Frm_Mode(CustTable,”Watch”) I eksemplet sættes en blok med navnet CustTable i tilstanden ”Watch”, der bevirker, at posterne kun kan ses. Der kan hverken ændres, oprettes eller slettes poster. Defaultværdier Defaultværdier anvendes til at hente en feltværdi, fra den sidste post brugeren stod på i en form, da formen blev lukket. Når C5 startes indlæses defaultværdier via global funktionen DBOpen Uddrag fra funktionen DBOpen FIND Parameters[UserNameIdx,CurUserId(),'Default'] SET &LedDefault = Txt1 SET &CustDefault= Txt2 SET &VendDefault= Txt3 SET &InvenDefault= Txt4 SET &SalesDefault= Txt5 SET &PurchDefault= Txt6 SET &ProjDefault= Txt7 Under brugen af C5 vil defaultværdierne løbende blive opdateres med seneste anvendte poster. Når C5 lukkes kaldes systemtriggeren DB-Close, som opdaterer Parameters, så defaultværdierne kan genindlæses næste gang brugeren starter C5. 157 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Uddrag fra SXL DB-Close INTRODUCE Parameters[UserNameIdx,CurUserId(),’Default’] SET Txt1 = &LedDefault SET Txt2 = &CustDefault SET Txt3 = &VendDefault SET Txt4 = &InvenDefault SET Txt5 = &SalesDefault SET Txt6 = &PurchDefault SET Txt7 = &ProjDefault #DbUpdate(Parameters) 158 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 24. COMAPI Formål Formålet med denne lektion er at give et overordnet overblik over, hvad COMAPI er og hvilke muligheder det giver udviklere i C5. Efter denne lektion skal kursisterne: Have en grundlæggende forståelse af, hvad COMAPI er. Have et overblik over nogle af de kald, der benyttes i forbindelse med COMAPI. Generelt COMAPI er en grænseflade til et lille subsystem i C5 kernen, der åbner muligheden for kald til eksterne COM objekter (ActiveX/COMAPI). Det er kernen i C5, der håndterer selve forbindelsen til COM objektet, således at stabiliteten i C5 sikres samtidig med, at man åbner for fleksibilitet i form af XAL-kommandoer, som indirekte kalder COM objekteter. COMAPI giver ingen mulig for udvikling af COM objekter, der er udelukkende tale om muligheden for at kalde eksisterende elementer. COMAPI giver heller ikke mulighed for at kalde ind til C5 fra andre programmer. Der er her kun tale om kald fra C5 til eksterne elementer. Et COM objekt kan beskrives som en applikation, der eksponerer nogle af sine interne funktioner, for derigennem at give andre applikationer mulighed for at benytte disse. Andre applikationer har derfor ingen behov for at vide, hvad der foregår internt i COM objektet, men blot at vide, hvilke funktioner, med dertilhørende parametre, som objektet eksponerer, og hvilket format eventuelle returværdier sendes i. Et eksempel kunne være, at man kalder MS Outlook, opretter et e-mail objekt, sender de tilhørende parametre indeholdende; til, emne og besked, og kalder metoden send. Handle Et COMAPI handle er den streng, som identificerer COM objektet overfor kernen, og som medsendes fra XAL-koden, når objektet kaldes. Hver gang et nyt objekt kaldes, skal der oprettes et nyt handle. Handle kan typisk defineres som: STR 12 &HCOM Handle result COMAPI handle result er den streng, som resultatet af et kald til COMAPI returneres i. Handle result vil returnere en tom streng, hvis alt er gået godt, og en fejlmeddelele, hvis der opstod et problem i kaldet, f.eks. ”0x80070057 The parameter is incorrect”. Handle result kan typisk defineres som: STR 80 &HR 159 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale COMAPI kald I det følgende vil nogle af de kald, som COMAPI understøtter blive gennemgået kort. For en yderligere og mere dybdegående dokumentation henvises til ”COMAPI Reference Manual”. Oprette et objekt Man kan grundlæggende tale om to typer af COM objekter; automations og controls. Automations er objekter, der udfører en funktion for applikationen, som kalder den. Det kunne for eksempel være en kompleks udregning, hvor resultatet af kaldet returneres til applikationen. En control er typisk et visuelt objekt, der placeres på en form, som for eksempel et grafobjekt, der illustrerer omsætningen på en specifik kunde. Eksempel 1 Når man opretter et automation objekt, benyttes COMCreate kommandoen: STR 12 &HCOM //Erklæring af Handle SET &HCOM = COMCreate(0, 'Excel.Application', '', 0) Her oprettes en instans af en Excel applikation, og hvis alt gå godt vil &HCOM nu indeholde et handle, som peger på denne instans. Hvis det ikke gå godt vil &HCOM være tom. Eksempel 2 Når man ønsker at oprette et Control objekt, stiller C5 en macro til rådighed, som hjælper med at implementerer objektet: #MacroLoad(COMAPI) //Macro indeholdende COMAPI funktioner #Frm_CRECOM(BLOK,FELT, STR createSpec, VARIABEL) I dette tilfælde oprettes et objekt på en form, hvor blokken og feltet på formen medsendes, samt oplysninger om det objekt, der skal oprettes, og handle, som skal pege på objektet. Eksempel 3 #Frm_CRECOM(IE,GraphButton,'Shell.Explorer -'+' '+'116'+' '+'26',&HCOM) Det der sker i eksempel 3, er, at der er oprettet en form indeholdende en blok ved navn IE, hvorpå der er indsat et felt, som hedder GraphButton. Når macroen kaldes vil dette felt blive udskiftet med et Explorer objekt, som har en bredde på 116 og en højde på 26, mens &HCOM vil blive udfyld med handle til objektet. 160 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Frigive et objekt Når man er færdig med at benytte objektet, er det vigtigt, at objektet afsluttes igen for at frigive de ressourcer, som objektet optager. Dette gøres ved at benytte funktionen COMRelease. Eksempel 4 STR 12 &HCOM STR 80 &HR SET &HCOM = COMCreate(0, 'Excel.Application', '',0) IF &HCOM <> '' THEN PRINT “SUCCESS” SET &HR = COMRelease(&HCOM) ELSE PRINT “ERROR” ENDIF Kald til ekstern funktion Man kan opdele et funktionskald i 3 dele; indsættelse af parametre, kald af funktion og læsning af returværder. Indsættelse af parametre Når en parameter sendes til en funktion benyttes COMPushVariant. Eksempel 5 STR COMPushVariant(STR HCOM, STR VTYPE, STR VDATA) Hvor HCOM er dit handle, VTYPE er varianttype og VDATA er den værdi, du ønsker at sende. Set fra C5 er alle værdier af typen STR. Det er derfor nødvendigt at medsende varianttypen, når funktionen kaldes. Varianttypen kan være. 161 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale VTYPE name VTYPE value Description 'VT_EMPTY' '0' Nothing 'VT_NULL' '1' SQL style Null 'VT_I2' '2' 2 byte signed integer 'VT_I4' '3' 4 byte signed integer 'VT_R4' '4' 4 byte real 'VT_R8' '5' 8 byte real 'VT_DATE' '7' Date 'VT_BSTR' '8' Automation string 'VT_DISPATCH' '9' IDispatch * 'VT_ERROR' '10' SCODE 'VT_BOOL' '11' Boolean True=-1, False=0 'VT_VARIANT' '12' VARIANT * 'VT_UNKNOWN' '13' IUnknown * 'VT_I1' '16' Signed char 'VT_UI1' '17' Unsigned char 'VT_UI2' '18' Unsigned short 'VT_UI4' '19' Unsigned long Eksempel 6 SET COMPushVariant(&HCOM, ’VT_BSTR’, InvenTable.Itemnumber) SET COMPushVariant(&HCOM, ’VT_I2’, ’74’) Her sendes et varenummer til COM objektet af type streng, samt værdien 74 af typen interger. Bemærk at begge sendes som typen STR. Kald af funktion Det er nu muligt at kalde funktionen via COMInvoke. Eksempel 7 SET &HR = COMInvoke(&HCOM, ’funktionsnavn’,2,1) Hvor 2-tallet fortæller, at der et to inputparametre og 1-tallet fortæller, at der er én outputværdi. &HR vil være tom, hvis alt er gået godt, mens den ved fejl vil indeholde en fejlmeddelse. 162 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Læsning af returværder For at læse returværdien benyttes COMTopVariant: Eksempel 8 SET &resultat = COMTopVariant(&HCOM,1) Bemærk her, at alle svar fra COM objektet vil være af typen streng. Eksempel på brugen af COMAPI Nedenstående eksempel omhandler visning af en hjemmeside på en form. Formen indeholder en blok ved navn ’IE’. På blokken er placeret 3 felter: URL (Tekst, STR 100, Ledetekst: ’Adresse’) GO (Trykknap, Ledetekst: ’GO’) GraphButton (Trykknap, Ledetekst: ’’) Triggere på formen Trigger XAL kode Kommentar Init #Macroload(FORMS) #Macroload(COMAPI) #Macroload(COMAPIUTIL) Åbner biblioteker STR 12 &HCOM STR 80 &HR SET &URL = “http://dr.dk” Erklærer variabel IF (&HCOM==’’) THEN #Frm_UsrKey(IE,9) ENDIF SET COMRelease(&HCOM) Hvis &HCOM er tom så kaldes UsrKey 9 Exit Tildel værdier Frigiv ressourcer Triggere på blokken ’IE’ Trigger XAL kode Kommentar USRKEY #Frm_CRECOM(IE,GraphButton, ’shell.Explorer-’+’’+’116’+’’+’+26’,&HCOM) Kalder COM objektet Nr 9 163 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Triggere på feltet ’GO’ Trigger XAL kode Kommentar Mouse IF (&HCOM == ’’) THEN #Frm_UsrKey(IE,9) ENDIF IF (&HCOM <> ’’) THEN SET COMPush(&HCOM, &HCOM) SET COMPushVariant(&HCOM,’VT_BSTR’,’&URL’) SET COMPushVariant(&HCOM,VT_UI4’,’0’) SET &HR = COMInvoke(&HCOM,’Navigate’,2,0) #ShowError(’Navigate’) END IF Check at COM objektet eksisterer. Kald COM objektet og send parametre. Kald ’Navigate. Vis evt. fejlmeddelse 164 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Opgaver Opgave 1: Visning af hjemmeside Formål med opgaven At kalde et COMobjekt på en form. Beskrivelse Opbyg eksemplet fra ”Eksempel på brugen af COMAPI”, hvor en Internet Explorer control indlæses på en form i C5. Opgave 2: Kald af funktioner Formål med opgaven At kalde funktioner i et COM objekt via COMAPI. Beskrivelse Udbyg eksemplet fra opgave 1 med to ny knapper: Tilbage (skal kalde funktionen: ”GoBack”) Frem (skal kalde funktionen: ”GoForward”) 165 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale 25. Appendix – Genvejstaster Formål Formålet med denne lektion er at give deltagerne en oversigt over forskellige genvejstaster og værktøjsknapper i C5, samt beskrive hvortil disse anvendes. Emner I lektionen beskrives knapperne på værktøjslinjen samt de oftest anvendte genvejstaster i C5. Værktøjslinjen I nedenstående liste ses de oftest anvendte genvejstaster til Windows versionen af C5. Vil du ikke bruge genvejstaster til de mange funktioner i C5, er der i naturligvis også mulighed for, at benytte musen og klikke på de forskellige knapper i værktøjslinjen. Se hvilke knapper der svarer til hvilke genvejstaster i listen nedenfor. Generelle genvejstaster Tast Beskrivelse Knap F1 Åbn den interne hjælp ALT+H Åbn hjælpeliste og se valgmuligheder i et felt SPACE Afmærk ja/nej felter Vælg mellem valgmuligheder (kun i felter med knappen højre side) ALT+N Åbn notatfelter CTRL+ALT+F6 Redigér det aktuelle skærmbillede CTRL+F9 Slet egne rettelser i det aktuelle skærmbillede SHIFT+F5 Kopier ALT+I Indsæt ALT+F4 Afslut C5 ALT+W Start Wizards CTRL+T Systemdato og tid i 166 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Navigation i C5 Tast Beskrivelse Knap CTRL+TAB Næste faneblad (modul) CTRL+SHIFT+TAB Forrige faneblad (modul) ALT+F8 Næste faneblad (kartoteker) ALT+F7 Forrige faneblad (kartoteker) F8 Næste post eller linje F7 Forrige post eller linje PgUp (page up) Næste sides poster/linjer PgDn (page down) Forrige sides poster/linjer CTRL+F8 Sidste post eller linje CTRL+F7 Første post eller linje SHIFT+F8 Hop til næste blok på skærmbilledet SHIFT+F7 Hop til forrige blok på skærmbilledet ENTER og TAB Næste felt SHIFT+TAB Forrige felt PIL venstre og højre Åbn/luk menupunkter i hovedmenuen vist som træstruktur CTRL+ALT+F4 Hop til hovedkartotek CTRL+F10 Skift til hovedmenuen ved flere åbne vinduer samtidig Vedligeholdelse af stamdata Tast Beskrivelse Knap F2 Opret ny post, linje eller afgrænsning SHIFT+F2 Opret en ny post som kopi af den valgte ALT+F9 Slet post, linje eller afgrænsning F3 Godkend og luk aktuelt skærmbillede CTRL+F2 Opdatér post eller linje ALT+D eller DELETE Slet indholdet i et felt BACKSPACE Slet tegn til venstre i et felt ALT+U Fortryd ændring i felt (genskab feltindhold) ALT+Q Fortryd sidste handling og luk skærmbillede ALT+C Kopier feltindholdet fra samme felt på forrige linje 167 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale Søgning og filtrering af poster Tast Beskrivelse Knap F4 Find post SHIFT+F4 Filtrer poster SHIFT+ALT+F4 Find faktura i Debitor- og Kreditorkartotekerne ALT+F5 Fritekstsøgning i kartoteker F2 Indsæt afgrænsningsfelt ALT+F9 Slet afgrænsningsfelt ALT+L Læg afgrænsningsfelter sammen (ét afgrænsningsfelt i stedet for et fra og et til afgrænsningsfelt) Øvrige genvejstaster Tast Beskrivelse Knap F5 Markér post if. åbenpostredigering (udligning) af poster CTRL+L Lommeregner CTRL+Q Vis billede CTRL+W Sæt præsentationsvaluta CTRL+U Udskrifter - spoolfil NB! Ud over de ovenfor listede genvejstaster findes der en liste over samtlige genvejstaster under Opsætning/Taster og værktøjslinje: 168 UNDERVISNINGSMATERIALE TIL MICROSOFT DYNAMICS® C5 VERSION 2012 Brugen af dette materiale er underlagt din aktuelle serviceaftale
© Copyright 2024