Microsoft Dynamics C5 Version Programmering III

Størrelse: px
Starte visningen fra side:

Download "Microsoft Dynamics C5 Version 2012. Programmering III"

Transkript

1 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.: ,

2 Indholdsfortegnelse Indledning Repetition af forms... 8 Formens opbygning... 8 Formens vindue... 9 Blokke i formen Opsætning af blokke Felter i blokke Macroer til styring og synkronisering af poster i forms Triggere Eksempel - Form med to blokke Eksempel - Form med én blok kaldt fra anden form Eksempel - Form med to blokke kaldt fra anden form Eksempel - Virtuelle felter styret fra blokke og kartoteksfelter Feltgrupper Opgaver Macroen #Frm_BLKBAR Anvendelse af #Frm_BLKBAR Visning af cursorens vej gennem flere blokke Opgaver Labels Filerne i labelsystemet Label editoren Label funktioner Hotkeys Indføring af labels i partner- eller brugerelementer Opgaver Database definition (DBD) DBD/Opret DBD/Ret DBD/List DBD/Oversæt DBD/Udskriv

3 DBD/Export DBD/Import DBD/Diverse Behandling af data (Data) DATA/Opret DATA/Ret (Datamanipulation) DATA/Udskriv (Rapportgenerator) DATA/Export DATA/Import Data/Diverse Vedligeholdelse af applikationsfiler Temporære kartoteker Generelt om temporære kartoteker Macrobiblioteket TMP_File Fordele og ulemper ved TMP kartoteker Opgaver Temporære index Opbygning af temporære index GetTempId CREIDX GENIDX ADDIDX DELIDX CheckCREIDX Triggere Eksempel på form med to blokke Opgaver XAL Systemsammenhænge Datadictionary Databaserelationer Versionskontrollen Funktioner under versionskontrollen Sammenhænge Opgaver

4 9. Gennemgang af Bilag Scope SEARCH Extern IF 1 THEN INTRODUCE Scope i forbindelse med en form Variabel erklæring Dobbelte direkte opslag Enkelt opslag Dobbelte direkte opslag Kartoteket Notes Felter i kartoteket Notes Sammenhæng mellem oprettet notat og Kartoteket Notes Index på kartoteket Notes Eksport og import af notater Import Notater i Forms Notater i rapporter Udledning af notater i Rapport-XAL Udledning af notater i Rapport-QT Udledning af notater med #OutPutNotes Prompt macroer Gennemgang af prompt macroerne Dialogboks med ledetekster og indtastningsfelter Parameters kartoteket Opbygningen af parametre kartoteket Macroerne ParameterSave og ParameterGet Macrobiblioteket Parameters Funktioner Oprettelse af funktion Kald af funktion Opgaver Pick funktionerne KeyQueue

5 Opgaver Funktionen Directory Parametre Eksempler Kodning af listbilleder Listbilleder generelt Oprettelse af listbilleder Kald fra udviklingsmenuen Kald via referencer på kartoteksfelter Kald af listbilleder med parametre uden reference GetField, SearchField, Mode=Select og PutField Macroen #ParmTable Listbillede-kalds-generator Opgaver TTS Transaction Tracking System Databasen Metatransaktioner TTSBEGIN TTSCOMMIT TTSABORT Eksempel på metatransaktion Macroer Opbygning af en macro Gennemgang af macroer Indirektioner Løkker og betingelsesstrukturer Betinget algebra Kommandoen For #Switch / #Case Macroen Opgaver Forms triggere Event triggeren Refresh triggeren Lookup triggeren

6 Opgaver Globalisering Parameter overførsel Overførte værdier &Parm Globalisering Ubegrænset og begrænset globalisering Globalisering af XAL kørsler, QT er og rapporter #Frm_Find #Frm_Mode Defaultværdier COMAPI Handle COMAPI kald Kald til ekstern funktion Eksempel på brugen af COMAPI Opgaver Appendix Genvejstaster Værktøjslinjen Generelle genvejstaster Navigation i C Vedligeholdelse af stamdata Søgning og filtrering af poster Øvrige genvejstaster

7 Indledning Velkommen til kurset Microsoft Dynamics C5 Programmering III. Kurset er berammet til 4 dage. Kursusmaterialet er udarbejdet til version 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

8 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

9 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 Tekst i rammen Vinduets højde / bredde Navn der kendetegner formen fremover, og som der søges på i processer og menuer. Tekst der vises i vinduets ramme under afvikling. 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 (default) Skalerbart Den angivne vinduesstørrelse benyttes. Vinduet kan kun skaleres ned. Felter flyttes ikke. 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 Nedarvet Lukker af for aktivering af form (trigger kode kan dog fortsat afvikles) 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

10 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ånsNr..: UdlånsType: DebitorKto...: KontaktPerson.: Udlånskartotek UdlånsDato: ReturDato: ForsikringsSum: Eksempel på multi record blok fra tidligere kursus Udlånsnr Varenr Varenavn Udlånslinjer Serienr Status DebitorKto 10

11 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 Blok navn Betydning 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 Autogenerér blok (Forskellen på en enkelt og en multi record blok ligger i besvarelsen af dette felt.) Navn på kartotek der skal tilknyttes blokken, når den skal anvendes til visning og indtastning af data i kartoteket. En autogenereret blok er det samme som en multi record blok. 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

12 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

13 Mulige justeringer på felter i forms Felttype Felt i opsætning Muligheder H K T D F Feltnavn Navn på felt (kan ikke ændres) H K T D F X Feltets bredde Antal tegn H K T D F X Feltets justering Venstrestillet, Højrestillet, Centreret T F Store bogstaver Nej eller Ja H K T D F Rette i feltets indhold Nej eller Ja 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

14 Felttype Felt i opsætning Muligheder K Automatisk dec. Tegn Nej eller Ja X Skygge Nej eller Ja X Start/sluttegn i ender Nej eller Ja X X Tænd/sluk knap Farve for inaktiv Nej eller Ja (indeholder 0 for slukket 1 for tændt) Farvens tal (vises når feltet er inaktivt med SKIP) H=Heltal, K=Kommatal, T=Tekst, D=Dato, F=Fasttekst, X=Trykknap 14

15 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) #FormError #Frm_Index(Blok,Index,X) #Frm_Search(Bloknavn) #Frm_SearchTop(Bloknavn) #Frm_SearchEnd(Bloknavn) Åbner for macroerne i biblioteket FORMS Udskriver fejlmeddelelser Angiver index til styring af posterne i formen Slår op på første post iflg. angivne index Slår op på første post iflg. angivne index Slår op på sidste post iflg. angivne index Kommandoer der også anvendes til styring af poster i forms Kommando Anvendelse EXTERN buffer SET Åbner for buffer til et andet kartotek, hvorfra nuværende form f.eks. er startet fra lokalmenu 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

16 Triggere Triggere i vinduet Kommando Init Anvendelse 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 Pre-form Viser fejlmeddelelser i et vindue på skærmen 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 Pre-Record Init-Record Anvendelse Anvendes til styring af poster i den næste blok. 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

17 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 (Gentages ved flere tildelinger) #Frm_Index(Blok2,Index,X) Tildeling af værdier til record i blok2 fra record i blok1. Feltet skal indgå som første komponent i indekset herunder Index til sortering i blok2 X angiver hvor mange felter i indekset, der kendes. Dvs. er tildelt værdier inden denne macro. #Frm_Search(Blok2) Første post i index i blok2 Triggere i underblok Trigger XAL kode Kommentar Initrecord i blok2 SET Blok2.Nøglefelt = Blok1.Nøglefelt (Gentages ved flere tildelinger) Tildeling af værdier til record i blok2 fra record i blok1. Som regel alle felter der indgår i indeksene, men kan også være andre startværdier der skal tildeles felter i recorden 17

18 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

19 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 #Frm_Index(Blok1,Index,X) Tildeling af værdier til blok1 Skal være første del af indekset Index til sortering i blok1 X angiver antal kendte felter #Frm_Search(Blok1) Første af udvalgte poster i blok1 iflg. X i givne index. Triggere i blok1 Trigger XAL kode Kommentar Prerecord Initrecord SET Blok2.Nøglefelt = Blok1.Nøglefelt (Gentages ved flere tildelinger) #Frm_Index(Blok2,Index,X) #Frm_Search(Blok2) EXTERN Buffer SET Blok.Nøglefelt = Buffer.Nøglefelt Tildeling af værdier til record i blok2 fra record i blok1. Feltet skal indgå som første komponent i indekset herunder Index til sortering i blok2 X angiver kendte felter der er tildelt værdier inden macroen. Første post i index i blok2 Åbner for adgang til for data fra den record der var åben ved kaldet af denne form. Tildeling af værdier til blokkens record fra ekstern record. Feltet skal indgå som første komponent i indekset 19

20 Triggere i underblok Trigger XAL kode Kommentar Init-record i blok2 SET Blok2.Nøglefelt = Blok1.Nøglefelt (Gentages ved flere tildelinger) Tildeling af værdier til record i blok2 fra record i blok1. 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

21 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

22 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

23 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

24 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 Dagligt 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 Periodisk Oprette faste udlånssatser XAL UDLFastSats10 Tilpasning Eksportere udlånssatser XAL UDLExportSats Slette udlånssatser XAL UDLDeleteSats Importere udlånssatser XAL UDLImportSats Opdatere priser i udlånsposter XAL UDLPrisOpdatPoster 24

25 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

26 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

27 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 OFF ALL CUR Bjælken tændes i angivne eller aktuel blok Bjælken slukkes i angivne eller aktuel blok Bjælken tændes i samtlige blokke, og slukkes enkeltvis med OFF Bjælken tændes i aktuelle blok, og slukkes i alle andre blokke 27

28 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) Preblok(2) Preblok(3) #Frm_BLKBAR(Blok2, OFF ) #Frm_BLKBAR(blok3, OFF ) #Frm_REPAINT #Frm_BLKBAR(Blok2, ON ) #Frm_BLKBAR(blok3, OFF ) #Frm_REPAINT #Frm_BLKBAR(Blok2, ON ) #Frm_BLKBAR(blok3, ON ) #Frm_REPAINT Ved indgang i blok 1 slukkes bjælken i blok 2 og 3 Ved indgang i blok 2 tændes bjælken og holdes slukket i blok 3 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

29 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

30 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> 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 <Modul> ALD <Sprog> Standard prefix for label filerne. 3-bogstavs lag specifikation f.eks. SYS. Forkortelse for Application Language Dictionary Fil ekstension. Relateret til sproget der benyttes i label filen. Eksempel C5sysald.dk 30

31 Label index filen C5 + <lag> + ALI <Sprog> C5 <Modul> ALI <Sprog> Standard prefix for label filerne. 3-bogstavs lag specifikation f.eks. SYS. Forkortelsen for Application Language Index Fil ekstension. Relateret til sproget der benyttes i label filen Eksempel C5sysali.dk Label com filen C5 + <modul> + ALC <Sprog> C5 <Modul> ALC <Sprog> Standard prefix for label filerne. 3-bogstavs lag specifikation f.eks. SYS. Forkortelsen for Application Language Compiled. Kernen opdaterer ALC filer når ALD filer er ændret. 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

32 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

33 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

34 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

35 Label funktioner Funktion LabelSearchFirst Beskrivelse 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: LabelGetComment Returnerer kommentarer for den specifikke label. Syntaks: STR LabelGetComment(STR label, STR sprog) Eksempel: 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

36 Funktion StrExpandLabels Beskrivelse Returnerer strengen, som er sent til funktionen som argument med ekspanderet label. Syntaks: STR StrExpandLabels(STR 255 Søgetekst) Eksempel: StrExpandLabels(Hej Hej = Test1 = 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

37 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

38 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 30 &tekst1 STR 30 &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

39 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 Kør * Anvendelse (* = ingen funktion) Opret Ret List Oprettelse af kartotek Vedligeholdelse af kartoteker Der vælges kartotek fra listen, kartoteksmenuen vises Trim * Debug * Oversæt Udskriv Export Import Oversættelse af XAL kode i kartotekernes triggere Skriver dokumentation over ét kartotek Eksport af kartoteker 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

40 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 Navn på kartotek Printnavn Ref. Formnavn Titel felt Hvor ligger data Applikationsgruppe Betydning Navn til identifikation af kartotek f.eks. CustTable. Tekst på skærm i stedet for kartoteksnavn f.eks. Debitorkartotek. F.eks. i QT er og Database Status. Form der hoppes til, når der tastes Ctrl+F4. Uden navn hop til form med samme navn som kartotek Feltnavn og indhold vises i rammen på forms Hvert regnskab / Midlertidig fil / Kun DAT regnskabet 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

41 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 Feltbehandling Indexbehandling Formler for kartoteket Password beskyttelse Oprydning Navn Fast-Tekst-Typer Anvendelse Opret og ret felter Opret, ret og slet index Oprettelse af kode på triggere Opret eller ret password Slet ALLE poster Samme indtastningsboks som under Opret 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

42 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 Ens nøgler tilladt Er indekset aktivt Index navngives ofte ud fra de felter, de består af, og afsluttes som regel med bogstaverne Idx. Nej eller Ja til om der må være ens nøgler i indekset 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

43 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 AccountIdx GroupIdx Felter i Indexformel Account 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 Faldende sortering Stigende og faldende Faldende første x antal tegn Tekst i fastteksttype Uden specialtegn Account ASCEND AmountMST DESCEND Account ASCEND, Date_ DESCEND Name DESCEND 3 {Navn faldende 3 tegn} Enum2Str(UnitCode) #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

44 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

45 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

46 Funktioner i Oversigt Funktion Forklaring Load XAL Alt+L 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. 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

47 Triggere (knapper) Post-Change Post-Load Init Pre-Delete Post-Delete Pre-Update Post-Update Pre-Insert Insert OK Insert Fail Forklaring Afvikles efter manuel inddatering i poster, inden opdatering i selve kartoteket. Returnering af værdien nul bevirker at posten ikke opdateres Anvendes f.eks. til udfyldelse af felter der ikke opdateres i kartoteket. Afvikles ved introduktion af en ny post. Benyttes typisk til udfyldelse af standardværdier Afvikles umiddelbart før posten slettes Afvikles umiddelbart efter posten slettes. Benyttes typisk til følge sletninger i relaterede kartoteker f.eks. Notater Afvikles umiddelbart før posten opdateres Afvikles umiddelbart efter posten er opdateres. Benyttes typisk til vedligeholdelse af summer o.l. Afvikles umiddelbart før posten indsættes i kartoteket Afvikles umiddelbart efter posten er indsat i kartoteket 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) Check-Field Pre-Field Post-Field Forklaring Anvendes til check af feltets værdi efter en indtastning Afvikles umiddelbart før der rettes i feltet Afvikles umiddelbart efter der er rettet i feltet Notatknappen kan ikke aktiveres. 47

48 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 Database XAL kode oversættes i kartotek valgt fra liste over kartoteker 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

49 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 Alle Eksport af alle nye kartoteker inkl. Enum. Der eksporteres alle nye kartoteker der er tilføjet, samt kartoteker med nye felter og index. Desuden eksporteres samtlige Fast-Tekst-Typer. Eksport af samtlige kartoteker ekskl. Enum. 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 Fast- Tekst-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 Overskriv Import af kartoteker med tilføjelse af nye felter. Importen omfatter kun kartoteker, der ikke eksisterer i forvejen. 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

50 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 Brugere/ Grupper Rettigheder Koder Der henvises til hjælpefilen for yderligere information om SQL Samme som under Adgangskontrol Samme som under Adgangskontrol Samme som under Adgangskontrol 50

51 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 Ret Oprettelse af nye regnskaber Datamanipulation List * Trim * Debug * Oversæt * Udskriv Export Import Ad Hoc Rapportgeneratoren Total eksport af database fra aktuelle regnskab 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

52 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

53 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

54 Data/Diverse I menupunktet Data/Diverse fremkommer en menu med punkterne i nedenstående skema. Menu punkter i Diverse Database status Reindex Check Anvendelse Skærmbillede til kontrol af kartotekernes status. Reindexering af enkelte kartoteker og hele databasen 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 Temporær Kartoteket er placeret i C5DATA.DAT og er tilgængeligt fra alle regnskaber. Kartoteket er placeret i sin egen temporære fil, der slettes, når C5 forlades. Applikation Kartotek Antal Modulet det enkelte kartotek er tilknyttet. Kartotekerne er sorteret efter moduler. Kartotekets kaldenavn 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

55 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

56 Menupunkter under Check Check Fix Anvendelse Check af databasens interne opbygning uden korrektion 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

57 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

58 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 #GetTempId Genererer et entydigt sessionnr til brug i et TMP kartotek Kalder ovenstående macro op til 8 gange alt efter hvor mange parametre man har sat ind i macroen. %1 = Entydigt INT %1 = Entydigt INT %2-8 = Entydigt INT #TMP_Delete_EN #TMP_Delete #DeleteDatoSum, #DeleteKontoSum, #DeleteVirtuel, #DeleteBetaling, #DeleteSum Sletter alle poster i et TMP kartotek med en bestemt session ID Sletter alle poster i et TMP kartotek med ovenstående macro for op til 5 sessionid s 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 %1 = TMP Kartotek %2 = Index %3 = SessionId %1 = TMP Kartotek %2 = Index %3 = SessionId %4-7 = SessionId %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

59 Ulemper Det kan være svært at overskue. Man skal huske at overføre sessionid mellem forskellige XAL elementer 59

60 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

61 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 ADDIDX DELIDX CheckCREIDX Indsætter samtlige records i temporære index Indsætter udvalgte records i temporære index Sletter temporære index Checker oprettelsen af temporære index 61

62 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

63 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

64 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

65 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 Exit Abort Refresh Pre-key Post-key Mouse Error Event Pre-form Post-form Første trigger der startes Når der tastes F3 eller Esc Når der tastes Alt+Q Når #Frm_Refresh er anvendt Når der trykkes på en lokal procestaste Når en lokal procestaste er blevet udført Når musen aktiveres i formen Under afvikling ved fejl i control kommandoer Når system events indtræffer f.eks. resize vindue Umiddelbart efter Init triggeren Umiddelbart inden Exit og Abort triggerne 65

66 Event-triggere i blokken Triggere Aktivering Pre-record Post-record Pre-block Post-block Post-load Pre-insert Post-insert Pre-update Post-update Pre-delete Post-delete Post-fail Pre-menu Post-menu Init-record Filter Lookup Når der skiftes til en ny post i formen Når den aktuelle post forlades Når der skiftes til en anden blok i formen Når den aktuelle blok forlades Umiddelbart før poster skrives på skærmen Inden poster indsættes i selve kartoteket Efter en vellykket indsættelse af en post i kart. Før opdatering af poster i en blok Efter en vellykket opdatering af poster i en blok Før sletning af poster Efter en vellykket sletning af poster Efter opdatering, indsættelse eller sletning der fejlede. Når et menupunkt vælges Efter et menupunkt er valgt Når der oprettes en ny post i en form Hver gang en post findes frem f.eks. med #Frm_Search Fremfinding af poster 66

67 Key-triggere i blokke Triggere Aktivering NXTFLD PRVFLD TOPREC ENDREC NXTREC PRVREC NXTBLK PRVBLK NXTFRM PRVFRM NXTPGE PRVPGE CLRBLK BLKMNU FNDREC ADDREC DELREC COMMIT Næste felt Forrige felt Første post i kartotek Sidste post i kartotek Næste post (record) Forrige post (record) Næste blok Forrige blok Næste side med poster Forrige side med poster Næste side Forrige side Clear blok (slet data i blok) Blokmenu kaldes Find specifikke poster Tilføj post Slet post 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

68 Felt-triggere Triggere Aktivering Pre-field Post-field Post-change Post-load Post-edit Mouse Før cursoren går ind i feltet Når cursoren forlader feltet Når feltet forlades og der er udført ændringer Som Post-load på blokke, men kun for synlige felter Efter ændring i et felt inden værdien gemmes 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) INT &IndexId #GetTempId(&IndexId) #LocalMacro.IndexNavn Tmp +Num2Str(&IndexId,0,0,0,0) #EndMacro #Frm_CREIDX(CustTable,#IndexNavn, Language_) #CheckCREIDX Åbner biblioteker Erklærer variabel Lokalmacro til indexnavn Temporært idx dannes 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

69 Triggere i hovedblok CustGroup (styrer opslag i underblok CustTable ) Trigger XAL kode Kommentar Prerecord #Frm_USRKEY(CustGroup,8) Kald UsrKey 8 USRKEY nr 8 #Frm_DELIDX(CustTable,#IndexNavn) #Frm_CREIDX(CustTable,#IndexNavn, Language_) SEARCH CustTable WHERE CustTable.Group == CustGroup.Group AND CustTable.Language_ == &Language Danner poster til temporære index. Poster fra CustTable tildeles til variablen &RecNo. Indsættes i temporære index. USRKEY Nr 9 END SET &RecNo = CustTable.Recid #Frm_ADDIDX(CustTable,#IndexNavn) #Frm_INDEX(CustTable,#IndexNavn) #Frm_Search(CustTable) IF &IndexId THEN #Frm_DELIDX(CustTable,#IndexNavn) ENDIF Index og Første post Temporært index slettes Triggere i feltet &Sprogkode i hovedblokken Trigger XAL kode Kommentar Post-Field #Frm_USRKEY(CustGroup,8) Kald UsrKey 8 69

70 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

71 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

72 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 VendTable En til mange relation 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

73 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 Er der relationer opsat 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 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

74 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 ENM IDX FRM LMC LST MAC PRD QTX REP SXL XAL UXL MNU MNX Kartotek Fasttekst Index Form Lokalmacro Listbilleder Macro Printer Søgninger Rapport System-trigger XAL-kørsel User-Hook Undermenuer Gittermenuer 74

75 Beskrivelse af elementer Det enkelte element er beskrevet med følgende felter: Type Felt angiver elementets type. Der er følgende muligheder: DBD: ENM: FNC: FRM: IDX: LMC: LST: MAC: MNU: PRD: QTX: REP: SXL: TRG: UXL: XAL: Kartotek Enum Funktion Form Index Localmacro Listbillede Macro Lokalmenu Printer Søgning Rapport Systemtrigger Databasetrigger Userhook 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.: ,

76 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 Afviklingsdatabase Automatisk scan Eksportsti Brugernavn Her angives forkortelsen på den aktuelle versionskontrol databasen. Her angives forkortelsen på den ønskede database, som benyttes ved afvikling af elementerne med funktionen Alt+R. 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. Her angives hvilket directory elementerne eksporteres til og importeres fra med funktionerne Eksport og Import. 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

77 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 MS- DOS 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 Navn Kald Feltet indeholder typen på det pågældende element. Feltet indeholder navnet på det pågældende element og er ligesom Type identisk med navnene på fanen Versionskontrol. Ved benyttelse af kartoteker og index er der angivet her, hvilkenform benyttelsen har. 77

78 Specifikation Linje 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. Feltet indeholder linjenummeret, hvor den pågældende benyttelse er fundet. Ved elementer med flere Triggere er det linjenummeret i den enkelte trigger. 78

79 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

80 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 SEARCH VendTable SET &Til = Account PRINT Account END PAUSE Ingen Scope Scope dvs. adgang til felterne 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

81 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

82 Eksempel på IF 1 THEN (Udsnit af XAL=PayCalculate)... #DefIdxTable(Periods,STR 10,DATE,,25) // Memory Cache with periods #IniIdxTable(Periods,1) 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

83 { } { 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

84 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

85 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

86 Betydning af de enkelte komponenter i direkte opslag Komponent Betydning Kartoteksnavn IndexNavn Udtryk Navn på opslagskartotek hvorfra der skal hentes en værdi. Navn på et Index i opslagskartoteket. 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

87 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 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

88 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 RowNumber LastChanged NotesFileId NotesRecId LineNumber Txt Forklaring Postens RowNumber i kartoteket Notat Dato for sidste ændring i denne post FileId på andet kartotek der ejer notatet RecId på post i andet kartotek der ejer notatet Benyttes til sortering Tekst med notat som det indtastes i et skærmbillede Date_ RecId FileId Notatpostens egen RecId i kartoteket Notat Notatkartotekets egen FileId i kartoteket i Notat 88

89 Sammenhæng mellem oprettet notat og Kartoteket Notes CustTable RowNumber LastChanged Account Name Osv. Notes RowNumber LastChanged NotesRecId NotesFileId 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 NotesIdx Indexformel 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

90 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

91 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") END WRITE &FilNavn2 AS COMMA FROM (NotatFileId, CustTable[RecID,NotesRecId].Account, LineNumber, Txt) 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

92 Eksempel på Import af CustTable og Notes STR 254 &FilNavn1 STR 254 &FilNavn2 STR 20 &Account STR 30 &Name STR 10 &Group INT &NotesFileId STR 20 &NotesAccount REAL &LineNumber STR 250 &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

93 Notater på forms med én blok Procestast Opret procestaste Alt+P Proces...: Form-afvikling Parametre til proces: Form=Notes (eller kun Notat) Hjælpetekst...: Notater Tast...: Alt N Notatfelt 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

94 Notater på forms med flere blokke Procestast Opret procestaste Alt+P Proces...: Form-afvikling Parametre til proces: Form=Notat (eller kun Notat) Hjælpetekst...: Notater Tast...: Alt N Notatfelt 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

95 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

96 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 Fra Til Status CustTable Sortering...: Filter...: Kørsler...: Kørsler Åben Åben Skjul Notes Sortering...: Filter...: Kørsler...: Kørsler Åben Åben Skjul 96

97 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 RecId FileId Felt 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

98 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

99 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 #PromptLen / Prompt_Util #StrPrompt / Prompt_Util #EmptyPrompt / Prompt_Util Laver en prompt, macroloader Prompt_Util og laver en INTRODUCE på parameter kartoteket Indeholder default længde på indledende tekster til prompt (20 tegn) Indeholder StrPrompt med mulighed for default Promptlængde Laver en tom prompt med default længde #PromptLen %1 = <UserID> %2 = <Navn> (Hvor navn er det navn man ønsker recorden gemt under i parameter kartoteket) Ingen parametre %1 = <LedeTekst> %2 = <Længde på prompten> %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 # StrField / Prompt_Util Returner tabelnavnet I en prompt med mulighed for default længde Returner feltnavn I en prompt med mulighed for default længde %1 = <Tabelnavn> %2 = <Længde på prompten> %1 = <Tabelnavn> %2 = <Feltnavn> %3 = <Længde på prompten> 99

100 Navn / Bibliotek Funktion Parametre #PromptAbort / Prompt_Util #PromptFromTo / Prompt_Util Benyttes til afslutning af prompt inkl. test for afslutning med alt Q Laver en prompt med teksten Fra og Til med en default afstand på 10 %1 = <AT Kolonne> %2 = <AT Linje> %3 = <Kartoteksnavn> %1 = <Afstand mellem fra og til> #GET_Field / Prompt_Util #GetDat / 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. Bruges i stedet for GET kommandoen men med en fast længde på indtastningsfeltet %1 =<Feltnavn> %2 =<Længde af prompten> %3 =<Kartoteksnavn> %4 =<Feltnavn> %5 =<Længde af promptfelt %1> %1 = <Feltnavn> #NoYes / Prompt_Util #NoYes10 / Prompt_Util Bruges i stedet for GET kommandoen men med en fast længde på 5 på indtastningsfeltet og kun på NejJa felterne Bruges i stedet for GET kommandoen men med en fast længde på 10 på indtastningsfeltet og kun på NejJa felterne %1 = <Feltnavn> %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

101 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

102 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 UserId Type Int Name STR 30 Txt1-14 STR 20 Txt 50 STR 100 INT 1-10 REAL 1-6 DATE 1-5 ENUM NoYes 1-15 INT REAL DATE 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

103 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

104 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

105 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

106 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

107 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

108 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 (GroupId) FieldNum INT (FeltId) STR (Kartoteksnavn) STR (FeltNavn) FieldPName STR (Ledetekst eller Feltnavn) STR (Kartoteksnavn) STR (FeltNavn) 108

109 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

110 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

111 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

112 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

113 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

114 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

115 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

116 Parametre Funktionen Directory skal tildeles værdier i form af parametrene: Ledetekst, PrimPath, SecPath, Mode, Rettigheder og Warning. Parameter Ledetekst PrimPath SecPath Mode Forklaring Ledetekst til en eventuel verificering af den primære sti af filer Primær sti til filer som funktionen arbejder på Sekundær sti til filer som funktionen arbejder på 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 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 Filmanager Rettigheder Anvende kun ved MODE = 0 0 = Ingen funktioner 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

117 Eksempler Macroen FileDelete { } { Sletning af fil %1,%2,... uden prompt } { } SET Directory("",%1,"",1,0,0) #IFNOT.EMPTY(%2) SET Directory("",%2,"",1,0,0) #ENDIF #IFNOT.EMPTY(%3) SET Directory("",%3,"",1,0,0) #ENDIF #IFNOT.EMPTY(%4) SET Directory("",%4,"",1,0,0) #ENDIF #IFNOT.EMPTY(%5) SET Directory("",%5,"",1,0,0) #ENDIF #IFNOT.EMPTY(%6) NB: Max 5 filer #ENDIF Macroen FileExists Directory("",%1,"",7,0,0) 117

118 Dirmanager { } { Kørsel til demonstration af mulighederne i XalFunktionen } { Directory } { } STR 60 &ReturStr STR 60 &PromptStr STR 60 &PriPath STR 60 &SecPath INT &Action INT &Rights INT &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) END SET &ReturStr = Directory(&PromptStr, &PriPath, &SecPath, &Action, &Rights, &Info) 118

119 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

120 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 Vinduets højde / bredde Den tekst der vil blive vist i vinduets ramme. 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 (default) Skalerbart Den angivne vinduesstørrelse benyttes. Vinduet kan kun skaleres ned. Felter flyttes ikke. 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 Lukket Nedarvet Fylder hele skærmbilledet som default uanset angivet vinduesstørrelse. Virker ellers som skalerbart. Lukker af for aktivering af form (trigger kode kan dog fortsat afvikles) 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

121 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 Ret Opret Slet Vise Vise, rette Vise, rette, oprette 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

122 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) CustTable.Account (felt) Alt+H SalesTabel (Kartotek) CustTable.Account (felt) CustTable (Ref. Kartotek) Account (Ref. felt) CustTable (Ref. Kartotek) Account (Reference) Listbilleder på CustTable 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 = 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

123 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> Index=<Indexnavn> Mode=Watch Mode=Select=Feltnavn Mode=Edit Mode=Add Mode=All GetField=<Feltnavn> SearchField=<Feltnavn> Listbillede navn. Det ønskede index I kartoteket specificeres, som default benyttes første index. Her kan man kun se eksisterende data. 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 Her kan man se og ændre eksisterende data. Her kan man se, ændre og tilføje data. Her kan man se, ændre, tilføje og slette data Feltnavn der skal bruges som udgangspunkt for fremsøgningen af data. 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 Command=Find Viser kun de records som opfylder søgekriteriet (givet ved SearchField/GetField) I Listbilledet 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

124 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 Forms / #ParmTable Funktionalitet 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 Parametre %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

125 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

126 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

127 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

128 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

129 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

130 Eksempel TTSBEGIN InvenPrice SEARCH InvenTable USING ItemIdx INTRODUCE InvenPrice[InvenTable.ItemNumber, Salg ] SET Price = InvenTable.CostPrice * 2 UPDATE InvenPrice PRINT ItemNumber END IF CostPrice <= 0 THEN TTSABORT SET BOX(2,"Der er varer uden kostpris!\n\n"+ "Kørslen afbrydes uden opdatering.",0) RETURN 0 ENDIF 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

131 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 Lokale macroer Samling af lokal macroer der kan bruges overalt Samling af localmacroer bør undgås og bruges macrobiblioteker i stedet. Kan bruges overalt hvis der macroloades 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 &Tal1 = 2 INT &Tal2 = 1 #Add(&Tal1,&tal2) Koden i #Add() macroen SET %1 = %1 + %2 131

132 Dette betyder, at når vi oversætter XAL en, så vil koden i virkeligheden være som følger: INT &Tal1 = 2 INT &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

133 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 #Macroload Global Denne macro giver adgang til macroerne i et macro bibliotek #Num2Str Funktioner Indsætter default værdierne til funktionen NUM2STR Default værdierne er: Num2Str(Real,0,0,1,2) Parameter 2-5 er valgfrie. #Add Global Denne macro lægger A sammen med sig selv og 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 A 0g B kan være en INT, REAL, DATE, ENUM %1 = Kartoteksnavn %1 = Macrobiblioteksnavn %1 = REAL %2 = Sat default til 0 %3 = Sat default til 0 %4 = Sat default til 1 %5 = Sat default til 2 %1 = A %2 = B %1 = A %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

134 #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 #ENDIF 0 #ENDIF, %3 #ENDIF 0 #ENDIF, %4 #ENDIF 1 #ENDIF, %5 #ENDIF 2 #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

135 #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) ENDIF {Engelsk til Tysk} 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

136 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

137 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

138 Outputtet til dette eksempel Eksempel med STEP INT &I FOR &I = 2 TO 10 STEP 2 PRINT &I END PAUSE Outputtet til dette eksempel: 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: #Switch / #Case Macroen Disse macroer bliver brugt til at implementere en Case struktur. Det kræver brugen af følgende macroer: #Switch() #Case() (Case bliver genbrugt lige så mange gange som der er udfald) #EndSwitch() 138

139 Eksempel 1 INT &I PROMPT "Vælg" GET(&I ASENUM "A\nB\nC\nD") INPUT #Switch(&I) #Case(0) PRINT "Du valgte bogstavet A" #Case(1) PRINT "Du valgte bogstavet B" #Case(2) PRINT "Du valgte bogstavet C" #Case(3) PRINT "Du valgte bogstavet D" #EndSwitch PAUSE 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

140 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

141 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 Forms / Formref 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 Denne macro henter den form der opsat på databasen til reference hvis kartotek og form ikke hedder det samme. %1= <Feltnavn> %2= <Formnavn> %3= <Parameter / Feltværdi> %1= <Kartoteksnavn> 141

142 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 Forms / #Frm_Refresh Funktionalitet Frm_Refresh bruges til at kalde Refresh triggeren med et bestemt interval. Parametre %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

143 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 Forms / #LookTOPREC Forms / #LookENDREC Forms / #LookPRVREC Forms / #LookNXTREC Forms / #LookCURREC Forms / #LookRECNO Værdi af indirektionen 'TOPREC' 'ENDREC' 'PRVREC' 'NXTREC' 'CURREC' '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

144 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

145 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 (Automatisk) Kaldt element (EXTERN Buffer) Parm Parm (Fra menupunkt) Kaldt element IF &Parm SET Felt=&Parm PRINT &Parm osv. 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

146 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= Bemærk! I menupunkter angives variablen &Parm uden & foran. Overførsel via kommandoen PROCESS PROCESS USING Buffer Buffer (Fra PROCESS) Kaldt element (EXTERN Buffer) Parm= Parm (Fra PROCESS) Kaldt element IF &Parm SET Felt=&Parm PRINT &Parm osv. 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

147 XAL kørsel uden overførsler PROCESS 17 Form=CustTable XAL kørsel med angivelse af buffer INTRODUCE CustTable[AccountIdx== ] PROCESS 17 Form=CustJournal USING CustTable XAL kørsel med angivelse af Parm INTRODUCE CustTable[AccountIdx== ] 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

148 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

149 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 XAL kørsel Anvendelse 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

150 É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 IF &Parm THEN Tildele nøgleværdier SET Er &Parm tom ELSE Hent sidst anvendte nøgle &Custdefault Angive index #Frm_Index Findes nøglefelt IF Account Akutelle post findes #Frm_Find Eksisterer posten ikke IF NOT RowNumber Første post findes #Frm_Search 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

151 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

152 #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 EXTERN Tildele nøgleværdier SET Angive index #Frm_Index Er bufferen tom IF RowNumber Åbne buffer 2 EXTERN Tildele nøgleværdier SET Angive index #Frm_Index 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

153 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

154 XAL kørslen CopyOrder EXTERN SalesTableArch IF RowNumber THEN ENDIF EXTERN ProjTableArch IF RowNumber THEN ENDIF EXTERN PurchTableArch IF RowNumber THEN 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

155 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

156 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 Edit Add All Kun se Se og rette Se, rette og oprette 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

157 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

158 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

159 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 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. 0x The parameter is incorrect. Handle result kan typisk defineres som: STR 80 &HR 159

160 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

161 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

162 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

163 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) STR 12 &HCOM STR 80 &HR SET &URL = Åbner biblioteker Erklærer variabel Tildel værdier IF (&HCOM== ) THEN #Frm_UsrKey(IE,9) ENDIF Hvis &HCOM er tom så kaldes UsrKey 9 Exit SET COMRelease(&HCOM) Frigiv ressourcer Triggere på blokken IE Trigger XAL kode Kommentar USRKEY Nr 9 #Frm_CRECOM(IE,GraphButton, shell.explorer ,&HCOM) Kalder COM objektet 163

164 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

165 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

166 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 ALT+H SPACE Åbn den interne hjælp Åbn hjælpeliste og se valgmuligheder i et felt Afmærk ja/nej felter Vælg mellem valgmuligheder (kun i felter med knappen højre side) i ALT+N CTRL+ALT+F6 CTRL+F9 SHIFT+F5 ALT+I ALT+F4 ALT+W CTRL+T Åbn notatfelter Redigér det aktuelle skærmbillede Slet egne rettelser i det aktuelle skærmbillede Kopier Indsæt Afslut C5 Start Wizards Systemdato og tid 166

167 Navigation i C5 Tast Beskrivelse Knap CTRL+TAB CTRL+SHIFT+TAB ALT+F8 ALT+F7 F8 F7 PgUp (page up) PgDn (page down) CTRL+F8 CTRL+F7 SHIFT+F8 SHIFT+F7 ENTER og TAB SHIFT+TAB PIL venstre og højre CTRL+ALT+F4 CTRL+F10 Næste faneblad (modul) Forrige faneblad (modul) Næste faneblad (kartoteker) Forrige faneblad (kartoteker) Næste post eller linje Forrige post eller linje Næste sides poster/linjer Forrige sides poster/linjer Sidste post eller linje Første post eller linje Hop til næste blok på skærmbilledet Hop til forrige blok på skærmbilledet Næste felt Forrige felt Åbn/luk menupunkter i hovedmenuen vist som træstruktur Hop til hovedkartotek Skift til hovedmenuen ved flere åbne vinduer samtidig Vedligeholdelse af stamdata Tast Beskrivelse Knap F2 SHIFT+F2 ALT+F9 F3 CTRL+F2 ALT+D eller DELETE BACKSPACE ALT+U ALT+Q ALT+C Opret ny post, linje eller afgrænsning Opret en ny post som kopi af den valgte Slet post, linje eller afgrænsning Godkend og luk aktuelt skærmbillede Opdatér post eller linje Slet indholdet i et felt Slet tegn til venstre i et felt Fortryd ændring i felt (genskab feltindhold) Fortryd sidste handling og luk skærmbillede Kopier feltindholdet fra samme felt på forrige linje 167

168 Søgning og filtrering af poster Tast Beskrivelse Knap F4 SHIFT+F4 SHIFT+ALT+F4 ALT+F5 F2 ALT+F9 ALT+L Find post Filtrer poster Find faktura i Debitor- og Kreditorkartotekerne Fritekstsøgning i kartoteker Indsæt afgrænsningsfelt Slet afgrænsningsfelt Læg afgrænsningsfelter sammen (ét afgrænsningsfelt i stedet for et fra og et til afgrænsningsfelt) Øvrige genvejstaster Tast Beskrivelse Knap F5 CTRL+L CTRL+Q CTRL+W CTRL+U Markér post if. åbenpostredigering (udligning) af poster Lommeregner Vis billede Sæt præsentationsvaluta 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

Microsoft Development Center Copenhagen, December 2009. Factsheet. Microsoft Dynamics C5 2010. Factsheet om Labels

Microsoft Development Center Copenhagen, December 2009. Factsheet. Microsoft Dynamics C5 2010. Factsheet om Labels Microsoft Development Center Copenhagen, December 2009 Factsheet 2010 Microsoft Dynamics C5 2010 Factsheet om Labels Indholdsfortegnelse Indledning... 3 Udviklingsværktøj - Ctrl-F1... 4 Labelsystemet...

Læs mere

Microsoft Dynamics C5 Version 2012. Programmering II

Microsoft Dynamics C5 Version 2012. Programmering II Microsoft Dynamics C5 Version 2012 Programmering II 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

Læs mere

Microsoft Dynamics C5 Version 2012. Programmering I

Microsoft Dynamics C5 Version 2012. Programmering I Microsoft Dynamics C5 Version 2012 Programmering I 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

Læs mere

Datatransport... 2. Import & Eksport af data... 2. Generelt... 2. Import/eksport... 4. Felter i Import og Eksport... 5

Datatransport... 2. Import & Eksport af data... 2. Generelt... 2. Import/eksport... 4. Felter i Import og Eksport... 5 Indhold Datatransport... 2 Import & Eksport af data... 2 Generelt... 2 Import/eksport.... 4 Felter i Import og Eksport... 5 Trykknapper til Import og Eksport... 7 1 Alle... 7 2 Slet... 7 3 Editor... 7

Læs mere

Bookingsystem til hoteller. JTA-Data Jylland JTA. Vinkelvej 108a 8800 Viborg Tlf. 86672024 www.jta-data.dk DATA. Jylland

Bookingsystem til hoteller. JTA-Data Jylland JTA. Vinkelvej 108a 8800 Viborg Tlf. 86672024 www.jta-data.dk DATA. Jylland Bookingsystem til hoteller -Data: C5 bookingsystem til hoteller Indhold 1. Daglig brug af bookingsystemet. 2. Ny booking et værelse 3. Ny booking flere værelser 4. Ankomst 5. Rengøring 6. Afrejse 7. Værelsesoversigt

Læs mere

Når du på Pro2tal Bager s hjemmeside: www.bagernettet.dk klikker på ikonet

Når du på Pro2tal Bager s hjemmeside: www.bagernettet.dk klikker på ikonet Når du på Pro2tal Bager s hjemmeside: www.bagernettet.dk klikker på ikonet kommer følgende login billede til Bagersystemet: Indtast dit brugernavn og adgangskode og tryk Enter eller klik på knappen Logon.

Læs mere

De vigtigste funktionstaster Microsoft Dynamics C5

De vigtigste funktionstaster Microsoft Dynamics C5 De vigtigste funktionstaster Microsoft Dynamics C5 Her kan du få hjælp til, hvordan du nemmere kan arbejde i C5 2012. Genvej Funktion Betydning F1 Hjælp Kalder hjælp frem. Hjælpen tager automatisk udgangspunkt

Læs mere

Vejledning til bagersystemet version 3.0. Varer. Oplysninger om dine varer findes under Lager/Varer.

Vejledning til bagersystemet version 3.0. Varer. Oplysninger om dine varer findes under Lager/Varer. Oplysninger om dine varer findes under Lager/. Varetabellen anvendes til at oprette og vedligeholde stamdata for råvarer, varer og opskrifter. 08-02-2008 Side 1 af 10 Tryk Ctrl+N eller klik på ikonet for

Læs mere

Axapta 3.0 Konverteringsvejledning

Axapta 3.0 Konverteringsvejledning Axapta 3.0 Konverteringsvejledning ectrl Dokumentversion 3.0 Juli 2008 - Datakonvertering 2008 Side 1 af 14 Indholdsfortegnelse DATAKONVERTERINGSVÆRKTØJET:...3 KARTOTEK INFORMATIONSOVERSIGT - FANEBLAD...5

Læs mere

Opgraderingsguide. Sådan opgraderer du. for Dynamics AX. fra version 4.59 eller tidligere. til. version (dansk udgave)

Opgraderingsguide. Sådan opgraderer du. for Dynamics AX. fra version 4.59 eller tidligere. til. version (dansk udgave) Opgraderingsguide Frederiksberg, januar 2007 Sådan opgraderer du for Dynamics AX fra version 4.59 eller tidligere til version 4.80 (dansk udgave) Indhold 1 Indledning...3 2 Klargøring af den eksisterende

Læs mere

Vejledning til Planmodul i FLEX

Vejledning til Planmodul i FLEX Vejledning til Planmodul i FLEX Planlægningsmodulet i FLEX er udformet for at give planlæggeren mulighed for at lave fagfordeling på hold samt ressourcestyre medarbejdernes arbejdstid. Alle stamdata hentes

Læs mere

Menuen E-shop har 4 undermenupunkter: Varer, Kunder, Ordrer og Opsætning.

Menuen E-shop har 4 undermenupunkter: Varer, Kunder, Ordrer og Opsætning. E-shop E-shoppen giver dig mulighed for, at drive handel på Internet. Når du har modulet E-shop, vil du i hovedmenuen i administrationen kunne se disse menupunkter: Menuen E-shop har 4 undermenupunkter:

Læs mere

Guide til opdatering af Navision Stat med ny funktionalitet - nye objekter, datakonvertering, automatisk indlæsning af datafiler.

Guide til opdatering af Navision Stat med ny funktionalitet - nye objekter, datakonvertering, automatisk indlæsning af datafiler. Side 1 af 20 Navision Stat 7.0 ØSY/JACPM 15-05-2015 Vejledning til Lokal Versionsstyring (VMS) Overblik Guide til opdatering af Navision Stat med ny funktionalitet - nye objekter, datakonvertering, automatisk

Læs mere

Indholdsfortegnelse. EasyIQ IDM 5.4 Brugermanual

Indholdsfortegnelse. EasyIQ IDM 5.4 Brugermanual Indholdsfortegnelse Indledning... 2 Forsiden... 2 Dine genveje... 3 Nyheder... 3 EasyIQ og EasyIQ Quick Funktioner... 3 Administration... 8 Licens... 8 Nyheder... 9 Eksterne links... 11 Log... 12 Password...

Læs mere

Abonnementsstyring. Start af Stellar Abonnement. Indledende tekst. Indholdsfortegnelse

Abonnementsstyring. Start af Stellar Abonnement. Indledende tekst. Indholdsfortegnelse Abonnementsstyring Indledende tekst Indholdsfortegnelse Start af Stellar Abonnement... 1 Kom godt i gang med abonnement... 2 Vare/Ydelser i Stellar Office Pro... 2 Abonnements oversigt... 2 Fanebladet

Læs mere

Balancepåtegning... 2. Udskriv balancepåtegning... 2. Kopier balancepåtegning... 2. Opret balance påtegning... 2. Ændre balancepåtegning...

Balancepåtegning... 2. Udskriv balancepåtegning... 2. Kopier balancepåtegning... 2. Opret balance påtegning... 2. Ændre balancepåtegning... Indhold Balancepåtegning... 2 Udskriv balancepåtegning... 2 Kopier balancepåtegning... 2 Opret balance påtegning... 2 Ændre balancepåtegning... 3 Slet balancepåtegning... 3 Udvidet balancepåtegning...

Læs mere

DaTelTek ApS ich 4 SpAPI Telenor Serviceprovider API

DaTelTek ApS ich 4 SpAPI Telenor Serviceprovider API DaTelTek ApS ich 4 SpAPI Telenor Serviceprovider API Release 4.0.0 DaTelTek ApS Birkevej 4 DK-4640 Faxe Denmark CVR: 31 06 05 59 +45 32 22 22 22 www.dateltek.dk info@dateltek.dk Indholdsfortegnelse Ændring

Læs mere

Kladde Plus... 3. Ekstra Felter i Kladde Plus... 3. Gentag modkonto... 3. Konteringsvejledning... 3. Konto... 4. Tekst... 4. Privat...

Kladde Plus... 3. Ekstra Felter i Kladde Plus... 3. Gentag modkonto... 3. Konteringsvejledning... 3. Konto... 4. Tekst... 4. Privat... Indhold Kladde Plus... 3 Ekstra Felter i Kladde Plus... 3 Gentag modkonto... 3 Konteringsvejledning... 3 Konto... 4 Tekst... 4 Privat... 4 Kontonavn... 4 Modkontonavn... 4 Plus Sag, Plus Medarbejder, Plus

Læs mere

JTAnno. Annoncestyring. til. Microsoft Business Solutions C5 JTA DATA. Jylland

JTAnno. Annoncestyring. til. Microsoft Business Solutions C5 JTA DATA. Jylland nno Annoncestyring til Microsoft Business Solutions C5 -Data nno vers. 1.2.1 til Microsoft Business Solutions C5 vers. 3 1. Introduktion til nno nno til Microsoft Business Solutions C5 vers. 3 er et ekstra

Læs mere

Installationsvejledning

Installationsvejledning 1 Installationsvejledning NaviScan EBC 2 INDHOLDSFORTEGNELSE: FORUDSÆTNINGER SIDE 3 OPRETTELSE AF INDEX PÅ LAGERPOSTER SIDE 3 INSTALLATION AF NAVISCAN EBC PROGRAMELEMENTER SIDE 3 INDLÆS LICENSNØGLE SIDE

Læs mere

Brugermanual 2015-01-01. ProcessManager ApS Hovmarksvej 68 DK-2920 Charlottenlund

Brugermanual 2015-01-01. ProcessManager ApS Hovmarksvej 68 DK-2920 Charlottenlund Brugermanual 2015-01-01 ProcessManager ApS Hovmarksvej 68 DK-2920 Charlottenlund T +45 40 84 44 41 Mail: info@process-manager.dk Web: www.process-manager.dk Web: www.easy-mapping.dk CVR 28 69 77 67 Side

Læs mere

Regnskab... 3. Før regnskab opdateres eller tages i brug (Opsætning)... 3. Regnskabsparametre... 3. Regnskab standard... 4

Regnskab... 3. Før regnskab opdateres eller tages i brug (Opsætning)... 3. Regnskabsparametre... 3. Regnskab standard... 4 Regnskab... 3 Før regnskab opdateres eller tages i brug (Opsætning)... 3 Regnskabsparametre... 3 Regnskab standard... 4 Hent model (1.75/1.80 -> 1.85) (afsnit 4.1.3 er kun relevant for kunder med modeller

Læs mere

My booking. Generelt. Forsiden. Version 9.0

My booking. Generelt. Forsiden. Version 9.0 My booking Version 9.0 System til at lave online bookinger, med mulighed for opdeling i grupper, forskellige booking typer, ændre layout indstillinger, status styring, sprogvalg samt en del mere, detaljer

Læs mere

Opgavestyring. TimePlus version 2013

Opgavestyring. TimePlus version 2013 version 2013 Opgavestyring 1 Opgavestyring... 2 1.1 /tilpasning/opgavestyring/opgavetyper... 2 1.2 /tilpasning/opgavestyring/erklæringstyper... 4 1.3 /tilpasning/parametre... 5 1.4 Debitor/kartotek/debitorPlus

Læs mere

INSTALLATIONSGUIDE. Installationsguide. for Dynamics AX 4.0. til. dansk udgave. Frederiksberg, januar Docversion: 1.02.

INSTALLATIONSGUIDE. Installationsguide. for Dynamics AX 4.0. til. dansk udgave. Frederiksberg, januar Docversion: 1.02. INSTALLATIONSGUIDE, version 4.81 Frederiksberg, januar 2008 Installationsguide til for Dynamics AX 4.0 dansk udgave h Indhold 1 Indledning... 3 1.1 Systemkrav... 3 1.2 Kritik modtages gerne... 3 1.3 Yderligere

Læs mere

INSTALLATION GUIDE Microsoft C5

INSTALLATION GUIDE Microsoft C5 Copyright 2006 Microsoft Corporation All rights reserved Microsoft Development Center Copenhagen December 2006 GUIDE Microsoft C5 Version 4.0 SP1 Installationsvejledning Indholdsfortegnelse 1. Indledning...

Læs mere

e-konto manual 01.08.2011 e-konto manual Side 1

e-konto manual 01.08.2011 e-konto manual Side 1 e-konto manual 01.08.2011 e-konto manual Side 1 Indhold 1. Overordnet beskrivelse... 3 2. Login... 3 3. Se og ret kundeoplysninger... 4 4. Rediger kontaktoplysninger... 6 5. Skift adgangskode... 7 6. BroBizz-oversigt...

Læs mere

Orddeling. Automatisk orddeling. Manuel orddeling. Word 2010 18 thoremil.dk. Vælg fanebladet [Sidelayout] Vælg [Orddeling] Markér Automatisk orddeling

Orddeling. Automatisk orddeling. Manuel orddeling. Word 2010 18 thoremil.dk. Vælg fanebladet [Sidelayout] Vælg [Orddeling] Markér Automatisk orddeling Orddeling Automatisk orddeling Vælg [Orddeling] Markér Automatisk orddeling Manuel orddeling Vælg [Orddeling] Klik [Manuelt] For hvert ord, som vises, kan der gøres følgende: Accepter det foreslåede orddelingssted

Læs mere

ActiveBuilder Brugermanual

ActiveBuilder Brugermanual ActiveBuilder Brugermanual Forfatter: TalkActive I/S Dato: Juni 2004 Version: R. 1.01 Sprog: Dansk Copyright 2004 - Talk Active - all rights reserved. Indhold: 1. INDLEDNING...2 2. QUICK-START...3 3. OPBYGNINGEN

Læs mere

Kontoplan Plus. Felter i Plus+ kontoplanen... 3. Eksternkonto... 3. Effekt... 3. Primo... 3. MomsABC... 3. Årskode... 3. Prv... 3. KontoNavn2...

Kontoplan Plus. Felter i Plus+ kontoplanen... 3. Eksternkonto... 3. Effekt... 3. Primo... 3. MomsABC... 3. Årskode... 3. Prv... 3. KontoNavn2... Kontoplan plus... 2 Felter i Plus+ kontoplanen... 3 Eksternkonto... 3 Effekt... 3 Primo... 3 MomsABC... 3 Årskode... 3 Prv... 3 KontoNavn2... 4 Funktioner i kontoplan plus... 4 Konteringsvejledning...

Læs mere

Formular modul. Sitecore Foundry januar Version 1.0

Formular modul. Sitecore Foundry januar Version 1.0 22. januar 2015 - Version 1.0 Pentia A/S Store Kongensgade 66, Baghuset 1264 København K Telefon: 7023 3330 E-mail: info@foreningssite.dk Indholdsfortegnelse Indledning... 3 Opret en ny formular... 4 Skjult

Læs mere

Kursusbeskrivelse. Forarbejde. Oprettelse af en Access-database

Kursusbeskrivelse. Forarbejde. Oprettelse af en Access-database Kursusbeskrivelse Oprettelse af en Access-database Som eksempel på en Access-database oprettes en simpelt system til administration af kurser. Access-databasen skal indeholde: et instruktørkartotek et

Læs mere

Formular modul. Sitecore Foundry juli Version 1.0

Formular modul. Sitecore Foundry juli Version 1.0 Sitecore Foundry 3.0 Formular modul 15. juli 2011 - Version 1.0 Pentia A/S Store Kongensgade 66, Baghuset 1264 København K Telefon: 7023 3330 E-mail: info@foreningssite.dk Indholdsfortegnelse Indledning...

Læs mere

Web MTC manual. Version 1.1 08-11-2012

Web MTC manual. Version 1.1 08-11-2012 Web MTC manual Version 1.1 08-11-2012 1 Revisioner: Version 1.0, 11-10-2012: Oprettelse af dokument Version 1.1, 08-11-2012: Afsnit om udskrivning af rapport tilføjet. 2 Indhold Sideopbygning... 5 Startside...

Læs mere

1. Web-inkasso for fordringshaver

1. Web-inkasso for fordringshaver 1. Web-inkasso for fordringshaver 1.1 Login på hjemmesiden Man kan logge sig på via Skattestyrelsens hjemmeside { HYPERLINK "http://www.aka.gl" } (under Inddrivelsesmyndigheden) eller direkte på { HYPERLINK

Læs mere

DK-Unit Point version 2.xx til PWE 37

DK-Unit Point version 2.xx til PWE 37 Beskrivelse af DK-Unit til Point Yomani og Xenta Dankort terminaler DK-Unit programmet er udviklet til at kunne benyttes sammen med forskellige applikationer, hvor man ønsker at kunne danne en Dankort

Læs mere

ectrl Skabelonkonvertering

ectrl Skabelonkonvertering ectrl Skabelonkonvertering Indholdsfortegnelse 1. Indledning 3 2. Import ved hjælp af standardskabeloner 4 Kolonneopsætning og feltdefinition 6 3. Opsætning af konverteringsdefinitioner 8 4. Udvidede muligheder

Læs mere

Vejledning for anvendelse af PensionsIndberetningssystem PI

Vejledning for anvendelse af PensionsIndberetningssystem PI Vejledning for anvendelse af PensionsIndberetningssystem PI PNN PENSION 190503/AMB Indholdsfortegnelse 1. INDBERETNINGER... 3 2. SØG INDBERETNING... 4 3. NY INDBERETNING... 5 4. INDLÆS FIL... 7 5. INDTAST

Læs mere

Manual til Kundekartotek

Manual til Kundekartotek 2016 Manual til Kundekartotek ShopPlanner Customers Med forklaring og eksempler på hvordan man håndterer kundeoplysninger www.obels.dk 1 Introduktion... 3 1.1 Formål... 3 1.2 Anvendelse... 3 2 Referencer...

Læs mere

SecureAware Opfølgning Manual

SecureAware Opfølgning Manual SecureAware Opfølgning Manual Manualen beskriver brugen af SecureAware version 3 Dokument opdateret: juni 2009 Om dette dokument Dette dokument er en vejledning i brug af opfølgnings-modulet i SecureAware.

Læs mere

DDElibra H Å N D B O G

DDElibra H Å N D B O G H Å N D B O G Axiell Danmark A/S 2016-10-12 Version 9.11.60 GUI Copyright 2016 2 1 Indholdsfortegnelse 1 Indholdsfortegnelse... 2 2 Introduktion... 3 3 Søgning i dokumentationen... 3 4 Åbning af ""...

Læs mere

AgroSoft A/S AgroSync

AgroSoft A/S AgroSync AgroSoft A/S AgroSync AgroSync er et AgroSoft A/S værktøj, der bliver brugt til filudveksling imellem WinSvin og PocketPigs. Fordele ved at bruge AgroSync: Brugeren bestemmer overførsels tidspunktet for

Læs mere

Vejledning til. Svejsevisitering. Oprettelse af kursister i testsystemet... 2. Opret Booking... 5. Kursisten tager test... 10

Vejledning til. Svejsevisitering. Oprettelse af kursister i testsystemet... 2. Opret Booking... 5. Kursisten tager test... 10 Kompetencecenter for e-læring Det Nationale Videncenter for e-læring Vejledning til Svejsevisitering Indhold Oprettelse af kursister i testsystemet... 2 Opret Booking... 5 Kursisten tager test... 10 Læreren

Læs mere

JTA-DynamicsPDF. til. Microsoft Dynamics C5 vers. 3 SP3 eller højere. JTA-Data Jylland Vinkelvej 108a 8800 Viborg Tlf. 86672024 www.jta-jylland.

JTA-DynamicsPDF. til. Microsoft Dynamics C5 vers. 3 SP3 eller højere. JTA-Data Jylland Vinkelvej 108a 8800 Viborg Tlf. 86672024 www.jta-jylland. JTA-DynamicsPDF til Microsoft Dynamics C5 vers. 3 SP3 eller højere. www.jta-jylland.dk 1. Introduktion til JTA-DynamicsPDF. JTA-DynamicsPDF til Microsoft Dynamics C5 er et ekstra modul, som er udviklet

Læs mere

I dette eksempel exporteres en balanceudskrft til Excel. Balancen er genereret og vises på skærmen.

I dette eksempel exporteres en balanceudskrft til Excel. Balancen er genereret og vises på skærmen. Excel, export og import I alle skærmbilleder, der er lister, oversigter, balancer, kladder etc., kan der både exporteres og importeres mellem Uniconta og Excel. Export benyttes f.eks. til at udlæse data

Læs mere

Elektronisk spørgeskema 2009. Vejledning

Elektronisk spørgeskema 2009. Vejledning Elektronisk spørgeskema 2009 Vejledning Indberetning på Elektronisk spørgeskema for 2009 Introduktion Elektronisk spørgeskema 2009 (ESP 2009) giver Dem mulighed for at lette arbejdet i forbindelse med

Læs mere

INSTALLATIONSGUIDE. Installationsguide. for Dynamics AX 4.0. til. dansk udgave. Frederiksberg, maj Docversion: 1.01.

INSTALLATIONSGUIDE. Installationsguide. for Dynamics AX 4.0. til. dansk udgave. Frederiksberg, maj Docversion: 1.01. INSTALLATIONSGUIDE Frederiksberg, maj 2007 Installationsguide til for Dynamics AX 4.0 dansk udgave h Indhold 1 Indledning...3 1.1 Systemkrav...3 1.2 Kritik modtages gerne...3 1.3 Yderligere oplysninger...3

Læs mere

Vejledning til PRO2TAL Bager/Online. Ordrer

Vejledning til PRO2TAL Bager/Online. Ordrer På Menuen Dagligt findes menupunkterne Ordrekladde og Ordre. Disse menupunkter benyttes til at oprette, vedligeholde og forespørge på henholdsvis faste ordrer (Ordrekladden) og almindelige ordrer dvs.

Læs mere

Komme-i-gang vejledning til Septimana. For skemalægger og systemadministratorer

Komme-i-gang vejledning til Septimana. For skemalægger og systemadministratorer Komme-i-gang vejledning til Septimana For skemalægger og systemadministratorer Denne Komme i gang er rettet mod skemalæggere og systemadministration. Hvis du er lærer eller studerende, kan du finde en

Læs mere

Vejledning til Kilometer Registrering

Vejledning til Kilometer Registrering Vejledning til Kilometer Registrering iphone Appen som holder styr på dit firma og privat kørsel. Udviklet af Trisect Development 2011. www.trisect.dk For iphone version 4.2 og nyere. Med Kilometer Registrering

Læs mere

Navision Stat 7.0. Kvikguide om tilpasning af rollecenteret. Overblik. Side 1 af 29. ØSY/STO 18. maj 2015

Navision Stat 7.0. Kvikguide om tilpasning af rollecenteret. Overblik. Side 1 af 29. ØSY/STO 18. maj 2015 Side 1 af 29 Navision Stat 7.0 ØSY/STO 18. maj 2015 Kvikguide om tilpasning af rollecenteret Overblik Formål Denne kvikguide omhandler de tilpasninger som du kan foretage i Handlingsbåndet, Navigationsmenuen

Læs mere

Manual til opsætning af Jit-klient version 1.0. Opsætning. Copyright Jit-Danmark Aps 2006. Find mere information på www.jitbesked.

Manual til opsætning af Jit-klient version 1.0. Opsætning. Copyright Jit-Danmark Aps 2006. Find mere information på www.jitbesked. Opsætning Indholdsfortegnelse Sådan finder du indstillingerne...3 Muligheder og begrænsninger...6 Hvilke søgeord skal jeg bruge?...6 Ting man skal passe på...6 Tilføjning/nedlægning af søgeord...6 Ændring

Læs mere

Indhold. Indholdsfortegnelse

Indhold. Indholdsfortegnelse Indholdsfortegnelse Indhold Indledning... 2 Forsiden... 2 Dine genveje... 3 Nyheder... 3 EasyIQ og EasyIQ Quick Funktioner... 3 Administration... 6 Licens... 7 Nyheder... 8 Log... 9 Password... 9 System...

Læs mere

Vejledning og kommentarer til opdatering

Vejledning og kommentarer til opdatering Vejledning og kommentarer til opdatering Udgave: SummaSummarum 4 Version: 4.20 Frigivelse: 3. december 2012 Nyhederne i SummaSummarum 4.20 SummaSummarum 4.20 indeholder flere nye forbedringer og muligheder

Læs mere

MANUAL TIL. OptitecRS CIPHERLAB 8000 - SCANNER

MANUAL TIL. OptitecRS CIPHERLAB 8000 - SCANNER MANUAL TIL OptitecRS CIPHERLAB 8000 - SCANNER INDHOLDSFORTEGNELSE 1 SAMLING OG TILKOBLING AF SCANNER... 1 1.1 STRØM TIL SCANNER... 2 1.2 TILKOBLING TIL COMPUTER... 2 1.2.1 Tilkobling med Seriel Stik...

Læs mere

Elevadministrations modulet. Brugervejledning Optagelse.dk

Elevadministrations modulet. Brugervejledning Optagelse.dk Elevadministrations modulet Brugervejledning Optagelse.dk Elevadministrations modulet Brugervejledning Optagelse.dk Forfatter: Tine Kanne Sørensen UNI C UNI C, 19.12.2013 Indhold 1 Indledning... 5 1.1

Læs mere

Vejledning til Teknisk opsætning

Vejledning til Teknisk opsætning Vejledning til Teknisk opsætning v. 1.0 Adm4you, 2010. Indhold Kort om denne vejledning... 3 Generelt om easyourtime... 3 Installation af databasen... 3 Sikkerhed og rettigheder... 4 SQL Login... 4 Rettigheder

Læs mere

Vejledning i status med CASIO DT-810 og SVANEN

Vejledning i status med CASIO DT-810 og SVANEN Vejledning i status med CASIO DT-810 og SVANEN 1. Læs denne vejledning igennem inden status Terminalen tændes ved at trykke på tasten PW. Står terminalen ikke i Hovedmenu trykkes på tasten CLR gentagne

Læs mere

DK-Unit Point version 1.xx

DK-Unit Point version 1.xx Beskrivelse af DK-Unit til Point Yomani og Xenta Dankort terminaler DK-Unit programmet er udviklet til at kunne benyttes sammen med forskellige applikationer, hvor man ønsker at kunne danne en Dankort

Læs mere

Kvik step MANUAL: Sunex Abonnement : Microsoft Navision C5

Kvik step MANUAL: Sunex Abonnement : Microsoft Navision C5 Kvik step MANUAL: Sunex Abonnement : Microsoft Navision C5 Abonnement kartoteket hvori man indlægger abonnements varelinier og faktura dato mm. kaldes frem fra menu : Debitor/Kartotek/Abonnement. Abonnementkartoteket

Læs mere

Selene brugervejledning

Selene brugervejledning Selene brugervejledning F2 : Åbner en oversigt med data for det aktive felt. F3: Gemmer data i det aktive vindue Salgsordre : Bruges til oprettelse af Ordre/Arbejdskort/Fakrura Debitor: Debitorregister,

Læs mere

HOFTEALLOPLASTIK - DATAUDTRÆK OG IMPORT TIL EXCEL

HOFTEALLOPLASTIK - DATAUDTRÆK OG IMPORT TIL EXCEL HOFTEALLOPLASTIK - DATAUDTRÆK OG IMPORT TIL EXCEL Når man er logget på KMS systemet, vælges Dataudtræk under punktet Vælg modul, hvorefter der klikkes på Gå til: På næste side klikkes på knappen Opret:

Læs mere

Brugervejledning. til. CR Udvalg

Brugervejledning. til. CR Udvalg Brugervejledning til CR Udvalg Indholdsfortegnelse Afsnit 1 (Forord) Side Forord 1 Hovedmenuen 2 Generelle forhold i CR Udvalg 4 Aktiv periode 7 Afsnit 2 (Systemtilpasning) Side Databasestier 1 Postnumre

Læs mere

INSTALLATIONSGUIDE AMC DIRECT DEBIT TIL FOR DYNAMICS AX. dansk udgave. AMC Consult A/S 9. juni 2011 Version 2009 V3

INSTALLATIONSGUIDE AMC DIRECT DEBIT TIL FOR DYNAMICS AX. dansk udgave. AMC Consult A/S 9. juni 2011 Version 2009 V3 INSTALLATIONSGUIDE TIL AMC DIRECT DEBIT FOR DYNAMICS AX dansk udgave AMC Consult A/S 9. juni 2011 Version 2009 V3 INDHOLD 1 Indledning... 3 1.1 Systemkrav... 3 1.2 Kritik modtages gerne... 3 1.3 Yderligere

Læs mere

Programmering C RTG - 3.3 09-02-2015

Programmering C RTG - 3.3 09-02-2015 Indholdsfortegnelse Formål... 2 Opgave formulering... 2 Krav til dokumentation af programmer... 3 ASCII tabel... 4 Værktøjer... 5 Versioner af ASCII tabel... 6 v1.9... 6 Problemer og mangler... 6 v2.1...

Læs mere

Introduktion til FileMaker Pro 4.0/4.1

Introduktion til FileMaker Pro 4.0/4.1 1 Introduktion til FileMaker Pro 4.0/4.1 Hvad er en database? En database er en samling data, som er organiseret på en systematisk måde og er tilgængelig i digital form. Med andre ord er det en slags elektronisk

Læs mere

Navision Stat 7.0. CVR Integration. Overblik. Side 1 af 15. 30. april 2015 ØS/ØSY/MAG

Navision Stat 7.0. CVR Integration. Overblik. Side 1 af 15. 30. april 2015 ØS/ØSY/MAG Side 1 af 15 Navision Stat 7.0 30. april 2015 ØS/ØSY/MAG CVR Integration Overblik Introduktion I denne vejledning kan du læse om, hvordan du validerer dine debitorers og kreditorers data op imod Det Centrale

Læs mere

Installationsguide. Integration af erhvervsdata fra NN Markedsdata til Microsoft Dynamics NAV 2015

Installationsguide. Integration af erhvervsdata fra NN Markedsdata til Microsoft Dynamics NAV 2015 Installationsguide Integration af erhvervsdata fra NN Markedsdata til Microsoft Dynamics NAV 2015 Indledning Dette dokument indeholder vejledning til installation af modulet NN Markedsdata i Dynamics NAV

Læs mere

Vejledning til elevadministration. Vejledning til brug af Optagelse.dk som elevadministrativt system

Vejledning til elevadministration. Vejledning til brug af Optagelse.dk som elevadministrativt system Vejledning til elevadministration Vejledning til brug af Optagelse.dk som elevadministrativt system Vejledning til elevadministration Vejledning til brug af Optagelse.dk som elevadministrativt system Forfatter:

Læs mere

Vejledning til kommunerne om kontrol af elever indskrevet pa en fri grundskole 5. september 2019

Vejledning til kommunerne om kontrol af elever indskrevet pa en fri grundskole 5. september 2019 Vejledning til kommunerne om kontrol af elever indskrevet pa en fri grundskole 5. september 2019 Indholdsfortegnelse Log på systemet... 3 Navigation mellem skærmbilleder og på skærmbillede... 4 Godkendelse

Læs mere

MANUAL HÅNDTERMINAL. Ver SKIOLD GØR EN FORSKEL!

MANUAL HÅNDTERMINAL. Ver SKIOLD GØR EN FORSKEL! MANUAL SKIOLD GØR EN FORSKEL! HÅNDTERMINAL 981 000 505 Ver. 100 02-10-2013 Indhold 1. HÅNDTERMINAL... 4 1.1 Håndterminal versioner.... 4 1.2 Integreret håndterminal... 4 1.3 Vigtig ved anvendelse af håndterminal...

Læs mere

Integration mellem OpenBizBox og E conomic

Integration mellem OpenBizBox og E conomic Integration mellem OpenBizBox og E conomic 1. Introduktion Integrationens formål er at sørge for at ordre der laves i OpenBizBox automatisk bliver eksporteret som en ordre i E conomic. Hvorved det gøres

Læs mere

Integration af DocuBizz og Helios

Integration af DocuBizz og Helios Integration af DocuBizz og Helios v. 0.2 Side 1 af 7 Integration af DocuBizz og Helios 1 Overordnet beskrivelse... 1 2 Format for de overførte data... 1 3 Overførsel af stamdata fra Helios til DocuBizz...

Læs mere

LEMAN / Præsentation

LEMAN / Præsentation LEMAN / Præsentation Velkommen til LEMAN Internet booking. Vi vil i det følgende gennemgå login, opsætning og indtastnings-muligheder. Systemet findes på http://booking.leman.dk eller via LEMAN s hjemmeside.

Læs mere

Easy Guide i GallupPC

Easy Guide i GallupPC Easy Guide i GallupPC Version. 6.00.00 Gallup A/S Masnedøgade 22-26 DK 2100 København Ø Telefon 39 27 27 27 Fax 39 27 50 80 Indhold SÅDAN KOMMER DU I GANG MED AT ANVENDE GALLUPPC... 2 TILFØJELSE AF UNDERSØGELSER

Læs mere

Statistikudtræk. 1 Introduktion

Statistikudtræk. 1 Introduktion Statistikudtræk MADS MENU: RAPPORT STATISTIK STATISTIKUDTRÆK (D.4.1.) Revideret 20-09-2010 1 Introduktion I MADS kan statistiske data trækkes ud via enten statistikudtræk eller perioderapporter. I statistikudtræk

Læs mere

Breve Fraser Makroer m.m.

Breve Fraser Makroer m.m. Koncern IT Anvendelse og udvikling Breve Fraser Makroer m.m. Oprettelse af brevprofiler (margintekst) 2 Anvendelse af brevmodul 4 Funktionsfelter i notatmodulet 6 Fremhævet tekst i notater 8 Standardtekster

Læs mere

Brugervejledning til KasseRapporten LIGHT

Brugervejledning til KasseRapporten LIGHT Brugervejledning til KasseRapporten LIGHT INSTALLATIONSVEJLEDNING... 2 FØRSTE GANG DU TAGER KASSERAPPORTEN I BRUG... 3 KOM GODT I GANG MED KASSERAPPORTEN LIGHT... 4 KASSERAPPORTEN - BRUG AF EGEN KONTOPLAN...

Læs mere

Indlæsning og anvendelse af kontoskema Res_14 til resultatopgørelse 2014. Vejledning

Indlæsning og anvendelse af kontoskema Res_14 til resultatopgørelse 2014. Vejledning Indlæsning og anvendelse af kontoskema Res_14 til resultatopgørelse 2014 Vejledning December 2014 1 Indholdsfortegnelse 1 Formål med denne vejledning... 3 2 Hent filer med kontoskema og kolonneformat...

Læs mere

Indholdsfortegnelse Brugervejledning til Generelt i Caretaker

Indholdsfortegnelse Brugervejledning til Generelt i Caretaker Indholdsfortegnelse Brugervejledning til Generelt i Caretaker Login og afslut 1 De vigtigste funktioner i Caretaker desktop version 1 Skærmbilledet 2 Navigatoren 3 Præsentationsformer 4 Koder 4 Relationer

Læs mere

HJÆLP TIL IGANGSÆTNING AF WINKOMPAS 3

HJÆLP TIL IGANGSÆTNING AF WINKOMPAS 3 HJÆLP TIL IGANGSÆTNING AF WINKOMPAS 3 1. Opstart af WinKompas 3 Når WinKompas 3 er startet op, vil der fremkomme et skærmbillede, hvor du skal indtaste følgende oplysninger for at få adgang til programmet:

Læs mere

Brugervejledning. for. ICAN Portalen

Brugervejledning. for. ICAN Portalen Brugervejledning for ICAN Portalen Generelt om systemet 1. Systemet er opbygget hirakisk. Eksempel: Foreninger - TGF - Bestyrelse - Udvalg - TIF - Bestyrelse - Udvalg - osv. Vedligeholdelse af ICAN Portalen

Læs mere

Formål Kvikguide beskriver, hvordan du kan foretage filtrering og sortering i henholdsvis tabeller og rapporter.

Formål Kvikguide beskriver, hvordan du kan foretage filtrering og sortering i henholdsvis tabeller og rapporter. Side 1 af 19 Navision Stat 9.0 ØSY/STO 01. oktober 2017 Kvikguide til filtrering og sortering i NS 9.0 Overblik Formål Kvikguide beskriver, hvordan du kan foretage filtrering og sortering i henholdsvis

Læs mere

MIU datakonverteringsprogram til brug for radioaflæsning af vandmålere

MIU datakonverteringsprogram til brug for radioaflæsning af vandmålere MIU datakonverteringsprogram til brug for radioaflæsning af vandmålere INDHOLDSFORTEGNELSE: MIU datakonverteringsprogram til brug for radioaflæsning af vandmålere... 1 1 Indledning... 3 2 Understøttede

Læs mere

Betjeningsvejledning. for. Vagtcentral MAC2000. PDF created with pdffactory trial version www.pdffactory.com

Betjeningsvejledning. for. Vagtcentral MAC2000. PDF created with pdffactory trial version www.pdffactory.com Betjeningsvejledning for Vagtcentral MAC2000 Vagtcentral systemet Vagtcentral programmet bruges til at oprette klienter med nødkaldeanlæg og fastlægge hvilke radioer / telefoner der skal ringes op, når

Læs mere

Daglig brug af JitBesked 2.0

Daglig brug af JitBesked 2.0 Daglig brug af JitBesked 2.0 Indholdsfortegnelse Oprettelse af personer (modtagere)...3 Afsendelse af besked...4 Valg af flere modtagere...5 Valg af flere personer der ligger i rækkefølge...5 Valg af flere

Læs mere

Markedsinfo. Microsoft Dynamics NAV 2009 SP1 Klassisk. Side 1 Copyright: Naddon version 201009

Markedsinfo. Microsoft Dynamics NAV 2009 SP1 Klassisk. Side 1 Copyright: Naddon version 201009 Markedsinfo Microsoft Dynamics NAV 2009 SP1 Klassisk Side 1 Microsoft Dynamics NAV 2009 SP1 Rollebaseret Indholdet i dette dokument må på ingen måde gengives helt eller delvist hverken på tryk eller i

Læs mere

IsenTekst Indhold til Internettet. Manual til Wordpress.

IsenTekst Indhold til Internettet. Manual til Wordpress. Manual til Wordpress Sådan opdaterer du din hjemmeside i Wordpress. Dette er en manual til de mest grundlæggende ting, så du selv kan redigere indholdet eller tilføje nyt på din hjemmeside. Guiden er skrevet

Læs mere

Afgrænsning/filtrering, sortering m.v. i Klienten

Afgrænsning/filtrering, sortering m.v. i Klienten Afgrænsning/filtrering, sortering m.v. i Klienten Afgrænsning/filtrering I det efterfølgende gennemgås de tre standard afgrænsnings-/filtrerings metoder i Prisme Klient: Avanceret filter Er den overordnede

Læs mere

Microsoft Business Solutions C5 3.0 SP2 NYHEDER

Microsoft Business Solutions C5 3.0 SP2 NYHEDER Copyright 2004 Microsoft Business Solutions ApS Frydenlunds Allé 6, DK-2950 Vedbaek Denmark CBR.NO. 76247218, All right reserved Vedbæk Maj 2004 Microsoft Business Solutions C5 3.0 SP2 Nyheder C5 3.0 SP2

Læs mere

Team Planner. Newbizz - emnegenerering

Team Planner. Newbizz - emnegenerering Team Planner 6 - Newbizz Newbizz - emnegenerering Indhold: Newbizz databasen - struktur...6.2 Newbizz stamdata...6.2 Oprettelse af emne...6.3 Oprettelse af kontaktpersoner...6.4 Mailgruppe - tildel...6.5

Læs mere

Python programmering. Per Tøfting. MacFest

Python programmering. Per Tøfting. MacFest Python programmering MacFest 2005 Per Tøfting http://pertoefting.dk/macfest/ Indhold Måder at afvikle Python program på Variabler Data typer Tal Sekvenser Strenge Tupler Lister Dictionaries Kontrolstrukturer

Læs mere

Udlæsning af stregkodefil til scanneren 1. Opret mappen pdt på C-drevet (c:\pdt).

Udlæsning af stregkodefil til scanneren 1. Opret mappen pdt på C-drevet (c:\pdt). Indholdsfortegnelse Introduktion... 2 Udlæsning af stregkodefil til scanneren... 3 Installation af scanneren... 5 Indlæsning af datafil i scanneren... 7 Brug af scanneren... 8 Sådan scanner du... 8 Sådan

Læs mere

TeamShare 2.1 Versionsnoter Oktober 2009

TeamShare 2.1 Versionsnoter Oktober 2009 TeamShare 2.1 Versionsnoter Oktober 2009 TeamShare version 2.1.292 Denne version af TeamShare har fået mange nye funktioner, samt forbedringer på eksisterende. Hver ny feature er gennemgået i hvert sit

Læs mere

Rapport generator til Microsoft C5

Rapport generator til Microsoft C5 Generelt Rapportgeneratoren til C5 kan benyttes sammen med alle versioner af C5 og kræver INGEN tillægsmoduler eller tilkøb af C5. Den kører på: C5 version 1.5x, 1.6x, 2.x, 3.x, 4.x, 2008, 2010 og 2012.

Læs mere

Status vejledning. Vejledning i håndtering af status scanner, tømning og indlæsning til EasyPOS

Status vejledning. Vejledning i håndtering af status scanner, tømning og indlæsning til EasyPOS Status vejledning Cipherlab CPT8000 Vejledning i håndtering af status scanner, tømning og indlæsning til EasyPOS 1 Indhold 2 Håndterminalen... 1 2.1 Beskrivelse af taster... 1 2.1.1 Hvad bruges tasterne

Læs mere

UVpraktik Brugermanual

UVpraktik Brugermanual UVpraktik Brugermanual 1 Indhold UVpraktik formål og anvendelse... 3 Log ind i UVpraktik... 4 Dataindlæsning i UVpraktik... 7 Nyttige genveje i UVpraktik... 8 Indhold af menuer... 9 Sorter... 9 Kartoteker...

Læs mere

Skifte til OneNote 2010

Skifte til OneNote 2010 I denne vejledning Microsoft Microsoft OneNote 2010 ser meget anderledes ud end OneNote 2007, og vi har derfor oprettet denne vejledning, så du hurtigere kan komme i gang med at bruge programmet. Læs videre

Læs mere

Administrator manual

Administrator manual Revision 1 Administrator manual INDHOLD LOG IND 1 OVERBLIK 1 ARBEJDSRUM 1 MEDARBEJDERE 2 OPRET NY MEDARBEJDER 2 TRIN 1 AF 4: NAVN OG OPLYSNINGER 2 TRIN 2 AF 4: LEGITIMATION 2 TRIN 3 AF 4: EFFEKTIVITETSNIVEAU

Læs mere

Finanstilsynets indberetningssystem. Vejledning til Regnearksskabelonerne

Finanstilsynets indberetningssystem. Vejledning til Regnearksskabelonerne Finanstilsynets indberetningssystem Vejledning til Regnearksskabelonerne Finanstilsynet - 2. udgave oktober 2009 Indholdsfortegnelse 1 INDLEDNING... 2 2 FORUDSÆTNINGER... 3 3 TRIN FOR TRIN... 4 3.1 Hent

Læs mere