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 ejere. Indholdet i dette dokument må på ingen måde gengives - helt eller delvist hverken på tryk eller i anden form uden forudgående tilladelse fra Microsoft. Indholdet i dette dokument kan ændres uden varsel. Der tages forbehold for tryk- og stavefejl. Microsoft Development Center Copenhagen, Frydenlunds Allé 6, DK-2950 Vedbæk, Danmark Tlf.: +45 4567 8000, www.microsoft.com/danmark/dynamics/losninger/c5.mspx
Indholdsfortegnelse Indledning... 12 Del I - XAL sproget... 13 1. XAL editoren... 14 Sproget XAL... 14 Anvendelse af XAL editoren... 14 Funktionstaster... 15 Kommentarer { }... 16 Skrivning af kommentarer på disk... 17 Opgaver: XAL editoren... 19 2. Grundlæggende XAL kommandoer... 20 PRINT... 20 PRINT AT... 21 PAUSE... 22 WINDOW... 23 WINDOW AT... 24 WINDOW og PRINT AT... 25 Opgaver: Grundlæggende XAL kommandoer... 25 3. Variabler i XAL sproget... 27 Variabeltyper... 27 Erklæring af variabler... 28 Tildeling af værdier til variabler... 29 Udskrivning af indhold fra variabler... 30 Opgaver: Variabler i XAL sproget... 33 4. PROMPT, grundlæggende brugerdialog... 34 Tildeling af værdier til variabler... 34 PROMPT... 35 Linjeskift i promptbokse... 35 Størrelse på promptboxen... 37 INPUT AT... 37 Andre muligheder med promptbokse... 38 Opgaver: PROMPT, Grundlæggende brugerdialog... 39 5. Betingelsesstrukturer med IF... 41 IF-THEN-ELSE-ENDIF... 41 2
Betingelsens bestanddele... 42 Opgaver: Betingelsesstrukturer med IF... 44 6. Fasttekster... 46 Fastteksttyper og tekster... 46 Fasttekster i variabler... 47 Tildeling af værdier til fasttekstvariabler... 48 Udskrivning af værdier fra fasttekstvariabler... 48 Fasttekster i promptboxe... 49 Fasttekster i IF strukturer... 50 Vedligeholdelse af fasttekster... 50 Opgaver: Fasttekster... 51 7. Funktioner, grundlæggende... 53 Opbygning... 53 Syntaks... 54 Datatyper i funktioner... 55 Funktioner (ToDay(), TimeNow() m.fl.)... 56 Opgaver: Funktioner... 63 8. Brugerdialog med BOX, grundlæggende... 67 Syntaks BOX()... 67 BOX() typerne 1 og 2... 68 Opgaver: Brugerdialog med BOX, grundlæggende... 70 9. Kartoteksgennemløb, grundlæggende... 72 SEARCH... 73 Sortering med USING... 75 Sortering med ORDER... 77 Afgrænsning med WHERE... 78 Opgaver: Kartoteksgennemløb, grundlæggende... 81 10. Brugerdialog med kartoteksopslag... 82 PROMPT grundlæggende repetition... 82 PROMPT til afgrænsning i SEARCH... 83 Kartoteksgennemløb med brugerstyret afgrænsning... 84 PROMPT med REF... 85 Opgaver: Brugerdialog med kartoteksopslag... 88 11. Kartoteksgennemløb, flere kartoteker... 90 Flere kartoteker uden synkronisering... 90 3
Flere kartoteker med synkronisering... 91 Udarbejdelse af total... 94 Opgaver: Kartoteksgennemløb, flere kartoteker... 96 12. Huskelister Kommandoer og funktioner... 99 Box... 99 Dokumentation af XAL-kørsler... 100 Funktion CurUserID()... 100 Funktion UserID2Name()... 101 Funktion TimeNow()... 101 Funktion Time2Str()... 102 Funktion ToDay()... 102 IF-THEN-ELSE-ENDIF... 103 Index - se indhold af... 103 Kommentarer... 104 PAUSE... 104 PRINT... 104 PRINT AT... 105 Programmering opret... 106 Programmering ret... 106 PROMPT... 107 PROMPT med REF... 108 SEARCH-END... 108 SEARCH-END med USING INDEX... 109 SEARCH-END med ORDER... 109 SEARCH-END med WHERE... 110 SET... 111 Variabler... 112 WINDOW... 113 XAL editoren - editeringsfunktioner... 114 XAL editoren nøgleord... 115 13. Huskelister XAL sproget...116 ENUM... 116 Programmering opret... 116 Programmering ret... 118 4
Del II Kartoteker og skærmbilleder...119 14. Kartoteker...120 Oprettelse af kartoteker... 120 Navngivning af kartoteker... 121 Hvor ligger data... 121 fpasswordbeskyttelse af kartoteker... 122 Systemfelter i kartoteker... 122 Nye felter i kartoteker... 122 Opgaver: Kartoteker... 126 15. Indexer...130 Anvendelse af indexer... 130 Oprettelse af Index... 131 Navngivning og indexformel... 132 Navngivning af Index i nye moduler... 132 Opgaver: Index... 134 16. Listbilleder...136 Oprettelse af listbilleder... 136 Navngivning af listbilleder... 138 Kald fra udviklingsmenuen... 138 Kald via kartoteks- og feltreferencer... 139 Opgaver: Listbilleder... 141 17. Formens vindue...144 Formens vindue... 144 Triggere (forms formler) generelt... 145 Triggere i Opsætning af vinduet... 146 Forms kontrolkommandoer og macroer... 147 #MacroLoad()... 148 #FormError... 149 #Frm_Index()... 149 #Frm_Search()... 150 #Frm_SearchTop()... 151 #Frm_SearchEnd()... 151 Eksempel på fejlhåndtering og styring af poster i en form... 152 5
Specielt vedr. triggerne Init og Pre-form... 152 Opgaver: Formens vindue... 154 18. Enkelt record blok...155 Opsætning af Enkelt record blok... 155 Felter... 156 Opgaver: Enkelt record blok... 157 19. Multi record blok...158 Opsætning Multi record blok... 159 Felter... 160 Opgaver: Multi record blokke... 161 20. Direkte opslag...162 Opbygning af direkte opslag... 162 Sammenhæng i direkte opslag... 163 Direkte opslag i XAL kørsel... 164 Opgaver: Direkte opslag... 166 21. Formens felter, opsætning...167 Formattering af felter... 167 Triggere på felter... 169 Post-Change... 170 Tildeling af værdi til et felt... 171 Valg af felt... 172 Valg af trigger... 172 Opgaver: Formens felter, opsætning... 173 22. Listemenuer...174 Listemenuer... 174 Hvor vedligeholdes listemenuer?... 176 Opsætning af listemenu... 176 Indsættelse af menupunkter i listemenu... 177 Undermenuer... 178 Opgaver: Listemenuer... 180 23. Synkronisering mellem forms...181 Synkronisering mellem forms... 181 Triggere ved synkronisering... 182 Triggeren Pre-Form... 182 Buffer... 182 6
EXTERN... 183 SET... 184 #Frm_Index()... 185 #Frm_Search() / #Frm_SearchTop() / #Frm_SearchEnd()... 186 Bloktriggeren Init-record... 186 Komplet eks. på synkronisering af forms... 188 Opgaver: Synkronisering mellem forms... 190 24. Huskelister forms...191 Fasttekst Opret ny type... 191 Fasttekst Tilføj tekster til eksisterende type... 192 Fasttekst Ret tekster i eksisterende type... 193 Kartotek Navn (opret/ret)... 194 Kartotek Feltbehandling (opret)... 195 Kartotek Feltbehandling (ret)... 196 Kartotek Feltbehandling (referencer)... 196 Kartotek Dokumentation... 196 Kartotek Index (opret)... 197 Kartotek Index (ret)... 197 Kartotek Index (slet)... 198 Listbillede Opret... 198 Listbillede Ret... 199 Listbillede Slet... 199 Menuer - Lille udviklingsmenu (CTRL F12)... 200 Menuer Lokalmenuer... 200 Menuer Opsætning af menupunkt... 201 Form Vindue (opret)... 202 Form Vindue (ret)... 203 Form Vindue (slet ) (dvs. hele formen)... 203 Form Enkelt record blok (opret)... 204 Form Enkelt record blok (ret)... 205 Form Enkelt record blok (slet)... 205 Form Multi record blok (opret)... 206 Form Multi record blok (ret)... 207 Form Multi record blok (slet)... 207 Form Felter (opret)... 208 Form Felter (ret)... 208 7
Form Felter (slet)... 209 Form Triggere i vinduet... 209 Form Triggere i blokke... 210 Form Triggere i felter... 210 Del III Rapporter...211 1. Rapport XAL...212 Processer i rapportgeneratoren... 212 Navne på rapporter... 212 Rapportgeneratorens opbygning... 214 Rapport-XAL... 215 SEARCH (repetition)... 215 PROMPT (repetition)... 216 OUTPUT... 217 Komplet eksempel på XAL kode... 219 Opgaver: Rapport XAL... 221 2. Rapport definition grundlæggende...222 Definitionsområdet... 222 Skema med funktionstaster i rapportgeneratoren... 224 Linjetypen Body... 225 Kartotekskolonnen... 226 Layoutområdet... 227 Flere bodylinjer i samme rapport... 228 Fritekst og ledetekster... 229 Opgaver: Rapport definition, grundlæggende... 232 3. Linjetyper uden kartoteker...233 Linjetypen Page header... 234 Linjetypen Page footer... 237 Linjetypen Prolog... 239 Linjetypen Epilog... 240 Tegning af streger og kasser... 241 Sideskift... 242 Opgaver: Linjetyper uden kartotek... 244 4. Rapport definition felter i layout...246 8
Oprettelsesmetoder... 247 Feltudtryk... 248 Formattering... 248 Mulige værdier i feltudtryk... 249 Kartoteksfelter uden kvalifikation... 250 Kartoteksfelter med kvalifikation... 251 Hvornår skal der kvalificeres?... 252 Tekst... 253 Variabler... 255 Egne variabler... 255 Systemvariabler... 256 Macroer... 258 #Company... 258 #MacroLoad()... 259 Funktioner... 261 Regneudtryk... 262 Opgaver : Rapport definition felter i layout... 264 5. Linjetypen Control...265 Opbygning af Control linjer... 265 #Rep_Execute... 267 Macroen #Add... 268 Control linjer og #Add i Rapport-QT... 270 Opgaver: Linjetypen Control... 272 6. Linjetyper med kartoteker...273 Bindeled i Rapport XAL og Rapport Definition... 273 Enkeltstående kartoteker... 276 Afhængige synkroniserede kartoteker... 277 Linjetypen Body... 279 Linjetypen Group Header... 279 Linjetypen Group Footer... 282 Linjetypen Subtotal... 286 Opgaver: Linjetyper med kartoteker... 291 7. Rapport QT Grundlæggende funktioner...293 QT-værktøjet... 293 QT i forhold til XAL... 294 9
Tre hovedområder i rapportgeneratoren... 294 Udtræk med XAL eller QT... 294 XAL og QT i samme rapport... 295 Forskelle ved udsendelse af data til rapport... 296 QT værktøjets vinduer... 297 Afgrænsningsvinduet... 298 Relationsvinduet (ved søgning i ét kartotek)... 299 Opsætningsvinduet... 300 Sorteringsvinduet... 301 Procedure for QT til søgning i ét kartotek.... 302 Eksempel på Rapport-XAL og Rapport-QT... 302 Rapport-XAL... 302 Rapport-QT... 303 Brugernes muligheder i Rapport-QT... 305 Opgaver: Rapport QT Grundlæggende funktioner... 308 8. Rapport QT filtrering og sortering...311 Filtrering... 311 Filtre i Rapport QT... 312 Build-filter... 312 Run-filter... 312 Sortering... 313 Anvendelse af sorteringsvinduet... 314 Opgaver: Rapport QT filtrering og sortering... 315 9. Subtotaler automatiske...317 Procedure for brug af automatiske subtotaler... 317 Opsætning af felt... 317 Opsætning af udskrivningsmåde... 320 Opsætning af automatisk ledetekst... 321 Sortering... 321 Tekst... 322 Opsætning af ledetekst og udskrivningsmåde... 323 Eksempler... 323 Opgaver: Subtotaler automatiske... 326 10. Rapport QT triggere grundlæggende...327 Triggere... 327 10
Globale triggere i opsætning... 328 Kartotekstriggere... 329 Rækkefølge på triggere... 331 Eksempel på anvendelse... 333 Opgaver: Rapport QT Triggere, grundlæggende... 335 11. Rapport QT med flere kartoteker...336 Flere kartoteker... 336 Relaterede kartoteker... 338 Relation i Rapport-QT... 339 Opgaver: Rapport QT med flere kartoteker... 344 12. Huskelister Rapporter...346 Oprette rapport... 346 Oprette rapportlinjer (Kolonnerne)... 346 Oprette rapportlinjer med fritekst... 346 Oprette rapportlinjer med streger og kasser... 347 Oprette rapportlinjer med forskellige felter... 347 Rapport afprøve (køre)... 347 Rapport QT Oprette første kartotek... 348 Rapport QT Oprette flere kartoteker... 349 Rapport QT Sortere... 350 Rapport QT Filtrere... 350 Rapport QT Feltafgrænse (tilføje / slette)... 350 Rapport QT Triggere i opsætning... 351 Rapport QT Triggere på kartoteker... 351 Subtotaler... 352 11
Indledning Velkommen til kurset Microsoft Dynamics C5 Programmering I. Kurset er berammet til 3 dage. Kursusmaterialet er udarbejdet til version 2012. Målgruppe Personer der ønsker et grundlæggende kendskab til udviklingsmiljøet i Microsoft Dynamics C5, og personer der skal opnå autorisation som Microsoft Dynamics C5 Programmør. Forudsætninger Gennemført kurset C5 Supervisor og evt. C5 Applikation II. Formål Kurset giver deltageren et grundlæggende kendskab til C5 s udviklingsmiljø og hvordan tilretninger og opbygning af nye elementer i systemet foretages. På kurset behandles følgende emner: Udviklingsmiljøet og kartoteksstrukturen Programmeringssproget XAL Opbygning af rapporter og skærmbilleder Opbygning af søgerutiner i XAL og QT 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. Til hver lektion findes en huskeliste, der giver et hurtigt overblik over fremgangs-måden og de taster, der bruges til at udføre funktionen. Lektionens opgaver er baseret på de arbejdsrutiner, der normalt forestås i virksomheden. Opgaveløsning er en vigtig del af indlæringsprocessen og da nogle af opgaverne er en fortsættelse af opgaver fra tidligere lektioner, kan det anbefales at løse opgaverne successivt. Alle opgaver knytter sig til den datafil, der undervises i. 12
Del I - XAL sproget 13
1. XAL editoren Formål Formålet med denne lektion er at give deltagerne viden om XAL editoren, og funktioner der benyttes i denne. Der undervises desuden i brugen af kommentarer i XAL kørsler. Efter lektionen skal kursisterne kunne: Navngive, åbne og lukke XAL kørsler Redigere i tekst ved at kopiere, flytte, indsætte og slette én linje ad gangen Markere et antal linjer og kopiere, flytte, indsætte og slette disse linjer Anvende og indsætte kommentarer. Generelt XAL editoren er en form for tekstbehandlingsprogram. Den har bare ikke helt samme funktionalitet. Til gengæld findes der mange andre faciliteter, der er specielt beregnet til programmering af XAL kørsler. Teksten, der indtastes i XAL editoren, består af kommandoer, der er samlet i et programmeringssprog med navnet XAL. Programmeringssproget kan blandes med almindelig tekst i form af kommentarer. Sproget XAL I XAL editoren anvendes programmeringssproget XAL, der betyder EXtended Application Language. Det er dette sprog, der anvendes og undervises i på dette og de følgende kurser. Sproget anvendes ikke alene i XAL editoren, men også i de mange andre editorbokse, der findes rundt omkring i C5, f.eks. i skærmbilleder og rapporter. Anvendelse af XAL editoren Et program bestående af XAL kommandoer, kaldes en XAL kørsel. Når der skal dannes en XAL kørsel, skal XAL editoren først navngives, hvorefter den åbnes. Når XAL editoren er åben, indtastes de XAL kommandoer og kommentarer kørslen består af. Efter indtastningen gemmes og godkendes XAL kørslen. Når en XAL kørsel godkendes, aktiveres der automatisk en kodekompiler, der oversætter de indtastede kommandoer til intern programkode. Det er denne, oversatte kode, der anvendes når XAL kørslen senere afvikles. Under oversættelsen foretages der en kontrol af syntaksen og det undersøges om de angivne kommandoer, kartoteker, felter, index osv. eksisterer og er stavet korrekt. Hvis der under oversættelsen findes fejl i de indtastede kommandoer, vises der en fejlmeddelelse på nederste linje på skærmen. Fejlen skal rettes inden XAL kørslen kan oversættes færdig og afvikles. Hvis der ikke findes nogen fejl, oversættes koden, hvorefter kørslen kan afvikles. Den kan enten afvikles fra udviklingsmenuen under XAL/Kør, eller den kan indsættes i et menupunkt, og afvikles derfra. 14
Funktionstaster Når editorboksen er åben til indtastning af programkode, findes der en mængde funktioner, der kan aktiveres gennem tastetryk. Nogle funktioner anvendes til redigering af koden. Andre funktioner er en hjælp til hurtig fremfinding af navne på kartoteker, felter, indexer o.a. Samtlige funktioner kan ses i en oversigt ved at taste F1, ligesom de kan anvendes gennem funktionsmenuerne i XAL editoren med SHIFT+F10. Skema med vigtige funktionstaster i XAL editoren Programmering ALT+Z Zoom vindue Op eller ned Redigering ALT+D Slet én linje F2 Kommandoer Vælg fra liste SH+F5 Kopi én linje eller afmærkede linjer F6 Fasttekster Vælg fra liste CTRL+F5 Flyt én linje eller afmærkede linjer F7 Kartoteker Vælg fra liste ALT+I Indsæt én linje eller afmærkede linjer F8 Indexer Vælg kartotek så index ALT+L Afmærk linjer Anvend piletaster SH+F8 Felter Vælg kartotek så felt DELETE Slet markerede linjer ALT+S Skriv afmærket område til disk ALT+H Hent fra disk 15
Kommentarer { } Der anvendes ofte kommentarer i XAL kørsler. Kommentarer er tekst, der ikke har nogen indflydelse på selve afviklingen af kørslen. Derimod kan den indeholde værdifuld information for de personer, der senere skal læse eller rette i den. Det er f.eks. en god idé at starte et program med at skrive navnet på forfatteren, datoen, version o.a., som i nedenstående illustration: Eksempel på indledende kommentarer i XAL kørsel {Forfatter...: Jens Olsen } {Dato...: 05.12.2011 } {C5 version...: 2012 } {Funktion...: Beregning af nye salgspriser ud fra } { dækningsgrader. } Som det fremgår af illustrationen sættes kommentarer i { }. I materialet kaldes de to tuborg-paranteser fremover for kommentartegn. I eksemplet startes og sluttes hver linje med kommentartegn. Dette er ikke absolut nødvendigt. I XAL editoren kan kommentarer godt strækkes over flere linjer, idet første linje startes med { og sidste linje sluttes med } som i næste eksempel. Kommentarer over flere linjer med ét starttegn og ét sluttegn {Forfatter...: Jens Olsen Dato...: 05.12.2011 C5 version...: 2012 Funktion...: Beregning af nye salgspriser ud fra Dækningsgrader.} De to illustrationer er kun eksempler på anvendelsen af kommentartegnene. Kommentarer kan også anvendes til forklaring af enkelte programafsnit. Dele af selve programkoden kan desuden kommenteres ud, hvis kørslen f.eks. skal testes, uden at den udkommenterede del medtages i afviklingen. Når testningen er slut, kan kommentartegnene fjernes igen. Kommentartegnene behøver ikke nødvendigvis at stå i starten og slutningen af en linje, men kan også stå inde i en linje. Der skal altid være ét starttegn og ét sluttegn. Al tekst og kode, der findes mellem to kommentartegn, springes over under afviklingen af kørslen. Efterfølgende eksempel viser et stykke XAL kode med forskellig anvendelse af kommentarer. 16
Eksempel på XAL kørsel med forskellige kommentarer {Forfatter...: Jens Olsen } {Dato...: 05.12.2011 } {C5 version...: 2012 } {Funktion...: Erklæring, tildeling og udskrivning } { af variabler i XAL sproget. } { Erklæring af variabler } INT REAL &Antal &Pris {Antal varer} {Varens salgspris} STR 20 &Varenavn {Varens navn} DATE &Salgsdato {Den dag varen kan sælges til prisen} ENUM NejJa &Udsalgsvare {NEJ/JA om det er en udsalgsvare} { Tildeling af værdier med SET } SET &Antal = 200 SET &Pris SET &Varenavn = 150.75 = Håndmixer SET &Salgsdato = 01\05\1999 SET &Udsalgsvare = 1 {0=Nej 1=Ja} { Udskrivning af værdier med PRINT } PRINT &Antal PRINT &Pris PRINT &Varenavn PRINT &Salgsdato PRINT &Udsalgsvare PAUSE Skrivning af kommentarer på disk Da startkommentarerne ofte opstilles på samme måde i alle XAL kørsler, kan det være en fordel at gemme dem i en fil på disken, hvorfra de så kan hentes hver gang, der oprettes en ny XAL kørsel. De hentede startkommentarer kan herefter ændres, så de passer til den aktuelle kørsel mht. f.eks. dato og funktion. 17
Eksempel på at gemme og hente på disk XAL kørsel {Forfatter...: Jens Olsen } {Dato...: 25.08.99 {C5 version....: 2.10 } } {Funktion...: } Alt S Disk Ny XAL kørsel {Forfatter...: Jens Olsen } {Dato...: 05.12.2011 } {C5 version...: 2012 } {Funktion...: Debitorliste} Alt H I eksemplet herover gemmes startkommentarerne i en fil med navnet Start. Filen hentes ind i en ny XAL kørsel, og de forskellige værdier tilpasses den nye kørsel. Bemærk! Når det afmærkede område udlæses, skal der angives navn på den fil, der skal udlæses til. På samme måde skal filnavnet angives, når den skal hentes igen. 18
Opgaver: XAL editoren Opgave 1: Startkommentarer Formål med opgaven At anvende kommentartegnene til startkommentarer i XAL editoren Huskelister Eksempel Kommentarer Beskrivelse Der skal oprettes startkommentarer som vist i eksemplet herunder. Kommentarerne skal gemmes på disken under navnet Start, så de kan anvendes igen i andre XAL kørsler. {Forfatter...: <dit navn> } {Dato...: <dato i dag> } {C5 version...: 2012 } {Funktion...: <Beskrivelse af kørslens funktion> } Forløb 1 Opret en ny XAL kørsel 2 Indsæt standard kommentarer som vist i eksemplet herover Skriv alle ledeteksterne og indsæt dit eget navn, dags dato og C5 version. 3 Markér linjerne og gem dem på disken under navnet Start. 4 Afslut og godkend kørslen 19
2. Grundlæggende XAL kommandoer Formål Formålet med denne lektion er at give deltagerne forståelse for grundlæggende XAL kommandoer, der anvendes til skrivning på skærmen. Efter denne lektion skal kursisterne kunne: Anvende kommandoerne PRINT, PRINT AT og PAUSE til udskrivning på skærmen Anvende kommandoerne WINDOW og WINDOW AT til selv at bestemme vinduets størrelse og placering på skærmen Kunne udskrive et bestemt sted i et vindue åbnet med kommandoen WINDOW Kommandoer generelt Kommandoerne er specielle ord, der anvendes i XAL kørsler. De er specielle, idet de har særlig betydning i kørsler. Kommandoerne findes samlet i XAL sproget. Der findes kommandoer, der anvendes, når der udskrives tekst til skærmen, kommunikeres med brugere, udføres beregninger osv. Alle kommandoer kan skrives på tastaturet, som de staves, eller de kan hentes med en af funktionstasterne fra plukkelisten over kommandoer. Plukkelisten åbnes med F2. Det er lige meget om kommandoerne skrives med STORT eller småt, men som regel skrives de med STORT, så de er nemme at genkende, og det ser pænere ud. Når kommandoerne hentes fra plukkelisten, overføres de altid med STORE bogstaver. PRINT Kommandoen PRINT anvendes til udskrivning på skærmen. Der kan udskrives forskellige typer af information, f.eks. tal, tekst, feltindhold fra kartoteker, variabler og funktioner. Syntaksmæssigt angives PRINT som det første på en linje efterfulgt af de informationer, der skal udskrives. Syntaks for PRINT PRINT <Information>, <Information>, osv. Det er ikke helt ligegyldigt, hvordan informationerne angives. Tal kan blot skrives som de er, hvorimod tekster altid skal noteres i anførselstegn. Ved flere forskellige dele af information i en og samme PRINT sætning skal disse altid adskilles med kommaer. Blanke linjer i programkoden har ingen indvirkning på selve afviklingen. Skal der derimod udskrives en blank linje på skærmen, gøres dette ved at angive to anførselstegn lige efter hinanden som i nedenstående eksempel: 20
PRINT med forskellig information {Udskrivning af værdi} PRINT Værdien er PRINT 100 PRINT kr PRINT {Giver blank linje på skærm} Programkoden læses sekventielt oppe fra og ned PRINT Værdien er,100, kr Det skal bemærkes, at XAL kørsler altid afvikles sekventielt fra toppen og ned. Hvis ovenstående XAL kørsel køres, resulterer det i følgende resultat, hvor den samme tekst udskrives på to forskellige måder adskilt med en blank linje: Resultat af ovenstående kørsel Værdien er 100 kr PRINT sætninger udskrives i bunden af skærmen, men først rykkes de forrige linjer én op. Værdien er 100 kr Kørselsafvikling Under afvikling af XAL kørsler læses programkoden altid sekventielt, dvs. linje for linje oppe fra og nedefter. Undervejs udføres de kommandoer, kørslen består af. PRINT sætninger udskrives altid i den nederste linje på skærmen, hvis der ikke angives andet. De ovenstående linjer rykkes automatisk én linje op. Kommentarene udskrives ikke, da de ikke har betydning for selve afviklingen. PRINT AT Selv om PRINT kommandoen altid skriver i den nederste linje på skærmen, kan der alligevel godt udskrives andre steder på skærmen. Dette foregår ved, som det sidste på PRINT linjen, at angive kommandoen AT efterfulgt af et kolonneog linjenummer, som vist herunder. 21
Syntaks for PRINT AT PRINT <Information>, <Information>, osv. AT <Kolonne>,<Linje> Positionen, der angives med AT, er det sted på printlinjen, hvor informationen i printsætningen udskrives på skærmen. Eksempel på anvendelse af PRINT AT {Udskrivning af værdi et bestemt sted} PRINT Værdien er PRINT 100 PRINT kr PRINT PRINT Værdien er,100, kr AT 20,3 Resultat af PRINT AT i ovenstående eksempel Værdien er 100 kr Værdien er 100 kr I eksemplet startes teksten Værdien er 100 kr i kolonne 20 linje 3. Bemærk at de linjer der var udskrevet i forvejen inden sætningen med PRINT AT, bliver stående nederst på skærmen. PRINT AT påvirker således kun den ene linje, hvori AT kommandoen angives. Vigtigt ved anvendelse af PRINT AT Hvis der i programmet efter en linje med AT kommandoen forekommer flere PRINT linjer uden AT, udskrives disse linjer nederst i vinduet samtidig med, at alle andre linjer rykkes op, også de der tidligere blev udskrevet med AT kommandoen. PAUSE Ved anvendelse af PAUSE stoppes programafviklingen midlertidigt. Kommandoen kan indsættes hvor som helst i XAL kørslen, der er behov for det. PAUSE kan f.eks. anvendes i en XAL kørsel, hvori der udskrives til skærmen. Når kørslen er slut, lukkes vinduet automatisk, og det ikke er sikkert, at brugeren når at se, hvad der udskrives. Hvis kørslen derimod afsluttes med PAUSE kommandoen, stoppes afviklingen midlertidigt, og på nederste linje på skærmen vises teksten Tryk på RETUR for at fortsætte. Ved at trykke på RETUR sættes kørslen igang igen og der fortsættes med den næste kommando, hvis der er flere, ellers lukkes vinduet og kørslen afsluttes. 22
Anvendelse af PAUSE midt i og som afslutning i XAL kørsel {Udskrivning af værdi} PRINT Værdien er PRINT 100 PRINT kr PAUSE PRINT PRINT Værdien er,100, kr PAUSE Resultat ved første PAUSE kommando Værdien er 100 kr Tryk på RETUR for at fortsætte Resultat efter anden PAUSE kommando Værdien er 100 kr Værdien er 100 kr Tryk på RETUR for at fortsætte WINDOW Når der udskrives til skærmen med PRINT, skrives der i virkeligheden i et vindue, der standard fylder hele skærmen. WINDOW kommandoen kan anvendes til at ændre størrelse og placering af dette vindue. Syntaks til WINDOW WINDOW <Bredde>,<Højde> Vinduets størrelse ændres ved at angive WINDOW kommandoen efterfulgt af bredden på vinduet i antal kolonner og højden i antal linjer som vist herunder. I næste eksempel vises kommandoen anvendt til at danne et vindue på 30 kolonner og 4 linjer. Eksempel på anvendelse af WINDOW WINDOW 30,4 PRINT Microsoft Dynamics C5 PAUSE Resultat af ovenstående eksempel med WINDOW 23
Microsoft Dynamics C5 Tryk på RETUR for at fortsætte WINDOW åbner, som vist, et tomt vindue, der placeres i øverste venstre hjørne af skærmen. Vinduet lukkes straks, når kørslen er slut. I eksemplet er PAUSE derfor indsat, for at holde vinduet åbent indtil der tastes RETUR (ENTER). WINDOW AT Med WINDOW AT kan det bestemmes hvor på skærmen, vinduet skal åbnes. Kommandoen AT anvendes på samme måde som i PRINT AT, idet der skal angives hvilken kolonne og linje vinduets øverste venstre hjørne skal placeres i. Syntaks for WINDOW AT WINDOW <Bredde>,<Højde> AT <Kolonne>,<Linje> I næste eksempel skal et vindue placeres i kolonne 10 linje 3 på skærmen. Eksempel på WINDOW AT WINDOW 30,4 AT 10,3 PRINT Microsoft Dynamics C5 PAUSE Resultat af ovenstående eksempel med WINDOW AT Microsoft Dynamics C5 Tryk på RETUR for at fortsætte 24
Bemærk at det er vinduets øverste venstre hjørne, der placeres i forhold til skærmen. WINDOW og PRINT AT Når PRINT AT anvendes i vinduer, der åbnes med WINDOW, udføres placeringen i forhold til selve vinduet og ikke i forhold til skærmen. I næste eksempel placeres ordet Microsoft i kolonne 5 linje 3, i et vindue der fylder 30 kolonner og er 4 linjer højt. Eksempel med PRINT AT i et vinduet åbnet med WINDOW WINDOW 30,4 AT 10,3 PRINT Microosft Dynamics C5 AT 5,3 PAUSE Resultatet af ovenstående eksempel Microsoft Dynamics C5 Tryk på RETUR for at fortsætte Opgaver: Grundlæggende XAL kommandoer Opgave 1: Udskrive i et vindue i en bestemt linje Formål med opgaven At anvende kommandoerne PRINT, PRINT AT og WINDOW til at udskrive linjer et bestemt sted i et vindue på skærmen. Huskelister Programmering - opret Kommentarer PRINT AT PAUSE WINDOW 25
XAL editoren - editeringsfunktioner Beskrivelse I opgaven skal en vits udskrives i et lille vindue på skærmen. Forløb 1 Opret en ny XAL kørsel 2 Indsæt og tilret startkommentarer 3 Print teksten Hvad er forskellen på en and? 4 Print teksten Den er lige rund på midten. 5 Afprøv kørslen 6 Indsæt et vindue der er 40 kolonner bredt og 10 linjer højt. Vinduet skal placeres i kolonne 20 linje 5. 7 Foretag nødvendige ændringer i opgaven så den angivne vits udskrives startende i kolonne nr. 10 linje nr. 8 i vinduet. 8 Godkend kørslen og afprøv den igen 26
3. Variabler i XAL sproget Formål Formålet med denne lektion er, at give deltagerne grundlæggende viden om hvad variabler er for noget. Der undervises i variabeltyperne INT, REAL, STR og DATE, og hvordan de kan anvendes i XAL sproget. Efter lektionen skal kursisterne kunne: Erklære variabler af typerne INT, REAL, STR og DATE. Indsætte værdier i de fire variabeltyper. Udskrive indholdet i de fire variabeltyper. Variabler generelt I XAL kørsler kan data gemmes på forskellig vis alt afhængigt af, hvad de skal anvendes til. Opbevaring af data Nogle data hentes fra kartoteker og behandles i kørsler, hvorefter de gemmes igen i de samme eller andre kartoteker. Andre data derimod benyttes og gemmes kun midlertidigt, mens kørsler er åbne og igang. Denne type data gemmes i variabler. Variabler Variabler er pladser i computerens hukommelse. De indeholder data, der kun eksisterer medens en XAL kørsel er igang. Så snart kørslen afsluttes, forsvinder variablernes data. Variabler kan f.eks. anvendes til sammentælling af værdier under gennemløbet af et kartotek, idet der ikke længere er brug for den sammentalte værdi, når gennemløbet er slut, og resultatet er skrevet ud. Selve variablen med dens indhold gemmes kun midlertidigt i hukommelsen på maskinen, og indholdet kan læses når som helst, der er behov for det. En variabel kan sammenlignes med et skab med skuffer i. Hver skuffe må dog kun indeholde én bestemt type værdi. Variabeltyper Der findes 5 forskellige typer variabler, der hver for sig kun kan indeholde én bestemt type data. De forskellige variabeltyper vises i skemaet herunder. Den sidste variabeltype med navnet ENUM, forklares ikke yderligere i denne lektion, men i en selvstændig lektion (ikke på kurset Programmering begynder). 27
De fem variabeltyper Type Indhold Eksempel på indhold INT Heltal 350 REAL Decimaltal 235.45 STR Tekster Strygejern DATE Datoer 01\05\1998 ENUM Fasttekster 1 Erklæring af variabler Inden variabler kan tages i anvendelse i en XAL kørsel, skal de først oprettes ved en erklæring. Dette skal altid ske som det første i en kørsel før alle andre programlinjer. Variabler erklæres ved at angive variablens type efterfulgt af et navn. For tekstvariabler skal der desuden angives hvor mange tegn, variablen skal kunne indeholde. Variabler i XAL sproget kendetegnes ved, at navnet foranstilles med et &-tegn. Selve navnet startes desuden altid med et bogstav og må ikke indeholde mellemrum. I nedenstående illustration ses eksempler på erklæringer af variabler. Det er frivilligt hvilke navne, variablerne skal have, men det er en god idé, at benytte navne der siger noget om deres indhold. Erklæring af variabler { Erklæring af variabler } INT REAL STR 20 DATE &Antal &Pris &Varenavn &Salgsdato Bemærk at tekstvariablen &Varenavn erklæres til at kunne indeholde 20 tegn. Bag ved erklæringen af variablerne kan der f.eks. også skrives en lille kommentar om deres anvendelse, som i nedenstående eksempel. Erklæring af variabler med kommentarer { Erklæring af variabler } INT &Antal { Antal stk af en vare } REAL &Pris { Salgspris i kroner og øre } STR 20 &Varenavn { Navn på varer (højst 20 tegn) } DATE &Salgsdato { Dato for varesalget } Der kan erklæres flere variabler af hver type, når der er behov for det, de skal blot have hver sit navn. 28
Tildeling af værdier til variabler Oprettede variabler kan tildeles værdier på to forskellige måder: Ved erklæringen Med kommandoen SET Ved erklæringen Når variabler erklæres, initialiseres de altid automatisk med nulværdier. De kan dog også tildeles andre værdier, som i nedenstående eksempel. Erklæring af variabler med samtidig tildeling af værdier { Erklæring af variabler med tildeling af værdier } INT &Antal = 350 REAL &Pris = 235.45 STR 20 &Varenavn = Strygejern DATE &Salgsdato = 01\05\2011 Tildelte værdier gemmes, indtil der gives en ny værdi med SET eller kørslen afsluttes. Med kommandoen SET Med kommandoen SET kan variablerne til hver en tid tildeles nye værdier, medens en kørsel er igang, og den samme variabel kan tildeles nye værdier flere gange. Tildelingen foregår med kommandoen SET som i følgende eksempel: Erklæring af variabler og tildeling med SET { Erklæring af variabler } INT REAL STR 20 DATE &Antal &Pris &Varenavn &Salgsdato { Tildeling af ny værdi til variabler med SET kommandoen } SET &Antal SET &Pris = 200 = 150.75 SET &Varenavn = Håndmixer SET &Salgsdato = 01\05\2011 Vigtigt ved tildeling af værdier Type Indhold Eksempel på værdi INT Heltal skrives som de er 350 REAL Decimaltal skrives altid med punktum 235.45 STR Tekster skrives i anførselstegn (enkelt eller dobbelt) Strygejern DATE Datoer skrives altid med backslash (bagvendt skråstreg) 01\05\2011 Tildeling af beregninger til variabler 29
{ Erklæring af variabler med tildeling af værdi} INT REAL &Antal &Pris = 200 = 150.75 STR 20 &Varenavn = Håndmixer DATE REAL &Salgsdato &Sum = 01\05\2011 { Tildeling af ny værdi i form af beregning } SET &Sum = &Antal * &Pris I ovenstående eksempel multipliceres værdierne i variablerne &Antal og &Pris med hinanden. Resultatet tildeles variablen &Sum. Udskrivning af indhold fra variabler Variablers indhold kan til enhver tid hentes frem og udskrives. Udskrivning foregår med kommandoen PRINT. PRINT kan udskrive indholdet direkte ved angivelse af variablens navn. I nedenstående eksempel erklæres der en variabel af hver type, hvorefter de tildeles værdier og til sidst udskrives med PRINT kommandoen. Erklæring, tildeling og udskrivning af variabler { Erklæring af variabler } INT REAL STR 20 DATE &Antal &Pris &Varenavn &Salgsdato { Tildeling af værdier med SET } SET &Antal = 200 SET &Pris = 150.75 SET &Varenavn = Håndmixer SET &Salgsdato = 01\05\2011 { Udskrivning af værdier med PRINT } PRINT &Antal PRINT &Pris PRINT &Varenavn PRINT &Salgsdato PAUSE Ovenstående eksempel medfører følgende udskrift på skærmen. 30
Resultat af ovenstående XAL kørsel 200 150,75 Håndmixer 01/05-09 Variabler udskrives således med PRINT kommandoen blot ved at angive deres navn efter den. Da variabler således kan udskrives som enhver anden komponent efter PRINT kommandoen, kan de også udskrives sammen med andre komponenter f.eks. i forbindelse med ledetekster. I nedenstående eksempel udskrives de samme variabler igen med ledetekster: Udskrivning af variabler med ledetekster { Udskrivning af værdier med PRINT } PRINT Antal...:, &Antal PRINT Pris...:, &Pris PRINT Varenavn...:, &Varenavn PRINT Salgsdato...:, &Salgsdato PAUSE Husk at de forskellige komponenter på printlinjerne adskilles af komma. Resultat af ovenstående XAL kørsel Antal...: 200 Pris...: 150,75 Varenavn...: Håndmixer Salgsdato...: 01/05-98 Herunder vises et andet eksempel på en PRINT sætning med blandede komponenter. Blandede komponenter i én printsætning { Udskrivning af værdier med PRINT } REAL STR 20 &Pris &Varenavn SET &Pris = 150.75 SET &Varenavn = Håndmixer PRINT 1,, &Varenavn, koster, &Pris, Kr. PAUSE 31
Resultat af ovenstående XAL kørsel 1 Håndmixer koster 150,75 Kr 32
Opgaver: Variabler i XAL sproget Opgave 1: Anvendelse af variabler Formål med opgaven At opbygge en XAL kørsel med erklæring, tildeling og udskrivning af variabler. Huskelister Programmering - opret Kommentarer Variabler XAL editoren - editeringsfunktioner Eksempel Beskrivelse Der skal opbygges en XAL kørsel der anvender variabler, som du tildeler dit navn og fødselsdato, hvorefter variablernes indhold udskrives på skærmen. Navn og fødselsdato skal foranstilles med ledetekster som vist herunder: Navn...: Ole Olsen Fødselsdato..: 30/06-75 Forløb 1 Opret en ny XAL kørsel 2 Indsæt og tilret startkommentarer 3 Opret variabler (start med kommentarlinjen Erklæring af variabler ) 4 Tildel navn og fødselsdato til variablerne (start med kommentarlinjen Tildeling af værdier ) 5 Udskriv oplysningerne på skærmen med ledetekster som i ovenstående eksempel (start med kommentarlinjen Udskrift ) 6 Godkend kørslen og afprøv den igen 33
4. PROMPT, grundlæggende brugerdialog Formål Formålet med denne lektion er at give deltagerne grundlæggende viden om brugerdialoger med kommandoen PROMPT. Efter lektionen skal kursisterne kunne: Anvende kommandoen PROMPT til at foretage en dialog med brugeren Opbygge promptbokse med flere linjer, med og uden indtastningsfelter. Brugerdialog generelt Brugerdialoger anvendes ofte til at spørge brugere om, hvilke værdier der skal indsættes i variabler. Grundlæggende kan variabler tildeles værdier i XAL kørsler direkte under erklæringen, eller med kommandoen SET som vist herunder. Tildeling af værdier til variabler Variabeltildeling med SET INT &Antal STR 20 &VareNavn SET &Antal = 5 SET &VareNavn = Tulipaner PRINT &Antal,,&VareNavn Når variabler tildeles værdier, som vist her, kan brugerne ikke påvirke deres værdier. Det kan de derimod, når der anvendes brugerdialoger. Tildeling af værdier til variabler gennem brugerdialog En brugerdialog kan udføres vha. en dialogboks, der er et lille vindue på skærmen. I dette vindue vises nogle ledetekster, der udfærdiges af programmøren i forvejen. Ved siden af ledeteksterne er der plads til, at der kan indtastes svar i et eller flere indtastningsfelter som vist i eksemplet på næste side. Dialogboks med ledetekster og indtastningsfelter Indtast vareinformationer Antal...: Varenavn...: I ovenstående dialogboks kan der indtastes antal og varenavn, som så kan anvendes videre i den bagvedliggende XAL kørsel. Dialogboksens funktion 34
Dialogbokse fungerer på samme måde som kommandoen PAUSE, idet PAUSE stopper XAL kørslen, indtil der tastes Enter eller Return. Med en dialogboks stoppes XAL kørslen også midlertidigt. Kørslen fortsættes først, når indtastningsfelterne udfyldes, og boksen afsluttes med Enter eller Return. Ovenstående type dialogboks kaldes også en promptboks, idet boksen inde i kørslen dannes med kommandoen PROMPT. PROMPT Kommandoen PROMPT anvendes til at danne en dialogboks med følgende grundlæggende indhold: Overskrift, ledetekster og felter til indtastning af værdier. PROMPT boks med overskrift, ledetekster og indtastningsfelter Overskrift Indtast vareinformationer Antal...: Varenavn...: Ledetekster Indtastningsfelter Overskrift og ledetekster er almindelig fritekst, hvorimod indtastningsfelterne fremkommer vha. en særlig kommando. Programmeringsmæssigt dannes promptboksen i eksemplet med følgende kommandoer: XAL kørsel til ovenstående promptboks INT &Antal STR 20 &VareNavn PROMPT Indtast vareinformationer,,, Antal...: GET (&Antal), Varenavn...: GET (&VareNavn) INPUT AT 15,4 Bemærk at variabler, der anvendes i XAL kørsler, altid skal angives i toppen af kørslerne. I eksemplet erklæres der variabler til brug i promptboksen. I promptbokse er overskrifter og ledetekster almindelig tekst, der angives i anførselstegn. Tekst skal altid skrives i anførselstegn. Indtastningsfelter fremkommer ved indsættelse af kommandoen GET, der skal efterfølges af navnet på en variabel i en parantes. Variablen bliver tildelt den værdi, der indtastes i promptboksen af brugeren. På denne måde kan variabler tildeles værdier gennem promptbokse i stedet for ved anvendelse af SET kommandoen. Bemærk! Der skal altid være mindst én variabel i en promptbox, ellers meldes der syntaksfejl. Linjeskift i promptbokse 35
I promptbokse anvendes kommaer, både som normale kommaer i tekster og til linjeskift. Kommaer i tekster Kommaer der indsættes i tekster i promptbokse, anvendes som normale pause-kommaer. Når disse kommaer indsættes i tekster, der står i anførselstegn, vises kommaerne blot som en del af teksten, når promptboksen ses på skærmen. Anvendelse af komma i tekst STR 15 &Varenr PROMPT Indtast vareinformationer,,, Varenummer...: GET (&Varenr),, Hvis det ønskes, må varenummeret, gerne være alfanumerisk. INPUT AT 15,4 I eksemplet anvendes der et almindeligt pausekomma i teksten Hvis det ønskes, må varenummeret gerne være alfanumerisk. Pause komma i tekst i promptboks Indtast vareinformationer Varenummer...: Hvis det ønskes, må varenummeret gerne være alfanumerisk. Kommaer til linjeskift Promptbokse udføres ofte med flere linjer, ud over selve overskriften. Der kan være flere linjer med GET kommandoer, og der kan være flere tekstlinjer uden GET og variabler. Hver gang, der skal skiftes linje i en promptboks, udføres dette vha. et komma. Hvert komma, der indsættes i en promptboks uden for anførselstegnene, vil medføre, at der skiftes linje. Skal der f.eks. være en blank linje, skal der sættes et ekstra komma. Promptboks med flere tekstlinjer STR 15 &Varenr PROMPT Indtast vareinformationer,,, Varenummer...: GET (&Varenr),, Hvis det ønskes, må varenummeret, gerne være alfanumerisk. INPUT AT 15,4 I dette eksempel erklæres der kun én variabel til brug i promptboxen. 36
Det væsentlige i eksemplet er placeringen af kommaerne. Hvert komma, der ikke er en del af teksten i anførselstegnene, medfører ét linjeskift, når promptboxen vises på skærmen. Ovenstående kørsel resulterer i følgende promptboks på skærmen. Promptboks med linjeskift udført vha. kommaer Indtast vareinformationer Varenummer...: Hvis det ønskes, må varenummeret gerne være alfanumerisk. Størrelse på promptboxen Der findes ikke nogen parametre til angivelse af boksens størrelse. Den eneste måde, hvorpå boksens størrelse kan påvirkes, er ved at indsætte flere kommaer, hvilket giver flere linjeskift og således påvirker højden på boksen. Bredden på boksen kan kun påvirkes ved at angive mere tekst i anførselstegn. Indtast vareinformationer Varenummer...: Hvis det ønskes, må varenummeret gerne være alfanumerisk. Kommaer uden for teksten påvirker boksens højde Teksternes længde og variablernes størrelse påvirker boksens bredde INPUT AT Promptbokse kan opstilles med eller uden placering. Promptboks uden placering Når promptbokse vises på skærmen, vises de altid i øverste venstre hjørne, hvis der ikke angives nogen placering, som i nedenstående XAL kørsel, med efterfølgende eksempel. XAL kørsel med promptboks uden placering STR 15 &Varenr PROMPT Indtast vareinformationer,,, Varenummer...: GET (&Varenr),, Hvis det ønskes, må varenummeret, gerne være alfanumerisk. INPUT 37
Promptboks placeret i øverste venstre hjørne af skærm Indtast vareinformationer Varenummer...: Hvis det ønskes, må varenummeret gerne være alfanumerisk. Promptboks med placering Placering af promptbokse kan angives med kommandoen AT, der anvendes på samme måde som i WINDOW AT. Kommandoen benyttes til at angive en position med kolonne- og linjenummer. Positionen angiver boksens øverste venstre hjørne, på samme måde som i WINDOW. AT kommandoen indsættes efter INPUT som vist i efterfølgende eksempel. Promptboks med placering vha. AT STR 15 &Varenr PROMPT Indtast vareinformationer,,, Varenummer...: GET (&Varenr),, Hvis det ønskes, må varenummeret, gerne være alfanumerisk. INPUT AT 15,4 Ovenstående kommando medfører at promptboxen udskrives med sit øverste venstre hjørne i kolonne 15 linje 4, som vist herunder. Promptboks med placering Indtast vareinformationer Varenummer...: Hvis det ønskes, må varenummeret gerne være alfanumerisk. Andre muligheder med promptbokse Promptbokse har mange flere muligheder end de ovennævnte. Nogle af dem gennemgås på andre programmeringskurser. Desuden henvises til den interne hjælp (Programmeringsmanualen) under PROMPT, hvor der gives en uddybende forklaring på PROMPT kommandoen. 38
Opgaver: PROMPT, Grundlæggende brugerdialog Opgave 1: Brugerdialog for sommerhusudlejning Formål med opgave At anvende en PROMPT til at modtage værdier til variabler. Huskelister PROMPT Beskrivelse Der skal opbygges en mindre XAL kørsel til et bureau, der udlejer sommerhuse. Kørslen skal beregne udlejningsprisen på sommerhuse, idet den i en promptbox skal spørge brugeren om antal udlejningsdage, dagspris og beregningsmetode. Variabler Værdi Variabeltype Erklæring i XAL-kørsel Dage Dagspris Metode Heltal Kommatal Tekst Udlejningspris Kommatal I denne opgave oprettes udelukkende promptboksen som vist herunder. Beregningerne tilføres opgaven efter næste lektion. Promptboks Beregning af udlejningsværdi Dage...: Dagspris...: Metode...: (Weekend, Uge, Dobbeltuge) Udskrift på skærm Beregning af udlejningsværdi for sommerhuse ------------------------------------------- Dage...: 14 DagsPris...: 500,00 Metode...: DobbeltUge Forløb 39
1 Opret en ny XAL kørsel 2 Indsæt og tilret startkommentarer 3 Opret variabler som vist i skemaet (start med kommentarlinjen Erklæring af variabler ) 4 Opstil promptboksen som vist herover (start med kommentarlinjen Brugerdialog ) 5 Indsæt print sætninger der kan udskrive de informationer, der indtastes i promptboksen. Se udskriften herover. (start med kommentarlinjen Udskrift ) 6 Godkend kørslen og afprøv den igen 40
5. Betingelsesstrukturer med IF Mål med lektionen Formålet med denne lektion er at give deltagerne forståelse for anvendelse af betingelsesstrukturer med kommandoen IF. Efter lektionen skal kursisterne kunne: Anvende kommandoen IF til styring af programforløb Styre et programforløb vha. betingelser, og oplysninger der indtastes i dialogbokse. Betingelsesstrukturer generelt Betingelsesstrukturer anvendes til at udføre én ud af to opstillede muligheder afhængig af sandhedsværdien i en opstillet betingelse. Betingelse anvendt i dagligdagen En grønthandler, der sælger æbler, har to forskellige priser på sine æbler. Henholdsvis 2,50 kr. og 3,00 kr. stykket. Kunderne vil naturligvis gerne købe æblerne til 2,50 kr., men for at få lov til det, skal kunderne opfylde en bestemt betingelse. Betingelsen er, at der skal købes mere end 10 æbler. Hvis der købes 10 æbler eller mindre, koster de 3,00 kr stykket. Hver gang grønthandleren sælger æbler, anvender han således en betingelsesstruktur, for at finde ud af hvilken pris æblerne skal sælges for. Gartnerens anvendelse af betingelsesstrukturen HVIS Antal > 10 SÅ SÆT pris i alt til Antal * 2.50 ELLERS SÆT pris i alt til Antal * 3.00 SLUT Det kan godt være at gartneren ikke tænker over det i dagligdagen, men hver gang der sælges æbler, er han nødt at udregne prisen som vist oven over. IF-THEN-ELSE-ENDIF I XAL kørsler opbygges betingelsesstrukturer med kommandoen IF, der kan opstilles efter følgende syntaks. Kommandoen består af ordene IF-THEN-ELSE-ENDIF Syntaks IF betingelse THEN Kommandolinjer at udføre ELSE Alternative kommandolinjer at udføre ENDIF 41
Bemærk at kommandoen ALTID skal afsluttes med ENDIF Kommandoen ELSE kan derimod udelades, hvis der er behov for det. I så fald udføres IF strukturen kun, hvis betingelsen er opfyldt. Hvis den ikke er opfyldt, overspringes IF strukturen helt, og XAL kørslen fortsætter, som om intet var hændt. Det er opfyldelsen af betingelsen, der afgør, om det er første hold kommandolinjer eller de alternative linjer, der skal udføres. Se afsnittet Betingelsens bestanddele. Grønthandlerens eksempel kan opstilles i en XAL-kørsel med nedenstående kode. IF struktur ved salg af æbler INT &Antal { Antal solgt } REAL &PrisIalt { Pris pr. stk * Antal) PROMPT Beregning af pris,,, Indtast antal GET (&Antal) INPUT IF &Antal > 10 THEN SET &PrisIalt = &Antal * 2.50 ELSE SET &PrisIalt = &Antal * 3.00 ENDIF PRINT Prisen ialt:, &PrisIalt PAUSE I eksemplet erklæres der to variabler til antal og pris i alt, og der er opstillet en promptboks til indtastning af antallet. Det indtastede antal undersøges i betingelsesstrukturen med IF og bestemmer således den endelige pris, der udregnes og tildeles variablen &PrisIalt. Til sidst udskrives prisen i alt på skærmen. Hvis betingelsen er opfyldt, antallet er større end 10, bliver den første sætning udført. Hvis betingelsen ikke er opfyldt, antallet er mindre end eller lig med 10, bliver den alternative sætning efter ELSE udført. Betingelsens bestanddele En betingelse består af to dataelementer og en mellemliggende relationel operator. Betingelse med to dataelementer og relationel operator &Antal > 10 I eksemplet er dataelementet på venstre side af operatoren en variabel med navnet &Antal og dataelementet, på højre side af operatoren er tallet 10. Den relationelle operator er tegnet > (større end). Det er vigtigt at de to dataelementer, på hver side af den relationelle operator, er af samme type. Det nytter f.eks. ikke at sammenligne talværdier med tekster. De eneste dataelementer, der må være forskellige fra hinanden i betingelsesudtryk, er heltal og kommatal. I eksemplet er variablen af typen heltal (INT) og den kan derfor sammenlignes med et heltal (REAL). Relationelle operatorer i betingelser 42
Operator Betydning >= Større end eller lig med <= Mindre end eller lig med < Mindre end > Større end == Lig med <> Forskellig fra Ovenstående relationelle operatorer kan anvendes i betingelser. I næste eksempel består betingelsen af direkte sammenligning med to dataelementer af typen tekst. Betingelse med sammenligning STR 10 &Måned { Månedens navn } PROMPT Indtast månedens navn GET (&Måned) INPUT IF &Måned == April THEN PRINT Du valgte April måned. ELSE PRINT Du valgte noget andet. ENDIF PAUSE Bemærk at operatoren består af to lighedstegn efter hinanden. I betingelser anvendes der altid to lighedstegn, når det skal undersøges om to værdier er ens. Bemærk ligeledes at teksten på højre side af operatoren er sat i citationstegn. Dette fordi variablen på venstre side er en tekstvariabel. På denne måde er de to dataelementer af samme type. 43
Opgaver: Betingelsesstrukturer med IF Opgave 1: Beregning af lejeværdi for sommerhuse Formål med opgave At anvende IF-THEN-ELSE-ENDIF i forbindelse med erklærede variabler Huskelister PROMPT IF-THEN-ELSE Beskrivelse I lektionen PROMPT grundlæggende brugerdialog var der en opgave med en promptboks til indtastning af værdier i forbindelse med udlejning af sommerhuse. Der skal bygges videre på denne opgave. Efter indtastning af relevante data, skal kørslen,ved hjælp af betingelsesstrukturer, beregne udlejningsprisen afhængigt af beregningsmetoden. Hvorefter prisen udskrives på skærmen. Variabler (udført i forrige opgave) Værdi Variabeltype Erklæring i XAL-kørsel Dage DagsPris Metode Udlejningspris Heltal Kommatal Tekst Kommatal Brugerdialog (udført i forrige opgave) Beregning af udlejningsværdi Dage...: Dagspris...: Metode...: (Weekend, Uge, Dobbeltuge) Beregningsmetoder Metode Beregning Weekend Dage * DagsPris + 10% Uge Dage * DagsPris DobbeltUge Dage * DagsPris 30 % 44
Udskrift på skærm Beregning af udlejningsværdi for sommerhuse ------------------------------------------- Dage...: 14 DagsPris...: 500,00 Metode...: DobbeltUge ------------------------------------------- Udlejningspris.: 4.900,00 =========================================== Forløb 1 Opret en ny XAL kørsel. 2 Kopier alle linjer fra opgaven i den forrige lektion ind i denne XAL kørsel. 3 Foretag ændringer i startkommentarerne i teksten til Funktion, så den svarer til denne opgave. 4 Opret en ny variabel til den beregnede udlejningspris, hvis den ikke findes i forvejen. 5 Indsæt betingelsesstrukturer med IF-THEN-ELSE for hver metode som vist i skemaet Beregningsmetoder herover. I hver struktur tildeles den beregnede værdi til variablen for udlejningsprisen. 6 Indsæt en print sætning der kan udskrive den beregnede udlejningspris. Se udskriften herover. 7 Afprøv kørslen og undersøg om beregningerne udføres korrekt ved anvendelse af de forskellige metoder. 45
6. Fasttekster Mål med lektionen Formålet med denne lektion er at give deltagerne viden om emnet fasttekster. Efter lektionen skal kursisterne kunne: Oprette nye fasttekster Anvende fasttekster i forbindelse med variabler Anvende fasttekster i forbindelse med promptbokse Anvende fasttekster i forbindelse med betingelse i IF strukturer. Fasttekster generelt Datatyper Der findes i XAL-sproget fem datatyper. Fem datatyper i XAL-sproget Heltal Kommatal Tekst Dato Fasttekst De fire første er tidligere behandlet under lektionen om variabler. I denne lektion behandles den sidste datatype Fasttekst. Datatypen Fasttekst Fastteksttyper er samlinger af faste tekster, der anvendes i XAL-sproget. Teksterne er faste, idet de så godt som aldrig ændres. De kan benyttes igen og igen i XAL-kørsler, skærmbilleder og udskrifter. En samling af tekster kaldes herefter en fasttekstype. Hver fastteksttype har sit eget navn, der som regel siger noget om, hvilken type tekster den indeholder. I XAL-sproget kan der oprettes yderligere fastteksttyper, og der kan tilføjes flere tekster til de eksisterende fastteksttyper. C5 (vers. 4.1 ->) Et eksempel på en type, der anvendes mange forskellige steder, er fastteksttypen med navnet NoYes. Denne type indeholder teksterne Nej og Ja. C5 (vers. -> 4.0) Et eksempel på en type, der anvendes mange forskellige steder, er fastteksttypen med navnet NejJa. Denne type indeholder teksterne Nej og Ja. Fastteksttyper og tekster 46
Hver tekst i en fastteksttype har en fast position i en indbyrdes rækkefølge. En fastteksttype er således en kombination af tekster og deres positioner, som vist i eksemplerne herunder. Fastteksttypen NoYes Fastteksttypens navn Position Tekst NoYes 0 Nej 1 Ja Den første position i en fastteksttype er altid position nul. Fastteksttypen ItemType Fastteksttypens navn Position Tekst ItemType 0 Vare 1 Ydelse 2 Stykliste 3 SamleListe Begge fastteksttyper anvendes f.eks. i lagerskærmbilledet i C5 under Lager/Kartotek, hvor typen NoYes f.eks. anvendes i felterne Spærret (Blocked), Engangsvare (OneTimeItem) og Negativ (NegativeInventory), og hvor typen ItemType anvendes i feltet Varetype (ItemType). Fastteksters anvendelse, i forbindelse med kartoteksfelter, behandles i lektionerne om skærmbilleder. Efterfølgende behandles fasttekster i forbindelse med variabler, promptbokse og IF strukturer. Fasttekster i variabler Erklæring af fasttekst variabler Variabel typer Type Indhold INT REAL STR DATE ENUM Heltal Kommatal Tekst Datoer Fasttekster Erklæring af variabler af typen fasttekst udføres ved at angive variablens type, den tilknyttede fastteksttype og variablens navn. Syntaks for erklæring af fasttekst variabel ENUM <Fastteksttype> &<Variabelnavn> 47
Under erklæringen angives der variabeltype dvs. ENUM, og variabelnavn foranstilles med &-tegnet. Desuden skal det angives, hvilken fastteksttype der skal tilknyttes variablen. Eksempel på erklæring af fasttekst variabel ENUM NoYes &NegativLagerbeholdning I eksemplet erklæres en variabel af typen ENUM dvs. fasttekst. Variablen knyttes til fastteksttypen NoYes, og navnet på variablen kaldes &NegativLagerBeholdning. Tildeling af værdier til fasttekstvariabler Når variabler af typen ENUM skal tildeles værdier, foregår det på en anden måde end ved andre variabler. Det er stadig SET kommandoen, der anvendes, men i stedet for at skrive selve teksten angives tekstens position i fastteksttypen. Tildeling af værdi til fasttekstvariabel ENUM NoYes &NegativLagerBeholdning SET &NegativLagerBeholdning = 1 {Ja} Variablen &NegativLagerBeholdning tildeles tallet 1, der tilsvarer værdien på position 1 i den tilhørende fastteksttype NoYes. Tildelingen kunne også være sket under erklæringen, som i næste eksempel. Tildeling af værdi til fasttekstvariabel under erklæring ENUM NejJa &NegativLagerBeholdning = 1 {Ja} Variabler af typen fasttekst indeholder altså positionen på teksten og ikke selve teksten. Udskrivning af værdier fra fasttekstvariabler Når værdier fra fasttekstvariabler udskrives, hentes selve teksten automatisk fra den tilhørende fastteksttype vha. positionen, der er gemt i variablen. Det er således teksten fra fastteksttypen, der udskrives og ikke selve positionen. Udskrivning af værdi fra fasttekstvariabel ENUM NoYes &NegativLagerBeholdning SET &NegativLagerBeholdning = 1 {Ja} PRINT Negativt lager...:, &NegativLagerBeholdning PAUSE Resultat 48
Negativt lager...: Ja I eksemplet indeholder variablen &NegativLagerBeholdning tallet 1. Det er dog ikke tallet, der udskrives, men teksten Ja der hentes automatisk i den tilhørende fastteksttype. Når fasttekstvariablers indhold præsenteres på skærmen, omformateres de således iflg. fastteksttypen. Det er f.eks. tilfældet i print sætninger, promptbokse og skærmbilleder. Fasttekster i promptboxe Ved at anvende fasttekstvariabler i promptbokse, opnås der to fordele under afviklingen: I indtastningsfeltet kan der kun indtastes værdier, der findes i forvejen i den tilhørende fastteksttype. Der kan tastes ALT+H og en oversigt over teksterne i den tilhørende fastteksttype vises. En af teksterne kan vælges og overføres til feltet. Opsætning af promptbokse med fasttekstvariabler er ikke anderledes end andre promptbokse. De to ovennævnte faciliteter stilles automatisk til rådighed af systemet, når variabler af typen fasttekst anvendes. Fasttekstvariabel i promptboks ENUM NoYes &NegativLager PROMPT Anvendelse af lager,,, Må lageret gå negativt: GET (&NegativLager), INPUT Afvikling Må lageret gå negativt: Anvendelse af lager Alt H NejJa Nej Ja I eksemplet anvendes fastteksttypen NoYes. Når promptboksen vises på skærmen, og der tastes ALT+H i feltet, kan der vælges mellem teksterne Nej og Ja i den tilknyttede fastteksttype. Der kan kun vælges mellem de tekster, der findes i fastteksttypen. Selv om der vælges en tekst fra listen, og teksten vises i indtastningsfeltet, vil den bagvedliggende variabel kun komme til at indeholde nummeret på tekstens placering i fastteksttypen. 49
Fasttekster i IF strukturer Da fasttekst variabler ikke indeholder selve teksten men positionen, betyder det, at der i betingelser i IF strukturer ikke kan sammenlignes med tekster men med positioner. Fasttekst i IF struktur ENUM NoYes &NegativLager PROMPT Anvendelse af lager,,, Må lageret gå negativt: GET (&NegativLager), INPUT IF &NegativLager == 1 THEN PRINT &NegativLager,, lageret må gå negativt ELSE PRINT &NegativLager,, lageret må ikke gå negativt ENDIF PAUSE I eksemplet er variablen &NegativLager en fasttekstvariabel af typen ENUM. Når kørslen udføres, vil variablen, efter indtastning i promptboksen, enten indeholde tallet 0 eller 1, afhængigt af hvad der skrives i indtastningsfeltet. I betingelsen i IF sætningen sammenlignes variablen med et heltal. I printsætningerne omformateres variablens indhold til teksten Ja eller Nej. Vedligeholdelse af fasttekster Fasttekster kan til hver en tid oprettes, ændres og slettes. Nye tekster kan dog kun oprettes nederst i listen over tekster i fastteksttypen. Hvis de skal slettes, kan det kun ske ved at begynde med den sidst oprettede. Derimod kan selve teksternes ordlyd godt ændres. Vigtigt! Der skal udvises stor forsigtighed ved ændring eller sletning, da der nemt kan skabes uoverensstemmelse mellem de positioner, der gemmes i variabler og kartoteksfelter, og de tekster der findes i den tilhørende fastteksttype. Hvis der f.eks. ændres i en fastteksttype, påvirker dette IKKE de værdier, der står rundt omkring i felter og variabler. Der sker ikke nogen automatisk ændring af disse. Huskeliste Der henvises til huskelisterne om fasttekster, for at lære at oprette og vedligeholde disse. 50
Opgaver: Fasttekster Opgave 1: Opret en fasttekst Formål med opgave At oprette en helt ny fastteksttype med tilhørende faste tekster. Huskelister ENUM Beskrivelse Opret en fastteksttype med flg. indhold: Fastteksttypens navn Position Tekst Beregningsmetode 0 Weekend 1 Uge 2 DobbeltUge Fastteksttypen skal anvendes til faste beregningsmetoder i kørslen til beregning af udlejningsværdi for sommerhuse. Forløb 1 Opret fastteksttypen som vist i skemaet herover. 2 Indsæt de faste tekster fra skemaet i ovenstående rækkefølge. 51
Opgave 2: Anvend fasttekst i XAL-kørsel Formål med opgave At erklære en variabel af typen ENUM (fasttekst), og at anvende denne i en promptboks og i en IF struktur. Huskelister PROMPT IF-THEN-ELSE-ENDIF Beskrivelse I forrige lektion blev der udarbejdet en XAL kørsel til beregning af udlejningsværdi for sommerhuse. I promptboksen skulle der indtastes teksten for den beregningsmetode, der skulle anvendes, men hvis der blev tastet forkert, gav det intet resultat. I denne opgave skal det ændres således, at der ikke skal tastes teksten på metoden, men være mulighed for at vælge metoden fra en fastteksttype med ALT+H. Forløb 1 Opret en ny XAL kørsel. 2 Kopiér alle linjerne fra opgaven i forrige lektion ind i denne XAL kørsel. 3 Foretag nødvendige ændringer i den nye kørsel, så variablen til metoder ændres fra at være en tekstvariabel til at være en fasttekst variabel (med fastteksten fra opgave 1). 4 Foretag nødvendige ændringer i IF-THEN-ELSE sætningerne, så betingelserne i de forskellige sætninger kommer til at fungere korrekt mht. fasttekstvariablen. 5 Afprøv kørslen med ALT+ H i promptboxen i indtastningsfeltet til metode variablen, og prøv i et andet forsøg at indtaste en værdi, der ikke findes i fastteksttypen til metode variablen. 52
7. Funktioner, grundlæggende Mål med lektionen Formålet med denne lektion er at give deltagerne en grundlæggende forståelse for anvendelsen af funktioner i XAL sproget. Efter lektionen skal kursisterne kunne Forstå den grundlæggende opbygning og syntaks til funktioner Udskrive værdier fra funktioner, tildele værdier fra funktioner til variabler og indbygge funktioner i hinanden Anvende funktionerne ToDay(), TimeNow(), Time2Str(), CurUserId() og UserId2Name(). Funktioner generelt Funktioner er en form for kommandoer, der anvendes til udledning af værdier afhængigt af forskellige parametre. Der findes f.eks. en funktion, der kan udlede dags dato, og en funktion der kan udlede navnet på den bruger, der er logget ind i Microsoft Dynamics C5 her og nu. Typer af funktioner Der findes følgende grupper af funktioner: Funktioner til konvertering af datatyper Funktioner til finansielle beregninger Funktioner til behandling af kommatal Funktioner til tekstbehandling Datobehandlingsfunktioner Brugerrettigheds- og systemfunktioner SQL-funktioner Der henvises til den interne hjælp (Programmeringsmanualen) - Funktioner, for beskrivelse af de enkelte funktioner. Opbygning Virkemåde Funktioner er mindre programmer, der kaldes eller startes i XAL kørsler. Funktioner udleder værdier, der returneres til den XAL kørsel, hvorfra de blev kaldt. 53
Funktionskald i XAL kørsel XAL kørsel Funktion(Parametre) Udledt værdi Funktion Udledning eller beregning af værdier med de overførte parametre. Den udledte værdi leveres tilbage til XAL kørslen. Ved hjælp af overførte parametre kan det bestemmes, hvordan returværdien skal se ud. Hvor funktioner anvendes uden parametre, returneres der altid en forud bestemt værdi i et bestemt format eller udseende. Se funktionen Today(). Hvor funktioner anvendes med parametre, anvendes den første parameter ofte til at angive en værdi f.eks. i form af navnet på en variabel. Med de efterfølgende parametre angives herefter, hvorledes den første parameter skal behandles inde i funktionen. På denne måde kan der f.eks. udføres en omformatering af værdien i den første parameter. Se funktionen Time2Str(). Syntaks Alle funktioner har et navn, ligesom XAL kommandoer. I XAL sproget genkendes funktioner ved, at navnet efterfølges af et sæt almindelige parenteser med eller uden parametre. Syntaks til funktioner med parametre Funktionsnavn(parametre) Funktionsnavn erstattes af funktionens navn, og parametre erstattes af en eller flere parametre. De indsatte parametre overføres til funktionen, hvor de anvendes til udledningen eller beregningen af den nye værdi. Hvis der er flere parametre i parenteserne, skal disse adskilles med kommaer. Det er ikke alle funktioner, der skal udfyldes med et udtryk inde i parenteserne. I de tilfælde ser syntaksen sådan ud. Syntaks til funktioner uden parametre Funktionsnavn() 54
Datatyper i funktioner Datatyper I XAL sproget findes der følgende fem datatyper: Datatype INT REAL STR DATE ENUM Forklaring Heltal Kommatal Tekst Dato Fasttekst Det er vigtigt at forholde sig til hvilke datatyper, der anvendes i funktioner i parametre og returværdier. Ofte anvendes funktioner til omformatering af én datatype til en anden, som vist i figuren herunder. Omformatering fra heltal til tekst Heltal Funktion Tekst En sådan omformatering udføres, f.eks. i funktionen Time2Str der anvendes til at omformatere sekunder siden midnat til en tekst i form af timer, minutter og sekunder. Omformatering af sekunder til tekst med klokkeslet 39510 Time2Str 10:58:30 Funktionsparametre Funktionsparametrene skal altid angives i den rigtige datatype, da funktionen ellers ikke kan fungere. Det nytter f.eks. ikke at indsætte en dato, hvis funktionen forventer et heltal. Det er også vigtigt at kende datatypen på den værdi der udledes. Hvis en udledt værdi f.eks. skal tildeles til en variabel, er det vigtigt at variablen er af samme værdi som funktionsværdien. Datatyper i funktionsparametre og udledte værdier angives ofte direkte i syntaksbeskrivelserne. Syntaks med angivelse af datatyper Funktionsnavn(parameter:DATATYPE):DATATYPE 55
I ovenstående eksempel, på syntaks med angivelse af datatyper, vises det hvordan parametrene angives i to dele i form af parameter og :DATATYPE. Det betyder ikke, at begge dele skal angives i funktionskaldet. Teksten :DATATYPE angives kun i syntaksbeskrivelsen, som forklaring til hvilken datatype parameteren skal være. Teksten :DATATYPE, efter paranteserne, angiver på samme måde hvilken datatype, returværdien er. Teksten :DATATYPE skal ikke angives under anvendelsen af funktionskaldet. Eksempel på syntaks med angivelse af datatyper Time2Str(t:INT, d1:int, d2:int):str Eksemplet med funktionen Time2Str() er kun medtaget for, at vise hvorledes datatyper angives i syntaksbeskrivelser. Selve funktionen uddybes senere i sit eget afsnit. Alle beskrivelser af funktioner i denne lektion og fremover vil følge denne standard for beskrivelse af syntakser for funktioner. Samme beskrivelse anvendes desuden i den interne hjælp (Programmeringsmanualen) - Funktioner. Funktioner (ToDay(), TimeNow() m.fl.) ToDay() Beskrivelse Funktionen ToDay() returnerer dags dato, der hentes fra computerens ur. Syntaks Today():DATE Parametre Ingen Returværdi Dags Dato i form af datatypen DATE Eksempel 1: ToDay() i PRINT sætning PRINT Datoen i dag:, ToDay() PAUSE Resultat Datoen i dag: 08/06-08 Her indgår funktionen ToDay() direkte i PRINT sætningen. Eksempel 2: ToDay() i variabler DATE &DD SET &DD = ToDay() 56
PRINT Datoen i dag:, &DD PAUSE Resultat Datoen i dag: 08/06-08 Her får variablen &DD sin værdi fra funktionen ToDay(). TimeNow() Beskrivelse Funktionen TimeNow() returnerer den aktuelle tid, der hentes fra computerens ur. Tiden returneres som et antal sekunder siden midnat. Syntaks TimeNow():INT Parametre Ingen Returværdi Antal sekunder siden midnat udtrykt som et heltal i form af datatypen INT Eksempel 1: TimeNow() i PRINT sætning PRINT Tiden i sekunder siden midnat:, TimeNow() PAUSE Resultat Tiden i sekunder siden midnat: 39510 Her anvendes funktionen TimeNow() direkte i PRINT sætningen. Eksempel 2: TimeNow() i variabler INT &Sekunder SET &Sekunder = TimeNow() PRINT Tiden i sekunder siden midnat:, &Sekunder PAUSE Resultat Tiden i sekunder siden midnat: 39510 Her får variablen &Sekunder sin værdi fra funktionen TimeNow(). Se også Time2Str(). Time2Str() 57
Beskrivelse Funktionen Time2Str() konverterer en tid til tekst. Tiden angives i sekunder og teksten der returneres, kan formateres til timer, minutter og sekunder ved angivelse af forskellige parametre. Syntaks Time2Str(t:INT, d1:int, d2:int):str Parametre Parameteren t er den tid i sekunder, der skal konverteres til en tekst. Tiden kan f.eks. angives i form af et helt tal, en variabel eller funktionen TimeNow(). Parameter d1 og d2 er formateringsparametre. Parameter d1 angiver typen af skilletegn mellem timer, minutter og sekunder. Parameter d2 angiver 24 timers eller 12 timers AM/PM ur. Parameterværdier for d1 Værdi Skilletegn 0 Intet skilletegn 1 : (kolon) 2. (punktum) 3 (space eller blankt tegn) 4, (komma) 5 / (skråstreg) Parameterværdi for d2 Værdi Skilletegn 1 24 timers ur 2 12 timers AM/PM ur Returværdi Timer, minutter og sekunder udtrykt i en tekststreng i form af datatypen STR. De tre værdier adskilles med skilletegn som angivet i parametrene. Eksempel 1: Time2Str() i PRINT sætning PRINT Sekunderne 39510 er klokken:, Time2Str(39510,1,1) PAUSE Resultat Sekunderne 39510 er klokken: 10:58:30 58
Her anvendes funktionen Time2Str() direkte i PRINT sætningen. Tallet 39510, er antal sekunder siden midnat og det omformateres ved hjælp af parameter 1 og 2. Parameteren d1 består af tallet 1, der resulterer i skilletegnet kolon. D2 er også 1, der giver 24 timers ur. Eksempel 2: Time2Str() i variabler STR 8 &Klokken SET &Klokken = Time2Str(39510,5,1) PRINT Sekunderne 39510 er klokken:, &klokken PAUSE Resultat Sekunderne 39510 er klokken: 10/58/30 Her får tekstvariablen &Klokken den værdi, der udledes med funktionen Time2Str(). Parameter d1 er sat til 5, der giver / i det returnerede klokkeslet. Eksempel 3: Time2Str() med TimeNow() indbygget PRINT Klokken er:, Time2Str(TimeNow(),3,1) PAUSE Resultat Klokken er: 10 58 30 Her anvendes funktionen TimeNow() som første parameter i funktionen Time2Str(). Parameter d1 er sat til 3, hvilket medfører blanke tegn som skilletegn. Funktionen anvendes direkte i PRINT sætningen. 59
CurUserId() Beskrivelse Funktionen CurUserId() returnerer den aktuelle brugers user-id. Dvs. det nummer brugeren automatisk får tildelt, når denne oprettes i C5. Syntaks CurUserId():INT Parametre Ingen Returværdi Den aktuelle brugers user-id udtrykt i et heltal i form af datatypen INT. Eksempler Eksempel 1: CurUserId() i PRINT sætning PRINT Den aktuelle brugers nummer:, CurUserId() PAUSE Resultat Den aktuelle brugers nummer: 1 Her anvendes funktionen CurUserId() direkte i PRINT sætningen. Funktionen returnerer brugerens nummer, der i eksemplet er 1. Eksempel 2: CurUserId() i variabler INT &BrugerNummer SET &BrugerNummer = CurUserId() PRINT Den aktuelle brugers nummer:, &BrugerNummer PAUSE Resultat Den aktuelle brugers nummer: 1 Her får variablen &BrugerNummer sin værdi fra funktionen CurUserId(). 60
UserId2Name() Beskrivelse Hver bruger i systemet er identificeret med en user-id i form af et unikt nummer. Funktionen UserId2Name omdanner dette nummer til det tilhørende brugernavn Syntaks UserId2Name(i1:INT):STR Parametre Parameteren i1 skal være et heltal. Kan angives som et heltal, en variabel eller funktionen CurUserId() Returværdi Den udledte brugers navn udtrykt som en tekst i form af datatypen STR Eksempel 1: UserId2Name() i PRINT sætning PRINT Navn på bruger nummer 5:, UserId2Name(5) PAUSE Resultat Navn på bruger nummer 5: Anna Her anvendes funktionen UserId2Name() direkte i PRINT sætningen. Navnet på bruger nummer 5 udledes og udskrives. Eksempel 2: UserId2Name() i variabler STR 15 &BrugerNavn SET &BrugerNavn = UserId2Name(5) PRINT Navn på bruger nummer 5:, &BrugerNavn PAUSE Resultat Navn på bruger nummer 5: Anna Her får variablen &BrugerNavn sin værdi fra funktionen UserId2Name(). Funktionen udleder navnet på bruger nummer 5. Variablens værdi udskrives herefter i PRINT sætningen. Eksempel 3: UserId2Name() med CurUserId() indbygget PRINT Navn på aktuel bruger:, UserId2Name(CurUserId()) PAUSE Resultat 61
Navn på aktuel bruger: Anna Her anvendes funktionen UserId2Name() til omformatering af funktionen CurUserId(). Funktionerne anvendes direkte i PRINT sætningen, og udskriver således navnet på den aktuelle bruger i stedet for brugerens nummer. 62
Opgaver: Funktioner Opgave 1: Funktioner i print sætninger Formål med opgaven At opbygge en XAL kørsel der benytter funktionen CurUserId( ) i en PRINT sætning. Huskelister Funktion - CurUserId( ) Beskrivelse Kørslen skal udskrive den nuværende brugers nummer eller ID på skærmen. Eksempel Nuværende Bruger ID: 1 Forløb 1 Opret en ny XAL kørsel. 2 Indsæt og tilret startkommentarer. 3 Lav en PRINT sætning der udskriver den nuværende brugers ID nummer på skærmen. Udskriftsområdet skal reduceres til at være 30 bred og 5 høj, samt positioneres på 10,4. 4 Afprøv kørslen og foretag evt. ændringer. 63
Opgave 2: Funktioner i variabler Formål med opgaven At opbygge en kørsel der gemmer resultatet af funktionen Today( ) i én variabel og udskriver denne til skærmen. Huskelister Eksempel Variabler Funktion - Today ( ) Beskrivelse Kørslen skal udskrive dato i dag, dato i går og dato om en uge. Bemærk! Der skal kun erklæres én variabel. DATOER I dag...: 10/08-09 I går...: 09/08-09 Om en uge: 17/08-09 Forløb 1 Opret en ny kørsel 2 Indsæt og tilret startkommentarer 3 Opret en variabel der kan indeholde datoer 4 Indsæt med TODAY() dags dato i variablen under erklæringen 5 Udskriv resultatet på skærmen som vist i eksemplet. Udskrifts området skal reduceres til at være 40 bred og 5 høj, samt positioneres på 10,5 6 Med SET kommandoen tildeles funktionen TODAY()-1 til variablen og udskrives 7 Med SET kommandoen tildeles funktionen TODAY()+7 til variablen og udskrives 8 Afprøv kørslen og foretag evt. ændringer 64
Eksempel Opgave 3: Funktioner indbygget i hinanden Formål med opgaven At opbygge en kørsel der udskriver forskellige typer funktioner til skærmen (TimeNow( ), Time2Str( ), Today( ), CurUserID( ) og UserID2Name( )). Huskelister Funktion - TimeNow( ) Funktion - Time2Str( ) Funktion - Today( ) Funktion - CurUserID( ) Funktion - UserID2Name( )). Beskrivelse Kørslen skal udskrive den nuværende brugers ID og navn, samt dags dato og klokkeslæt. Bruger ID: 1 Bruger navn: Supervisor Dato...: 10/08-99 Klokken.: 11:25:45 Forløb 1 Opret en ny kørsel 2 Indsæt og tilret startkommentarer 3 Udskriv resultatet på skærmen som vist i eksemplet. Udskriftsområdet skal reduceres til at være 40 bred og 5 høj, samt positioneres på 10,5 4 Bemærk, at udskriften skal indeholde en funktion inden i en funktion, f.eks. ved Brugers navn og Tid. Tiden skal desuden udformes med kolon som skilletegn mellem timer, minutter og sekunder) 5 Afprøv kørslen og foretag evt. ændringer 65
Opgave 4: Stopur Formål med opgaven At opbygge en kørsel der benytter funktionerne TimeNow() og Time2Str() til at danne et stopur. Huskelister Eksempel Funktion - TimeNow() Funktion - Time2Str() Beskrivelse Der skal dannes en kørsel der viser tiden mellem to pauser, idet pauserne anvendes til start og stop af uret. Tast <ENTER> for at starte og stoppe uret! Tid: 00:01:35 Forløb 1 Opret en ny kørsel 2 Indsæt og tilret startkommentarer 3 Opret to heltalsvariabler &Start og &Stop 4 Opret en PRINT sætning med teksten Tast <ENTER> for at starte og stoppe uret! 5 Der skal anvendes PAUSE kommandoer i forbindelse med start og stop af uret 6 Efter første PAUSE tildeles startvariablen tiden med TIMENOW() og efter næste PAUSE tildeles stopvariablen tiden med TIMENOW() 7 I printsætningen med ordet Tid: trækkes de to variabler fra hinanden for, at vise hvor mange sekunder der gik. (Afprøv kørslen.) 8 Anvend TIME2STR() for at vise tiden i timer, minutter og sekunder. Afprøv kørslen igen. 66
8. Brugerdialog med BOX, grundlæggende Formål Formålet med denne lektion er at give deltagerne grundlæggende viden om funktionen BOX(), der anvendes til brugerdialoger. Efter lektionen skal kursisterne kunne Anvende funktionen BOX() med type 1 og 2 til udskrivning af informationer og advarsler. Generelt I XAL kørsler er der ofte behov for at standse kørslen og give brugeren en besked i form af generel information eller en advarsel. Denne funktionalitet kan opnås ved anvendelse af funktionen BOX(). Funktionen har forskellige anvendelsesmåder, og kan udføres i fire forskellige typer. I denne lektion gennemgås den grundlæggende anvendelse af type 1 og 2 i funktionen BOX(). Bokstyper i denne lektion Type Funktion Farve 1 Infoboks Grå 2 Advarselsboks Rød Syntaks BOX() Box() er en funktion og skal behandles på samme måde som alle andre funktioner i XAL sproget. Syntaksen er derfor også den samme, idet funktionsnavnet skal efterfølges af to paranteser med parametre. Generel syntaks for funktioner med parametre Funktionsnavn(parametre) Se yderligere forklaring i lektionen Funktioner, grundlæggende. De parametre, der indgår i funktioner, er forskellige for hver enkelt funktion, idet parametrene bestemmer hvad, der kommer ud af funktionen. Parametre og funktionen BOX() typerne 1 og 2 BOX() indeholder altid tre parametre, som vist herunder. Syntaks for funktionen Box() Box(type:INT,tekst:STR,std:INT):INT 67
Når Box funktionen anvendes i XAL sproget, skal den aktiveres med kommandoen SET eller PRINT, som vist i næste afsnit. BOX() typerne 1 og 2 Funktionen BOX() typerne 1 og 2 returnerer en grå informationsboks eller en rød advarselsboks. Boksen indeholder en tekst som brugeren, programmøren, bestemmer på forhånd ved opsætning af boksen. Selve boksen virker som en PAUSE, idet boksen vises på skærmen, indtil der tastes Enter eller Return. Syntaks Box(type:INT, tekst:str, std:int):int Parametre Parameter nr Datatype Betydning 1 INT 1 = Grå infoboks 2 = Rød advarselsboks 2 STR Tekst der skal stå i boksen. Skal altid stå i citationstegn. Linjeskift udføres med \n. Se eks. 3 INT 1 = Nummer på knap i boks (Der er kun én med teksten OK ) Returværdi Den angivne returværdi er et heltal i form af datatypen INT. Returværdien har ingen praktisk betydning ved BOX() typerne 1 og 2. Se eksempler nedenfor. Eksempel på BOX(1) infoboks {Forfatter : Jens Olsen} {Dato : 05.12.2011} {C5 version : 2012} SET Box(1, Kørslen startes ved at taste <Enter>,1) Resultat Kørslen startes ved at taste <Enter> OK I dette eksempel vises en infoboks. Det tænkes, at der er flere linjer efter SET kommandoen. 68
Eksempel på BOX(2) advarselsboks {Forfatter : Jens Olsen} {Dato : 05.12.2011} {C5 version : 2012} SET Box(1, Kørslen stoppes nu!,1) Resultat Kørslen stoppes nu! OK I dette eksempel udskrives der en advarselsboks. Eksemplet er her kun tænkt som en advarsel om, at kørslen ikke er længere. Eksempel på BOX(1) infoboks med tekst i flere linjer {Forfatter : Jens Olsen} {Dato : 05.12.2011} {C5 version : 2012} SET Box(1, Beregning af kostpriser\ntast <Enter> for start,1) Resultat Beregning af kostpriser Tast <Enter> for start OK I dette eksempel vises en infoboks med flere linjer. Linjeskift indsættes med tekstkommandoen \n. Når XAL kørslen afvikles og teksten læses vil \n medføre, at der skiftes linje. Linjeskift kan indsættes hvor som helst og flere gange i teksten, hvis der skal være flere linjer i boksen. 69
Opgaver: Brugerdialog med BOX, grundlæggende Opgave 1: Bokse anvendt i eksempel Formål med opgaven At anvende info- og advarselsbokse i en kørsel sammen med IF sætninger og variabler. Huskelister Box Beskrivelse Der skal oprettes en kørsel til beregning af salgspris i alt. Kørslen skal starte med en infoboks, med informationer om hvad kørslen udfører. Derefter vises en promptboks, hvor brugeren skal kunne indtaste varenavn, antal og pris pr. stk. Programmet udregner dernæst en total for pågældende køb. Hvis der tastes en kombination af antal og pris, der giver en total på nul eller mindre, skal der udskrives en advarsels boks, der orienterer brugeren om, at totalen ikke kan regnes ud, ellers skal totalen udskrives på skærmen. Infoboks med forklaring til kørsel Kørslen udregner samlet salgspris ved at multiplicere antal og pris. OK Promptboks Prisberegning Varenavn : Antal...: Pris...: Advarselsboks Totalen kan ikke udregnes! Antal eller pris er lig med eller mindre end nul. OK Udskrift Varenavn : Bananer Antal...: 10 Pris...: 2.50 Total...: 25.00 70
Forløb 1 Opret en ny kørsel. Indsæt og tilret startkommentarer 2 Opret variabler til Varenavn, Antal, Pris og Total 3 Indsæt en infoboks som vist herover 4 Opret en promptboks til indtastning af Varenavn, Antal og Pris som vist herover 5 Tildel udregning af Antal * Pris til Total variablen 6 Undersøg i en IF struktur om total blev nul eller mindre 7 Hvis totalen er nul eller mindre, skal der udskrives en advarselsboks som vist herover 8 Hvis totalen er større end nul, udskrives Varenavn, Antal, Pris og Total på skærmen, som vist i udskriften herover 9 Godkend og afprøv kørslen 71
9. Kartoteksgennemløb, grundlæggende Mål med lektionen Formålet med denne lektion er at give deltagerne grundlæggende viden om kartoteksgennemløb til fremfinding af poster i givne kartoteker. Efter lektionen skal kursisterne kunne: Udføre kartoteksgennemløb med SEARCH på ét kartotek ad gangen Udskrive oplysninger på skærmen fra det valgte kartotek Sortere kartoteksposter med USING og ORDER Afgrænse kartoteksposter med WHERE. Generelt om kartoteker Et kartotek er opbygget af en række poster, hvor hver post indeholder en række felter med informationer. Et lagerkartotek kan f.eks. indeholde felter som varenummer, varenavn, kostpris osv. Eksemplet herunder viser et antal tænkte poster i et lagerkartotek. Eksempel på et lagerkartotek Post nr. Varenummer Varenavn Kostpris Andre felter 1 18000 Kabinet 1.250,20-2 8000 Harddisk type 1 2.520,75-3 16000 Ram 520,40-4 12000 Harddisk type 2 1.230,75-5 14000 CD romdrev 50,10-6 20000 Skærm 1.000,10 - osv. osv. osv. osv. - Når der oprettes nye varer i lagerkartoteket, svarer det til at oprette nye poster. Posterne i kartoteket ligger som standard sorteret i den rækkefølge, hvori de indtastes. For at danne et udtræk af poster i et kartotek er det nødvendigt at udføre et kartoteksgennemløb. Under gennemløbet stilles hver enkelt post til rådighed for XAL kørslen, og det kan f.eks. vælges om posten skal springes over, eller om den skal medtages og udskrives. Kartoteksgennemløb udføres med kommandoen SEARCH. 72
SEARCH Kommandoen SEARCH anvendes til gennemløb af poster i kartoteker efter følgende syntaks. Syntaks for SEARCH SEARCH <kartoteksnavn> <kommandoer> END Kartoteksgennemløb startes altid med kommandoen SEARCH og sluttes altid med END. SEARCH efterfølges desuden af navnet på det kartotek, der skal gennemløbes. Når kommandoen bruges isoleret, løbes samtlige poster i kartoteket igennem, uden at der sker andet. Gennemløbet foregår i indtastningsrækkefølgen. C5 version 4.1 -> Eksempel på isoleret kartoteksgennemløb af lagerkartoteket {Forfatter...: Jens Olsen} {Dato...: 05.12.2011} {C5 Version...: 2012} SEARCH InvenTable END C5 version -> 4.1 Eksempel på isoleret kartoteksgennemløb af lagerkartoteket {Forfatter...: Jens Olsen} {Dato...: 25.08.2007} {C5 Version...: 4.00} SEARCH LagKart END Hver gang en post findes frem i kartoteksgennemløbet, stilles samtlige feltværdier i posten til rådighed for XAL kørslen. Disse værdier kan anvendes på forskellig vis, f.eks. kan de udskrives på skærmen med PRINT. Det er dog vigtigt, at PRINT kommandoen placeres det rigtige sted i forhold til SEARCH og END. I forbindelse med PRINT angives navnene på de kartoteksfelter, hvis indhold skal udskrives. I en søgeløkke er felterne tilgængelige, så længe kartoteket er aktivt, og det er det inde i søgeløkken mellem SEARCH og END. XAL:Søgeløkke med udskrivning af feltværdier {Forfatter...: Jens Olsen} {Dato...: 25.08.1999} {XAL Version...: 3.50} SEARCH InvenTable PRINT ItemNumber,,ItemName,,CostPrice END PAUSE 73
Kartoteket, der gennemløbes i dette eksempel, er lagerkartoteket og felterne der udskrives, er ItemNumber, ItemName og CostPrice. Selve PRINT sætningen er sat op inde i SEARCH løkken. Ved en eksekvering af ovenstående vil skærmen f.eks. se ud som følger: C5: Søgeløkke med udskrivning af feltværdier {Forfatter...: Jens Olsen} {Dato...: 25.08.1999} {C5 Version...: 4.00} SEARCH LagKart PRINT VareNummer,,VareNavn1,,KostPris END PAUSE Kartoteket, der gennemløbes i dette eksempel, er lagerkartoteket og felterne der udskrives, er VareNummer, VareNavn1 og KostPris. Selve PRINT sætningen er sat op inde i SEARCH løkken. Ved en eksekvering af ovenstående vil skærmen f.eks. se ud som følger: 74
Resultat 18000 Kabinet 1.250,20 8000 Harddisk type 1 2.520,75 16000 Ram 520,40 12000 Harddisk type 2 1.230,75 14000 CD romdrev 50,10 20000 Skærm 1.000,10 Bemærk at kartoteksposterne, her i form af varer, ikke ser ud til at være udskrevet i en bestemt rækkefølge. Hvis der ikke angives andet, udskrives posterne i den rækkefølge, som de er indtastet i. Kommandoen PRINT AT kan evt. anvendes til udskrivning af felterne i kolonner. Sortering af poster i kartoteksgennemløb udføres med kommandoerne USING og ORDER, der behandles efterfølgende. Sortering med USING Alle kartoteker kan indeholde ét eller flere indexer, der anvendes til sortering af kartotekernes indhold af poster. Findes der ikke nogen indexer på et kartotek, kan dets poster kun gennemløbes og vises i den rækkefølge de er indtastet i. Hvert indeks repræsenterer en sorteringsrækkefølge for det pågældende kartotek. Lagerkartoteket kan f.eks. indeholde indekserne, som vist herunder. Index på InvenTable (Lagerkartotek) i C5 vers. 2012 -> Navn på index Sorteringsnøgler i for af felter ItemIdx GroupIdx NameIdx ItemTypeIdx TariffIdx AltItemIdx PayCTypeItemIdx CTypePayItemIdx ItemNumber Group, ItemNumber ItemName1 ItemType TariffNumber AltItemIdx PayCType, CostType, ItemNumber CostType, PayCType, ItemNumber 75
Index på LagKart (Lagerkartotek) i C5 vers. -> 4.1 Navn på index VareIdx GrpVarIdx NavnIdx VareTypeIdx ToldIdx AltVareIdx Sorteringsnøgler i for af felter VareNummer Gruppe, VareNummer VareNavn1 VareType ToldPosition AltVare Indexer anvendes således til at skabe hurtige gennemløb af kartoteker, og til at vise kartoteksposter i forskellige rækkefølger på skærmen. Indekser i søgeløkker I søgeløkker anvendes kommandoen USING til at angive, hvilket af disse faste indekser der skal sorteres efter, som vist i nedenstående eksempel på syntaks. Syntaks for SEARCH med USING SEARCH <kartoteksnavn> USING <indexnavn> <kommandoer> END Bemærk at kommandoen USING og indexnavn angives lige efter kartoteksnavnet. Et gennemløb af lagerkartoteket kan f.eks. udføres efter et af de indekser, der er oprettet og beskrevet i ovenstående skema. C5 vers. 2012 -> Eksempel på kartoteksgennemløb med sortering efter fast index {Forfatter...: Jens Olsen} {Dato...: 05.12.2011} {C5 Version...: 2012} SEARCH InvenTable USING ItemIdx PRINT ItemNumber,, ItemName1,, CostPrice END PAUSE I ovenstående eksempel anvendes indexet ItemIdx på kartoteket ItemTable til sortering af posterne i varenummerorden. 76
C5 vers. -> 4.1 Eksempel på kartoteksgennemløb med sortering efter fast index {Forfatter...: Jens Olsen} {Dato...: 25.08.2007} {C5 Version...: 4.00} SEARCH LagKart USING VareIdx PRINT VareNummer,, VareNavn1,, KostPris END PAUSE I ovenstående eksempel anvendes indexet VareIdx på kartoteket LagKart til sortering af posterne i varenummerorden. Resultatet af begge eksempler vises herunder. Resultat af sortering af varer i nummerorden efter indexene ItemIdx / VareIdx. 8000 Harddisk type 1 2.520,75 12000 Harddisk type 2 1.230,75 14000 CD romdrev 50,10 16000 Ram 520,40 18000 Kabinet 1.250,20 20000 Skærm 1.000,10 Gennemløb af kartoteker kan ikke alene udføres vha. af de faste indekser, men også direkte på kartoteksfelter med kommandoen ORDER, der behandles efterfølgende. Sortering med ORDER ORDER anvendes ligesom USING også til sortering af poster i kartoteksgennemløb. Hvor USING anvendes til faste indekser, anvendes ORDER, når der skal sorteres direkte efter enkelte kartoteksfelter. Ved anvendelse af ORDER dannes der først et midlertidigt index, inden gennemløbet startes. ORDER kan anvende et hvilket som helst felt i kartoteket. ORDER anvendes således, hvor der ikke findes et fast index. I nedenstående eksempel, skal posterne f.eks. sorteres i beløbsorden efter feltet KostPris, som der ikke findes et fast index på: C5 vers. 2012-> Eksempel på kartoteksgennemløb med sortering efter kartoteksfelt {Forfatter...: Jens Olsen} {Dato...: 05.12.2011} {C5 Version...: 2012} SEARCH InvenTable ORDER BY CostPrice PRINT ItemNumber,, ItemName1,, CostPrice END PAUSE C5 vers. -> 4.1 Eksempel på kartoteksgennemløb med sortering efter kartoteksfelt 77
{Forfatter...: Jens Olsen} {Dato...: 25.08.2007} {C5 Version...: 4.00} SEARCH LagKart ORDER BY KostPris PRINT VareNummer,, VareNavn1,, KostPris END PAUSE Resultat af kartoteksgennemløb med sortering efter kartoteksfelt 14000 CD romdrev 50,10 16000 Ram 520,40 20000 Skærm 1.000,10 12000 Harddisk type 2 1.230,75 18000 Kabinet 1.250,20 8000 Harddisk type 1 2.520,75 Kommandoerne USING og ORDER anvendes således til sortering af poster i kartoteksgennemløb. Skal der derimod afgrænses i posterne, udføres dette med kommandoen WHERE, der behandles efterfølgende. Afgrænsning med WHERE Med kommandoen WHERE kan der afgrænses på de poster, der skal udsøges i en søgeløkke. Der kan således udvælges et antal poster til behandling i gennemløbet. Syntaksen for anvendelse af WHERE er som følger: Syntaks for SEARCH med WHERE SEARCH <kartoteksnavn> WHERE <betingelse> <kommandoer> END Kommandoen WHERE efterfølges af en betingelse, der skal opfyldes for, at de enkelte poster skal medtages i gennemløbet eller ej. Betingelsen kan f.eks. bestå af navnet på et kartoteksfelt og en værdi, der kan sammenlignes med indholdet i det angivne felt. De to værdier kan sammenlignes med hinanden med tegnene i nedenstående skema. 78
Relationelle operatorer i betingelser Operator Betydning >= Større end eller lig med <= Mindre end eller lig med < Mindre end > Større end == Lig med <> Forskellig fra I nedenstående eksempel anvendes den relationelle operator >=. I eksemplet udvælges således kun poster, der er større end eller lig med 10000. C5 vers. 2012 -> Eksempel på afgrænsning af poster >= 10000 {Forfatter...: Jens Olsen} {Dato...: 05.12.2011} {C5 Version...: 2012} SEARCH InvenTable WHERE ItemNumber >= 10000 PRINT ItemNumber,, ItemName1,, CostPrice END C5 vers. -> 4.1: Eksempel på afgrænsning af poster >= 10000 {Forfatter...: Jens Olsen} {Dato...: 25.08.2007} {C5 Version...: 4.00} SEARCH LagKart WHERE VareNummer >= 10000 PRINT VareNummer,, VareNavn1,, KostPris END I dette eksempel gennemløbes lagerkartoteket med SEARCH, og WHERE anvendes til at udvælge de poster ud, hvis varenummer er større end eller lig med 10000. Varenummeret står i citationstegn fordi varenumre i C5 er alfanumeriske, hvilket betyder, at de er tekster. 79
C5 vers. 2012 -> Eksempel på afgrænsning af poster >= 10000 og sortering med USING {Forfatter...: Jens Olsen} {Dato...: 05.12.2011} {C5 Version...: 2012} SEARCH InvenTable USING ItemIdx WHERE ItemNumber >= 10000 PRINT ItemNumber,, ItemName1,, CostPrice END C5 vers. -> 4.1 Eksempel på afgrænsning af poster >= 10000 og sortering med USING {Forfatter...: Jens Olsen} {Dato...: 25.08.2007} {C5 Version...: 4.00} SEARCH LagKart USING VareIdx WHERE VareNummer >= 10000 PRINT VareNummer,, VareNavn1,, KostPris END Når der afgrænses med WHERE, og der samtidig sorteres med USING eller ORDER, er det vigtigt at disse kommandoer placeres rigtigt i forhold til hinanden. Som det fremgår af ovenstående eksempel, skal sorteringskommandoerne således altid stå efter kartoteksnavnet, men før WHERE kommandoen. 80
Opgaver: Kartoteksgennemløb, grundlæggende Opgave 1: Søgeløkke med sortering / afgrænsning Formål med opgaven Der skal udarbejdes et kartoteksgennemløb, der afprøves med sortering på både index og felt. Huskelister SEARCH-END SEARCH-END med USING INDEX SEARCH-END med ORDRE Beskrivelse Der skal opbygges en kørsel, der gennemløber kartoteket CustTable og på skærmen udskriver værdier fra felterne Account, Name og BalanceMST. Gennemløbet skal sorteres ud fra et index og derefter ud fra et felt. Desuden skal der indsættes en afgrænsning, så der kun medtages poster fra og med et bestemt kontonummer. Eksempel på udskrift 10 Dan Rasmussen 38.855,00 20000 Central Kopiering 142.412,50 33344 Computer Hjemme Service A/S 5.311.501,50 100000 Autotester A/S 6.229,00 230896 DebTest Gruppen 38.346,00 42983214 Superfos Korn A/S 1.984.821,20 45934545 IBM Danmark A/S 734.640,00 45999300 Microsoft Data A/S 7.000,00 228729910 Foto og Computer A/S 0,00 Forløb I C5 1 Opret en ny kørsel. Indsæt og tilret startkommentarer 2 Opret med SEARCH en søgeløkke, der kan gennemløbe kartoteket CustTable (debitor) og udskriv felterne Account, Name og BalanceMST. Afprøv XAL kørslen 3 Anvend USING til at sortere efter indexet AccountIdx, der sorterer i kontonummerorden. NB: Prøv F8 tasten for at hente et fast index fra kartoteket Afprøv XAL kørslen 4 Fjern USING og anvend ORDER til at sortere efter feltet BalanceMST, så debitorerne vises i beløbsorden. Afprøv kørslen 5 Tilføj en afgrænsning ved hjælp af WHERE, så der kun medtages poster med Konto større end eller lig med 36-12, og sortér efter indexet AccountIdx Afprøv kørslen 81
10. Brugerdialog med kartoteksopslag Mål med lektionen Formålet med denne lektion er at give deltagerne en yderligere forståelse for anvendelsen af brugerdialoger med PROMPT, idet deltagerne lærer at foretage hjælpeopslag i indtastningsfelter. Efter lektionen skal kursisterne kunne: Opbygge promptbokse med hjælpeopslag således, at der i indtastningsfelter ved hjælp af ALT+H, kan overføres værdier fra felter i kartoteker til variabler i promptbokse Opbygge promptbokse med hjælpeopslag og anvende de overførte feltværdier til afgrænsning af poster i søgeløkker. PROMPT grundlæggende repetition I den grundlæggende anvendelse af PROMPT kommandoen, opbygges der en dialogboks, dvs. en promptboks med overskrift, ledetekster og et eller flere indtastningsfelter. Promptboks med ét indtastningsfelt Udsøgning af lagervarer Varenummer...: En promptboks skal altid bestå af mindst ét indtastningsfelt. For hvert indtastningsfelt skal der desuden altid erklæres en variabel. Når der indsættes værdier i indtastningsfelterne, opfanges disse værdier i de bagvedliggende variabler med GET kommandoen, som vist i eksemplet nedenfor. C5 vers. 2012 -> Eksempel på XAL kørsel med promptboks {Forfatter...: Jens Olsen} {Dato...: 05.12.2011} {C5 Version...: 2012} {Erklæring af variabel} Str 10 &VareNr {Brugerdialog} PROMPT Udsøgning af lagervarer,,, Fra varenummer: GET(&VareNr) INPUT AT 15,5 PRINT Varenummer:, &VareNr PAUSE I ovenstående eksempel er det tekstvariablen &VareNr, der med GET modtager input fra indtastningsfeltet i promptboksen og den indtastede værdi udskrives på skærmen. 82
Resultat af indtastning i promptboks. Varenummer: 10000 I dette eksempel forudsættes det, at der indtastes værdien 10000 i indtastningsfeltet i promptboksen, hvorefter værdien udskrives på skærmen. Som vist i ovenstående eksempel kan de værdier, der indtastes i promptbokse udskrives på skærmen med PRINT kommandoen. Promptboksen kan imidlertid også anvendes i forbindelse med afgrænsning af poster i søgeløkker. PROMPT til afgrænsning i SEARCH Kartoteksgennemløb med fast afgrænsning I kartoteksgennemløb er det ofte kun udvalgte poster, der skal behandles. Ved et gennemløb af lagerkartoteket skal der f.eks., kun behandles poster med varenummer større end 10000. I XAL kørsler udføres gennemløbet med kommandoen SEARCH, og der kan udføres faste afgrænsninger med WHERE. C5 vers. 2012 -> Eksempel på kartoteksgennemløb med fast afgrænsning {Forfatter...: Jens Olsen} {Dato...: 05.12.2011} {C5 Version...: 2012} SEARCH InvenTable WHERE ItemNumber > 10000 PRINT ItemNumber,, ItemName1 END I dette eksempel afgrænses posterne med WHERE, idet den opstillede betingelse medfører, at kun poster med ItemNumber > 10000 medtages og udskrives. C5 vers. -> 4.1 Eksempel på kartoteksgennemløb med fast afgrænsning {Forfatter...: Jens Olsen} {Dato...: 25.08.2007} {C5 Version...: 4.00} SEARCH LagKart WHERE VareNummer > 10000 PRINT VareNummer,, VareNavn1 END I dette eksempel afgrænses posterne med WHERE, idet den opstillede betingelse medfører, at kun poster med VareNummer > 10000 medtages og udskrives. Problem for brugere 83
I dagligdagen kan XAL kørslen, i ovenstående eksempel, være tung at håndtere for brugerne, idet der altid kun medtages varer, hvor varenummeret er større end 10000. Hvis der skal foretages andre afgrænsninger, og brugerne ikke selv kan eller må rette i XAL kørslen, skal der først tages fat i supervisoren eller en programmør, der kan udføre de nødvendige ændringer. Løsning Problemet kan løses ved at udvide XAL kørslen med en brugerstyret afgrænsning i form af en promptboks med et indtastningsfelt, hvori der kan indtastes et nyt varenummer, hver gang kørslen afvikles. Kartoteksgennemløb med brugerstyret afgrænsning Kartoteksgennemløb med brugerstyret afgrænsning udføres ved at indsætte en promptboks i XAL kørslen lige før kartoteksgennemløbet. I promptboksen kan brugeren så indtaste og styre de værdier, der skal afgrænse kartoteksgennemløbet. Promptboks til indtastning af værdier for kartoteksgennemløb Udsøgning af lagervarer Fra varenummer: I denne promptboks har brugeren mulighed for at indtaste et varenummer. Den værdi, der indtastes i feltet, modtages af den bagved liggende variabel. Ved at indsætte variablen i WHERE sætningen i stedet for det faste varenummer, er det brugerens varenummer, der anvendes til afgrænsningen i stedet for den faste værdi. C5 vers. 2012 ->Eksempel på kartoteksgennemløb med brugerstyret afgrænsning {Forfatter...: Jens Olsen} {Dato...: 05.12.2011} {C5 Version...:. 2012} {Erklæring af variable} Str 10 &Fravarenr PROMPT Udsøgning af lagervarer,,, Fra varenummer: GET(&Fravarenr) INPUT AT 15,5 SEARCH InvenTable WHERE ItemNumber > &Fravarenr PRINT ItemNumber,, ItemName1 END Her anvendes variabelen i promptboksen til at modtage værdier med GET og i SEARCH anvendes variablen i WHERE i afgrænsningsbetingelsen. XAL kørslen medtager således kun poster, hvor varenummeret er større end, den værdi der indtastes i promptboksen. C5 vers. -> 4.1 Eksempel på kartoteksgennemløb med brugerstyret afgrænsning 84
{Forfatter...: Jens Olsen} {Dato...: 25.08.2007} {C5 Version...: 4.00} {Erklæring af variable} Str 10 &Fravarenr PROMPT Udsøgning af lagervarer,,, Fra varenummer: GET(&Fravarenr) INPUT AT 15,5 SEARCH LagKart WHERE VareNummer > &Fravarenr PRINT VareNummer,, VareNavn1 END Her anvendes variabelen i promptboksen til at modtage værdier med GET og i SEARCH anvendes variablen i WHERE i afgrænsningsbetingelsen. XAL kørslen medtager således kun poster, hvor varenummeret er større end, den værdi der indtastes i promptboksen. PROMPT med REF Anvendelse af ALT+H i indtastningsfelter Indtastningsfelter i promptbokse kan udstyres med en hjælpefunktion i form af tastekombinationen ALT+H. Tastes der ALT+H i et indtastningsfelt, er det i visse tilfælde muligt at hente en liste over poster i et kartotek. I listen over kartoteksposter kan der udvælges én post, der så overføres til selve indtastningsfeltet. Anvendelse af <Alt H> i indtastningsfelt i promptboks Udsøgning af lagervarer Liste over varer i lagerkartoteket. Fra varenummer ALT+H Valgt vare overføres til indtastningsfeltet i promptboksen Ved at taste ALT+H, i indtastningsfeltet i promptboxen, kan brugeren få en liste over varenumre i kartoteket og vælge et derfra. Denne funktionalitet opnås ved anvendelsen af PROMPT med REF Opsætning af PROMPT med REF 85
REF skal altid efterfølges af to parametre i form navnet på det kartotek, der skal refereres til (foretages opslag i), og navnet på et felt i det pågældende kartotek. De to parametre skal altid adskilles af et punktum, men uden mellemrum. C5 vers. 2012 -> Eksempel på PROMPT med indbygget REF {Forfatter...: Jens Olsen} {Dato...: 05.12.2011} {C5 Version...: 2012} {Erklæring af variable} Str 10 &Fravarenr PROMPT Udsøgning af lagervarer,,, Fra varenummer: GET(&Fravarenr REF InvenTable.ItemNumber), INPUT AT 15,5 SEARCH InvenTable WHERE ItemNumber >= &Fravarenr PRINT ItemNumber END Det er stadig GET kommandoen, der sørger for, at variablen kan modtage den værdi, der indtastes i promtpboksen. REF kommandoen anvendes kun for at give brugeren hjælp, idet den gør det muligt for brugeren i indtastningsfeltet at taste ALT+H, og få en liste over værdier i det kartotek der angives efter kommandoen. Når brugeren ser listen, kan der peges på en værdi, der herefter overføres til indtastningsfeltet. I eksemplet refereres der til lagerkartoteket (InvenTable)med feltet ItemNumber. Det betyder, at det er den værdi, der indtastes i promptboxen, der herefter anvendes i søgeløkken i forbindelse med WHERE, idet WHERE forbindes med variabelnavnet i den opsatte betingelse. 86
C5 vers. -> 4.1 Eksempel på PROMPT med indbygget REF {Forfatter...: Jens Olsen} {Dato...: 25.08.2007} {C5 Version...: 4.00} {Erklæring af variable} Str 10 &Fravarenr PROMPT Udsøgning af lagervarer,,, Fra varenummer: GET(&Fravarenr REF Lagkart.VareNummer), INPUT AT 15,5 SEARCH LagKart WHERE VareNummer >= &Fravarenr PRINT VareNummer END Det er stadig GET kommandoen, der sørger for, at variablen kan modtage den værdi, der indtastes i promtpboksen. REF kommandoen anvendes kun for at give brugeren hjælp, idet den gør det muligt for brugeren i indtastningsfeltet at taste ALT+H, og få en liste over værdier i det kartotek der angives efter kommandoen. Når brugeren ser listen, kan der peges på en værdi, der herefter overføres til indtastningsfeltet. I eksemplet refereres der til lagerkartoteket med feltet VareNummer. Det betyder, at det er den værdi, der indtastes i promptboxen, der herefter anvendes i søgeløkken i forbindelse med WHERE, idet WHERE forbindes med variabelnavnet i den opsatte betingelse. 87
Opgaver: Brugerdialog med kartoteksopslag Opgave 1: PROMPT med REF til afgrænsning Formål med opgaven At udarbejde et kartoteksgennemløb med SEARCH og WHERE, hvor afgrænsningerne til WHERE betingelserne anvender variabler, der tildeles værdier gennem en prompt-box. I promptboksen skal det være muligt at foretage hjælpeopslag med ALT+H. Huskelister Variabler PROMPT med REF SEARCH-END Beskrivelse Der skal oprettes en XAL kørsel hvor brugeren indtaster en værdi i en promptboks, der er positioneret på skærmen. Denne værdi skal fungere som afgrænsning på et efterfølgende gennemløb af debitorkartoteket. De fundne poster udskrives til skærmen. Promptboks Valg af debitorer Fra konto...: Til konto...: Eksempel på resultat udskrevet i vindue 100000 Autotester A/S 6.229,00 230896 DebTest Gruppen 38.346,00 42983214 Superfos Korn A/S 1.984.821,20 45934545 IBM Danmark A/S 734.640,00 45999300 Microsoft Data A/S 7.000,00 228729910 Foto og Computer A/S 0,00 88
Forløb i C5 1 Opret en ny XAL kørsel. Kopiér alle linjer fra den foregående opgave ind i denne. Foretag nødvendige ændringer i standard kommentarerne. 2 Der skal nu være to variabler, der kan anvendes til indtastning af Fra kontonummer og Til kontonummer. 3 Promptboksen skal ændres så den indeholder begge variabler med ledetekster. Se eksemplet herover. 4 Kartoteksgennemløbet skal afgrænses ved hjælp af en WHERE. Begge variablerne skal anvendes i WHERE sætningen, idet kun kontonumre der er større end eller lig med FraKonto og mindre end eller lig med TilKonto medtages. 5 Afprøv kørslen. 6 Foretag nødvendige ændringer i promptboksen, så brugeren får mulighed for at anvende ALT+H i felterne. Der skal refereres til kartoteket CustTable og feltet Account. 7 Afprøv din XAL kørsel til du er tilfreds. 89
11. Kartoteksgennemløb, flere kartoteker Mål med lektionen Formålet med denne lektion er, at give deltagerne viden om hvordan der kan udføres kartoteksgennemløb, der synkroniseres med hinanden. Desuden vises det hvordan, der kan foretages sammentælling af poster under kartoteksgennemløb. Efter lektionen skal kursisterne kunne: Udføre kartoteksgennemløb på flere kartoteker Synkronisere kartoteksgennemløb Danne totaler på kartoteksgennemløb. Flere kartoteker uden synkronisering I XAL kørsler kan der udmærket være flere søgeløkker efter hinanden, uden at disse behøver at være synkroniseret. I det følgende eksempel gennemløbes først kartoteket med kreditor grupper. Derefter gennemløbes selve kreditor kartoteket.: C5 vers. 2012 -> Eksempel på to kartoteksgennemløb uden synkronisering {Forfatter...: Jens Olsen} {Dato...: 05.12.2011} {C5 Version...: 2012} SEARCH VendGroup PRINT VendGroup AT 1,22 PRINT GroupName AT 12,22 PRINT END PRINT SEARCH VendTable PRINT Account AT 1,22 PRINT Name AT 12,22 PRINT Phone AT 42,22 PRINT END PAUSE 90
C5 vers. -> 4.1 Eksempel på to kartoteksgennemløb uden synkronisering {Forfatter...: Jens Olsen} {Dato...: 25.08.2007} {C5 Version...: 4.00} SEARCH KreGruppe PRINT Gruppe AT 1,22 PRINT GruppeNavn AT 12,22 PRINT END PRINT SEARCH KreKart PRINT Konto AT 1,22 PRINT Navn AT 12,22 PRINT Telefon AT 42,22 PRINT END PAUSE Resultat DK UDL Danmark Udland 12000 Kontorforsyningen 45 52 46 11 14000 Emballagefabrikken A/S 77 33 33 12 16000 Smith og Co. 55 81 86 87 18000 Herman Hasse Gmbh 22 35 36 44 20000 Fa. Jensen & Hansen 33 31 32 66 Som det fremgår vises først kreditor grupperne og derefter selve kreditorerne. Kreditorerne, i den nederste del af eksemplet, har således ingen umiddelbar samhørighed med kreditorgrupperne i den øverste del. Flere kartoteker med synkronisering Ofte er der behov for at koble flere kartoteker sammen, således at poster i et kartotek er afhængige af poster i et andet kartotek. I stedet for at udskrive kreditorgrupper og kreditorer hver for sig, som i foregående eksempel, kunne disse synkroniseres således, at hver kreditorgruppe efterfølges af de tilhørende kreditorer, som vist herunder. 91
Kreditorgrupper med tilhørende kreditorer DK 12000 Danmark Kontorforsyningen 45 52 46 11 14000 Emballagefabrikken A/S 77 33 33 12 20000 Fa. Jensen & Hansen 33 31 32 66 UDL Udland 16000 18000 Smith og Co. Herman Hasse Gmbh 55 81 86 87 22 35 36 44 I ovenstående eksempel med kreditorgrupper og tilhørende kreditorer er det den enkelte kreditorgruppe, der afgrænser hvilke kreditorer, der skal udskrives. Eksemplet opbygges ved at oprette den ene søgeløkke inde i den anden, og ved at synkronisere de to søgeløkker. Synkronisering Synkroniseringen udføres ved, på kartoteket i den yderste søgeløkke, at finde et felt der kan identificere posterne i den inderste søgeløkke, idet der i den inderste søgeløkke skal findes et felt med en tilsvarende værdi. Hvis der fortsættes med eksemplet, der omhandler kreditorgruppe og kreditorer, vil det være kreditorgruppefeltet, der kan anvendes til at synkronisere de to søgeløkker. Kreditorgruppefeltet på kreditor kartoteket indeholder den samme værdi som kreditorgruppefeltet på kreditorgruppe kartoteket. Hvilket betyder, at dette felt kan anvendes til at udlede de poster, der hører til den enkelte kreditorgruppe. WHERE Selve synkroniseringen udføres i gennemløbet med underkartoteket, dvs. i den inderste søgeløkke. Synkroniseringen opbygges med kommandoen WHERE. Kommandoen efterfølges af en betingelse, som sammenligner felterne i de to kartoteker som vist i syntaksen herunder. Syntaks for WHERE WHERE <underkartotek.felt> == <hovedkartotek.felt> WHERE kommandoen medfører, at kun poster der opfylder udtrykket medtages i kartoteksgennemløbet. Således vil det kun være poster i underkartoteket, der har felter af samme værdi som felter i hovedkartoteket, der medtages. Efterfølgende er et eksempel på kodning af to søgeløkker, hvor den ene søgeløkke afgrænser den anden. Eksemplet anvender samme kartoteker som i de tidligere anvendte eksempler. Søgeløkkerne er synkroniseret med WHERE. C5 vers. 2012 -> Eksempel på kartoteksgennemløb synkroniseret med WHERE 92
{Forfatter...: Jens Olsen} {Dato...: 05.12.2011} {C5 Version...: 2012} SEARCH VendGroup PRINT VendGroup,,GroupName AT 1,22 PRINT SEARCH VendTable WHERE VendTable.Group == VendGroup.Group PRINT Account AT 1,22 PRINT Name AT 12,22 PRINT Phone AT 42,22 PRINT END PRINT END PAUSE I ovenstående eksempel startes først en søgeløkke på kartoteket VendGroup. Alt, hvad der står mellem SEARCH VendGroup og den tilhørende END, udføres ved hvert gennemløb. En af de ting, der udføres i den yderste søgeløkke med VendGroup, er netop at starte en ny søgeløkke, nemlig den søgeløkke der gennemsøger VendTable. Ved i kreditorkartoteket at afgrænse posterne med WHERE, udvælges kun de kreditorer, der har samme kreditorgruppe, som den gruppe der bearbejdes. Der kan således i den inderste søgeløkke foretages udvælgelse af kreditorer til den aktuelle gruppe. C5 vers. -> 4.1 Eksempel på kartoteksgennemløb synkroniseret med WHERE {Forfatter...: Jens Olsen} {Dato...: 25.08.2007} {C5 Version...: 4.00} SEARCH KreGruppe PRINT Gruppe,,GruppeNavn AT 1,22 PRINT SEARCH KreKart WHERE KreKart.Gruppe == KreGruppe.Gruppe PRINT Konto AT 1,22 PRINT Navn AT 12,22 PRINT Telefon AT 42,22 PRINT END PRINT END PAUSE I ovenstående eksempel startes først en søgeløkke på kartoteket KreGruppe. Alt, hvad der står mellem SEARCH KreGruppe og den tilhørende END, udføres ved hvert gennemløb. En af de ting, der udføres i den yderste søgeløkke med KreGruppe, er netop at starte en ny søgeløkke, nemlig den søgeløkke der gennemsøger KreKart. Ved i kreditorkartoteket at afgrænse posterne med WHERE, udvælges kun de kreditorer, der har samme kreditorgruppe, som den gruppe der bearbejdes. Der kan således i den inderste søgeløkken foretages udvælgelse af kreditorer til den aktuelle gruppe. 93
Resultat DK Danmark 12000 Kontorforsyningen 45 52 46 11 14000 20000 Emballagefabrikken A/S Fa. Jensen & Hansen 77 33 33 12 33 31 32 66 UDL 16000 Udland Smith og Co. 55 81 86 87 18000 Herman Hasse Gmbh 22 35 36 44 Udarbejdelse af total Totaler er resultater af beregninger. De består f.eks. af de summerede værdier af poster fra et kartoteksgennemløb. Totaler skal gemmes i variabler af samme type som feltet, der summeres på. Sammentælling udføres ved, at tildele variabler deres egen værdi plus værdien af de felter der sammentælles. Syntaks for summering i variabel SET &<variabelnavn1> = &<variabelnavn1> + kartoteksfelt &variabelnavn1 er navnet på den variabel, der skal indeholde summeringen og kartoteksfelt er navnet på det felt, der skal summeres. Tildelingen af værdi til variablen skal udføres på et sted i XAL kørslen, hvor feltværdierne er tilgængelige, dvs. inde i søgeløkken. C5 vers. 2012 -> Eksempel på kartoteksgennemløb med summering i variabel Real &Sum SEARCH VendTable SET &Sum = &Sum + BalanceMST END PRINT Kreditorer i alt:, &Sum PAUSE 94
C5 vers. -> 4.1 Eksempel på kartoteksgennemløb med summering i variabel Real &Sum SEARCH KreKart SET &Sum = &Sum + SaldoDkk END PRINT Kreditorer i alt:, &Sum PAUSE Resultat Kreditorer i alt: -523.548,88 95
Opgaver: Kartoteksgennemløb, flere kartoteker Opgave 1: Kartoteker uden synkronisering Formål med opgaven At opbygge en XAL kørsel med to kartoteksgennemløb, der ikke er synkroniseret. Huskelister Programmering - Opret Variabler SEARCH-END PRINT AT PAUSE Beskrivelse Der skal oprettes en XAL kørsel, der udskriver resultaterne af uafhængige gennemløb på kartotekerne CustGroup og CustTable. Der skal ikke sættes afgrænsninger på kartoteksgennemløbene. Eksempel på udskrift på skærm DK Danske debitorer UDL Export debitorer ------------------------------------------------ DK 10 Dan Rasmussen 38.855,00 UDL 20000 Central Kopiering 142.412,50 DK 33344 Computer Hjemme Service A/S 5.311.501,50 UDL 100000 Autotester A/S 6.229,00 DK 230896 DebTest Gruppen 38.346,00 DK 42983214 Superfos Korn A/S 1.984.821,20 DK 45934545 IBM Danmark A/S 734.640,00 DK 45999300 Microsoft Data A/S 7.000,00 UDL 228729910 Foto og Computer A/S 0,00 Forløb I C5 1 Opret en ny XAL kørsel. Indsæt og tilret startkommentarer 2 Opret en søgeløkke til kartoteket CustGroup og udskriv felterne Group og GroupName 3 Opret derefter en søgeløkke til kartoteket CustTable og udskriv felterne Group, Account, Name og BalanceMST. 4 Afprøv kørslen 96
Opgave 2: Kartoteker med synkronisering Formål med opgaven At opbygge en XAL kørsel med to kartoteksgennemløb der er synkroniseret. Huskelister Programmering - Opret Variabler SEARCH-END PRINT AT PAUSE Beskrivelse Der skal oprettes en XAL kørsel, der udskriver resultaterne af et gennemløb af CustGroup og CustTable, hvor CustTable er indbygget i CustGroup. Eksempel på udskrift på skærm DK Danske debitorer ------------------------------------------------ DK 10 Dan Rasmussen 38.855,00 DK 33344 Computer Hjemme Service A/S 5.311.501,50 DK 230896 DebTest Gruppen 38.346,00 DK 42983214 Superfos Korn A/S 1.984.821,20 DK 45934545 IBM Danmark A/S 734.640,00 DK 45999300 Microsoft Data A/S 7.000,00 UDL Export debitorer ------------------------------------------------- UDL 20000 Central Kopiering 142.412,50 UDL 100000 Autotester A/S 6.229,00 UDL 228729910 Foto og Computer A/S 0,00 Forløb I C5 1 Opret en ny XAL kørsel. Kopiér alle linjerne fra den forrige opgave ind i denne XAL kørsel. Foretag nødvendige ændringer i standard kommentarerne 2 Flyt søgeløkken på CustTable (med print linjer) ind i søgeløkken på CustGroup 3 Synkronisér CustTable med CustGroup ved hjælp af WHERE 4 Afprøv kørslen 97
Opgave 3: Kartoteker med synkronisering og sammentælling. Formål med opgaven At bygge videre på den foregående opgave, idet der skal udføres en manuel sammentælling, i en variabel, i den ene af søgeløkkerne. Huskelister Programmering - Opret Variabler SEARCH-END Beskrivelse Der skal bygges videre på den foregående opgave. Der skal foretages en sammentælling af feltet BalanceMST i CustTable således, at der dannes en total for hver debitorgruppe. Denne total skal udskrives til skærmen efter gennemløbet af CustTable. DK Danske debitorer ----------------------------------------------- DK 10 Dan Rasmussen 38.855,00 DK 33344 Computer Hjemme Service A/S 5.311.501,50 DK 230896 DebTest Gruppen 38.346,00 DK 42983214 Superfos Korn A/S 1.984.821,20 DK 45934545 IBM Danmark A/S 734.640,00 DK 45999300 Microsoft Data A/S 7.000,00 Total 8.115.163,70 UDL Export debitorer ----------------------------------------------- UDL 20000 Central Kopiering 142.412,50 UDL 100000 Autotester A/S 6.229,00 UDL 228729910 Foto og Computer A/S 0,00 Total 148.641,50 Forløb i C5 1 Opret en ny XAL kørsel. Kopiér alle linjerne fra den forrige opgave ind i denne XAL kørsel. Foretag nødvendige ændringer i standard kommentarerne. 2 Opret en variabel der kan bruges til summering af feltet BalanceMST. 3 Indsæt kode til summering af feltet BalanceMST i den oprettede variabel. Udskriv værdien i variablen med ledeteksten Total foran. Værdien udskrives hver gang en debitorgruppe er færdig. (Husk at nulstille) 4 Afprøv kørslen. 98
12. Huskelister Kommandoer og funktioner Box Syntaks Beskrivelse Box(type, tekst,0) Funktionen Box danner en kasse med en tekst. Der kan dannes forskellige former for bokse afhængigt af indholdet i parameteren type. På dette kursus benyttes flg. bokstyper: Type 1: Infoboksen (tekstboks med grå baggrund). Type 2: Advarselsboksen (tekstboks med rød baggrund). I parameteren tekst skrives boksens tekst i citationstegn. Der kan indsættes linjeskift med \n, der skal være indenfor citationstegnene. Sidste parameter skal for bokstype 1 og 2 være 0. Eksempel Infoboks Eksempel Advarselsboks med linjeskift SET Box(1, Kørslen er slut,0) SET Box(2, ADVARSEL\nKørslen blev afbrudt,0) 99
Dokumentation af XAL-kørsler Udskriv dokumentation Generelt/Tilpasning/Udviklingsmenu/XAL/ Udskriv Du ser en menuen Vælg kørsel, der er en liste over alle XAL-kørsler. Vælg den kørsel der skal udskrives, ved at skrive de første tegn i kørslens navn. ENTER Billedet Udskriftsmuligheder er blevet åbnet. Skriv til-feltet udfyldes med PRINTER Printer-feltet udfyldes med navnet på den printer, der skal skrives til (Spørg evt. instruktøren) Formattering-feltet skal åbnes med ALT+H ALT+H ENTER Du ser billedet Formattering Tvungen venstre margen-feltet sættes til 2 for, at undgå at skrive i hullerne på papiret. De øvrige felter kan forblive som de er eller ændres efter ønske. Godkend vinduet med F3 Du er tilbage i billedet Udskriftsmuligheder Resten af felterne forbliver, som de er. Udfør udskriften ved at godkende med F3 Funktion CurUserID() Syntaks Returværdi Beskrivelse Eksempler CurUserID():INT INT Funktionen CurUserID() returnerer den nuværende brugers ID nummer som et heltal. ID nummeret er identisk med Bruger nummeret ved oprettelse af ny bruger i Generelt/Tilpasning/Adgangskontrol/Brugere og Grupper CurUserID()-> 1 (som er Supervisorens nummer) 100
Funktion UserID2Name() Syntaks Returværdi Beskrivelse UserID2Name(INT):STR STR Hver bruger er identificeret ved et unikt brugernavn og funktionen UserID2Name() returnerer det brugernavn som er tilknyttet heltalsparameteren, der er brugernummeret. Eksempler UserID2Name(1)-> Supervisor Funktion TimeNow() Syntaks Returværdi Beskrivelse TimeNow():INT INT Funktionen TimeNow() returnerer klokkeslettet, baseret på computer uret. Det returnerede heltal er defineret som antal sekunder siden midnat. Eksempler TimeNow()-> 18098 101
Funktion Time2Str() Syntaks Time2Str( Sekunder(INT), TMS(INT), Tid(INT) ):STR Sekunder TMS Antal af sekunder siden midnat Type af Time, minut og sekund adskiller = 0 (Ingen adskiller) = 1 ( : som adskiller) = 2 (. som adskiller) = 3 ( som adskiller) = 4 (, som adskiller) = 5 ( / som adskiller) Returværdi Beskrivelse Eksempler Tid STR Bestemmer hvordan tiden skal vises, enten i AM/PM format eller i 24-timers tid. = 1 (24-timers format benyttes) = 2 (AM/PM format benyttes) Funktionen Time2Str() konverterer en tid, defineret som et antal sekunder siden midnat, til en tekst, der samtidigt antager et valgfrit tidsformat, alt efter hvilke parametre der vælges. Time2Str(18098,1,1) -> 05:01:38 Time2Str(18099,0,0) -> 050139 Time2Str(50000,2,1) -> 13.53.20 Time2Str(50000,2,2) -> 01.53.20 PM Funktion ToDay() Syntaks Returværdi Beskrivelse Eksempler ToDay():DATE DATE Funktionen ToDay() returnerer dags dato. Der skal ikke tastes nogen parametre i parenteserne PRINT ToDay() { medfører dags dato } 102
IF-THEN-ELSE-ENDIF Syntaks Beskrivelse Eksempler IF <udtryk> THEN {Kommandoer der afvikles, hvis udtrykket er sandt} ELSE {Kommandoer der afvikles, hvis udtrykket er falsk} ENDIF Kommandoen IF-THEN-ELSE-ENDIF er en spørgestruktur, hvis resultat bliver SANDT eller FALSK. Strukturen har tre bestanddele: En betingelse, en SAND konsekvens og en FALSK konsekvens. I nogle tilfælde er det ikke nødvendigt at opstille en FALSK konsekvens. I så fald vil der ikke blive udført kommandoer, hvis betingelsen evaluerer til falsk. SEARCH CustTable IF BalanceMST > BalanceMax THEN PRINT Overskredet { betingelse er sand } ELSE PRINT OK { betingelse er falsk } ENDIF END PAUSE Index - se indhold af Se indhold af index Gentages for hvert kartotek, der skal ses index i Gentages for hvert index Ctrl F12/Kartoteker Du er i billedet Kartoteksopbygning Stå i kartotekskolonnen og åbn en liste over kartoteker Vælg kartotek fra listen ved at taste de første tegn i kartoteksnavnet Billedet består af tre blokke. Flyt til blokken Index Stil cursoren på det ønskede index På nederste linje ses teksten: Indexformel: efterfulgt af navnene på de felter indexet består af. Afslut når du er færdig eller flyt til kartotekskolonnen igen og vælg et nyt kartotek F4 ENTER SH+F8 PIL Op eller PIL NED ESC SH+F8 103
Kommentarer Syntaks Beskrivelse { kommentar } En kommentar er en fritekst, der indsættes et vilkårligt sted i programmet for at forklare programmets funktion. Kommentarer skal altid omgives med { }. Kommentarer har ingen indvirkning på selve programmet, men er blot en forklarende tekst, der overspringes på afviklingstidspunktet. Kommentarer anvendes typisk i flg. tilfælde: Som introduktion til selve programmet Som forklaring ved erklæring af variabler Ved forklaring af programmet Til at ignorere dele af programmet Eksempel 1 Eksempel 2 {Jens Olsen 15.01.2011 C5 version 2012 Udskrift af debitorer med saldo} { Forfatter...: Jens Olsen } { Dato...: 25.08.2007} { C5 version...: 4.0 } { Funktion...: Summering af saldi på debitorer } { Erklæring af variabler } PAUSE Syntaks Beskrivelse Eksempler PAUSE Kommandoen PAUSE anvendes til at stoppe en kørsel midlertidigt. Kommandoen giver brugeren mulighed for, at se udskriften inden kørslen fortsætter (og måske afsluttes), og vinduet lukkes. Hvis PAUSE ikke angives, når brugeren ikke at se udskriften. Kørslen genoptages efter en PAUSE, når brugeren taster ENTER PRINT Ole Olsen PRINT 25 PRINT Ole Olsen, 25, år PAUSE PRINT 104
PRINT Syntaks Beskrivelse Eksempler PRINT <udtryk> PRINT <udtryk>,<udtryk>,... Kommandoen PRINT benyttes til udskrivning i XAL-kørsler. Der kan bl.a. udskrives informationer fra poster i gennemløbne kartoteker og værdier på anvendte variabler, ligesom der kan skrives almindelig tekst. Der kan kun skrives på skærmen med PRINT kommandoen. Udskriften placeres på nederste linje i vinduet. Udskrifter bredere en vinduet afskæres og fortsætter ikke på næste linje. Der kan max udskrives 8 udtryk pr. linje. Er der behov for flere, skal der angives flere PRINT kommandoer. PRINT Ole Olsen PRINT 25 PRINT Ole Olsen, 25, år PRINT AT Syntaks PRINT <udtryk> AT <kolonne>,<linje> PRINT <udtryk>,<udtryk>... AT <kolonne>,<linje> Beskrivelse Eksempler Kommandoen PRINT AT benyttes til udskrivning i XAL-kørsler, idet programmøren selv bestemmer, hvor på vinduet printværdierne skal stå. Kommandoen AT skal anføres til sidst på printlinjen, og den skal efterfølges af kolonne- og linjenummer adskilt med et komma. Hvis der efter en sætning med PRINT AT kommer en eller flere andre PRINT sætninger uden AT, vil de værdier, der er placeret på vinduet på bestemte steder med PRINT AT, blive rykket en linje op for hver PRINT sætning uden AT. PRINT Ole Olsen AT 20,5 PRINT 25 AT 20,6 PRINT Ole Olsen, 25, år AT 20,5 105
Programmering opret Opret Generelt/Tilpasning/Udviklingsmenu/XAL/Opret Du ser en dialogbox med feltet Kørsel. Indtast navnet på din kørsel her. (Brug IKKE punktum i navnet, gerne understreg) Der åbnes nu en editorbox, der fylder den øverste halvdel af skærmen. Zoom editorboxen op i fuld skærmstørrelse. (Kan gøres mindre igen med samme funktionstast) ALT+Z Editoren er nu klar til indtastning af et program til en XALkørsel. Flg. huskelister omhandler arbejdet med editoren: XAL editoren - editeringsfunktioner XAL editoren nøgleord Efter endt indtastning godkendes kørslen F3 Programmering ret Ret Generelt/Tilpasning/Udviklingsmenu/XAL/Ret Vælg kørsel fra plukkelisten. Der åbnes nu en editorbox, der fylder den øverste halvdel af skærmen. Zoom editorboxen op i fuld skærmstørrelse. (Kan gøres mindre igen med samme funktionstast) ALT+Z Efter at XAL-kørslen er kommet frem i editoren, kan der foretages diverse ændringer og tilføjelser. Der henvises til huskelisterne: XAL editoren - editeringsfunktioner XAL editoren nøgleord Ændringerne afsluttes og godkendes med F3 Efter godkendelsen vises der en dialogboks med spørgsmålet: Ønskes kørslen igangsat? Sæt kørslen i gang Afslut Ja Nej 106
PROMPT Syntaks Beskrivelse Eksempel 1 Eksempel 2 PROMPT <overskrift>,,, <evt. tekst>, <ledetekst> GET (&Var) INPUT AT <kolonne>,<linje> Kommandoen PROMPT benyttes til at stoppe op i programmet og spørge brugeren om den værdi, der ønskes indsat i de variabler, der anføres i paranteserne efter GET. Overskrifter og ledetekster skal altid stå i citationstegn. Kommaerne efter linjerne bevirker linjeskift. Hvert komma giver ét linjeskift. AT er valgfrit. Hvis AT ikke angives, vises promptboxen i skærmens øverste venstre hjørne. PROMPT Vælg farve,, Farve...: GET (&Farve), (Rød eller blå) INPUT PROMPT Indtast værdier,, Antal...: GET (&Antal), Nummer..: GET (&Nummer), Pris...: GET (&Pris) INPUT AT 10,5 107
PROMPT med REF Syntaks Beskrivelse Eksempel PROMPT <overskrift>,,, <evt. tekst>, <ledetekst> GET (&Var REF kartotek.felt) INPUT AT <kolonne>,<linje> Kommandoen PROMPT benyttes til at stoppe op i programmet og spørge brugeren om den værdi, der ønskes indsat i de variabler, der anføres i paranteserne efter GET. Overskrifter og ledetekster skal altid stå i citationstegn. Kommaerne efter linjerne bevirker linjeskift. Hvert komma giver ét linjeskift. AT er valgfrit. Hvis AT ikke angives vises promptboxen i skærmens øverste venstre hjørne. Ved anvendelse af REF i en promptbox kan brugeren med ALT+H få en plukkeliste med værdier i det angivne kartotek. Ved valg af en værdi overføres denne til variablen. PROMPT Vælg debitor,, Konto..: GET (&Kto REF CustTable.Account) INPUT SEARCH-END Syntaks Beskrivelse Eksempel SEARCH <kartotek> [<kommandoer>] END Kommandoen SEARCH anvendes til at gennemløbe poster i et kartotek. Kartotek er navnet på det kartotek, der skal gennemløbes. De poster der udvælges kan f.eks. udskrives med PRINT kommandoen. SEARCH CustTable PRINT Account,,Name END PAUSE 108
SEARCH-END med USING INDEX Syntaks Beskrivelse Eksempel 1 Eksempel 2 SEARCH <kartotek> [USING [INDEX] Indexnavn] [<kommandoer>] END Kommandoen SEARCH anvendes til at gennemløbe poster i et kartotek. De poster der udvælges, kan f.eks. udskrives med PRINT kommandoen. Med USING kan det angives hvilket af de faste indexer, der skal sorteres efter. Ordet INDEX er et valgfrit nøgleord, der gør kørslen lettere at læse. SEARCH CustTable USING INDEX AccountIdx PRINT Account,,Name END PAUSE SEARCH CustTable USING AccountIdx PRINT Account,,Name END PAUSE SEARCH-END med ORDER Syntaks Beskrivelse Eksempel 1 Eksempel 2 SEARCH <kartotek> [ORDER <felt>] [<kommandoer>] END Kommandoen SEARCH anvendes til at gennemløbe poster i et kartotek. Med USING kan der angives sortering efter et af de faste indexer. Hvis der skal sorteres efter et kartoteksfelt, hvorpå der ikke er noget fast index, gøres dette med ORDER. Ordet felt er navnet på det kartoteksfelt, der skal sorteres efter. Der dannes et midlertidigt index på feltet. De poster der udvælges, kan f.eks. udskrives med PRINT kommandoen. Nogle programstumper bruger kommandoen ORDER BY. Der er ingen forskel på ORDER og ORDER BY og det skal blot nævnes her, i det tilfælde at man støder på den. SEARCH CustTable ORDER Name PRINT Name,,Account END PAUSE SEARCH CustTable ORDER BY Name PRINT Name,,Account END PAUSE 109
SEARCH-END med WHERE Syntaks Beskrivelse Eksempel SEARCH <kartotek> [WHERE <betingelse>] [<kommandoer>] END Kommandoen SEARCH anvendes til at gennemløbe poster i et kartotek. Med WHERE kan der angives et udvælgelsesskriterium, for hvilke poster i kartoteket der skal udvælges. Efter WHERE opstilles en betingelse, der skal være opfyldt for, at de enkelte poster bliver udvalgt. De poster der udvælges kan f.eks. udskrives med PRINT kommandoen. SEARCH CustTable WHERE Group == DK PRINT Group,,Account,,Name END PAUSE 110
SET Syntaks Beskrivelse Eksempler SET <dataelement> = <udtryk> Et af formålene med kørsler er at manipulere med dataelementer. Det kan ske ved at tildele værdier til variabler. Kommandoen SET benyttes til dette. I kommatalsvariabler er decimaltegnet et. punktum. I datovariabler skal \ backslash, anvendes til datoer ved tildeling af værdier med SET. Hvis backslash ikke benyttes eller hvis datoen ligger uden for det lovlige interval, kommer der en fejlmeddelelse om semantisk fejl. Hvis årstallet kun tastes med 2 cifre, antager systemet, at det er en dato i dette århundrede. { Heltal } SET &Antal = 100 { Kommatal } SET &Beløb = 45.25 SET &Beløb = &Beløb + 350.50 { Tekster } SET &ForNavn = Ole SET &EfterNavn = Olsen SET &Navn = &ForNavn + + &EfterNavn { Datoer } SET &AnsatDato = 25\01\1997 { Fasttekster } SET &Svar = 1 111
Variabler Syntaks <type> &<variabelnavn> <type>[<variant>] &<variabelnavn> <type> &<variabelnavn> = Værdi Beskrivelse En variabel er en plads i hukommelsen, der benyttes til at gemme værdier i under afviklingen af programmet. Der er fem typer variabler: INT (heltal) REAL (kommatal) STR (tekst) DATE (datoer) ENUM (fasttekster) Eksempler på erklæringer Eksempler på erklæringer med tildelinger af værdier Før en variabel kan anvendes, skal den erklæres i toppen af programmet. På STR variabler skal der angives længde, og på ENUM skal der angives navn på fastteksttypen. Variabler initialiseres med nulværdier i det øjeblik, de bliver erklæret. Der kan altid tildeles nye værdier med SET kommandoen sålænge, den nye værdi er af samme type som variablen selv. Variablerne har i og for sig ingen funktion før, de får tildelt værdier. INT &Antal REAL &Beløb STR 25 &Navn DATE &AnsatDato ENUM NejJa &Svar INT &Antal = 45 REAL &Beløb = 275.50 STR 25 &Navn = Olsen DATE &AnsatDato = 29\07\09 ENUM NejJa &Svar = 1 112
WINDOW Syntaks WINDOW <bredde>,<højde> WINDOW <bredde>,<højde> [AT <kolonne>,<linje>] Beskrivelse Eksempel 1 Eksempel 2 Kommandoen WINDOW åbner et vindue på skærmen. Det er helt tomt, når det åbnes. Det lukkes automatisk, når kørslen afsluttes eller der åbnes et nyt vindue. Der kan kun være ét vindue åbent ad gangen. AT viser hvor øverste venstre hjørne af vinduet placeres på skærmen. Hvis AT udelades, placeres vinduet i øverste venstre hjørne. Hvis vinduet f.eks. specificeres med højde og bredde lig 0,0, bliver det ikke åbnet, men det oprindelige lukkes, dvs. skærmen slukkes. Dette modsvarer kommandoen CLEAR SCREEN i andre programmeringssprog. WINDOW 40,5 PRINT Ole Olsen, 25, år PAUSE WINDOW 40,5 AT 20,5 PRINT Ole Olsen, 25, år PAUSE 113
XAL editoren - editeringsfunktioner Vælg slut linje Cursoren hopper til enden af linjen END Vælg start linje Slet én linje Kopier én linje til buffer Flyt én linje til buffer Indsæt fra buffer Markér flere linjer Cursoren hopper til starten af linjen Den linje, cursoren står på, slettes (Cursoren kan stå hvor som helst på linjen) Den linje, cursoren står på, kopieres ud i bufferen (Cursoren kan stå hvor som helt på linjen) Den linje, cursoren står på, flyttes ud i bufferen (Cursoren kan stå hvor som helt på linjen) Bufferens indhold indsættes, der hvor cursoren står Der kan markeres flere linjer på en gang ved at stå på første linje og taste ALT+L og flytte op og ned med piletasterne. De markerede linjer vises med gråt HOME ALT+D SH+F5 CTRL+F5 ALT+I ALT+L Pile Slet flere linje Markér linjerne ALT+L og pile Kopier flere linjer til buffer Flyt flere linjer til buffer Slet de markerede linjer Markér linjerne Kopiér de markerede linjer ud i bufferen Flyt cursoren og indsæt igen Markér linjerne Flyt de markerede linjer ud i bufferen Flyt cursoren og indsæt et andet sted DELETE ALT+L og pile SHIFT+F5 ALT+I ALT+L og pile CTRL+F5 ALT+I 114
XAL editoren nøgleord Zoom vindue Når editoren åbnes, vises vinduet kun i halv størrelse. Nøgleord Kartoteker Felter Index Fasttekster Tekster i fasttekster Zoom vinduet op eller ned Nøgleordene (kommandoerne) kan hentes fra en plukkeliste. Cursoren står automatisk på den sidst anvendte kommando. Når listen vises på skærmen, skrives de første tegn i kommandoen, hvorefter den vises automatisk og kan overføres til editoren. Vælg kommando og overfør til editoren Kartoteker hentes fra en plukkeliste. (Samme fremgangsmåde som under nøgleord) Vælg kartotek og overfør til editoren Felter hentes fra en plukkeliste over kartoteker. (Samme fremgangsmåde som under nøgleord) Vælg kartotek, felt og overfør til editoren Indexer hentes fra en plukkeliste over kartoteker (Samme fremgangsmåde som under nøgleord) Vælg kartotek, index og overfør til editoren Fasttekster hentes fra en plukkeliste (Samme fremgangsmåde som under nøgleord) Vælg fasttekst og overfør til editoren Tekster i fasttekster hentes fra en plukkeliste over fasttekster. (Samme fremgangsmåde som under nøgleord) Vælg fastteksttype, tekst og overfør til editoren ALT+Z F2 ENTER F7 ENTER SH+F8 ENTER F8 ENTER F6 ENTER SH+F6 ENTER 115
13. Huskelister XAL sproget ENUM Funktion Fremgangsmåde Tast Opret ny fastteksttype Generelt/Tilpasning/Udviklingsmenu/DBD/Ret/ Kerne Vælg kartotek (Det skal blot være et tilfældigt kartotek, da oprettelse af fastteksttyper kan foregå på et hvilket som helst kartotek.) Vælg Fast-Tekst-Typer i menuen Vælg Opret ny type i menuen ENTER ENTER ENTER Du ser billedet Fast-Tekst Indtast Navn på typen Indtast overskriftsnavn i feltet Print Navn Tilføj tekster Godkend Benyt samme menusti som ovenstående. Vælg Tilføj/Ret tekster i menuen Fast-Tekst-Typer F3 ENTER Ret tekster Vælg Type Du ser nu en dialogbox med Fast-Tekst-Typens navn som overskrift. Indsæt tekst i feltet INDSÆT NY TEKST-- Du ser nu dialogboxen Fast-Tekst Indhold Indtast navn i feltet Godkend (til du er helt ude af programmet) Benyt samme menusti som ovenstående Vælg Tilføj/Ret tekster i menuen Fast-Tekst-Typer Vælg Type Du ser nu en dialogbox med Fast-Tekst-Typens navn som overskrift Vælg navn der skal ændres Åbn Fast-Tekst Indhold og foretag ændring Godkend (til du er helt ude af programmet) ENTER INSERT eller ENTER F3 ENTER ENTER ENTER F3 Programmering opret Funktion Fremgangsmåde Tast Opret Generelt/Tilpasning/Udviklingsmenu/XAL/Opret 116
Funktion Fremgangsmåde Tast Du ser en dialogbox med feltet Kørsel Indtast navnet på din kørsel her (Brug IKKE punktum i navnet, gerne understreg) Der åbnes nu en editorbox, der fylder den øverste halvdel af skærmen Programelementer Zoom editorboxen op i fuld skærmstørrelse (Kan gøres mindre igen med samme funktionstast) Kommentarer sættes i { } Start programmet med en kommentar om programmets funktion, XAL version, dato, forfatter o.a. Variabler indsættes først i programmet Du vælger selv navne til dine variabler Indsæt kommando (nøgleord) Hent kartotek Hent Indexnavne Vælg først kartotek derefter indexnavn Hent feltnavne Vælg først kartotek, derefter feltnavn Hent fast-tekst-typer Hent fast-tekst-indhold Vælg først fast-tekst-type, derefter indhold ALT+Z { } F2 F7 F8 SHIFT+F8 F6 SHIFT+F6 117
Programmering ret Funktion Fremgangsmåde Tast Ret Generelt/Tilpasning/Udviklingsmenu/XAL/Ret Editeringsmuligheder Vælg kørsel fra plukkelisten. Der åbnes nu en editorbox der fylder den øverste halvdel af skærmen. Zoom editorboxen op i fuld skærmstørrelse. (Kan gøres mindre igen med samme funktionstast) Du kan benytte samme programelementer som i huskesedlen: Programmering Opret ALT+Z Slet hel linje Placér cursoren på linjen og slet. ALT+D Flyt én linje Placér cursoren på linjen og flyt til buffer Flyt cursoren til det sted hvor linjen skal indsættes. CTRL+F5 Flyt flere linjer på én gang Indsæt linjen fra bufferen. Placér cursoren på første linje Afmærk linjer. (linjerne markeres i anden farve) Flyt linjerne til bufferen. Flyt cursoren til det sted hvor linjerne skal indsættes. ALT+I ALT+L og pil ned CTRL+F5 Kopiér én linje Indsæt linjerne. Placér cursoren på linjen og kopier til buffer Flyt cursoren til det sted hvor linjen skal indsættes. ALT+I SH+F5 Kopiér flere linjer på én gang Indsæt linjen fra bufferen. Placér cursoren på første linje Afmærk linjer. (linjerne markeres i anden farve) Kopier linjerne til bufferen. Flyt cursoren til det sted hvor linjerne skal indsættes. ALT+I ALT+L og pil ned SH+F5 Indsæt linjerne. ALT+I 118
Del II Kartoteker og skærmbilleder 119
14. Kartoteker Mål med lektionen Formålet med denne lektion er at lære deltagerne at oprette kartoteker med felter. Desuden forklares begrebet systemfelter Efter lektionen skal kursisterne kunne: Oprette nye kartoteker Oprette nye felter i kartoteker og kende til: Password beskyttelse af kartoteker Begrebet systemfelter. Kartoteker generelt C5 består af over 200 forskellige kartoteker, der hver især igen består af en mængde felter. Nogle af kartotekerne består kun af ganske få felter. Andre består af mange felter. Afdelingskartoteket består således kun af 7 forskellige felter, medens lagerkartoteket består af over 70 forskellige felter. Der kan være op til 255 felter i ét kartotek. Oprettelse af kartoteker Supervisoren, eller brugere med tilsvarende rettigheder, kan selv oprette nye kartoteker og felter i C5. Bemærk! Kartoteker kan IKKE slettes igen, når de først er oprettet. Oprettelse af nyt kartotek Felt Betydning Navn på kartotek Printnavn Ref. Formnavn Titel felt Hvor ligger data Sigende navn der anvendes til identifikation af kartoteket f.eks. CustTable. Navn der benyttes om kartoteket i daglig tale f.eks. Debitorkartotek. Anvendes som ledetekst, når der skrives til skærmen. Kan f.eks. ses i QT er i kartotekskolonnen f.eks. Debitor/Udskrifter/Stamdata/Debitorer. Ses også i Generelt/Kartotek/Database Status i kartotekskolonnen. Navnet på det skærmbillede der hoppes til, når der tastes CTRL+F4. Angives der ikke et navn i dette felt, hoppes der automatisk til den form, der har samme navn som kartoteket f.eks. CustTable. Navnet på et felt i kartoteket f.eks. Account. Feltnavnet, med indhold, vises i rammen på skærmbilleder, der anvender dette kartotek. Data i kartoteker kan gemmes på tre forskellige måder: 120
I hvert regnskab I en midlertidig eller privat fil Kun i DAT regnskabet Se forklaring til de tre muligheder herunder. Applikationsgruppe Evt. angivelse af hvilken applikationsgruppe kartoteket tilhører. C5 kontrollerer at koden til denne gruppe er OK. Navngivning af kartoteker 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 versaler><kartoteksnavn> Eksempel Kartoteks navn startes således med modulnavnets tre første bogstaver skrevet med STORT efterfulgt kartoteks navn. BOODestinationer I eksemplet er der f.eks. oprettet et Booking modul til et rejsebureau, og der oprettes et kartotek med destinationer. Kartoteknavnet bliver derfor BOODestinationer. Ovenstående navngivning SKAL overholdes, hvis modulet skal certificeres af Microsoft. Hvor ligger data Hvor ligger data Eksempel på kartotek DAT DMO Øvrige Midlertidigt regnskab LønKørsel (X) (X) (X) Hvert regnskab DebTable el. DebKart X X X Kun DAT regnskabet PostNumre X Markeringerne i felterne til højre viser, hvordan data i et kartotek gemmes i de forskellige regnskaber. X viser hvor dataene gemmes og vedligeholdes. (X) viser, at dataene kun er midlertidige og slettes, når C5 lukkes ned. Midlertidigt regnskab Ved midlertidigt regnskab kan der tastes data ind i kartoteket i alle regnskaber, men så snart C5 lukkes ned, slettes de indtastede data. Kartoteket er midlertidigt. Hvert regnskab 121
Ved hvert regnskab kan der tastes data ind i kartotekerne i de enkelte regnskaber, og dataene gemmes i sit eget regnskab, også efter at C5 er lukket ned. Kun i DAT regnskabet Når der vælges kun i DAT regnskabet, betyder det, at dataene kun eksisterer i dette regnskab. Hvis der f.eks. tastes data ind i et kartotek i et andet regnskab end DAT regnskabet, vil dataene blive gemt i DAT og ikke i det aktuelle regnskab. Dataene er samtidig til rådighed i alle de øvrige regnskaber. Postnummer kartoteket er f.eks. fælles for alle regnskaber, idet postnumrene kun ligger i DAT regnskabet, men alligevel kan ses, vedligeholdes og anvendes i et hvilket som helst andet regnskab. Passwordbeskyttelse af kartoteker Det er muligt at indlægge password på de enkelte kartoteker. Passwords skal huskes Passwords kan kun ændres ved at indtaste et nyt, men først når der er opnået adgang til kartoteket ved angivelse af det gamle password Passwords kan ikke umiddelbart genetableres. Hvis de glemmes, må data betragtes som tabte, idet kartoteket er låst Eneste mulighed, for at få slettet et glemt password, består i, at en medarbejder fra Microsoft kommer ud i virksomheden med et specielt program, der kan låse op for kartoteket igen. Systemfelter i kartoteker Alle kartoteker i C5 har fire ensartede systemfelter. Systemfelter RowNumber LastChanged RecId FileId Beskrivelse Postens nummer i kartoteket Dato for sidste manipulation af posten Record Id, dvs. postens nummer i databasen File Id, dvs. kartotekets entydige nummer De fire felter indsættes automatisk, når der oprettes et nyt kartotek. Da det er systemfelter, skal der heller ikke indtastes data i dem. De vedligeholdes automatisk. Felterne kan indsættes i skærmbilleder eller rapporter på lige fod med egne oprettede felter. Der kan f.eks. være behov for at vise sidste ændringsdato for posteringer. Nye felter i kartoteker 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. 122
Felttyper Felttyper Beskrivelse Datatyper Alphanumerisk 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. Udvej 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 i den eksporterede tekstfil Importere den redigerede tekstfil, idet den gamle overskrives. Denne metode må dog kun benyttes på kartoteker, der er fuldstændigt tomme, da der ellers er risiko for, at smadre sammenhængen mellem data og kartoteksdefinition, hvorefter dataene er ubrugelige. Regler for feltnavne Nedenstående regler skal overholdes for navngivning af felter: Højst 32 tegn Bogstaverne a-å og A-Å Tallene 0-9 Eneste tegn derudover er understreg Første tegn skal være et bogstav Ingen blanke tegn (mellemrum) Ikke navnesammenfald med XAL f.eks. by som i ORDER BY 123
Fælles ved oprettelse af alle typer nye felter Felt Betydning Feltnavn Hjælpetekst Evt. ledetekst Udfylde under oprettelse Udfylde under rettelse Gem feltets indhold Referencekartotek Referencefelt Navn der identificerer feltet i resten af C5 systemet. Feltnavnet kan ændres, hvis der er behov for det. Kort forklaring til feltet. Forklaringen vises i bunden af skærmen, når cursoren placeres på feltet i et skærmbillede. Tekst der anvendes som overskrift eller ledetekst til feltet i f.eks. skærmbilleder. Angives der ingen tekst, anvender systemet automatisk feltnavnet. Nej eller Ja til om det skal være muligt at indtaste i feltet under oprettelse af poster. Normalt Ja, men der kan være situationer, hvor det ikke skal være muligt. Hvis indholdet i feltet f.eks. er et resultat af indholdet i et eller flere andre felter. Om det skal være muligt at indtaste i feltet under rettelse af en post. Fungerer som sikring mod uønskede rettelser. Svaret vil ofte afhænge af svaret i det foregående felt. Nej eller Ja til at gemme feltets indhold i databasen. Normalt Ja, men hvis indholdet i feltet f.eks. hentes via opslag i et andet kartotek, behøver det ikke at blive gemt, og sparer derved plads i datafilen. Navn på et andet kartotek hvori værdien, af det felt der er ved at blive oprettet, også optræder. Anvendes sammen med referencefelt til opslag med ALT+H i skærmbilleder og listbilleder. Navn på et felt i referencekartoteket, hvori værdi og type er den samme, som det felt der er ved at blive oprettet. Specielt ved nye tekstfelter Felt Betydning Sammenlignes justeret Længde Dan skyggefelt (SQL) Der kan vælges mellem Venstrestillet og Højrestillet. Justeringen har betydning, hvor et tekstfelt indeholder tal, der skal anvendes i index eller sammenligninger. Hvis tekstfelter med talværdier skal sorteres i forhold til talværdien, skal teksten højrestilles. Længden på den tekst feltet må kunne indeholde. Max. 255 tegn. Ved at svare Ja, dannes der en kopi i SQL. Kopien indeholder samme tekst i store bogstaver til søgning i SQL Specielt ved nye heltals- og kommatalsfelter 124
Felt Opdatering af tallet Betydning Der kan vælges mellem Absolut og Relativ. Absolut Relativ Absolut opdatering bevirker, at enhver forandring af værdier i en post med det samme bliver gemt på harddisken og overskriver den oprindelige værdi. Relativ opdatering har kun betydning, hvis det er en flerbrugerversion, hvor flere brugere kan arbejde med den samme post samtidigt. Relativ opdatering medfører, at alle bevægelser på en post opsummeres og gemmes. Anvendes normalt ikke, da det kan give kludder i opdateringer. Specielt ved nye kommatalsfelter Felt Betydning National valuta Nej = Vis kun beløb i national valuta. Ja = Vis 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 ) Specielt ved nye fasttekstfelter Felt Betydning Hvilken Fast-Tekst- Type Her angives navnet på den fastteksttype, der skal tilknyttes dette felt. Angives der ingen fastteksttype, indsættes der automatisk typen NejJa. (Ses først når feltet åbnes igen under Ret) 125
Opgaver: Kartoteker Opgave 1: Fasttekster Formål med opgaven At oprette nye fasttekster Huskelister Fasttekst Opret ny type Beskrivelse I forbindelse med et system til styring af varer der udlånes, skal der oprettes to nye fastteksttyper. Den ene type skal indeholde tekster til de forskellige typer af udlån og den anden skal indeholde tekster, der vedrører udlånslinjernes status. Navne og indholdet i de to fastteksttyper er beskrevet i skemaet herunder. Der kan evt. sættes checkmærker ud for de tekster, der er indtastet. Fastteksttypen UDLUdlånsType Fastteksttypens navn Position Tekst UDLUdlånsType 0 Udlån 1 Kommission 2 Andet Fastteksttypen UDLUdlånsStatus Fastteksttypens navn Position Tekst UDLUdlånsStatus 0 Udlånt 1 Returneret 2 Solgt 3 Bortkommet 4 Skrottet Forløb 1 Opret først fastteksttypen UDLUdlånsType og indsæt teksterne iflg. ovenstående skema 2 Opret derefter fastteksttypen UDLUdlånsStatus og indsæt teksterne iflg. ovenstående skema 126
Opgave 2: Kartoteker Formål med opgaven At oprette nye kartoteker med tilhørende felter Huskelister Kartotek Navn Kartotek Feltbehandling Beskrivelse Der skal oprettes to nye kartoteker til registrering af udlånte varer. Registreringen skal foregå på samme måde, som når der oprettes salgsordrer i C5, idet der skal være ét kartotek til ordrehoveder og ét til ordrelinjer. Kartoteket til ordrehovederne skal hedde UDLUdlånsKart, og kartoteket til ordrelinjerne skal hedde UDLUdlånsPost. Navngivningen følger kodestandarden for nye moduler og kartoteker. Modulet er UDLÅN og de tre første bogstaver indsættes foran hvert kartoteksnavn. Kartoteket UDLUdlånsKart Kartoteksnavn Type Specielt Lgd Feltnavn Udfyld under rettelse UDLUdlånsKart Int Absolut UdlånsNr Nej Str Højrestillet 10 DebitorKto Nej Date UdlånsDato? Enum UDLUdlåns-type UdlånsType *? Str Venstrestillet 25 KontaktPerson? Date ReturDato? Real Absolut Forsikringssum? * Fastteksttypen til feltet UdlånsType er den nyoprettede fasttekst med navnet UDLUdlånstype. 127
Kartoteket UDLUdlånspost Kartoteks-navn Type Specielt Lgd Feltnavn Udfyld under rettelse UDLUdlånsPost Int Absolut UdlånsNr Nej Str Venstrestillet 10 VareNr Ja Str Venstrestillet 30 VareNavn Nej Str Venstrestillet 10 SerieNr Ja Enum UDLUdlåns- Status Status * Ja Str Højrestillet 10 DebitorKto Nej * Fastteksttypen til feltet Status er den nyoprettede fasttekst med navnet UDLUdlånsStatus. Forløb 1 Følg huskelisten hvis du ikke ved hvordan, der oprettes kartoteker. 2 Under oprettelsen af felterne i kartotekerne, skal du kun indtaste de informationer, der er vist i ovenstående skemaer. Resten skal være blanke eller er automatisk udfyldt med default informationer. 3 Opret først kartoteket UDLUdlånsKart og indsæt felterne iflg. ovenstående skema. 4 Opret derefter kartoteket UDLUdlånsPost og indsæt felterne iflg. ovenstående skema. 5 Du kan evt. indtaste ledetekster og hjælpetekster, hvis du ønsker det, og der er tid til det. 128
Opgave 3: Dokumentation Mål med opgaven At udskrive dokumentation på kartotekerne Huskelister Kartotek Dokumentation Beskrivelse Efter oprettelse af de to kartoteker med felter, skal der udskrives dokumentation på dem og det skal kontrolleres, at alt er oprettet korrekt. Forløb 1 Inden udskrivning af dokumentationen skal du, i begge kartoteker, vælge feltet LøbeNummer og indtaste dit navn i hjælpeteksten 2 Dette er kun for, at du kan kende din dokumentation fra de andre kursisters, når den udskrives på printeren 3 Følg huskelisten hvis du ikke kan huske hvordan, der udskrives dokumentation på kartotekerne 4 Udskriv dokumentation for kartotekerne på printeren 5 Kontrollér at kartotekerne er rigtigt oprettet 129
15. Indexer Mål med lektionen Formålet med denne lektion er at lære deltagerne at oprette og navngive indexer i kartoteker. Efter lektionen skal kursisterne kunne: Oprette og navngive nye Index. Indexer generelt Index oprettes og vedligeholdes i de kartoteker de tilhører. C5 leveres med index til de eksisterende kartoteker, men der kan oprettes flere nye, hvis der opstår behov for det. Der kan således være flere index til hvert kartotek. De oprindelige index kan ikke slettes, men de kan ændres. Det anbefales ikke at foretage ændringer i eksisterende index, da det kan give uforudsigelige følger. Hvis der er behov for det, er det bedre at oprette nye index. Anvendelse af indexer Index anvendes til forskellige formål f.eks.: Sortering af kartoteker Kontrol af nøgleværdier Sortering af skærmbilleder Sortering af listbilleder Direkte opslag Nedenstående er en kort introduktion til de forskellige anvendelsesmuligheder. Mulighederne behandles nærmere i lektioner om de forskellige emner, når der er naturligt behov for dette. Sortering af kartoteker i rapporter og XAL kørsler Indexer giver mulighed for hurtig sortering og fremfinding af poster, idet de peger hen til de enkelte poster i databasen i den orden, der er angivet i indexet. Kontrol af nøgleværdier ved oprettelse i skærm- og listbilleder Et index kan benyttes til, at kontrollere om der må oprettes flere poster med samme nøgleværdier. Om der f.eks. må oprettes to personer med samme personnummer, eller to kunder med samme kundenummer. Sortering af skærmbilleder Når der skal bladres i poster i skærmbilleder, eller poster skal listes i skærmbilleder, der kan vise flere poster ad gangen, benytter forms automatisk det først oprettede index som default, hvis der ikke angives andet. Mangler index kan der kun søges fortløbende, dvs. i den rækkefølge posterne blev indtastet. 130
Sortering af listbilleder Ved kald af et listbillede vil systemet forsøge at finde et index med det aktuelle felt som første komponent. Hvis det findes vil dette index blive benyttet til sortering af listbilledet. Hvis det ikke findes, bliver det først oprettede index brugt. Hvis der slet ikke er nogen Index, benyttes posternes indtastningsrækkefølge. Direkte opslag Hvis der skal hentes værdier fra et andet kartotek, end det der aktuelt benyttes, kan dette gøres med et direkte opslag og et index. Oprettelse af Index Index oprettes i udviklingsmenuen under DBD/Ret/Kerne/ Vælg et kartotek / Indexbehandling/Opret. Index oprettes ved at angive følgende feltværdier. Felter der udfyldes ved oprettelse af Index Felt Betydning Indexnavn Ens nøgler tilladt Er indexet aktivt Beskrivelse af index For indexnavne gælder de samme regler som for felter. Felter og Index må dog ikke have sammenfaldene navne. Index navngives ofte ud fra de felter de består af, og afsluttes som regel med bogstaverne Idx. Se nedenstående eksempler. Indexet styrer hvorvidt, der må være flere poster med samme nøgleværdier. Hvis der ikke må være flere debitorer med samme kontonummer, skal der være et index med kontonummer som eneste komponent og med NEJ i feltet: Ens nøgler tilladt. Hvis der derimod skal være mulighed for at sortere debitorerne i navneorden, skal der også være et index i navneorden. Da der gerne må være flere debitorer med samme navn, skal indexet have JA i feltet: Ens nøgler tilladt. Aktive Index vedligeholdes automatisk af systemet. Et index kan slås fra, så det ikke længere er aktivt, og ikke skal vedligeholdes mere. Så snart indexet slås til igen, bliver det automatisk ajourført. Det skal bemærkes, at jo flere Index der er aktive, jo mere tid skal C5 bruge til at vedligeholde dem. Beskrivelsen (indexformlen) består af kartoteksfelter adskilt med komma. Indexet kan sorteres stigende (ASCEND) eller faldende (DESCEND). Tekstfelter kan sorteres ud fra et valgt antal tegn i feltet startende fra venstre mod højre. Der kan indsættes kommentarer i indexformler. Se nedenstående eksempler på indexformler. 131
Navngivning og indexformel Index navngives ofte ud fra de felter de består af og afsluttes som regel med bogstaverne Idx. Åbnes nogle af de index der findes i nuværende C5 kartoteker, ses at der er brugt mange forskellige måder at navngive på. C5 vers. 2012 -> Eksempler på indexnavne IndexNavn Felter i Indexformel AccountIdx Account AcDateIdx Account, Budgetcode, Date_, Department, RowNumber C5 vers. -> 4.1 Eksempler på indexnavne IndexNavn Felter i Indexformel KontoIdx Konto KtoDatoIdx Konto, BudgetKode,Dato,LøbeNummer C5 vers. 2012 -> Eksempler på indexformler IndexNavn Felter i Indexformel AccountIdx AccDateIdx Account ASCEND Account ASCEND, Date_ DESCEND NameIdx Name DESCEND 3 {Name faldende 3 tegn} C5 vers. -> 4.1 Eksempler på indexformler IndexNavn Felter i Indexformel KontoIdx KtoDatoIdx NavnIdx Konto ASCEND Konto ASCEND, Dato DESCEND Navn DESCEND 3 {Navn faldende 3 tegn} Index med tekstfelter Hvis et tekstfelt, der har et talindhold, skal indgå i et index og sorteringen skal ske i forhold til talindholdet, som f.eks. kontofeltet debitorkartoteket, 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.) 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 132
<3 første tegn i modulets navn med versaler><indexnavn> Eksempel Indexnavn startes således med modulnavnets tre første bogstaver skrevet med STORT efterfulgt navn på index. Navn på index skal desuden altid bestå af de tre første tegn af de indgående felters navne, hvor første tegn skrives med stort. Afslut navnet med Idx. BOODesLanHotIdx I eksemplet er der f.eks. oprettet et Booking modul 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. Navn på index må højst være 16 tegn. Det kan sagtens være længere, men der kan så opstå uforudsigelige situationer. Ovenstående navngivning SKAL overholdes, hvis modulet skal certificeres af Microsoft. 133
Opgaver: Index Opgave 1: Index Mål med opgaven At oprette Index på kartoteker. Huskelister Kartotek Index Beskrivelse Der skal oprettes Index til de nye kartoteker, så posterne kan styres ordentligt. Indexet til ordrehovedet skal styre, at der ikke må findes to ordrer med samme ordrenummer, og at der ikke må være to ordrer af samme type på samme dag til samme kunde. Indexet til udlånsposterne styrer, at der gerne må være flere linjer med samme varenummer på den samme ordre. Index til UDLUdlånsKart Indexnavn Ens nøgler Aktivt Beskrivelse af index (felter) UDLDebDatTypIdx NEJ JA DebitorKto UdlånsDato UdlånsType UDLUdlIdx NEJ JA UdlånsNr UDLDebUdlIdx Nej JA DebitorKto UdlånsNr Index til UDLUdlånsPost Indexnavn Ens Nøgler Aktivt Beskrivelse af index (felter) UDLUdlVarIdx JA JA UdlånsNr VareNr Forløb 1 Følg huskelisten hvis du ikke ved hvordan, der oprettes Index på kartoteker. 2 Opret først Index på kartoteket UDLUdlånsKart iflg. skemaet 3 Opret derefter indexet på kartoteket UDLUdlånsPost iflg. skemaet 134
Opgave 2: Dokumentation Mål med opgaven At udskrive dokumentation på kartotekerne til indexkontrol. Huskelister Kartotek Dokumentation Beskrivelse Efter oprettelse af Index, skal der udskrives dokumentation på kartotekerne, og det skal kontrolleres, at Indexne er oprettet korrekt. Forløb 1 Inden udskrivning af dokumentationen skal du i begge kartoteker gå ind i feltet LøbeNummer og indtaste dit navn i hjælpeteksten. Dette er kun for, at du kan kende din dokumentation fra de andre kursisters, når den udskrives på printeren. 2 Følg huskelisten hvis du ikke ved hvordan, der udskrives dokumentation på kartotekerne. 3 Udskriv dokumentation for kartotekerne på printeren. 4 Kontrollér at Indexne er rigtigt oprettet. 135
16. Listbilleder Formål med lektionen Formålet med denne lektion er at lære deltagerne at oprette og anvende listbilleder. Efter lektionen skal kursisterne kunne: Oprette listbilleder Anvende listbilleder via udviklingsmenuen Oprette kartoteks- og feltreferencer Kalde listbilleder via referencer på kartoteksfelter. Listbilleder generelt Et listbillede er et hjælpebillede i form af en liste over poster i ét kartotek. C5 leveres med færdige listbilleder, der er oprettet i forvejen til forskellige kartoteker, men der kan oprettes flere listbilleder efter behov. Anvendelse Listbilleder kan i skærmbilleder eller i andre listbilleder kaldes med ALT+H via referencefelt i databasen, og feltværdien kan overføres til det felt, der blev kaldt fra. Listbilleder kan også anvendes fra udviklingsmenuen til oprettelse, ændring og sletning af poster direkte i databasen. Oprettelse af listbilleder Listbilleder oprettes i udviklingsmenuen, i søjlen LST, hvor der først vælges, hvilket kartotek listbilledet skal oprettes til. Der kan være flere listbilleder til hvert kartotek. Billederne oprettes ved at åbne for et indtastnings billede til opsætning af listbilledets vindue. Dette billedet indeholder en del felter, der 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. De øvrige felter udfyldes efter behov. Opsætning af listbilledets vindue Felt Søgenavn i liste Tekst i rammen Vinduets højde / bredde Betydning Navn der kendetegner listbilledet fremover og som der søges på i processer og menuer. Når billedet godkendes, gemmes det som en brugertilretning, og navnet foranstilles med et $ tegn. Tekst der vises i vinduets ramme under afvikling. Vinduets højde i antal linjer og bredde i antal kolonner. Felterne indeholder defaultværdier, der kan ændres efter behov. Farvesæt Standard anvendes altid farvesæt 2. 136
Vindue Angivelse af hvorledes vinduet skal vises på skærmen. Fast (default) Skalerbart Dynamisk Lukket Nedarvet 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. Fylder hele skærmbilledet som default uanset angivet vinduesstørrelse. Virker ellers som skalérbart. Lukker af for aktivering af form (trigger kode kan dog fortsat afvikles). Arbejder skjult i det øjeblikkelige vindue. Dette benyttes ikke standard i applikationen. Indsætning af felter Felterne indsættes på billedet via en tabel. De vises i samme rækkefølge som i denne tabel. Det er muligt at ændre opsætningen af de enkelte felter i listbilledet. Tekstfelter kan f.eks. ændres i længden og kommatalsfelter kan formateres på forskellige måder. Et listbillede til debitorkartoteket kunne f.eks. bestå af felterne i nedenstående tabel, og indtastet i samme rækkefølge: C5 vers. 2012 -> Eksempel på felter i listbilledet til CustTable Feltnavn Account Name Phone C5 vers. -> 4.1 Eksempel på felter i listbilledet til DebKart Feltnavn Konto Navn Telefon 137
Resultatet Debitorer Kontonummer Navn Telefon Listbilledet viser felterne i samme rækkefølge som i opsætningen. Hvis felterne indtastes i modsat rækkefølge i opsætningen, vises de også i modsat rækkefølge i listbilledet dvs. Telefon, Navn og Kontonummer. Navngivning af listbilleder Listbilleder navngives i Opsætning af vindue i feltet Søgenavn i liste. Billederne kan kaldes hvad som helst, men det kan være en fordel at give billederne samme navne som et af felterne i kartoteket. Ofte gives billedet samme navn, som det felt der refereres til når der tastes ALT+H. Betydningen af at give billedet det rigtige navn fremgår af afsnittet Kald via kartoteks- og feltreferencer. Her vises desuden hvad der sker, hvis listbillederne har andre navne. Kald fra udviklingsmenuen Listbilleder kan kaldes direkte fra udviklingsmenuen 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 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 138
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 kartoteks- og feltreferencer Listbilleder kan også kaldes fra skærmbilleder og fra andre listbilleder via feltreferencer på kartoteksfelter i databasen. Referencerne indsættes i opsætningen af databasefelter i felterne referencekartotek og referencefelt. Der kan både refereres til andre kartoteker og felter, og til samme kartotek og felt. Kartoteks- og feltreferencer Opsætning af databasefelt Referencekartotek...: Referencefelt...: Bemærk! Ved kald af listbilleder via feltreferencer kan der kun vises og overføres feltværdier. Der kan ikke oprettes, rettes og slettes, som ved kald fra udviklingsmenuen. Opslag med ALT+H fungerer kun på felter med referencer. Kald af listbillede via referencefelter Skærmbillede (form) Felt ABC ALT+H Opsætning på felt ABC i kartoteket til formen Ref. Kartotek: Xyz Referencefelt: B Listbillederne A, B, C, D i reference kartoteket Xyz A B Listbilledet med samme navn som reference felt vises B C D 139
Automatisk valg af listbillede Hvis kartoteket, der refereres, til har et listbillede med samme navn som selve referencefeltet, aktiveres listbilledet i samme øjeblik, der tastes ALT+H. Findes der ikke et listbillede med samme navn som referencefeltet, vises der først en pickliste med de eksisterende listbilleder, også hvis der kun findes ét listbillede. Fra picklisten vælges det billede der skal åbnes. Sortering af poster i listbillede Sorteringsrækkefølgen af posterne 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. 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. 140
Opgaver: Listbilleder Opgave 1: Kartoteks- og feltreferencer Mål med opgaven At indsætte referencer på kartoteksfelter. Huskelister Kartotek Feltbehandling (referencer) Beskrivelse Der skal oprettes kartoteks- og feltreferencer på de nye kartoteker, så der kan vises og overføres feltværdier til listbilleder og skærmbilleder. Feltreferencer på UDLUdlånsKart Kartotek Felt Referencekartotek Referencefelt UDLUdlånsKart UdlånsNr UDLUdlånsKart UdlånsNr DebitorKto CustTable Account Feltreferencer på UDLUdlånsPost Kartotek Felt Referencekartotek Referencefelt UDLUdlånsPost UdlånsNr UDLUdlånsKart UdlånsNr VareNr InvenTable ItemNumber VareNavn InvenTable ItemName1 DebitorKto CustTable Account Forløb 1 Åben de to kartoteker og indsæt kartoteks- og feltreferencer på felterne iflg. ovenstående skemaer. 141
Opgave 2: Listbillede til UDLUdlånsKart Mål med opgaven At oprette et listbilleder samt afprøve om indexene fungerer. Huskelister Listbillede Opret Beskrivelse Der skal oprettes et listbillede til UDLUdlånsKart som vist herunder. UdlånsKart UdlånsNr DebitorKto UdlånsDa UdlånsType Kontaktperson ReturDat Forsikr Forløb 1 Følg huskelisten hvis du ikke kan huske hvordan, der skal oprettes listbilleder. 2 Opret et listbillede til kartoteket UDLUdlånsKart efter ovenstående eksempel. Opsætning af vinduet Bredde = 50 tegn, Farvesæt = 1, Vindue = Skalérbart. Felter Indsæt alle de felter du selv oprettede i kartoteket. 3 Opret forskellige udlånsordrer med hver sin debitorkonto. 4 Afprøv om indexet UDLUdldx fungerer ved at indtaste et udlånsnummer, der findes i forvejen. Det må du ikke kunne, da indexet er entydigt. 5 Afprøv om indexet UDLDebDatTypIdx fungerer ved at indtaste en ny ordre, der har samme DebitorKonto, UdlånsDato og UdlånsType. Det må du ikke kunne, da index er entydigt. 6 Prøv også om fastteksten fungerer i feltet UdlånsType. 7 Prøv at finde datoerne med ALT+H. 142
Opgave 3: Listbillede til UDLUdlånsPost Mål med opgaven At oprette et listbilleder samt afprøve om index fungerer. Huskelister Listbillede Opret Beskrivelse Der skal oprettes et listbillede til UDLUdlånsPost som vist herunder: UdlånsPost UdlånsNr VareNr VareNavn SerieNr Status DebitorKto Forløb 1 Opret et listbillede til kartoteket UDLUdlånsPost efter ovenstående eksempel. Opsætning af vinduet Bredde = 50 tegn, Farvesæt = 1, Vindue = Skalérbart. Felter Indsæt alle de felter du selv oprettede i kartoteket. 2 Opret nogle udlånslinjer på forskellige udlånsnumre. 3 Afprøv om index UDLUdlVarIdx fungerer ved at indtaste et af de udlånsnumre der findes i forvejen og med samme varenummer. Det skal du kunne, da indexet ikke er entydigt. 4 Prøv at skifte mellem farvesæt 1 og 2 i opsætning af listbilledet. 143
17. Formens vindue Formål med lektionen Formålet med denne lektion er at lære kursisterne at oprette formens vindue og forstå opbygningen af forms (skærmbilleder). Desuden lærer de at anvende macroer til styring af forms. Efter lektionen skal kursisterne kunne: Oprette formens vindue Indsætte macroer i triggerne INIT, ERROR og PRE-FORM Forstå og anvende macroerne #MacroLoad(), #FormError, #Frm_Index(), #Frm_Search() og #SearchEnd() Skærmbilleder generelt Skærmbilleder i C5 kaldes også forms. De oprettes og vedligeholdes i udviklingsmenuen i søjlen FRM. En form består af ét vindue, en eller flere blokke og felter. Blokke kan indsættes i vinduet som vist herunder. Blokke i forms Én blok med én post repræsenteret ved et antal felter Én blok med flere poster repræsenteret ved felter i kolonner Flere blokke af ovennævnte typer Formens opbygning Blok med én post i felter Formens Vindue Felter Blok med flere poster i kolonner Formens vindue Formens vindue er altid det første, der sættes op. Ved opsætningen vises der et skærmbillede med en del felter, der kan udfyldes. Det er dog ikke alle felter, der behøver at blive udfyldt, da de indeholder defaultværdier, der kan anvendes, som de er. De vigtigste felter fremgår af nedenstående skema. 144
Opsætning af vindue (vigtigste felter) Felt Søgenavn i liste Tekst i rammen Vinduets højde / bredde Betydning 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 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 Forms formler Angivelse af hvorledes vinduet skal vises på skærmen. Fast (default) Skalerbart Dynamisk Lukket Nedarvet Triggere (forms formler) generelt Angivne vinduesstørrelse benyttes. Vinduet kan kun skaleres ned. Felter flyttes ikke. 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. Fylder hele skærmbilledet som default uanset angivet vinduesstørrelse. Virker ellers som skalérbart. Lukker af for aktivering af form (trigger kode kan dog fortsat afvikles) Arbejder skjult i det øjeblikkelige vindue. Dette benyttes ikke standard i applikationen Triggere i form af XAL editorbokse. Anvendes til indtastning af XAL kode til styring af forms og deres poster. Det er muligt selv at styre en forms funktion ved at indtaste XAL-kode og specielle forms kontrol kommandoer i triggere i formen. Triggere er almindelige XAL editorbokse, der kan åbnes rundt omkring, i de tre niveauer forms består af, som vist i nedenstående illustration. 145
Formens tre niveauer med triggere dvs. formler Vindue Blokke Form formler Felter Blok formler Felt formler Indholdet i triggerne eksekveres på bestemte tidspunkter under afviklingen af forms. De enkelte triggere behandles i lektionerne, efterhånden som der bliver behov for dem. I denne lektion behandles nogen af de triggere (form formler), der findes under opsætning af formens vindue. Triggere i Opsætning af vinduet Triggere i forms er som tidligere omtalt XAL editorbokse, hvori der kan indtastes kode, der kan styre formens forskellige funktioner efter programmørens ønsker. Under Opsætning af vinduet findes der nogle triggere, der f.eks. kan anvendes til fejlhåndtering og styring af poster i forms. Triggere i vinduet Vindue Form formler Init Pre-form Error 146
Triggerne i opsætning af vinduet (i denne lektion) Trigger Eksempler på anvendelse Init Første trigger der gennemløbes når formen aktiveres. Anvendes bl.a. til kald af macro biblioteker Error Indsættelse af macroen #FormError til fejlhåndtering Pre-form Gennemløbes lige efter Init triggeren. Angivelse af index til sortering af poster i blokke. Angivelse af opslag på første eller sidste post i indexet. Forms kontrolkommandoer og macroer Funktionerne i forms kan styres med specielle forms kontrolkommandoer i de forskellige triggere der findes i vinduet, blokkene og felterne. Forms kontrolkommandoer Der findes en mængde forskellige forms kontrolkommandoer. Kommandoerne anvendes som vist i nedenstående syntaks. Syntaks for kontrolkommando Control <kommando> <parameter> <parameter> Bemærk at kommandoerne startes med ordet Control efterfulgt af selve kommandoen i citationstegn. Desuden anvendes der forskellige parametre afhængigt af, hvilken kommando det drejer sig om. Parametrene skrives blot efter hinanden adskilt med et mellemrum. Da kommandoernes syntaks først kontrolleres når formen afvikles, er der udarbejdet nogle macroer til erstatning for dem. Kommandoerne kan stadig anvendes, men macroerne er bedre at bruge, idet de syntakscheckes allerede under indtastningen. Macroer Macroerne angives med en anden syntaks en kommandoerne. Syntaks for kontrolmacro #Frm_<kommando>(<parametre>, <parameter>) I syntaksen startes macroer med ordet #Frm_. Straks efter understregen angives selve kommandoen. De forskellige parametre angives herefter i en parentes adskilt med kommaer. 147
C5 vers. 2012 -> Sammenligning mellem kontrolkommando og -macro Control Index InvenTable ItemIdx #Frm_Index(InvenTable, ItemIdx) C5 vers. -> 4.1 Sammenligning mellem kontrolkommando og -macro Control Index LagKart VareIdx #Frm_Index(LagKart, VareIdx) Ovenstående eksempel viser opstillingen af kommandoen Index sammenlignet med den tilsvarende macro. De to linjer i eksemplet udfører således akkurat det samme. I denne og de efterfølgende lektioner anvendes macroerne. Kontrolkommandoer og -macroer i denne lektion Kontrolkommando Kontrolmacro Control Index #Frm_Index() Control Search #Frm_Search() Control SearchTop #Frm_SearchTop() Control SearchEnd #Frm_SearchEnd() Ovenstående macroer behandles efterfølgende. #MacroLoad() Macroen #MacroLoad() anvendes til at åbne for macrobiblioteker, så der opnås adgang til deres macroer. Af syntaksen fremgår det, at der i paranteserne til macroen skal angives navn på det kartotek, der skal åbnes (loades). Syntaks #MacroLoad(biblioteksnavn) Macroen anvendes både i XAL kørsler, rapporter og forms. 148
Eksempel Der findes mange forskellige macrobiblioteker i XAL sproget. Nogle er dedikeret til specielle formål, hvilket ofte fremgår af bibliotekets navn. Macroer der kun anvendes i forms, er f.eks. samlet i et bibliotek med navnet FORMS. Trigger Macroen indsættes altid i starten af XAL kørsler, rapporter og forms. I forms indsættes macroen således i den trigger, der gennemløbes allerførst, når formen aktiveres. Dette er triggeren med navnet INIT, der står for initialisering. Trigger Macroer Init #MacroLoad(FORMS) #FormError Macroen #FormError anvendes til udskrivning af fejlmeddelelser i en boks på skærmen. Fejlmeddelelserne i boksen er mere sigende, end de fejlmeddelelser der normalt vises på den nederste linje i skærmbilledet. Meddelelserne dukker mest op, når der skrives fejl i kommandoer i triggerne, idet disse kommandoer først syntakscheckes og fejlkontrolleres, når formen afvikles. Macroen angives som følger uden nogen form for parametre. Syntaks #FormError Trigger Macroen indsættes altid i triggeren Error. Eksempel Trigger Macroer Error #FormError #Frm_Index() Når der bladres i posterne i en enkelt record blok i en form, sorteres de efter et bestemt index. Dette gælder også, når posterne vises i en multi record blok. I macroen #Frm_Index() angives navnet på det index, der skal benyttes. 149
Syntaks #Frm_Index(<bloknavn>, <indexnavn>) Bemærk! Første parameter er altid bloknavne, aldrig kartoteksnavne. Anden parameter er navn på index, der sorteres efter. Indexet skal tilhøre det kartotek, der er knyttet til blokken. Trigger Macroen indsættes som regel i triggeren Pre-Form. C5 vers. 2012 -> Eksempel Trigger Macroer Pre-Form #Frm_Index(ItemTable, ItemIdx) I dette eksempel anvendes blokken ItemTable og index ItemIdx. Husk at indexet tilhører det kartotek, der er tilknyttet blokken, men at det alligevel er blokkens navn, der skal angives som parameter til macroen. C5 vers. -> 4.1 Eksempel Trigger Pre-Form Macroer #Frm_Index(LagKart, VareIdx) I dette eksempel anvendes blokken LagKart og indexet VareIdx. Husk at indexet tilhører det kartotek, der er tilknyttet blokken, men at det alligevel er blokkens navn, der skal angives som parameter til macroen. Manglende index Angives der ikke et index i Pre-Form triggeren, benyttes som default det først oprettede index. Findes der ikke noget index vises posterne i indtastnings-rækkefølgen. #Frm_Search() Det kan angives om visningen eller bladringen i forms, skal starte på første eller sidste post, i det index der angives i macroen #Frm_Index(). Macroen #Frm_Search() angiver at der startes på den første post. Syntaks #Frm_Search(<bloknavn>) I syntaksen er det igen blokkens navn, der angives som parameter. Trigger 150
Macroen indsættes som regel i triggeren Pre-Form under macroen #Frm_Index(). C5 vers. 2012 -> Eksempel Trigger Macroer Pre-Form #Frm_Index(ItemTable, ItemIdx) #Frm_Search(ItemTable) C5 vers. -> 4.1 Eksempel Trigger Pre-Form Macroer #Frm_Index(LagKart, VareIdx) #Frm_Search(LagKart) Husk at det er blokkens navn, der angives som parameter og ikke kartoteksnavnet. #Frm_SearchTop() Macroen #Frm_SearchTop() har nøjagtig samme syntaks og funktion som #Frm_Search(). #Frm_SearchEnd() Det kan angives om visningen eller bladringen i forms, skal starte på første eller sidste post, i det index der angives i macroen #Frm_Index(). Macroen #Frm_SearchEnd() angiver at der startes på den sidste post. Syntaks #Frm_SearchEnd(<bloknavn>) I syntaksen er det igen blokkens navn, der angives som parameter. Trigger Macroen indsættes som regel i triggeren Pre-Form under macroen #Frm_Index(). C5 vers. 2012 -> Eksempel Trigger Macroer Pre-Form #Frm_Index(ItemTable, ItemIdx) #Frm_SearchEnd(ItemTable) C5 vers. -> 4.1 Eksempel Trigger Pre-Form Macroer #Frm_Index(LagKart, VareIdx) #Frm_SearchEnd(LagKart) 151
Husk at det er blokkens navn, der angives som parameter og ikke kartoteksnavnet. Eksempel på fejlhåndtering og styring af poster i en form Nedenfor vises et samlet eksempel på macroer, der er nødvendige for at foretage fejlhåndtering og styring af poster i forms. Det er også vist, hvilke triggere macroerne bør anvendes i. C5 vers. 2012 -> Triggere Init Pre-form Error Macroer #MacroLoad(FORMS) #Frm_Index(ItemTable, ItemIdx) #Frm_Search(ItemTable) #FormError C5 vers. -> 4.1 Triggere Init Pre-form Error Macroer #MacroLoad(FORMS) #Frm_Index(LagKart, VareIdx) #Frm_Search(LagKart) #FormError Eksemplet kan kun anvendes til forms, der ikke er synkroniserede, idet synkroniserede forms kræver udfyldelse og kendskab til flere macroer og en af triggerne i blokke. Specielt vedr. triggerne Init og Pre-form Ovenfor vises den foreløbige anvendelse af triggerne Init og Pre-form. Anvendelsen af de to triggere svarer ikke helt til beskrivelsen i hjælpeteksten i de trykte manualer og på skærmen, idet teksten ikke indeholder nogen beskrivelse af triggeren Pre-form. Denne trigger er først kommet til senere, og beskrives i tillægget CONCORDE XAL til Windows & OS/2 Warp fra 1995 på side 16. Generelt kan Init triggeren anvendes til styring af forms, og de kontrolkommandoer og -macroer der er omtalt ovenfor i forbindelse med Pre-form triggeren, kan udmærket anvendes i Init triggeren i stedet for. Bemærk: Ofte vil det dog være mere rigtigt at indsætte ovenstående kontrolkommandoer og macroer i Pre-form end i Init, idet Pre-form anvendes i Windows når en detail form eller en underform er linked og kaldes fra en master form eller en hovedform. Se nærmere forklaring til dette i det nævnte tillæg. I denne og efterfølgende lektioner anvendes derfor altid triggeren Pre-form. 152
Bemærk: Er Init og Pre-form helt tomme kan brugerne uden videre oprette, rette og slette poster i formen, ligesom der kan bladres i posterne. Så tastes der det mindste i blot én af triggerne, forsvinder denne automatik, og det skal selv styre, hvordan posterne behandles i formen. Styringen udføres med de specielle forms kontrolkommandoer eller macroer, der er gennemgået i denne lektion. 153
Opgaver: Formens vindue Opgave 1: Formens vindue Formål med opgaven At oprette formens vindue og indsætte macroer til styring og fejlhåndtering. Huskelister Form Vindue Beskrivelse Der skal oprettes et vindue til hver af de to kartoteker UDLUdlånsKart og UDLUdlånsPost. Desuden skal relevante triggere udstyres med macroer til styring og fejlhåndtering. Forløb for UDLUdlånsKart 1 Opret vinduet til formen UDLUdlånsKart. Giv den navnet UDLUdlånsKart, og bestem selv teksten i rammen. Størrelsen på vinduet skal være 10 høj 80 bred. 2 Indsæt macro der kan åbne biblioteket FORMS. 3 Indsæt macro der kan styre fejlhåndteringen i formen. 4 Indsæt macro der kan styre hvilket index der skal anvendes. Benyt indexet UDLUdlIdx og bloknavnet UDLUdlånsKart. 5 Indsæt macro der kan styre at der startes på den første post i det angivne index. Benyt bloknavnet UDLUdlånsKart. Forløb for UDLUdlånsPost 1 Opret vinduet til formen UDLUdlånsPost. Giv den navnet UDLUdlånsPost, og bestem selv teksten i rammen. Størrelsen på vinduet skal være 15 høj og 50 bred, der er default. Vinduet skal være skalérbart. 2 Indsæt macro der kan åbne biblioteket FORMS. 3 Indsæt macro der kan styre fejlhåndteringen i formen. 4 Indsæt macro der kan styre hvilket index, der skal anvendes. Benyt indexet UDLUdlVarIdx og bloknavnet UDLUdlånsPost. 5 Indsæt macro der kan styre, at der startes på den sidste post i det angivne index. Benyt bloknavnet UDLUdlånsPost. 154
18. Enkelt record blok Mål med lektionen Formålet med denne lektion er at lære deltagerne, hvilken betydning blokke har i forms og hvordan disse oprettes. Desuden undervises i indsættelse af databasefelter i blokke. Efter lektionen skal kursisterne kunne: Oprette forms med én enkelt record blok Indsætte almindelige databasefelter i blokken. Enkelt record blok generelt Enkelt record blokke anvendes, når der skal dannes skærmbilleder, hvori der kun skal vises én post eller record ad gangen. Blokken er det næste, der skal opsættes efter formens vindue. Blokke kan indeholde én eller flere records ad gangen. Denne lektion behandler blokke med én record. Opsætning af Enkelt record blok Blokke oprettes, mens formens vindue ses på skærmen. Ved oprettelsen åbnes vinduet Opsætning for blok der et indtastningsbillede med felter der beskriver blokken. Mange af felterne indeholder default værdier og behøver derfor ikke at udfyldes eller ændres. De vigtigste felter, der skal udfyldes ved opsætning af en enkelt record blok, fremgår af nedenstående skema. Felter i opsætning af blokke Felt Betydning Blok navn Kartotek 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 evt. bliver tilknyttet. Navn på kartotek der skal tilknyttes blokken, når den skal anvendes til visning og indtastning af data i kartoteket. Det er som nævnt ovenfor en god idé at give blokken samme navn som kartoteket. Ved at indsætte kartotekets navn først, kan det efterfølgende kopieres op i bloknavnet med SHIFT+F5, så bliver det også stavet rigtigt første gang. 155
Bloknavn og kartoteksnavn Baggrundsvindue Vindue på skærm på skærm SH+F2 Opret blok Kartotek Opsætning for blok BlokNavn Kartotetek Samme navn som kartoteket Blokkens navn vises i bunden af skærmen under opbygningen Felter En enkelt record blok kan indeholde både enkelt stående felter fra det tilknyttede kartotek og virtuelle felter der ikke tilhører kartoteket. Virtuelle felter behandles i en senere lektion. I en enkelt record blok skal felterne placeres manuelt på skærmen. Cursoren placeres der, hvor selve feltet skal være og ikke der hvor ledeteksten starter. Opsætning af felter foregår ved at vælge dem ud fra en plukkeliste med felter. Der er mulighed for at ændre formatet på felterne både under og efter opsætningen. Ledeteksterne skal ikke skrives manuelt, men vises automatisk. Der er dog også mulighed for at skrive tekster direkte på skærmen, hvis der er behov for det. Felter og tekst i blokke Kontonummer: Navn...: Telefon...: Debitorer Kontonummer skal indtastes Fritekst kan skrives overalt Ledetekster fremkommer automatisk Cursor bestemmer feltets plads Felter indsættes fra kartotek med F2 og Enter 156
Opgaver: Enkelt record blok Opgave 1: Form med enkelt record blok Formål med opgaven At oprette en form med én enkelt record blok og indsætte felter på blokken. Huskelister Form Enkelt record blok Form Felter Beskrivelse Der skal oprettes en enkelt record blok i vinduet til formen UDLUdlånsKart. UdlånsNr..: UdlånsType: DebitorKto...: KontaktPerson.: Udlånskartotek UdlånsDato: ReturDato: ForsikringsSum: Forløb 1 Anvend vinduet til UDLUdlånsKart fra den forrige lektion. 2 Opret blokken på vinduet og giv den samme navn som kartoteket. 3 Indsæt og placér felterne som vist i ovenstående eksempel. 4 Opret et par udlånsordrer med hver sit udlånsnummer. 5 Opret et nyt udlån der findes i forvejen. Det må du ikke kunne. 6 Opret et nyt udlån der har samme DebitorKonto, UdlånsDato og UdlånsType. Det må du ikke kunne, da indexet er entydigt. 7 Prøv også om fastteksten fungerer i feltet UdlånsType. 8 Prøv at bladre mellem ordrene. 9 Kontrollér om listbillederne til felterne UdlånsNr og DebitorKto åbnes direkte. Ellers skal du foretage de nødvendige ændringer, så de kommer til det. 157
19. Multi record blok Mål med lektionen Formålet med denne lektion er at lære deltagerne at oprette blokke med flere records, og hvordan felter indsættes i disse blokke. Efter lektionen skal kursisterne kunne: Oprette forms med én multi record blok Indsætte almindelige databasefelter i blokken. Generelt En multi record blok kendetegnes ved den måde, felterne er placeret på, idet de opstilles som kolonner ved siden af hinanden. Hver enkelt linje indeholder én post på tværs af kolonnerne, og blokken er derfor beregnet til at vise flere poster på én gang. Form med multi record blok Varenummer Varenavn Varelinjer Serienr Status Er der ikke plads, til at placere alle felter i kolonner, indsættes de resterende felter i bunden af blokken som enkeltstående felter, som vist på næste side. 158
Multi record blok med enkeltstående felter: Varenummer Varenavn Varelinjer Serienr Status Type.: Følgeseddel: Valuta: Ref..: Faktura...: Beløb.: Opsætning Multi record blok Blokke er det næste, der opsættes efter vinduet. De oprettes mens formens vindue er vist på skærmen. Ved oprettelsen åbnes vinduet Opsætning for blok, der er et indtastningsbillede med felter der beskriver blokken. Mange af felterne indeholder default værdier og behøver derfor ikke at udfyldes eller ændres. De vigtigste felter at udfylde, vises i nedenstående skema. Felter i opsætning af multi record blokke Felt Betydning Blok navn Kartotek Autogenerér blok 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 det evt. tilknyttes. Navn på kartotek der skal tilknyttes blokken, når den skal anvendes til visning og indtastning af data i kartoteket. Forskellen på en multi- og en enkelt record blok ligger i besvarelsen af dette felt. NEJ = Blokken autogenereres ikke. Felterne skal placeres manuelt i blokken. JA = Blokken autogenereres. Felterne placeres automatisk i blokken, hvor der er plads til det. Felterne placeres desuden i kolonner, der kan vise mange records på én gang. En autogenereret blok er således det samme som en multi record blok. 159
Bloknavn Det er som nævnt ovenfor en god idé at give blokken samme navn som kartoteket. Ved at indsætte kartotekets navn først, kan det efterfølgende kopieres op i bloknavnet med SHIFT+F5, så bliver det også stavet rigtigt første gang. I de få tilfælde hvor der skal være to blokke til samme kartotek i en form, skal de dog have hvert sit navn, da der ikke må være to blokke med samme navn. Under opbygning af forms vises det aktuelle bloknavn i nederste linje på skærmen. Felter En multi record blok kan både indeholde felter fra det tilknyttede kartotek, og virtuelle felter der ikke tilhører kartoteket. Virtuelle felter behandles i en senere lektion. I en multi record blok ses felterne som kolonner, og evt. samtidig som en række felter, hvis der ikke er plads til dem alle i kolonnerne, som i nedenstående eksempel: Varenummer Varenavn Varelinjer Serienr Status Felter indsættes fra kartotek med F2 og ENTER. Placeringen udføres automatisk Type.: Følgeseddel: Valuta: Ref..: Faktura...: Beløb.: Indsætning af felter Felterne indsættes ved at vælge dem fra en plukkeliste over felter i det kartotek, der er tilknyttet blokken. I en multi record blok foregår placeringen automatisk. Cursoren skal derfor ikke stilles manuelt nogen steder for at indsætte felterne. Overskrifter / ledetekster vises automatisk. Felternes format kan ændres både under og efter opsætningen på formen. 160
Opgaver: Multi record blokke Opgave 1: Form med multi record blok Formål med opgaven At oprette en form med én multi record blok Huskelister Form Multi record blok Form Felter Beskrivelse Der skal oprettes en multi record blok i vinduet til formen UDLUdlånsPost. Skærmbilledet skal bestå af én multi record blok og have samme navn som kartoteket UDLUdlånPost. Udlånslinjer Udlånsnr Varenr Varenavn Serienr Status DebitorKto Forløb 1 Anvend vinduet til formen UDLUdlånsPost, der blev oprettet i lektionen om kartoteker 2 Opret blokken på vinduet med Ja i autogenér, og giv den samme navn som kartoteket 3 Indsæt felterne og lad dem blive placeret automatisk som ovenfor. 4 Prøv at ændre formens størrelse ved at skalere op og ned med CTRL+R 5 Godkend og afprøv formen 6 Opret 3-4 forskellige udlånslinjer. 7 Opret en ordre der findes i forvejen og med samme varenummer. Det skal du kunne, da indexet ikke er entydigt. 8 Prøv at bladre mellem udlånslinjerne, og gå til hh. første og sidste linje 9 Kontrollér om listbillederne fungerer i felterne UdlånsNr, DebitorKto og VareNr. 161
20. Direkte opslag Mål med lektionen Formålet med denne lektion er, at lære deltagerne om direkte opslag, hvad de anvendes til og hvordan de opbygges. Efter lektionen skal kursisterne: Vide hvordan direkte opslag opbygges Kunne anvende direkte opslag til at hente værdier fra et andet kartotek. Direkte opslag generelt Direkte opslag er, som navnet hentyder til, et opslag direkte i et andet kartotek, end det der behandles lige nu. I nedenstående eksempel er der et udsnit af et ordrehoved, hvori der kan indtastes ordrenummer og kontonummer. Kundens navn skrives ikke, men hentes fra debitorkartoteket vha. et direkte opslag. Anvendelse af direkte opslag Ordrenummer Ordrer Kontonummer Navn Navnet hentes med direkte opslag i debitorkartoteket når kontonummeret er indtastet. Et direkte opslag består af fire hovedkomponenter, som vist på næste side. Opbygning af direkte opslag Direkte opslag består af fire hovedkomponenter: 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. Syntaks for direkte opslag med lighedstegn 162
Kartoteksnavn[IndexNavn == Udtryk].Feltnavn Syntaks for direkte opslag med komma Kartoteksnavn[IndexNavn, Udtryk].Feltnavn De enkelte komponenter behandles i nedenstående skema. Betydning af de enkelte komponenter i direkte opslag Komponent Betydning Kartoteksnavn IndexNavn Udtryk Feltnavn 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 indexet, adskilles disse med kommaer. Værdien kan anføres direkte, eller i form af navn på et felt eller en variabel. 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 Punktum Når der skal hentes en bestemt værdi i opslags-kartoteket, skal den hentes vha. af et opslag i indexet. I opslaget sættes index lig med udtryk. Dette angives ved at sættet et komma eller dobbelte lighedstegn mellem Indexnavn og Udtryk. Punktum sættes som angivelse af, at der efterfølger et felt. Sammenhæng i direkte opslag Nedenstående eksempel illustrerer virkemåden i et direkte opslag. På et skærmbillede Ordrer hentes debitorens navn med et direkte opslag i debitorkartoteket. 163
Virkemåden i et direkte opslag Debitorkartoteket (CustTable) AccountIdx Konto Pos 1400 2 1500 4 1600 1 1700 3 1800 5 Poster Pos Konto Navn Tlf 1 1600 Olsen 2 1400 Jensen 3 1700 Hansen 4 1500 Petersen 5 1800 Sørensen CustTable[AccountIdx==Account].Name Ordre 1234 Ordre r Konto 1500 Navn Petersen I det direkte opslag henviser CustTable til debitorkartoteket. AccountIdx henviser til indexet med samme navn i debitorkartoteket. Debitorens navn kopieres fra debitorkartoteket over til Name-feltet i ordren. I det direkte opslag anvendes Account-feltet fra ordren til opslaget i indexet. Feltet indeholder debitorens kontonummer, hvilket er første komponent i indexet. Direkte opslag kan anvendes mange forskellige steder f.eks. i triggere i forms, i rapportfelter og i XAL kørsler. Direkte opslag i XAL kørsel 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 bynavne i PostNummer kartoteket. C5 vers. 2012 -> Eksempel på XAL kørsel med direkte opslag efter bynavn Search CustTable PRINT Name PRINT Address1 PRINT ZipCity,, ZipCode[ZipCodeIdx, ZipCode].CityName PRINT END PAUSE 164
C5 vers. -> 4.1 Eksempel på XAL kørsel med direkte opslag efter bynavn Search DebKart PRINT Navn PRINT Adresse1 PRINT PostNr,, PostNummer[PostNrIdx, PostNr].ByNavn PRINT END PAUSE Resultat IBM Danmark A/S Nymøllevej 91 2800 Lyngby Central Kopiering A/S Postbox 35 1101 København K Bynavnet er hentet med et direkte opslag. Direkte opslag kan også tildeles til variabler, kan indsættes direkte i felter i rapporter, og tildeles som værdier til felter i forms. 165
Opgaver: Direkte opslag Opgave 1: Direkte opslag (Ekstra opgave) Mål med opgaven At benytte direkte opslag for at hente værdier fra et andet kartotek. Beskrivelse Der skal dannes en XAL kørsel med debitorposter, med søgning i kartoteket CustTrans. Kartoteket CustTrans indeholder poster til de enkelte debitorer, der findes i CustTable. Der er dog ikke noget felt i CustTrans, der indeholder debitorernes navne. I denne opgave skal der laves en liste med følgende felter fra CustTrans: Account Date_ AmountMst Desuden skal der, efter feltet Account, indsættes navnet på debitor. Dette skal hentes med direkte opslag i CustTable. Forløb i C5 1 Start en ny XAL kørsel. Indsæt og tilret startkommentarer. 2 Dan en søgeløkke på kartoteket CustTrans. 3 Indsæt en linje der udskriver felterne Account, Date_ og AmountMst. 4 Afprøv kørslen. 5 Indsæt efter Account et direkte opslag der i CustTable kan hente feltet Name. 6 Afprøv kørslen. 166
21. Formens felter, opsætning Mål med lektionen Formålet med denne lektion er at lære deltagerne om mulighederne for formattering af felter i forms. Desuden gives kendskab til triggerne i felter. Efter lektionen skal kursisterne kunne: Anvende triggeren Post-Change Og have kende til: Mulighederne for formattering af felter i forms Triggerne i felter. Generelt Felter i forms indsættes altid i blokke. I enkelt record blokke indsættes felterne manuelt og i multi record blokke indsættes de automatisk. I begge tilfælde medtager felterne deres opsætning fra databasen. Det vil sige at de beholder deres oprindelige opsætning. I begge tilfælde gælder, at der kan ændres i feltets formatering og anvendelse i forms. Desuden findes der nogle få triggere i felter. Formattering af felter Formattering udføres når felter oprettes og ændres med funktionerne Opret felt og Ret felt. I billedet Opsætning af... felt er der felter med informationer om opsætningen. Nogle felter indeholder opsætningen fra databasen og andre indeholder default opsætninger for feltets anvendelse i selve formen. Begge dele kan ændres efter behov. Feltopsætning kan udføres når der oprettes nye felter med F2 og når der rettes i felter med F6. Når funktionerne aktiveres, vises der en dialogboks til justering af det aktuelle felt. Dialogboksen har forskelligt indhold afhængigt af felttype. Felttyper i C5 Heltal Kommatal Tekst Dato Fasttekst Skemaet på næste side indeholder en samlet oversigt over alle justeringsmuligheder. De første fem kolonner viser hvad der kan justeres på de enkelte linjer. 167
Mulige justeringer på felter i forms Felttype Felt i opsætning Muligheder H K T D F Feltnavn H K T D F Feltets bredde H K T D F Feltets justering Navn på felt (kan ikke ændres) Antal tegn Venstrestillet, Højrestillet, Centreret T F Store bogstaver Nej eller Ja H K T D F Rette i feltets indhold H K T D F Hvor mange linjer vises H K T D F Skal feltet autoplaceres H K T D F Vis automatisk ledetekst H K T D F Autohop til næste felt H K T D F Kopier felt H K T D F Skal feltet vises H K T D F Ledetekst Nej eller Ja Alle linjer eller én linje Nej eller Ja Nej eller Ja Nej eller Ja Nej eller Ja Nej eller Ja Evt. ny ledetekst (hvis blank bruges databasens) H K T D F Må feltet brugeropsættes Nej eller Ja H K T D F Spring feltet over H K T D F Søgning efter input H K T D F Formler på feltet Nej eller Ja Nej eller Ja ENTER og der åbnes for triggere D Rækkefølge (DMÅ) DMÅ (Dag, Måned, ÅR) D 2 seperatorer / -, 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 seperator Ingen, Komma, Punktum, Mellemrum K Decimal tegn Komma (,) eller Punktum (.) K Antal decimaler Antal K Automatisk dec. tegn Nej eller Ja 168
Triggere på felter På samme måde som der er triggere i formens vindue og dens blokke, er der også triggere i felterne. Det er triggere, der f.eks. aktiveres, når en post loades ind i formen, når cursoren går ind i eller forlader et felt eller når musen aktiveres i et felt. Triggere i Opsætning af felt Felter Felt formler Der er 6 triggere eller Felt Formler i hvert felt Triggere i felter Anvendelse Post-Load Pre-Field Post-Edit Post-Change Post-Field Mouse Udføres umiddelbart før posten skrives på skærmen. Anvendes f.eks. til at udfylde virtuelle felter. Udføres før markøren får adgang til feltet. Udføres efter editering i et felt, men inden værdien gemmes i feltet. Den tekst, der står i feltet, kan inspiceres gennem variablen &INVAL og kan evt. ændres. Udføres når markøren forlader feltet og der samtidig er foretaget ændringer i feltet. Udføres når markøren forlader feltet, uanset om der er foretaget ændringer eller ej. Udføres når musen aktiveres i feltet. 169
Rækkefølge for aktivering af felttriggerne Post-Load Pre-Field Når en post loades ind i formen Når cursoren flyttes ind i feltet Felt Post-Edit Mouse (Når der klikkes med musen i feltet) Post-Change Post-Field Efterfølgende behandles triggeren Post-Change. Post-Change Triggeren Post-Change aktiveres, når cursoren forlader feltet, kun hvis der samtidig er foretaget ændringer i det. Post-Change kan f.eks. anvendes til at tildele værdier til andre felter i en form. Disse andre felters indhold er så afhængigt af det felt, hvorfra de får tildelt deres værdi. C5 vers. 2012 -> Eksempel I et tænkt eksempel findes der, på en form til indkøbsordrelinjer, ud over feltet ItemNumber, også felterne Txt og UnitCode, samt flere andre. Felterne Txt og UnitCode udfyldes automatisk, når der indtastes varenummer. Felterne hænger således nøje sammen med feltet ItemNumber, idet disse altid skal passe sammen, når de vises i formen. Ændres et varenummer i feltet til et andet varenummer, skal felterne Txt og UnitCode derfor også automatisk ændres tilsvarende. Én metode til at hente værdierne til Txt og UnitCode kan være med direkte opslag i lagerkartoteket. Ved at indsætte det direkte opslag i triggeren Post-Change på feltet ItemNumber, vil de to felter altid blive opdateret, hver gang der er blevet ændret i indholdet i ItemNumber. Dette gælder også, når der oprettes varenummer på en ny linje, idet feltet da er tomt. Feltet ændres således fra at være tomt til at indeholde et varenummer og Post-Change triggeren aktiveres når feltet forlades. 170
Anvendelse af Post-Change i feltet ItemNumber ItemNumber Post-Load Pre-Field Post-Edit Post-Change Post-Field Mouse Tildeling af værdi til Txt og UnitCode med direkte opslag Txt UnitCode Tildeling af værdi til et felt Tildeling af værdier til felter i en form foretages med kommandoen SET, på samme måde som når der tildeles værdier til variabler. Her er det bare felter i en form, der tildeles værdier. C5 vers. 2012 -> Herunder vises eksempler på tildeling af direkte opslag til felterne Txt og UnitCode. Ved at indsætte koden i Post-Change på feltet ItemNumber, vil de to felter altid indeholde de værdier, der tilhører det indtastede ItemNumber. Tildeling af værdier til felter i Post-Change på feltet ItemNumber SET Txt SET UnitCode = InvenTable[ItemIdx, ItemNumber].ItemName1 = InvenTable[ItemIdx, ItemNumber].UnitCode C5 vers. -> 4.1 Herunder vises eksempler på tildeling af direkte opslag til felterne VareNavn1 og Enhed. Ved at indsætte koden i Post-Change på feltet VareNummer, vil de to felter altid indeholde de værdier, der tilhører det indtastede varenummer. Tildeling af værdier til felter i Post-Change på feltet VareNummer SET VareNavn1 = LagKart[VareIdx, VareNummer].VareNavn1 SET Enhed = LagKart[VareIdx, VareNummer].Enhed 171
Valg af felt Det er ikke uden betydning, hvilket felt der anvendes til opdatering. Anvendes feltet ItemNumber, vil opdateringen udføres hver gang, der er indtastet et varenummer og feltet forlades. Anvendes et af felterne Txt eller UnitCode, vil opdateringen først findes, når cursoren forlader et af disse felter. Springes de over, vil de derfor aldrig blive opdateret, da cursoren ikke kommer ind i dem og således heller ikke kan forlade dem. Det rigtige felt i denne situation er således feltet ItemNumber. Valg af trigger Det er heller ikke uden betydning, hvilken trigger der anvendes. Af de seks triggere der findes på felter, er det nødvendigt af finde ud af, hvilken funktionalitet der skal opnås. I det tænkte eksempel herover skulle funktionen være, at ved ændring i feltet ItemNumber skulle felterne Txt og UnitCode ændres automatisk. Denne funktionalitet kan faktisk opnås både med Post- Change og Post-Edit triggerne. 172
Opgaver: Formens felter, opsætning Opgave 1: Triggere, felter og direkte opslag Formål Mål med opgaven At benytte direkte opslag for at hente værdier fra et andet kartotek At vælge det rigtige felt og den rigtige trigger til det direkte opslag At justere felter så de springes over i indtastningen. Huskelister Form Triggere i felter Beskrivelse I de foregående opgaver har du selv måttet indtaste varenavnet i skærmbilledet til UDLUdlånsPost. I denne opgave skal du sørge for, at feltet VareNavn automatisk opdateres med varenavnet fra lagerkartoteket. Det skal ske, både når der oprettes en ny varelinje og når der ændres i varenummeret på en eksisterende linje. Felterne UdlånsNr, VareNavn og DebitorKto skal springes over under indtastning i formen til UDLUdlånsPost. Feltet DebitorKto skal springes over under indtastning i formen til UDLUdlånsKart. Forløb 1 Vælg formen til UDLUdlånsPost og vælg det felt der skal anvendes til direkte opslag for at opdatere feltet VareNavn. 2 Indtast det direkte opslag og tildel værdien til feltet VareNavn. 3 Foretag nødvendige ændringer så feltet VareNavn overspringes. 4 Afprøv som følger: 5 Opret en ny varelinje og kontrollér at varenavnet er rigtigt. 6 Udskift et varenummer i en linje med et andet varenummer og kontrollér at varenavnet også ændres i dette tilfælde. 7 Kontrollér at feltet med varenavnet springes over. 173
22. Listemenuer Mål med lektionen Efter lektionen skal kursisterne kunne: Oprette, tilrette og vedligeholde listemenuer i form af undermenuer til gittermenuer, lokalmenuer og generelle menuer. Emner Listemenuer i C5 Opsætning og vedligeholdelse af listemenuer Menuer generelt C5 indeholder et menusystem, der hjælper til at finde rundt i de mange forskellige skærmbilleder, rapporter, kørsler osv. Menusystemet består af to forskellige typer menuer. Menutyper Menu Gittermenu Listemenu Forklaring Menu i form af en matrix bestående af kolonner og linjer. Cellerne i matrixen indeholder menupunkterne. Hvis der er mere end ét menupunkt, opstilles disse automatisk som en listemenu. Menu i form af en liste af menupunkter. Der findes følgende typer listemenuer: Undermenu til gittermenuer Undermenu til listemenuer Lokalmenuer i skærmbilleder Generelle menuer Alle menuer kan i vid udstrækning tilrettes den enkelte brugers eller brugergruppes behov. Denne lektion behandler listemenuer. Listemenuer Listemenuer er menuer i form af menupunkter opsat som en liste under hinanden. 174
Eksempel på listemenu Finans Kontoplan > Posteringer > Kontoudtog Balancer > Budgetter > Regnskab Pengeinstitut > --------------- Dimensioner > --------------- Forespørgsler > Menupunkter med tegnet > viser at der åbnes en undermenu. Menupunkter uden tegnet > starter det tilknyttede program direkte. Det kan f.eks. være et skærmbillede eller en rapport. Listemenuer findes forskellige steder i menusystemet, men opsættes og vedligeholdes ens. Listemenuer i C5 Listemenu Undermenu til gittermenuer Undermenu til listemenu Lokalmenuer i forms Generelle menuer Forklaring Menupunkter i celler i gittermenuer består altid af en listemenu. Et menupunkt i en listemenu kan kalde en undermenu i form af en anden listemenu. Lokalmenuer er menuer, der kan kaldes frem med F10 i et åbent skærmbillede. Menuen er netop lokal, idet den kun findes i det ene skærmbillede. En lokalmenu kan således heller ikke kaldes fra andre skærmbilleder. Hvert skærmbillede har sin egen lokalmenu. Generelle menuer er selvstændige listemenuer der oprettes og vedligeholdes i udviklingsmenuen i søjlen MNU. Til forskel fra lokalmenuer kan generelle menuer kaldes overalt i C5, idet de kan tilknyttes f.eks. en procestaste eller en hvilken som helst anden menu. 175
Listemenuer Gittermenuen Undermenu til gittermenu Undermenu til listemenu Skærmbillede Lokal menu til skærmbillede Generel menu til procestaste eller listemenu Hvor vedligeholdes listemenuer? Vedligeholdelse af listemenuer består i opsætning af selve menuen og indsættelse af menupunkter. Vedligeholdelse foregår der, hvor listemenuen befinder sig. Vedligeholdelsessted Listemenu Undermenu til gittermenu Undermenu til listemenu Lokalmenu Generel menu Sted for oprettelse og vedligeholdelse I celler i gittermenuer Generelt/Tilpasning/Udviklingsmenu/MNX/Ret I en hvilken som helst anden listemenu Generelt/Tilpasning/Udviklingsmenu/MNX/Ret I den valgte gittermenu vælges undermenu der skal vedligeholdes I det skærmbillede der indeholder lokalmenuen Generelt/Tilpasning/Udviklingsmenu/FRM/Ret I udviklingsmenuen i søjlen MNU Generelt/Tilpasning/Udviklingsmenu/MNU/Ret Opsætning og indsættelse af menupunkter er ens for alle listemenuer. Se afsnittet Opsætning af listemenu. Opsætning af listemenu Opsætning af listemenuer udføres med funktionen Opsætning, der startes med CTRL+F6. Funktionen åbner billedet Opsætning af menu. Billedet indeholder felter til indtastning af menuens titel osv. 176
Felter i Opsætning af menu Felt Forklaring Menutitel Ryd baggrund Første menu i serie Forlad menu efter valg Rammetype Tekst der skrives som overskrift til menuen. Hvis teksten fylder mere end det længste navn på et af menupunkterne, afkortes den automatisk. Skal der være en længere tekst, skal et af menupunkternes navne forlænges med blanke tegn. Om baggrunden skal ryddes når menupunktet åbnes Om det er første menu i en serie. Det kan ikke bestemmes, hvor menuen skal placeres på skærmen, men ved at svare ja her, placeres menuen i øverste venstre hjørne af skærmen for at gøre plads til flere undermenuer. Om menuen skal forlades efter valg. Ved at forlade menuen efter valg vendes der ikke tilbage til den igen når menupunktet er afsluttet. Hvilken ramme type der skal være rundt om menuen Bemærk: Det er ikke muligt at bestemme placering og størrelse på menuen. Indsættelse af menupunkter i listemenu I alle menupunkter foregår der et programkald af et skærmbillede, en rapport, en kørsel eller andet der skal afvikles. Menupunkter indsættes med funktionen Insert, der åbner billedet Opsætning af menupunkt. Felter i Opsætning af menupunkt Felter Betydning Proces Parametre til proces Menupunktets navn Bogstav til hurtigvalg Hjælpetekst Gruppe rettigheder Navn på den proces der skal afvikles. Hver proces kan have forskellige parametre. Som regel skal der mindst angives navn på det applikationselement, der skal afvikles. Angives som Parameter=værdi Parameter=værdi... Den tekst der skal stå som menupunkt i menuen. Et bogstav i menupunktets navn. Bogstavet bør ikke være anvendt et andet sted i menuen. Bogstavet aktiverer menupunktet med det samme. Den tekst der skal vises i bunden af skærmen, når cursoren står på menupunktet. Navn på den eller de grupper der må afvikle dette menupunkt. Kun de grupper, der angives her, kan se menupunktet. C5 vers. 2012 -> Eksempel 177
Felter Proces Parametre til proces Menupunktets navn Bogstav til hurtigvalg Hjælpetekst Gruppe rettigheder Eksempel Form-afvikling Form=CustTable Debitorer D Debitorkartotek Liste I C5 kaldes skærmbilleder for FORMS. I ovenstående eksempel skal der udføres en afvikling af et skærmbillede, derfor processen Formafvikling. Skærmbilledet der skal afvikles hedder CustTable, hvorfor parametrene til processen er Form=CustTable. C5 vers. -> 4.1 Eksempel Felter Eksempel Proces Parametre til proces Menupunktets navn Bogstav til hurtigvalg Hjælpetekst Gruppe rettigheder Form-afvikling Form=Debkart Debitorer D Debitorkartotek Liste I C5 kaldes skærmbilleder for FORMS. I ovenstående eksempel skal der udføres en afvikling af et skærmbillede, derfor processen Formafvikling. Skærmbilledet der skal afvikles hedder DebKart, hvorfor parametrene til processen er Form=DebKart. Undermenuer Undermenuer oprettes ved at vælge processen Undermenu og give menupunktet et navn. I menuen efterfølges navnet automatisk af tegnet >. 178
Vedligeholdelse af listemenuer Finans Kontoplan > Posteringer > Kontoudtog Balancer > Budgetter > Regnskab Pengeinstitut > --------------- Dimensioner > --------------- Forespørgsler > CTRL F6 Insert Opsætning af menuen Menunavn...: Menutitel...: Ryd baggrunden...: Første menu i serie...: Forlad menu efter valg: Rammetype (0-9)...: Opsætning af menupunkt Proces...: Parametre til proces...: Menupunktets navn...: Bogstav til hurtigvalg..: Hjælpetekst...: Grupperettigheder...: 179
Opgaver: Listemenuer Opgave 1: Kald af skærmbilleder fra lokalmenuer Formål med opgaven At benytte lokalmenuer til kald af andre skærmbilleder. Huskelister Menuer Lokalmenuer Menuer Opsætning af menupunkt Beskrivelse I denne opgave skal du, med lokalmenuer, kalde formen UDLUdlånsKart fra formen CustTable, og UDLUdlånsPost skal kaldes fra formen UDLUdlånsKart. Se nedenstående skitse. CustTable Lokal menu UDLUdlånsKart Lokal menu UDLUdlånsPost Forløb i C5 1 Vælg formen CustTable og opret et nyt menupunkt i lokalmenuen. Menupunktet skal kalde formen UDLUdlånsKart. 2 Vælg formen UDLUdlånsKart og opret en ny lokalmenu. 3 Vælg den nye lokalmenu og opret et nyt menupunkt, der kan kalde formen UDLUdlånsPost. 4 Afprøv de nye menupunkter som følger: 5 Vælg formen CustTable og foretag et kald af UDLUdlånsKart. 6 Du skal kunne se og bladre i alle debitorers udlån. 7 Inde i udlånsbilledet skal du kalde kalde udlånslinjerne. 8 Du skal kunne se og bladre i samtlige udlånslinjer, også de der tilhører de andre udlån end det aktuelle. 180
23. Synkronisering mellem forms Mål med lektionen Formålet med denne lektion er at lære deltagerne at synkronisere forms med hinanden, således at en indeholdet i en form er afhængigt af indholdet i en anden form. Efter lektionen skal kursisterne kunne: Synkronisere to forms med hinanden Forstå hvilke forms kontrol kommandoer der skal anvendes til synkroniseringen mellem to forms Forstå hvilke triggere der skal anvendes til synkroniseringen mellem to forms. Generelt Synkronisering anvendes f.eks. når der foretages kald fra en form til en anden eller fra en form til en rapport. Synkroniseringen består i at den kaldte form eller rapport sættes op, så indholdet her stemmer overens med indholdet i den form der blev kaldt fra. I denne lektion behandles synkronisering mellem forms. Synkronisering mellem forms Synkronisering mellem forms udføres som hovedregel ved hjælp af kald fra lokalmenuen i hovedformen og opsætning af selve synkroniseringen i underformen. I illustrationen herunder er Ordrekartotek hovedform til Ordrelinjer og Ordrelinjer er hovedform til Ordretotaler. Kald af forms fra lokalmenuer Ordrekartotek Lokal menu Ordrelinjer Lokal menu Ordretotaler 181
Når en form kaldes fra en menu, er det muligt at synkronisere den, med den form der kaldes fra. I illustrationen kan det f.eks. synkroniseres, så formen med ordrelinjerne kun viser de linjer, der tilhører den ordre, der blev kaldt fra. Det er vigtigt at forstå, at et kald af en form via en menu ikke alene er nok til, at hente de rigtige informationer i den underliggende form. Det er i den underliggende form selve synkroniseringen finder sted, og at de rigtige informationer findes frem. Triggere ved synkronisering Ved synkronisering mellem to forms anvendes følgende triggere i vinduet og på blokken i underformen. Triggere i underform ved synkronisering Triggere i vinduet Anvendelse Pre-form Åbning af buffer Tildeling af værdier i blokken (fra buffer) Angivelse og låsning af index til sortering af poster i blokken. Angivelse af opslag på første eller sidste af de fundne poster. Triggere i blokken Init-record Anvendelse Åbning af buffer Tildeling af startværdier fra buffer til ny record Triggeren Pre-Form I triggeren Pre-form ligger koden til selve synkroniseringen. Der er her de rigtige poster findes frem. Synkroniseringen foregår ved hjælp af følgende kommandoer og macroer: En buffer EXTERN SET #Frm_Index() (med låsning af antal indexkomponenter) #Frm_Search() eller #Frm_SearchEnd() De enkelte punkter behandles på de følgende sider. Buffer Foretages der et kald af en anden form via en lokalmenu, gemmes posten i den oprindelige form i en buffer med samtlige sine data. Det betyder, at der til enhver tid kan hentes information i bufferen om den post eller record, der blev kaldt fra. 182
Bufferen indeholder den aktuelle record Buffer Aktuel record Information om aktuel record (ordre) hentes i bufferen Hovedform Ordrekartotek Underform Ordrelinjer Lokal menu I underformen er det vigtigt at vide hvilken post, der kaldes fra, så de rigtige posteringer (linjer) kan findes frem. Dette kan gøres ved at åbne bufferen med kommandoen EXTERN. EXTERN Kommandoen EXTERN åbner for en buffer med informationer om den record, der kaldes fra. Åbning af buffer med EXTERN Buffer Ordrekartotek Bufferen åbnes med kommandoen EXTERN buffernavn Hovedform Ordrekartotek Underform Ordrelinjer Lokal menu EXTERN OrdreKart Syntaksen for EXTERN er som følger, idet kommandoen efterfølges af bufferens dvs. kartotekets navn. Syntaks EXTERN <buffer> C5 vers. 2012 -> : 183
Hvis der f.eks. fra formen SalesTable skal foretages et kald af formen SalesLine med ordrelinjerne indsættes der et menupunkt i formen SalesTable til kald af posteringerne i SalesLine. I SalesLine skal der så åbnes for bufferen til SalesTable for, at se hvilket ordrenummer der blev kaldt fra. Åbningen af bufferen skal da se ud som følger: C5 vers. 2012 -> Eksempel EXTERN SalesTable C5 vers. -> 4.1 : Hvis der f.eks. fra formen OrdKart skal foretages et kald af formen OrdLinje med ordrelinjerne indsættes der et menupunkt i formen OrdKart til kald af posteringerne i OrdLinje. I OrdLinje skal der så åbnes for bufferen til OrdKart for, at se hvilket ordrenummer der blev kaldt fra. Åbningen af bufferen skal da se ud som følger. C5 vers. -> 4.1 Eksempel EXTERN OrdKart Når bufferen er åbnet, skal blokkens nøglefelter tildeles værdier fra den. Det udføres med kommandoen SET. SET Når der skal synkroniseres mellem to forms, anvendes SET kommandoen til at tildele værdier (fra bufferen) til felter i blokken, idet de poster der skal vises i underformen, skal tilhøre den record, der findes i bufferen. Tildeling med SET fra Buffer Buffer Ordrekartotek Tildeling med SET fra buffer felter til felter i blok i form Hovedform Ordrekartotek Lokal menu Underform Ordrelinjer EXTERN Ordrekartotek SET blok.felt = buffer.felt Syntaksen for SET kommandoen ved tildeling af værdier til blokken fra bufferen, er som følger. Syntaks SET <bloknavn>.<feltnavn> = <buffernavn>.<feltnavn> 184
I eksemplet fra afnittet om EXTERN med kald af ordrelinjer fra ordrekartoteket, vil SET kommandoen da se ud, som følger. C5 vers. 2012 -> Eksempel SET SalesLine.Number = SalesTable.Number I formen er der en blok med navnet SalesLine, der har et felt med navnet Number. Dette felt tildeles den værdi, feltet Number har i bufferen SalesTable. C5 vers. -> 4.1 Eksempel SET OrdLinje.Nummer = OrdKart.Nummer I formen er der en blok med navnet OrdLinje, der har et felt med navnet Nummer. Dette felt tildeles den værdi, feltet Nummer har i bufferen OrdKart. Ved hjælp af macroen #Frm_Index() kan de rigtige poster herefter findes frem. #Frm_Index() Macroen #Frm_Index() anvendes ikke alene til visning af poster, men også til fremfinding af bestemte poster, der så vises i samme sortering som indexet. Ved synkronisering mellem forms, skal der netop i underformen, fremfindes bestemte poster, nemlig de poster der tilhører den record, der befinder sig i bufferen. Efter at bufferen er åbnet, og værdier er tildelt blokken, anvendes macroen #Frm_Index() til at finde de rigtige poster frem. Poster findes med #Frm_Index() Buffer Ordrekartotek Posterne findes med #Frm_Index(Blok, Index, 1) Hovedform Ordrekartotek Lokal menu Ordrelinjer Underform EXTERN Ordrekartotek SET blok.felt = buffer.felt #Frm_Index(Blok,Index,1) Det er vigtigt at anvende indexmacroen rigtigt, idet det er nødvendigt at angive hvilke komponenter i indexet, der skal benyttes i søgningen efter posterne. I eksemplet med kaldet af ordrelinjerne fra ordrekartoteket, er der f.eks. kun én kendt værdi, der kan hentes i bufferen og som samtidig kan anvendes til fremfinding af ordrelinjeposterne. Det er ordrenummeret, da dette felt findes i begge kartoteker. Ordrenummeret fra bufferen bliver da også med SET kommandoen tildelt Ordrenummeret i blokken 185
For at finde de rigtige poster skal der anvendes et index med ordrenummeret som første komponent. Hvis dette index består af flere komponenter, skal det angives hvilke af disse, der er kendte. Det siges at indexkomponenterne låses. Syntaksen for #Frm_Index() med låsning af komponenter er som følger. Syntaks #Frm_Index(<bloknavn>, <indexnavn>, <antal låste komponenter>) Hensigten med de låste komponenter vises i følgende eksempel, hvor der anvendes et index med flere komponenter. C5 vers. 2012 -> Eksempel #Frm_Index(SalesLine, NumTransLineIdx, 1) Blokken SalesLine er tilknyttet et kartotek SalesLine, der har et index NumTransLineIdx, der består af 4 komponenter. Indexnavn Komponenter (felter) i indexet NumTransLineIdx C5 vers. -> 4.1 Eksempel Number, Transaction, LineNumber, RowNumber #Frm_Index(OrdLinje, NumTraLinIdx, 1) Blokken OrdLinje er tilknyttet et kartotek OrdLinje, der har et index NumTraLinIdx, der består af 4 komponenter. Indexnavn Komponenter (felter) i indexet NumTraLinIdx Nummer, Transaktion, LinjeNr, Løbenummer Da det kun er den første komponent i indexet dvs. ordrenummeret, der er kendt, skal det fastlåses, at indexet i fremfindingen af poster kun skal anvende denne komponent. Derfor angives tallet 1 i #Frm_Index(). Der kan låses mere end én komponent, hvis værdierne kendes, men altid fra venstre mod højre. Der kan ikke låses på en komponent midt i indexet. De poster, der findes med #Frm_Index(), vises stadig sorteret efter alle komponenter i indexet, idet låsningen kun gælder udsøgningen af posterne. #Frm_Search() / #Frm_SearchTop() / #Frm_SearchEnd() Der er stadig mulighed for, at angive om cursoren skal starte på den første eller den sidste post. Når der er tale om låste poster, gælder dette så kun, de der er fundet. Første eller sidste post vælges med en af macroerne #Frm_Search(), #Frm_SearchTop() eller #Frm_SearchEnd(). Bloktriggeren Init-record Når der skal oprettes en ny record i en underform, kan det være nødvendigt at tildele nogle startværdier til den. Det kan f.eks. være værdier, der findes i bufferen. 186
Selv om disse værdier bliver tildelt blokken med SET kommandoen i Pre-form triggeren, kan disse værdier ikke automatisk anvendes, når der skal oprettes en ny record. Init-record Tildeling af startværdier til records foregår i triggeren med navnet Init-record. Init-Record aktiveres, når der i en form sker en begivenhed f.eks. i form af at oprette en ny record. Dette sker f.eks. ved at taste F2 eller ved, at markøren placeres på en ny tom post, der skal oprettes. Tildeling af værdier fra bufferen foregår på samme måde som i Pre-form ved at åbne bufferen med EXTERN og tildele værdier med SET. C5 vers. 2012 -> Pre-form EXTERN SalesTable SET SalesLine.Number = SalesTable.Number C5 vers. -> 4.1 Pre-form EXTERN OrdKart SET OrdLinje.Nummer = OrdKart.Nummer Ofte kan det betale sig at kopiere linjerne fra Pre-form og så tilføje flere linjer med SET kommandoer, hvis der er behov for det. C5 vers. 2012 -> Init-record EXTERN SalesTable SET SalesLine.Number = SalesTable.Number SET SalesLine.Account = SalesTable.Account I dette eksempel tildeles der værdier fra bufferen til felterne Number og Account. Der kan også tildeles andre former for startværdier f.eks. dags dato. 187
C5 vers. -> 4.1 Init-record EXTERN OrdKart SET OrdLinje.Nummer = OrdKart.Nummer SET OrdLinje.Konto = OrdKart.Konto I dette eksempel tildeles der værdier fra bufferen til felterne Nummer og Konto. Der kan også tildeles andre former for startværdier f.eks. dags dato. Komplet eks. på synkronisering af forms Synkronisering i triggere i vinduet og blokke Buffer Ordrekartotek Triggere i vinduet Init Error Pre-form Hovedform Ordrekartotek Lokal menu Underform Ordrelinjer (Vindue) (Blok) Triggere i blok Init-record Eksemplet indeholder kun triggere, der anvendes i underformen, idet hovedformen ikke har nogen ændringer i sine triggere. Eksemplet er vist på næste side. 188
C5 vers. 2012 -> Komplet eksempel med triggere og tilhørende kode Trigger i vinduet Init Anvendelse #MacroLoad(FORMS) Pre-form EXTERN SalesTable SET SalesLine.Number = SalesTable.Number #Frm_Index(SalesLine, NumTransLineIdx, 1) #Frm_SearchEnd(SalesLine) Error Triggere i blokken Initrecord #FormError Anvendelse EXTERN SalesTable SET SalesLine.Number = SalesTable.Number SET SalesLine.Account = SalesTable.Account C5 vers. -> 4.1 Komplet eksempel med triggere og tilhørende kode Trigger i vinduet Init Anvendelse #MacroLoad(FORMS) Pre-form EXTERN OrdKart SET OrdLinje.Nummer = OrdKart.Nummer #Frm_Index(OrdLinje, NumTraLinIdx, 1) #Frm_SearchEnd(OrdLinje) Error Triggere i blokken Init-record #FormError Anvendelse EXTERN OrdKart SET OrdLinje.Nummer = OrdKart.Nummer SET OrdLinje.Konto = OrdKart.Konto 189
Opgaver: Synkronisering mellem forms Opgave 1: Synkronisering mellem forms Formål med opgaven At benytte XAL kommandoer og forms kontrol kommandoer i form af macroer til synkronisering mellem forms. Huskelister Form Triggere i vinduet Form Triggere i blokke Beskrivelse Efter opsætning og afprøvning af lokalmenuer skal der synkroniseres mellem forms, så der kun vises poster, der tilhører den aktuelle post i den form, der kaldes fra. Når UDLUdlånsKart kaldes fra CustTable, skal det synkroniseres, så der kun vises udlån, der tilhører den aktuelle debitor. Når UDLUdlånsPost kaldes fra UDLUdlånsKart, skal det synkroniseres, så der kun vises udlånslinjer, der tilhører det udlån, der var fremme ved kaldet. Forløb i C5 1 Vælg formen til UDLUdlånsKart og opsæt synkroniseringen til CustTable. Benyt indexet UDLDebDatTypIdx til opslag og start på første post i indexet. 2 Vælg formen til UDLUdlånsPost og opsæt synkroniseringen med UDLUdlånsKart. Benyt UDLUdlVarIdx til opslag og start på sidste post i indexet. 3 Afprøv synkroniseringen som følger: 4 Vælg formen CustTable og foretag et kald af UDLUdlånsKart. Du må kun kunne se og bladre i udlån til den aktuelle debitor. 5 Inde i udlånsbilledet skal du kalde udlånslinjerne. Du må kun kunne se og bladre i de udlånslinjer, der tilhører det udlån du kaldte fra. 6 Opret et nyt udlån på en debitor og indsæt 2-3 udlånslinjer. 7 Gentag punkt 6 et par gange med en anden debitor. 8 Afprøv om du stadig kun kan bladre i udlån og udlånslinjer der tilhører den aktuelle debitor og udlån. 9 Vælg listbilledet til UDLUdlånsPost og kontrollér at felterne DebitorKto og UdlånsNr er udfyldt. Hvis de ikke er det, skal du foretage nødvendige ændringer i synkroniseringen. 190
24. Huskelister forms Fasttekst Opret ny type Funktion Fremgangsmåde Tast Oprette ny fasttekst-type Generelt/Tilpasning/Udviklingsmenu/DBD/Ret/ Kerne Vælg kartotek (Det skal blot være et tilfældigt kartotek, da oprettelse af fastteksttyper kan foregå på et hvilket som helst kartotek.) Vælg Fast-Tekst-Typer i kartotekets menu Vælg Opret en ny type i menuen Fast-Tekst-Typer ENTER ENTER ENTER Du ser billedet Fast-Tekst Indtast Navn på typen. Indtast overskriftsnavn i feltet Print Navn. Tilføje tekster Gentages for hver ny tekst Godkend Du er nu tilbage i menuen Fast-Tekst-Typer og kan vælge at afslutte med eller du kan indsætte tekster ved at gå til fasen Tilføj tekster her i huskelisten. Du er i menuen Fast-Tekst-Typer Vælg Tilføj/ret tekster Vælg den oprettede fastteksttype i menuen. Vælg Type Du ser nu en dialogbox med Fast-Tekst-Typens printnavn som overskrift. Indsæt tekst i feltet Indsæt ny tekst Du ser nu dialogboxen Fast-Tekst Indhold Indtast teksten i feltet Når du er færdig med at indsætte tekster, kan du afslutte ved at godkende (til du er helt ude af programmet). ENTER eller F3 F3 ENTER ENTER INS eller ENTER F3 191
Fasttekst Tilføj tekster til eksisterende type Funktion Fremgangsmåde Tast Starte Vælge kartotek Vælge type Gentages for hver ny tekst Generelt/Tilpasning/Udviklingsmenu/DBD Der er nu to muligheder: Hvis du vælger Diverse/Fasttekst, kan du gå direkte til Vælg Type her i huskelisten. Hvis du vælger Ret/Kerne, skal du starte i Vælge kartotek. Vælg kartotek (Det skal blot være et tilfældigt kartotek, da oprettelse af fastteksttyper kan foregå på et hvilket som helst kartotek.) Vælg Fast-Tekst-Typer i kartotekets menu Vælg Tilføj/ret tekster i menuen Fast-Tekst-Typer Vælg fastteksttype i menuen Vælg Type Du ser nu en liste over tekster i den valgte fastteksttype. Indsæt tekst i feltet Indsæt ny tekst Du ser nu dialogboxen Fast-Tekst Indhold. Indtast teksten i feltet Når du er færdig med at indsætte tekster, kan du afslutte ved at godkende (til du er helt ude af programmet). ENTER ENTER ENTER ENTER INS eller ENTER F3 F3 192
Fasttekst Ret tekster i eksisterende type Funktion Fremgangsmåde Tast Starte Vælge kartotek Vælge type Gentages for hver tekst der ændres Generelt/Tilpasning/Udviklingsmenu/DBD Der er nu to muligheder: Hvis du vælger Diverse/Fasttekst, kan du gå direkte til Vælge Type her i huskelisten. Hvis du vælger Ret/Kerne, skal du starte i Vælge kartotek. Vælg kartotek (Det skal blot være et tilfældigt kartotek, da oprettelse af fastteksttyper kan foregå på et hvilket som helst kartotek.) Vælg Fast-Tekst-Typer i kartotekets menu Vælg Tilføj/ret tekster i menuen Fast-Tekst-Typer Vælg fastteksttype i menuen Vælg Type Du ser nu en liste over tekster i den valgte fastteksttype. Vælg tekst der skal ændres Du ser nu dialogboxen Fast-Tekst indhold. Foretag ændringerne i teksten Når du er færdig med at indsætte tekster, kan du afslutte ved at godkende (til du er helt ude af programmet). ENTER ENTER ENTER ENTER ENTER ENTER F3 193
Kartotek Navn (opret/ret) Funktion Fremgangsmåde Tast Oprette kartotek med navn Generelt/Tilpasning/Udviklingsmenu/DBD/ Opret Du er nu i billedet Opret/Se Kartotek. Som standard er det nok at udfylde flg. felter: Rette kartoteksnavn Navn på kartotek: Skriv et sigende navn på kartoteket. Benyt evt. forkortelse som f.eks. DebTable eller Debkart. Print Navn: Skriv det navn kartoteket skal kaldes i det daglige f.eks. Debitorkartotek. Godkend oprettelsen med Du ser nu en menu med kartoteksnavnet som overskrift. Du kan nu vælge at afslutte menuen med eller vælge at gå til et af menupunkterne. (Se andre huskelister) Generelt/Tilpasning/Udviklingsmenu/DBD/Ret/ Kerne Du ser nu en liste over kartoteker. Vælg det kartotek der skal ændres Du ser nu en menu med kartoteksnavnet som overskrift. Vælg menupunktet Navn Du er nu i billedet Opret/Se Kartotek Som standard er der kun behov for at ændre flg. felter: Navn på kartotek: Indtast evt. nyt navn på kartoteket. Print Navn: Indtast evt. et andet kaldenavn på kartoteket. Godkend ændringerne med Afslut menuen med Slette kartotek Kartoteker kan ikke slettes. F3 F3 ENTER F3 F3 ENTER 194
Kartotek Feltbehandling (opret) Funktion Fremgangsmåde Tast Finde kartotek Generelt/Tilpasning/Udviklingsmenu/DBD/Ret/ Kerne Vælg kartotek fra den viste liste Vælg Feltbehandling/Opret fra den viste menu ENTER ENTER Opret felt Vælg felttype fra menuen Felttyper ENTER Gentages for hvert felt at oprette Særegne informationer Sammenlign. Justeret Længde Opdatering af tallet Hvilken Fast- Tekst-Type Fælles informationer Feltnavn Evt. Ledetekst Udfylde under rettelse Indtastningsbilledet Opsætning af databasefelt vises. For hver felttype er der nogle særegne og nogle fælles Informationer, der skal angives. I denne huskeliste vises de vigtigste felter at udfylde. Udfyld de særegne informationer for felttypen og gå videre til de fælles informationer. Alfanumerisk-felt Vælg Højre- eller venstrestillet. Angiv længde. Heltals-felt og Kommatals-felt Vælg default værdien Absolut. Dato-felt Intet specielt. Fast-Tekst-Type Vælg fastteksttype med Udfyldes for alle felter. Giv feltet et sigende navn. Anvend tegnene a-å, AÅ, 0-9 og understreg. Hvis ledeteksten ikke udfyldes anvendes feltnavnet som ledetekst i listbilleder og skærmbilleder. Hvis der svarers ja kan feltværdien senere ændres, det må man ikke ved nøglefelter, hvor der findes underliggende poster, f.eks. Debitorkontonr. med posteringer. ALT+H Afslutte Godkend med F3 195
Kartotek Feltbehandling (ret) Funktion Fremgangsmåde Tast Finde felt Generelt/Tilpasning/Udviklingsmenu/DBD/Ret/ Kerne Vælg kartotek fra den viste liste Vælg Feltbehandling/Ret fra den viste menu ENTER ENTER Åbne felt Vælg felt fra feltlisten ENTER Indtastningsbilledet Opsætning af databasefelt vises. Udfør nødvendige ændringer. Afslutte Godkend med F3 Kartotek Feltbehandling (referencer) Funktion Fremgangsmåde Tast Indsætte referencer Åbne opsætning af databasefelt Gentages for hvert felt Referencekartotek Referencefelt Generelt/Tilpasning/Udviklingsmenu/DBD/Ret/ Kerne Vælg kartotek fra den viste liste Vælg Feltbehandling/Ret fra den viste menu Vælg felt fra feltlisten Indtastningsbilledet Opsætning af databasefelt vises. Udfyld flg. felter: Angiv navn på kartotek der skal referes til Angiv navn på felt i referencekartoteket, hvori værdi og type er den samme, som det felt du står i her. ENTER ENTER ENTER ALT+H ALT+H Afslutte Godkend med F3 Kartotek Dokumentation Funktion Fremgangsmåde Tast Udskrive dokumentation Generelt/Tilpasning/Udviklingsmenu/DBD/ Udskriv Vælg kartotek fra den viste liste Udfyld billedet Udskriftsmuligheder med nødvendige informationer. Godkend med Vælg kartotek fra kartotekslisten ENTER F3 ENTER 196
Kartotek Index (opret) Funktion Fremgangsmåde Tast Finde kartotek til index Oprette index Gentages for hvert index der skal oprettes Generelt/Tilpasning/Udviklingsmenu/DBD/Ret/ Kerne Vælg kartotek fra den viste liste Vælg Indexbehandling/Opret fra den viste menu Du ser nu indtastningsbilledet Opsætning af Index Udfyld flg. felter (alle): ENTER ENTER IndexNavn Giv indexet et sigende navn. Eksempel på indexnavn: KtoDatoIdx.Navnet viser at indexet består af felterne KontoNr og Dato. Ens Nøgler tilladt NEJ = Der må kun være én post med samme indexnøgle. JA = Hvis der gerne må være flere poster med samme indexnøgle. Er indexet aktivt Angiv med Ja eller Nej om indexet er aktivt. Beskrivelse af index (Indexformel) Gentages for hver felt der skal indsættes Åbn editorbox til indtastning af felter Indsæt felter ved at vælge kartotek Vælg felt (Felter adskilles med komma) Godkend editorboxen med Godkend opsætningen af indexet ENTER SHIFT+F8 ENTER F3 F3 Afslutte Godkend resten med F3 Kartotek Index (ret) Funktion Fremgangsmåde Tast Finde index Generelt/Tilpasning/Udviklingsmenu/DBD/Ret/ Kerne Vælg kartotek fra den viste liste Vælg Indexbehandling/Ret fra den viste menu ENTER ENTER Rette Index Vælg index fra listen ENTER Gentages for hvert index der skal rettes Du ser nu indtastningsbilledet Opsætning af Index. Udfør nødvendige ændringer. Godkend editorboxen med Godkend opsætningen af indexet F3 F3 Afslutte Godkend resten med F3 197
Kartotek Index (slet) Funktion Fremgangsmåde Tast Finde index Slette index Generelt/Tilpasning/Udviklingsmenu/DBD/Ret/ Kerne Vælg kartotek fra den viste liste Vælg Indexbehandling/Slet fra den viste menu (Indexet slettes uden advarsel.) ENTER ENTER Afslutte Godkend resten med F3 Listbillede Opret Funktion Fremgangsmåde Tast Finde kartotek til listbillede Opsætte vindue Generelt/Tilpasning/Udviklingsmenu/Lst/Opret Vælg kartotek fra liste Indtastningsbilledet Opsætning af vinduet åbnes. De vigtigste felter at udfylde er: Søgenavn i liste Billedets navn som det skal søges under. Tekst i rammen Øvrige felter Indsætte felt Gentages for hvert felt der skal indsættes NB.: Benyt samme navn som det felt der skal slås op på i kartoteket, så åbnes listbilledet direkte. Indsæt den tekst der skal vises i rammen på selve listbilledet. Udfyldes feltet ikke, benytter systemet indholdet i det ovenstående felt Søgenavn i liste. Resten af felterne kan udfyldes efter eget valg, ellers udfyldes de automatisk med defaultværdier. Godkend med Billedet Design af listbillede vises. (Felter indsættes heri.) Felter indsættes i Design af listbillede. Vis plukkeliste over felter i kartoteket Vælg felt fra plukkelisten ENTER F3 INSERT ENTER Afslutte listbillede Billedet Opsætning af... felt vises. Godkend Gør klar til næste felt NB.: Felterne vises i den rækkefølge, de står i her. Hvis du ikke taster PIL NED bliver de indsat før. Gentag for næste felt eller Afslut og godkend. F3 PIL NED F3 198
Listbillede Ret Funktion Fremgangsmåde Tast Finde listbillede Generelt/Tilpasning/Udviklingsmenu/Lst/Ret Ændre opsætning af vindue Vælg kartotek fra liste Vælg listbillede fra liste Indtastningsbilledet Design af listbillede vises. Du kan nu vælge at indsætte eller ændre felter eller at ændre i opsætningen af vinduet. Åbn indtastningsbilledet Opsætning af vinduet Udfør nødvendige ændringer. Godkend med Du er tilbage i Design af listbillede. Indsætte felter Felter indsættes i Design af listbillede. ENTER ENTER CTRL+F6 F3 Gentages for hvert felt der skal indsættes Afslutte listbillede Slette felt Vis plukkeliste over felter i kartoteket Vælg felt fra plukkelisten Billedet Opsætning af... felt vises. Godkend Gør klar til næste felt NB.: Felterne vises i den rækkefølge, de står i her. Hvis du ikke taster PIL NED bliver de indsat før. Gentag for næste felt eller Afslut og godkend Et felt kan slettes ved at markere feltet med cursoren og taste INSERT ENTER F3 PIL NED F3 DELETE Listbillede Slet Funktion Fremgangsmåde Tast Finde listbillede Slette listbillede Generelt/Tilpasning/Udviklingsmenu/Lst/Slet Vælg kartotek fra liste Vælg listbillede fra liste Boksen Slet listbillede vises. Slet listbilledet (Listbilledet slettes.) ENTER ENTER JA 199
Menuer - Lille udviklingsmenu (CTRL F12) Funktion Fremgangsmåde Tast Kald af menuen Kald den lille udviklingsmenu Vælg XAL-Navne. Du ser en liste over applikationselementer tilhørende den sidste procestype du var inde i. Skift procestype (hvis nødvendigt) Vælg procestype og vis applikationselementer Vælg applikation der skal udføres Vælg linje der vises med Procestype=Applikation f.eks. Form=CustTable og overfør linjen til feltet CTRL+F12 ALT+T ENTER ENTER ENTER Menuer Lokalmenuer Funktion Fremgangsmåde Tast Menusti Generelt/Tilpasning/Udviklingsmenu/FRM/Ret Indsætte Ændre Slette Opsætte Vælg skærmbillede (form) fra plukkelisten. Aktiver Lokalmenuen Du ser nu lokalmenuen til det aktuelle skærmbillede. Indsætning, ændring eller sletning af menupunkter foregår nu som i huskelisten: Menuer Opsætning af menupunkt. I opsætning af menu kan du angive: Menutitel F10 CTRL+F6 Om baggrunden skal ryddes Om menuen er den første i en serie Om menuen skal forlades efter valg Hvilken rammetype de skal anvendes 200
Menuer Opsætning af menupunkt Funktion Fremgangsmåde Tast Finde plads til menupunkt Du kommer fra en af huskelisterne: Menuer Undermenuer til gittermenuer Menuer Generelle menuer Menuer Lokale menuer PILE eller hurtigvalg Vælge indsætte, ændre eller slette Ved indsætte eller ændre Placér bjælken hvor der skal indsættes et nyt menupunkt, eller hvor der skal ændres i et eksisterende. Du kan nu vælge: at indsætte et nyt menupunkt at ændre i et eksisterende menupunkt at slette et menupunkt I de to første tilfælde åbnes opsætningsbilledet Opsætning af menupunkt med felterne: INS ENTER DEL Proces Angiv procestype eller vælg fra plukkeliste. ALT+H Parametre til proces Menu-punktets navn Bogstav til hurtigvalg Hjælpetekst Gruppe rettigheder Anfør hvilke parametre der skal benyttes til processen f.eks. Form=DebKart, hvis det er processen Form-afvikling. Se evt. huskelisten: Menuer - Lille Udviklingsmenu. Anfør det navn der skal stå i menuen. Er der kun et menupunkt i menuen, vises navnet ikke. Derimod udføres punktet umiddelbart. Bogstav til aktivering af menuen direkte. Teksten vises på nederste linje på skærmen. Du kan åbne feltet med og indsætte grupper eller slette grupper Hvis ingen grupper angives, kan alle afvikle menupunktet. Angives en eller flere grupper er det kun de angivne, der kan se og afvikle menupunktet. (CTRL+F12) ENTER INS DEL 201
Form Vindue (opret) Funktion Fremgangsmåde Tast Opsætte vindue Åbne opsætning af vindue Generelt/Tilpasning/Udviklingsmenu/Frm/Opret Indtastningsbilledet Opsætning af vinduet åbnes. De vigtigste felter at udfylde er: Søgenavn i liste Formens navn som den skal søges under. Tekst i rammen Vinduets højde Bredde Farvesæt Vindue Afslutte form Indsæt den tekst der skal vises i rammen på selve skærmbilledet. Angiv vinduets højde i antal linjer. Angiv vinduets bredde i antal karakterer (kolonner) Som standard vælges farvesæt2. Fast: Dette er default værdien. Er god at anvende ved Enkelt Record Blokke, idet vinduets højde og bredde benyttes som angivet. CTRL+R kan kun skalere ned og felterne flyttes ikke. Skalerbart: Værdien Skalérbart er god ved Multi Record Blokke. CTRL+R kan både skalere op og ned, og felterne flyttes automatisk. Godkend med Vinduet vises på skærmen og er klar til oprettelse af blokke. Billedet kan lukkes med F3 eller der kan oprettes blokke (se huskelister hertil). F3 F3 202
Form Vindue (ret) Funktion Fremgangsmåde Tast Finde form Generelt/Tilpasning/Udviklingsmenu/Frm/Ret Vælg form fra listen over forms ENTER Formen vises på skærmen. Åbne vindue Åbn for indtastningsbilledet Opsætning af vindue. CTRL+F6 Foretag ønskede ændringer. Afslutte form Godkend med Formen vises igen på skærmen. Billedet kan lukkes med eller blokke og felter kan behandles (se huskelister hertil) F3 F3 Form Vindue (slet ) (dvs. hele formen) Funktion Fremgangsmåde Tast Finde form Slette form Generelt/Tilpasning/Udviklingsmenu/Frm/Slet Vælg form fra listen over forms Der vises en advarselsboks, med spørgsmålet om formen skal slettes. Slet formen (formen slettes herefter.) Slet ikke formen (formen slettes ikke.) ENTER JA NEJ 203
Form Enkelt record blok (opret) Funktion Fremgangsmåde Tast Finde form Generelt/Tilpasning/Udviklingsmenu/Frm/Ret Vælg form fra listen over forms ENTER Formen vises på skærmen. Oprette blok Opret en blok. SH+F2 Gentages for hver blok der skal oprettes Blok navn Kartotek Indtastningsbilledet Opsætning for blok åbnes. De vigtigste feltet at udfylde er: Feltet skal udfyldes. Anvend om muligt samme navn som kartoteket. Det gør det nemmere at anvende forms control kommandoerne, idet disse altid refererer til bloknavnet og ikke til kartoteksnavnet. Udfyldes kun når blokken skal indeholde felter fra et kartotek. Hent kartoteksnavnet fra listen over kartoteker Bemærk: Felterne Autogenerér blok og Auto options skal ikke udfyldes ved Enkelt Record Blokke. ALT+H Afslutte form Godkend med Formen vises igen på skærmen. Billedet kan lukkes med eller blokke og felter kan behandles (se huskelister hertil) F3 F3 204
Form Enkelt record blok (ret) Funktion Fremgangsmåde Tast Finde form Generelt/Tilpasning/Udviklingsmenu/Frm/Ret Vælg form fra listen over forms ENTER Formen vises på skærmen. Bloknavn ses i bunden af skærmen. Åbne blok Vælg blok der skal ændres SHIFT+F8 Gentages for hver blok der skal rettes Afslutte form Åbn for indtastningsbilledet Opsætning for blok Foretag ønskede ændringer. Godkend med Formen vises igen på skærmen. Billedet kan lukkes med F3 eller blokke og felter kan behandles (se huskelister hertil) SHIFT+F6 F3 F3 Form Enkelt record blok (slet) Funktion Fremgangsmåde Tast Slette blok Exportere form Blokke kan ikke slette i en form. Hvis en blok skal slettes, skal formen først eksporteres ud i en fil i styresystemet, bloklinjerne fjernes og formen importeres igen. Generelt/Tilpasning/Udviklingsmenu/Frm/ Export/Export Vælg form fra listen over forms ENTER Angiv stinavn på den fil hvortil formen skal exporteres. Slette blok i fil Generelt/Tilpasning/Hop til operativsystem Åbn filen med den exporterede form. (Anvend dos editoren eller andet værktøj til editering.) Slet alle linjer vedr. den blok der fjernes. Linjerne begynder med BLOCK bloknavn og slutter med ENDBLOCK. Afslut og godkend ændringerne. Importere form igen Luk styresystemet Generelt/Tilpasning/Udviklingsmenu/Frm/ Import Angiv stinavn på filen med formen der skal importeres. Blokken er nu fjernet fra formen. EXIT 205
Form Multi record blok (opret) Funktion Fremgangsmåde Tast Finde form Generelt/Tilpasning/Udviklingsmenu/Frm/Ret Vælg form fra listen over forms ENTER Formen vises på skærmen. Oprette blok Opret en blok SHIFT+F2 Gentages for hver blok der skal oprettes Blok navn Kartotek Autogenerér blok Indtastningsbilledet Opsætning for blok åbnes. De vigtigste feltet at udfylde er: Feltet skal udfyldes. Anvend om muligt samme navn som kartoteket. Det gør det nemmere at anvende forms control kommandoerne, idet disse altid refererer til bloknavnet og ikke til kartoteksnavnet. Udfyldes kun når blokken skal indeholde felter fra et kartotek. Hent kartoteksnavnet fra listen over kartoteker. Udfyldes med JA ALT+H Auto options Åbn indtastningsbilledet Blok auto-options ENTER Ved anvendelse af defaultværdierne fylder det autogenererede område automatisk hele vinduet. Du kan ændre værdierne efter ønske. Afslutte form Godkend billedet Blok auto-options Godkend billedet Opsætning for blok Godkend og luk selve formen med eller arbejd videre med blokke og felter (se huskelister hertil). F3 F3 F3 206
Form Multi record blok (ret) Funktion Fremgangsmåde Tast Finde form Generelt/Tilpasning/Udviklingsmenu/Frm/Ret Vælg form fra listen over forms ENTER Formen vises på skærmen. Bloknavn ses i bunden af skærmen. Åbne blok Vælg blok der skal ændres SHIFT+F8 Gentages for hver blok der skal ændres Afslutte Åbn for indtastningsbilledet Opsætning for blok Foretag ønskede ændringer i selve indtastningsbilledet Opsætning for blok eller i billedet Blok auto-options. Godkend med Formen vises igen på skærmen. Billedet kan lukkes med eller blokke og felter kan behandles (se huskelister hertil). SHIFT+F6 F3 F3 Form Multi record blok (slet) Funktion Fremgangsmåde Tast Slette blok Der henvises til huskelisten: Form Enkelt record blok (slet). 207
Form Felter (opret) Funktion Fremgangsmåde Tast Finde form Generelt/Tilpasning/Udviklingsmenu/Frm/Ret Vælg form fra listen over forms ENTER I enkelt record blok I multi record blok Indsætte felt Gentages for hvert felt der skal indsættes Formen vises på skærmen. Du skal selv placere cursoren, hvor feltet skal stå. I en multi record blok, autogenereret, placeres felterne automatisk. Du skal derfor ikke selv placere cursoren. Indsæt feltet. Du ser nu boksen til indtastning af feltnavn. Vis liste over felter Hent feltnavn fra listen Du ser nu skærmbilledet med feltets opsætning..opsætningen kan ændres efter behov. F2 ENTER ENTER Godkend feltet Afslutte form Godkend og afslut hele formen F3 F3 Form Felter (ret) Funktion Fremgangsmåde Tast Finde form Generelt/Tilpasning/Udviklingsmenu/Frm/Ret Vælg form fra listen over forms ENTER Formen vises på skærmen. Åbne felt Placér cursoren på feltet PILE Gentages for hvert felt der skal ændres Åbn billedet med feltets opsætning Foretag ønskede ændringer i opsætningen. Godkend feltet F6 F3 Afslutte form Godkend og afslut hele formen F3 208
Form Felter (slet) Funktion Fremgangsmåde Tast Finde form Generelt/Tilpasning/Udviklingsmenu/Frm/Ret Vælg form fra listen over forms ENTER Formen vises på skærmen. Finde felt Placér cursoren på feltet PILE Gentages for hvert felt der skal slettes Slet feltet ALT+F9 Afslutte form Godkend og afslut hele formen F3 Form Triggere i vinduet Funktion Fremgangsmåde Tast Finde trigger i vindue Generelt/Tilpasning/Udviklingsmenu/Frm/Ret Vælg form fra listen over forms ENTER Formen vises på skærmen. Åbn skærmbilledet Opsætning af vinduet Vælg feltet Forms formler og åbn listen over triggere CTRL+F6 PILE ENTER Åbne trigger Vælg trigger og åbn tilhørende editorboks PILE og ENTER Gentages ved flere trigger Indtast ønsket kode. Afslutte trigger i vindue Godkend og afslut koden Vælg anden trigger eller luk listen over triggere Godkend og afslut Opsætning af vinduet F3 ESC F3 209
Form Triggere i blokke Funktion Fremgangsmåde Tast Finde blok med triggere Åbne trigger Gentages ved flere triggere Afslutte bloktrigger Generelt/Tilpasning/Udviklingsmenu/Frm/Ret Vælg form fra listen over forms Formen vises på skærmen. Vælg blok Åbn skærmbilledet Opsætning for blok Vælg feltet Blok formler og åbn listen over triggere Vælg trigger og åbn tilhørende editorboks Indtast ønsket kode. Godkend og afslut koden Vælg anden trigger eller luk listen over triggere Godkend og afslut Opsætning for blok Afslut selve formen ENTER SHIFT+F8 SHIFT+F6 PILE / ENTER PILE / ENTER F3 ESC F3 F3 Form Triggere i felter Funktion Fremgangsmåde Tast Finde felt med triggere Generelt/Tilpasning/Udviklingsmenu/Frm/Ret Vælg form fra listen over forms Formen vises på skærmen. Vælg felt Åbn skærmbilledet Opsætning af felt Vælg feltet Formler for selve feltet og åbn listen over triggere ENTER PILE F6 PILE ENTER Åbne trigger Vælg trigger og åbn tilhørende editorboks PILE og ENTER Gentages ved flere triggere Afslutte felttrigger Indtast ønsket kode. Godkend og afslut koden Vælg anden trigger eller luk listen over triggere Godkend og afslut Opsætning af felt Afslut selve formen F3 ESC F3 F3 210
Del III Rapporter 211
1. Rapport XAL Mål med lektionen Formålet med denne lektion er at give deltagerne grundlæggende viden om opbygningen af rapportgeneratoren i C5. I lektionen lægges der særlig vægt på rapportgeneratorens XAL editor. Kommandoerne SEARCH, USING, ORDER, WHERE og PROMPT repeteres. Efter lektionen skal kursisterne kunne: Anvende rapportgeneratorens XAL editor til indtastning af XAL kørsler Anvende kommandoen OUTPUT, og kende forskel på anvendelsen af OUTPUT og PRINT Gemme rapporter. Generelt Rapportgeneratoren er det værktøj i C5 der anvendes til opbygning og udskrivning af rapporter på papir. Generatoren anvendes både til oprettelse og vedligeholdelse af rapporter. Den kan startes i udviklingsmenuen i kolonnen REP og består af to processer. Processer i rapportgeneratoren Rapportgeneratoren i C5 arbejder med to processer. Rapportgeneratorens to processer Nr Navn Anvendelse 14 Rapport-opbygning Oprettelse af nye og ændring af eksisterende rapporter i menulinjerne Opret og Ret 15 Rapport-afvikling Afvikling af rapporter i menulinjen Kør Rapporter der oprettes og vedligeholdes i de to processer har alle for- og efternavne. Navne på rapporter I nye rapporter bestemmer du selv, hvad fornavnet skal være. Efternavnet tildeles automatisk af rapportgeneratoren afhængigt af hvilket lag, der er åbnet. I denne lektion tages der udgangspunkt i brugerlaget USR, der er det lag, der altid arbejdes i som standard. (Der henvises til Supervisor kurset for forklaring til de forskellige lag). Standardrapporterne der udvikles af Microsoft ligger i SYS laget, og de tilrettede standardrapporter og bruger-rapporter ligger i USR laget. Når standardrapporter i SYS laget tilrettes af brugerne, gemmes de automatisk i brugerlaget under samme fornavn som standardrapporten, men med efternavnet USR. 212
Vigtigt! Standardrapporterne kan ikke overskrives, og de kan ikke slettes. Det kan bruger-rapporterne derimod. Det anbefales derfor at udvise forsigtighed, når der ændres i brugerrapporter. C5 vers. 2012 -> Eksempel på rapporter i udviklingsmenuen i kolonnen REP Rapportnavn Efternavn $InvenList $CustBalanceList Usr Usr... Sys CustBalanceList Sys... Sys... Sys I ovenstående eksempel er rapporten InvenList en ny brugerrapport, hvorfor den har fået efternavnet USR. Rapporten CustBalanceList findes både i en SYS og en USR version. Dvs. at der er foretaget en tilretning af den originale CustBalanceList. Selve rapportgeneratorens opbygning behandles i næste afsnit. Bemærk! Navne på rapporter og andre elementer skal altid være i ét ord. Eneste tegn, ud over bogstaverne i alfabetet, er understreg og ved navne der består af flere ord, bør hvert ord starte med stort bogstav, men uden mellemrum mellem ordene. C5 vers. -> 4.1 Eksempel på rapporter i udviklingsmenuen i kolonnen REP Rapportnavn Efternavn $LagerListe $DebSaldoListe Usr Usr... Sys DebSaldoListe Sys... Sys... Sys I ovenstående eksempel er rapporten LagerListe en ny brugerrapport, hvorfor den har fået efternavnet USR. Rapporten DebSaldoListe findes både i en SYS og en USR version. Dvs. at der er foretaget en tilretning af den originale DebSaldoListe. Selve rapportgeneratorens opbygning behandles i næste afsnit. Bemærk! Navne på rapporter og andre elementer skal altid være i ét ord. Eneste tegn, ud over bogstaverne i alfabetet, er understreg og ved navne der består af flere ord, bør hvert ord starte med stort bogstav, men uden mellemrum mellem ordene. 213
Rapportgeneratorens opbygning Rapportgeneratoren består af to hovedområder: Område Rapport-XAL Rapport-definition Anvendelse Indeholder XAL kørsel med kommandoer til udtræk af data fra kartoteker i databasen Definition af linjer og opsætning af layout Data udtrækkes i rapport-xal fra kartoteker og videresendes til rapport-definition til udskrivning i rapporten, som illustreret herunder. Dataudtræk med XAL Kartoteker Rapport- XAL Rapport-definition Når rapportgeneratoren aktiveres og åbnes, vises begge hovedområder samtidig. Områdernes placering i rapportgeneratoren ses i figuren på næste side. Hovedområdernes placering i rapportgeneratoren Rapport-XAL Rapport-definition Ved oprettelse af nye rapporter er det frivilligt hvilket hovedelement, der skal anvendes først. Denne lektion tager udgangspunkt i rapport-xal, der behandles i næste afsnit. 214
Rapport-XAL Rapport-XAL er en almindelig XAL editorbox, der befinder sig i rapportgeneratorens øverste del. Rapport-XAL i form af en almindelig XAL editorboks ALT + Z Rapport-XAL i form af en XAL-editorboks SH + F6 Rapport-definition Når rapportgeneratoren åbnes stilles cursoren automatisk i området rapport-definition i venstre side. Med SH+F6 kan der herefter skiftes til rapport-xal området. Rapportgeneratorens XAL editorbox fylder som default 3 linjer, men kan med ALT+Z zoomes op til fuld størrelse, så det er nemmere at overskue den kode, der indtastes. I editorboxen kan alle de normale XAL kommandoer og funktionstaster anvendes til søgning af data, der skal udskrives i rapporten. For at trække data ud af databasen og sende disse videre til rapporten, anvendes bl.a. XAL kommandoerne SEARCH og PROMPT, der repeteres efterfølgende. SEARCH (repetition) SEARCH kommandoerne består af SEARCH, END, USING, ORDER og WHERE. SEARCH kommandoernes betydning Kommando Betydning SEARCH Udfører en løkke ved at gennemløbe poster i et kartotek. Efterfølges af navnet på kartotek der skal gennemløbes. END USING Afslutter søgeløkker Angiver at der skal sorteres efter et fast index. Indexnavnet skrives efter kommandoen USING. ORDER Angiver at der skal sorteres efter et kartoteksfelt. Feltnavnet angives efter kommandoen ORDER. WHERE Angiver at der skal foretages en afgrænsning under gennemløbet. Kommandoen efterfølges af en betingelse, der skal være opfyldt for, at poster udleveres til XAL kørslen. 215
Herunder nogle få eksempler på anvendelsen af SEARCH kommandoerne. C5 vers. 2012 -> Eksempel på kartoteksgennemløb med sortering efter fast index SEARCH InvenTable USING ItemIdx PRINT ItemNumber,, ItemName1,, CostPrice END PAUSE C5 vers. -> 4.1 Eksempel på kartoteksgennemløb med sortering efter fast index SEARCH LagKart USING VareIdx PRINT VareNummer,, VareNavn1,, KostPris END PAUSE C5 vers. 2012 -> Eksempel på kartoteksgennemløb med sortering efter kartoteksfelt SEARCH InvenTable ORDER BY CostPrice PRINT ItemNumber,, ItemName1,, CostPrice END PAUSE C5 vers. -> 4.1 Eksempel på kartoteksgennemløb med sortering efter kartoteksfelt SEARCH LagKart ORDER BY KostPris PRINT VareNummer,, VareNavn1,, KostPris END PAUSE C5 vers. 2012 -> Eksempel på afgrænsning af poster med varenummer >= 10000 SEARCH InvenTable WHERE ItemNumber >= 10000 PRINT ItemNumber,, ItemName1,, CostPrice END C5 vers. -> 4.1 Eksempel på afgrænsning af poster med varenummer >= 10000 SEARCH LagKart WHERE VareNummer >= 10000 PRINT VareNummer,, VareNavn1,, KostPris END HUSK at PRINT kun udskriver på skærmen. Skal der udskrives på en printer anvendes kommandoen OUTPUT, der behandles i afsnittet om OUTPUT. PROMPT (repetition) PROMPT kommandoen anvendes til at give brugeren mulighed for selv at indtaste værdier i indtastningsfelter i en dialogboks. PROMPT kommandoerne består af PROMPT, INPUT, AT, GET og REF. PROMPT kommandoernes betydning Kommando PROMPT Betydning Danner en dialogboks bestående af overskrifter, ledetekster og indtastningsfelter. 216
Alle tekster SKAL stå i anførselstegn. GET GET efterfølges af navnet på en variabel i en parantes. Den angivne variabel modtager værdien, der indtastes i indtastningsfeltet. REF Anvendes for at give brugeren hjælp fra et givet kartotek. REF efterfølges af navn på referencekartotek og felt. Bruger kan med ALT+H slå op i det angivne kartotek. INPUT INPUT AT Afslutter boksen. Boksen placeres i øverste venstre hjørne på skærmen Afslutter boksen. Boksen placeres et bestemt sted på skærmen. AT efterfølges af kolonnenummer og linjenummer. Herunder eksempler på anvendelsen af PROMPT kommandoerne. Promptboks med to variabler INT &Antal STR 20 &VareNavn PROMPT Indtast vareinformationer,,, Antal...: GET (&Antal), Varenavn...: GET (&VareNavn) INPUT Promptboks med tekstlinje uden GET, men med INPUT AT STR 15 &Varenr PROMPT Indtast vareinformationer,,, Varenummer...: GET (&Varenr),, Hvis det ønskes, må varenummeret, gerne være alfanumerisk. INPUT AT 15,4 OUTPUT Kommandoen OUTPUT anvendes i Rapport-XAL til at sende udsøgte poster videre til rapportdefinition, så værdier herfra kan udskrives på printer. Syntaks for OUTPUT kommandoen OUTPUT <Kartoteksnavn> Bemærk at OUTPUT kun efterfølges af navnet på et kartotek og ikke af navne på felter, som det er tilfældet med PRINT kommandoen. Hvor PRINT sender data til et vindue på skærmen, sender OUTPUT i stedet data til en rapport, der kan udskrives på papir. Anvendelse af PRINT eller OUTPUT 217
XAL kørsel SEARCH Kartotek Skærm PRINT END OUTPUT Rapport Forskel på PRINT og OUTPUT Når data skal sendes til et vindue på skærmen, skal programmøren selv styre hvilke felter, der skal udskrives. Det sker ved at angive PRINT kommandoen efterfulgt af navnene på de enkelte felter. Når data skal sendes til en rapport, anvendes OUTPUT kommandoen, der tager fat i hele posten og sender samtlige felter videre til rapport-definitionen, hvor de enkelte felter udfyldes med værdier fra den modtagne post. Eksempler på anvendelse af PRINT og OUTPUT Efterfølgende vises eksempler på anvendelse af de to kommandoer PRINT og OUTPUT. C5 vers. 2012 -> Eksempel på PRINT SEARCH ItemTable PRINT ItemNumber,, ItemName1,, CostPrice END PAUSE C5 vers. -> 4.1 Eksempel på PRINT SEARCH LagKart PRINT VareNummer,, VareNavn1,, KostPris END PAUSE PRINT kommandoen efterfølges af de enkelte feltnavne, der skal udskrives på skærmen. C5 vers. 2012 -> Eksempel på OUTPUT SEARCH InvenTable OUTPUT InvenTable END C5 vers. -> 4.1 Eksempel på OUTPUT SEARCH LagKart OUTPUT LagKart 218
END OUTPUT kommandoen efterfølges af navnet på kartoteket. Det betyder at denne kommando sender hele posten videre til rapport-definitionen, hvor felternes værdier fordeles på rapporten. Bemærk at PAUSE ikke er nødvendig her. Komplet eksempel på XAL kode C5 vers. 2012 -> Promptboks med REF anvendt sammen med SEARCH Str 10 &FraVare Str 10 &TilVare PROMPT Udsøgning af lagervarer,,, Fra varenummer: GET(&FraVare REF InvenTable.ItemNumber), Til varenummer: GET(&TilVare REF InvenTable.ItemNumber) INPUT AT 15,5 SEARCH InvenTable WHERE ItemNumber >= &FraVare AND ItemNumber <= &TilVare OUTPUT InvenTable END I ovenstående eksempel anvendes variablerne fra promptboksen til afgrænsning inde i WHERE. Når XAL kørslen eksekveres, vises promptboksen som i eksemplet herunder. C5 vers. -> 4.1 Promptboks med REF anvendt sammen med SEARCH Str 10 &FraVare Str 10 &TilVare PROMPT Udsøgning af lagervarer,,, Fra varenummer: GET(&FraVare REF Lagkart.VareNummer), Til varenummer: GET(&TilVare REF LagKart.VareNummer) INPUT AT 15,5 SEARCH LagKart WHERE VareNummer >= &FraVare AND VareNummer <= &TilVare OUTPUT LagKart END I ovenstående eksempel anvendes variablerne fra promptboksen til afgrænsning inde i WHERE. Når XAL kørslen eksekveres, vises promptboksen som i eksemplet herunder. Eksempel på promptbox med indtastningsfelter Udsøgning af lagervarer Fra varenummer: Til varenummer: Resultat af ovenstående XAL kørsel 219
18000 Kabinet 1.250,20 16000 Ram 520,40 12000 14000 Harddisk type 2 CD romdrev 1.230,75 50,10 20000 Skærm 1.000,10 Afhængig af hvad brugeren indtaster i PROMPT boxen, vil listen kun indeholde de varer, der har et varenummer, der er større end eller lig med og mindre end eller lig med de varenumre, der blev indtastet. 220
Opgaver: Rapport XAL Opgave 1: Rapport-XAL til Udlånsliste Formål med opgaven At oprette XAL koden til en rapport med navnet Udlånsliste. Rapporten er sorteret efter debitor og udlånsnummer. Beskrivelse Der skal oprettes XAL kode til en rapport med navnet Udlånsliste. Data til listen hentes fra kartoteket UDLUdlånsKart og posterne afgrænses på debitorkontonummer. Afgrænsninger skal kunne indtastes i en promptboks med referencer til debitorkartotekets kontonummer. Forløb i C5 1 Opret en ny rapport. 2 Vælg Rapport XAL, hvor du indsætter og tilretter startkommentarer. 3 Opret variabler til Fra konto og Til konto 4 Opret en promptboks med overskriften Udlånsliste. Boksen skal prompte for Fra konto og Til konto. Indsæt referencer til kartoteket CustTable feltet Account, så det bliver muligt i promptboksen at anvende ALT+H. 5 Opret en søgeløkke på kartoteket UDLUdlånsKart. Anvend indexet UDLDebUdlIdx til sortering. Anvend afgrænsningerne fra variablerne i promptboksen. Send data til Rapport definition med OUTPUT kommandoen. 6 Godkend koden i Rapport XAL editoren og luk rapporten. 7 Afprøv om promptboksen ser rigtig ud og virker mht. opslag i debitorkartoteket. 221
2. Rapport definition grundlæggende Mål med lektionen At give deltagerne grundlæggende indsigt i rapportgeneratorens definitionsområde. Efter lektionen skal kursisterne kunne: Oprette rapportlinjer med kartoteksfelter, ledetekster og fritekster Anvende kommandoen OUTPUT og kartotekskolonnen som bindeled mellem rapportgeneratorens XAL-editor og definitionsområdet Afvikle rapporter. Generelt Når der skal udfærdiges rapporter i rapportgeneratoren, dannes der først en XAL-kode i rapport-xal. I denne kode indsættes kommandoen OUTPUT, der sørger for at sende udtrukne poster videre til definitionsområdet. Dataudtræk med XAL Kartoteker Rapport-XAL (OUTPUT) Rapport-definition Definitionsområdet Introduktion til definitionsområdet Rapportgeneratorens definitionsområde består af fire kolonner som vist i illustrationen herunder. 222
Rapport-definition med de fire kolonner Linje-XAL Linje- Typer Kartoteker Layoutområde Rapport-definition De fire kolonners betydning Kolonner Anvendelse Linje-typer Kartoteker Linje-XAL Layoutområde Anvendes til definition af, hvilke typer linjer der skal udskrives. En rapport kan, ud over selve dataene, f.eks. indeholde linjer med sideoverskrifter eller bundtekster, samt flere andre former for linjer. Dette behandles nærmere i lektionen om linjetyper. Anvendes først og fremmest til at definere, hvilket kartotek den enkelte linje får sine data fra, f.eks. når der udskrives data i rapporten. Beregnet til XAL kode der kun gælder den aktuelle linje. Her opsættes selve rapportens layout med felter og fritekster. De enkelte kolonner og deres anvendelse bliver hver især behandlet nærmere i efterfølgende lektioner på dette og det efterfølgende kursus. Der vil således ikke blive givet en komplet vejledning alene på dette kursus, men nok til at kunne fremstille egne rapporter og redigere i eksisterende. Oprettelse af rapportlinjer foregår ved at udfylde de forskellige kolonner med værdier, der svarer til udskriftens indhold og udsøgte data. Linjetypen bestemmer ofte, hvad linjen skal anvendes til i rapporten, og hvordan de øvrige kolonner skal udfyldes. Den vigtigste linjetype er Body, der behandles efterfølgende. 223
Skema med funktionstaster i rapportgeneratoren Feltbehandling F2 Opret felt Redigering ALT D Slet én linje CTRL F2 Opret felt Direkte fra kartotek SH F5 Kopiér felt eller afmærkede linjer ALT F2 Opret felt Ledetekst eller overskrift CTRL F5 Flyt felt eller afmærkede linjer F6 Ret felt Alle typer ALT I Indsæt felt eller afmærkede linjer ALT F9 Slet felt Stå først på feltet ALT L Afmærk linjer Anvend piletaster. Fjernes med ALT+F5 SH F6 Rapport XAL Hop til editorboksen DELETE Slet markerede linjer Flere funktioner kan findes med F1. 224
Linjetypen Body Kolonnen linjetyper De vigtigste linjer i en rapport er de, der udgør selve kroppen i rapporten. I definitionsområdet kaldes disse linjer for Body linjer. Body linjer oprettes ved at vælge typen Body i kolonnen med linjetyper. Rapportens krop i form af data fra databasen Disse linjer angives som linjetypen Body Body linjer er således de linjer i rapporten, der indeholder data fra databasen. Derfor indeholder Body linjerne i definitionsområdet også informationer om, hvilket kartotek data kommer fra, og hvilke felter der skal udskrives på papiret. Body linjer til en rapport opstilles som vist i nedenstående figur. C5 vers. 2012 -> Opsætning Body linje i definitionsområdet Body InvenTable ItemNumber ItemName1 CostPrice Layoutområde Definitionsområde Bemærk at kartotekskolonnen og layoutområdet også er udfyldt. Dette er vigtigt ved linjetypen Body. C5 vers. -> 4.1 Opsætning op Body linje i definitionsområdet Body LagKart VareNummer VareNavn1 KostPris Layoutområde Definitionsområde Bemærk at kartotekskolonnen og layoutområdet også er udfyldt. Dette er vigtigt ved linjetypen Body. 225
Kartotekskolonnen Kartotekskolonnen er bindeleddet mellem rapportgeneratorens XAL-editor og definitionsområdet. Kartotekskolonnen skal udfyldes med navnet på det kartotek, der angives med kommandoen OUTPUT i rapport-xal. C5 vers. 2012 -> Kartotekskolonne med samme kartotek som i OUTPUT SEARCH InvenTable OUTPUT InvenTable END Body InvenTable ItemNumber ItemName1 CostPrice Layoutområde Definitionsområde C5 vers. -> 4.1 Kartotekskolonne med samme kartotek som i OUTPUT SEARCH LagKart OUTPUT LagKart END Body LagKart VareNummer VareNavn1 KostPris Layoutområde Definitionsområde Hvis kartotekskolonnen udfyldes med et andet kartoteksnavn end det, der angives i OUTPUT kommandoen, afvikles rapporten ikke korrekt. Første gang der indsættes en Body linje, udfyldes kartotekskolonnen automatisk med en *. Denne stjerne er et wildcard, der kan erstatte et hvilket som helst kartotek. For at dette fungerer, kræver det, at kartoteksfelterne i layoutområdet bliver kvalificeret med kartoteksnavnet. Det anbefales, at der altid indsættes kartoteksnavn! Det anbefales, at der ALTID indsættes kartoteksnavn i kartotekskolonnen, idet det kan blive svært, at overskue definitionsområder med mange rapportlinjer. Resultat af ovenstående rapportopstilling 18000 16000 Kabinet Ram 1.250,20 520,40 12000 Harddisk type 2 1.230,75 14000 20000 CD romdrev Skærm 50,10 1.000,10 226
Layoutområdet Layoutområdet anvendes til beskrivelse af rapportens udseende eller layout. Beskrivelsen udføres ved at indsætte kartoteksfelter, ledetekster eller fritekster. Kartoteksfelter Kartoteksfelter kan indsættes med forskellige metoder. I denne lektion anvendes metoden CTRL+F2. Med denne metode skal cursoren først placeres i layoutområdet i den kolonne, hvor feltet skal starte. Når funktionstasten aktiveres, vælges først kartoteksnavn og derefter feltnavn, der så overføres til layoutområdet. C5 vers. 2012 -> Oprettelse af felt i layoutområde Cursor placeres, hvor feltet skal starte. Body InvenTable ItemNumber ItemName1 Ctrl F2 Vælg kartotek Vælg felt Bemærk! Ved oprettelse af felter med CTRL+F2, føres kartoteksnavnet med over i feltet i layoutområdet. I ovenstående eksempel står der ItemName1 i feltet, ved rigtig overførsel med CTRL+F2 kommer der til at stå InvenTable.ItemName1. Når felter foranstilles med kartoteksnavn, siges det, at feltet er kvalificeret. C5 vers. -> 4.1 Oprettelse af felt i layoutområde Cursor placeres, hvor feltet skal starte. Body LagKart VareNummer VareNavn1 Ctrl F2 Vælg kartotek Vælg felt 227
Bemærk! Ved oprettelse af felter med CTRL+F2, føres kartoteksnavnet med over i feltet i layoutområdet. I ovenstående eksempel står der VareNavn1 i feltet, ved rigtig overførsel med CTRL+F2 kommer der til at stå LagerKart.VareNavn1. Når felter foranstilles med kartoteksnavn, siges det, at feltet er kvalificeret. Flere bodylinjer i samme rapport Der kan være flere body linjer til samme kartotek. Ovenstående eksempel kunne f.eks. ændres, så felterne står under hinanden. C5 vers. 2012 -> Flere Body linjer i samme rapport SEARCH InvenTable OUTPUT InvenTable END Body Body Body Body InvenTable InvenTable InvenTable InvenTable ItemNumber ItemName1 CostPrice C5 vers. -> 4.1 Flere Body linjer i samme rapport SEARCH LagKart OUTPUT LagKart END Body Body Body Body LagKart LagKart LagKart LagKart VareNummer VareNavn1 KostPris I layoutet er der yderligere indsat en ekstra bodylinje uden felter. Denne vil medføre, at der udskrives en blank linje. Hver gang OUTPUT kommandoen eksekveres i søgeløkken, sendes der data til definitionsområdet, hvor samtlige bodylinjer med samme kartoteksnavn bliver udskrevet. Det betyder, at varerne kommer til at stå under hinanden med en blank linje mellem hver vare. Bodylinjerne udskrives i den rækkefølge, de har i definitionsområdet. C5 vers. 2012 -> Flere Body linjer pr. post 18000 Kabinet 1.250,20 16000 Ram 520,40 12000 Harddisk type 2 1.230,75 228
I eksemplet udskrives ItemNumber, ItemName1 og CostPrice på hver sin linje. Hver vare adskilles med en blank linje. C5 vers. -> 4.1 Flere Body linjer pr. post 18000 Kabinet 1.250,20 16000 Ram 520,40 12000 Harddisk type 2 1.230,75 I eksemplet udskrives VareNummer, VareNavn1 og KostPris på hver sin linje. Hver vare adskilles med en blank linje. Fritekst og ledetekster Der findes forskellige muligheder for indtastning af tekst i layoutområdet. Fritekst Fritekst er tekst, der blot indtastes på linjerne, hvor der er plads til det. Det kan være bogstaver, tal og andre tegn, der findes på tastaturet. Teksten behøver ikke at stå i anførselstegn, sådan som det er nødvendigt, når PRINT kommandoen skriver tekst på skærmen. Teksten kan være forklaringer eller som ledetekster. Ledetekster kan dog også hentes direkte fra opsætningen i databasen. Ledetekster I stedet for selv at finde på ledetekster til felter, kan disse hentes direkte fra kartoteksdefinitionen med funktionen ALT+F2 Opret ledetekst. Når funktionen vælges, åbner skærmbilledet med overskriften Opret ledetekst. I skærmbilledet er det muligt, at justere ledetekstens udseende ved at udfylde nogle felter som vist i nedenstående skema: 229
Felter i Opret ledetekst Felter Værdier Kartotek Felt Feltets bredde Overskrift/ ledetekst Tekstens justering Ret til store bogstaver Navn på kartotek hvorfra ledetekst skal hentes. Åbnes med ALT+H, hvis det ikke vises ved åbning. Felt hvorfra der skal hentes ledetekst. Åbnes med ALT+H. Antal tegn ledeteksten skal fylde i rapporten. Ved bredder større end teksten udfyldes automatisk med punkter og kolon. Der kan vælges, om det er en kolonne overskrift eller en ledetekst. Forskellen er...: ved ledetekst. Vælg mellem: Venstrestillet, Højrestillet eller Centreret. Skal ledeteksten vises med store eller små bogstaver. Vælg mellem: Nej eller Ja. Feltbetingelse Ved at taste ENTER åbnes en editorboks, hvori der kan indtastes betingelser for, om ledeteksten skal udskrives eller ej. Der kan være fordele ved at anvende ledetekster fra kartotekerne, idet teksterne således altid er ens fra rapport til rapport. C5 vers. 2012 -> Opsætning af ledetekst og fritekst SEARCH InvenTable OUTPUT InvenTable END Body Body Body Body InvenTable VARENUMMER...: ItemNumber InvenTable VARENAVN...: ItemName1 InvenTable KOSTPRIS...: CostPrice InvenTable --------------------------------------- ALT+F2 Opret ledetekst 230
C5 vers. -> 4.1 Opsætning af ledetekst og fritekst SEARCH LagKart OUTPUT LagKart END Body Body Body Body LagKart VARENUMMER...: VareNummer LagKart VARENAVN...: VareNavn1 LagKart KOSTPRIS...: KostPris LagKart --------------------------------------- ALT+F2 Opret ledetekst I dette eksempel er der oprettet ledetekster foran hver af de tre felter. Ledeteksterne udskrives med store bogstaver. Den stiplede linje er et eksempel på fritekst. Linjen er tekst, idet den blot er dannet af bindestreger. Det kunne være * eller et hvilket som helst andet tegn. Eksempel på rapport med ledetekster og fritekster VARENUMMER...: 18000 VARENAVN...: Kabinet KOSTPRIS...: 1.250,20 --------------------------------------- VARENUMMER...: 16000 VARENAVN...: Ram KOSTPRIS...: 520,40 --------------------------------------- VARENUMMER...: 12000 VARENAVN...: Harddisk type 2 KOSTPRIS...: 1.230,75 --------------------------------------- 231
Opgaver: Rapport definition, grundlæggende Opgave 1: Rapport-Layout til Udlånsliste Formål med opgaven At oprette en Bodylinje i layoutet til rapporten Udlånsliste. Beskrivelse I rapporten Udlånsliste fra forrige opgave, skal der oprettes en enkelt Bodylinje med felterne DebitorKto, UdlånsNr, ReturDato og Forsikringssum. Forløb 1 Vælg rapporten Udlånsliste fra forrige opgave. 2 Opret en enkelt Bodylinje til kartoteket UDLUdlånsKart og indsæt felterne DebitorKto, UdlånsNr, ReturDato og ForsikringsSum. 3 Godkend rapporten. 4 Afprøv rapporten med forskellige afgrænsninger. 232
3. Linjetyper uden kartoteker Mål med lektionen Formålet med denne lektion er at give deltagerne overblik over linjetyper, der ikke anvender kartotekskolonnen. Efter lektionen skal kursisterne kunne: Anvende linjetyperne Page Header, Page Footer, Prolog og Epilog. Linjetyper generelt Ved at betragte en standardrapport på et stykke papir kan det ses, at den har forskellige grupper af indhold fordelt på papiret. Grundlæggende indeholder en rapport altid data fra databasen. Derudover kan der f.eks. være side hovede og side fod samt flere andre områder eller linjer med data. Grupper med informationer på papiret Side hovede Rapportens krop i form af data Side fod I rapportgeneratoren skelnes der mellem de forskellige grupper af indhold, idet disse gruppeinddelinger dannes i området rapport-definition vha. forskellige typer af linjer. Den første kolonne i definitions området anvendes til at definere de forskellige linjetyper, der kan være på rapporten. Kolonnen linjetyper i rapport-definition Linje Typer Rapport-definition 233
Linjetyper Linjetyperne vælges ved at placere cursoren i første kolonne. Tastes der ENTER, vises der en liste over mulige linjetyper. Den type, der vælges, overføres til kolonnen. Grupper af linjetyper Linjetyperne kan inddeles i følgende tre grupper: Linjetyper UDEN kartoteker Type Navn Anvendelse PgHd Page Header Overskriftslinje på hver side i rapporten PgFt Page Footer Underskriftslinje på hver side i rapporten Prol Prolog Indledende bemærkninger i starten af rapporten Epil Epilog Afsluttende bemærkninger i slutningen af rapporten Linjetyper MED kartoteker Type Navn Anvendelse GrHd Group Header Overskriftslinje til hver gruppe af poster i kartotek Body Body Linje med værdier fra OUTPUT kartoteket GrFt Page Header Underskriftslinje til hver gruppe af poster Subt Subtotal Kun til tekst der udskrives foran automatiske totaler Linjetype med speciel styring Type Navn Anvendelse Ctrl Control Linje der styres med specielle Control macroer Denne lektion behandler kun linjetyper uden kartoteker. Linjetypen Page header Linjetypen Page Header anvendes til at definere de linjer, der øverst på hver side udgør sidens hoved. Placering af Page Header på papiret Page Header Body linjer Rapportens krop i form af data 234
Sidens hoved er oftest almindelig tekst, der udskrives i toppen af hver side på rapporten. Det kan f.eks. være kolonneoverskrifter til Body linjer eller forskellige typer af felter. Teksterne kan indsættes som almindelig tekst uden citationstegn. C5 vers. 2012 -> Eksempel på anvendelse af Page Header SEARCH InvenTable OUTPUT InvenTable END PgHd Varenummer Navn Body InvenTable ItemNumber ItemName1 KostPris CostPrice C5 vers. -> 4.1 Eksempel på anvendelse af Page Header SEARCH LagKart OUTPUT LagKart END PgHd Body LagKart Varenummer Navn VareNummer VareNavn1 Kostpris KostPris Resultat VareNummer Navn KostPris 18000 Kabinet 1.250,20 16000 Ram 520,40 12000 Harddisk type 2 1.230,75 Flere linjer Der kan udmærket være flere Page Header linjer på en side, hvis der er behov for det. Blanke linjer opnås ved at indsætte linjer uden tekst eller felter i layoutområdet. 235
C5 vers. 2012 -> Eksempel med flere Page Header linjer SEARCH InvenTable OUTPUT InvenTable END PgHd PgHd PgHd PgHd Body Body Body InvenTable InvenTable InvenTable Vareliste med kostpriser Varenummer Navn Kostpris ----------- ------------------- --------- ItemNumber ItemName1 CostPrice VareNavn1 ItemName2 mmer C5 vers. -> 4.1 Eksempel med flere Page Header linjer SEARCH LagKart OUTPUT LagKart END PgHd PgHd PgHd PgHd Body Body Body LagKart LagKart LagKart Vareliste med kostpriser Varenummer Navn Kostpris ----------- ------------------- --------- VareNummer VareNavn1 KostPris VareNavn1 VareNavn2 mmer Resultat Vareliste med kostpriser VareNummer Navn KostPris ----------- -------------------- -------- 18000 Kabinet 1.250,20 Plastic grå 16000 Ram 520,40 8MB 12000 Harddisk type 2 1.230,75 500MB I ovenstående eksempel er der indsat en blank linje i Page Header og en i Body. Rækkefølge Page Header Hver gang der startes på en ny side i rapporten, udføres alle Page Header linjer automatisk. Linjerne udføres i den rækkefølge, de har i området rapport-definition. Body Bodylinjerne udføres ikke automatisk, men derimod hver gang kommandoen OUTPUT eksekveres i XAL-koden. 236
Linjetypen Page footer Linjetypen Page footer anvendes til at definere de linjer, der nederst på hver side udgør sidens fod. Placering af Page Footer på papiret Page Header Body linjer Rapportens krop i form af data Page Footer Sidens fod er oftest almindelig tekst, der udskrives i bunden af hver side på rapporten. Det kan f.eks. være en forklaring til forskellige forekomster i bodylinjerne. C5 vers. 2012 -> Eksempel på anvendelse af Page Footer SEARCH InvenTable OUTPUT InvenTable END PgHd Body PgFt InvenTable Varenummer Navn Kostpris ItemNumber ItemName1 CostPrice VareNavn1 Varetyper på listen: Vare, Stykliste, Ydelse mmer C5 vers. -> 4.1 Eksempel på anvendelse af Page Footer SEARCH LagKart OUTPUT LagKart END PgHd Body PgFt LagKart Varenummer Navn Kostpris VareNummer VareNavn1 KostPris VareNavn1 Varetyper på listen: Vare, Stykliste, Ydelse mmer Resultat Varenummer Navn Kostpris 237
18000 Kabinet 1.250,20 16000 Ram 520,40 12000 Harddisk type 2 1.230,75 Varetyper på listen: Vare, Stykliste, Ydelse Flere linjer Der kan udmærket være flere Page Footer linjer på en side, hvis der er behov for det. Blanke linjer opnås ved at indsætte linjer uden tekst eller felter i layoutområdet. C5 vers. 2012 -> Eksempel med flere Page Footer linjer SEARCH InvenTable OUTPUT InvenTable END PgHd PgHd PgHd PgHd Body PgFt PgFt PgFt InvenTable Vareliste med kostpriser C5 vers. -> 4.1 Eksempel med flere Page Footer linjer SEARCH LagKart OUTPUT LagKart END PgHd PgHd PgHd PgHd Body PgFt PgFt PgFt Resultat LagKart Vareliste med kostpriser Varenummer Navn Kostpris ----------- ------------------- --------- ItemNumber ItemName1 CostPrice VareNavn1 Listen mmer indeholder varetyperne: Vare Stykliste Ydelse Vareliste med kostpriser Varenummer Navn Kostpris ----------- ------------------- --------- VareNummer VareNavn1 KostPris VareNavn1 Listen mmer indeholder varetyperne: Vare Stykliste Ydelse Varenummer Navn Kostpris ---------- -------------------- -------- 18000 Kabinet 1.250,20 16000 12000 Ram Harddisk type 2 520,40 1.230,75 Listen indeholder varetyperne: Vare Stykliste Ydelse I ovenstående eksempel er der indsat en blank linje i Page Header. Rækkefølge Page Header 238
Hver gang der startes på en ny side i rapporten, udføres alle Page Header linjer automatisk. Linjerne udføres i den rækkefølge de har i området rapport-definition. Body Bodylinjerne udføres ikke automatisk, men derimod hver gang kommandoen OUTPUT eksekveres i XAL-koden. Page Footer Hver gang en side afsluttes udføres alle Pager Footer linjer automatisk. Linjerne udføres i den rækkefølge, de har i området rapport-definition. Bemærk! Linjetyperne kan godt stå blandet i rapport-definition, men den aktuelle linjetype udføres altid i rækkefølge fra oven og nedefter. Linjetypen Prolog Linjetypen Prolog anvendes til at definere linjer, der kun udskrives én gang i toppen af hele rapporten lige før linjer af typen Page Header. Placering af Prolog på papiret Prolog Page Header Body linjer Rapportens krop i form af data Prolog linjer anvendes f.eks. som overskrift eller indledende bemærkning til den samlede rapport. Bemærkninger i form af tekst indsættes som almindelig tekst uden citationstegn. Der kan desuden indgå felter af forskellig art i Prolog linjerne. Der henvises til lektionen om felter. C5 vers. 2012 -> Eksempel på anvendelse af Prolog SEARCH InvenTable OUTPUT InvenTable END Prol Prol PgHd Body InvenTable *** ANVENDES TIL KONTROL AF KOSTPRISER *** Varenummer Navn ItemNumber ItemName1 Kostpris CostPrice C5 vers. -> 4.1 Eksempel på anvendelse af Prolog 239
SEARCH LagKart OUTPUT LagKart END Prol Prol PgHd Body LagKart *** ANVENDES TIL KONTROL AF KOSTPRISER *** Varenummer Navn Kostpris VareNummer VareNavn1 KostPris Resultat *** ANVENDES TIL KONTROL AF KOSTPRISER *** Varenummer Navn 18000 Kabinet Kostpris 1.250,20 16000 Ram 520,40 12000 Harddisk type 2 1.230,75 Linjetypen Epilog Linjetypen Epilog anvendes til at definere linjer, der kun udskrives én gang som afslutning på hele rapporten, lige før en evt. Page Footer på sidste side. Placering af Epilog på papiret Page Header Body linjer Rapportens krop i form af data Epilog Page Footer Epilog linjer anvendes til afsluttende bemærkninger til den samlede rapport. Bemærkninger indsættes som almindelig tekst uden citationstegn. C5 vers. 2012 -> Eksempel på anvendelse af Epilog SEARCH InvenTable OUTPUT InvenTable END 240
PgHd Body PgFt Pgft Epil Epil InvenTable C5 vers. -> 4.1 Eksempel på anvendelse af Epilog SEARCH LagKart OUTPUT LagKart END PgHd Body PgFt Pgft Epil Epil LagKart Varenummer Navn ItemNumber ItemName1 Kostpris CostPrice Varetyper på listen: Vare, Stykliste, Ydelse *** KONTROLLERET AF: DATO: *** Varenummer Navn VareNummer VareNavn1 Kostpris KostPris Varetyper på listen: Vare, Stykliste, Ydelse *** KONTROLLERET AF: DATO: *** Resultat Varenummer Navn Kostpris 18000 Kabinet 1.250,20 16000 Ram 520,40 *** KONTROLLERET AF: DATO: *** Varetyper på listen: Vare, Stykliste, Ydelse Tegning af streger og kasser Streger og kasser tegnes i layoutområdet med funktionen ALT+T. Funktion har tre virkemåder, afhængigt hvor mange gange den aktiveres. 1. gang Enkelt streg 2. gang Dobbelt streg 3. gang Viskelæder Flyttes cursoren følger stregen med i alle retninger. Funktionen afsluttes med RETURN/ENTER, F3 eller ESC. Der kan tegnes streger og kasser i og på tværs af alle linjetyper. Nemmest er det at tegne lukkede kasser inden for samme linjetype. Tegning på tværs af flere linjetyper kan give problemer med sammenhæng, og linjer som ikke hænger helt sammen. Dette kan dog løses, men kræver kendskab til kontrol macroer og flere andre linjetyper end de der er gennemgået i denne lektion. C5 vers. 2012 -> Eksempel på tegning af streger SEARCH InvenTable OUTPUT InvenTable END PgHd PgHd Varenummer Navn PgHd Body Inventable ItemNumber ItemName1 Kostpris CostPrice 241
PgFt Epil Epil Epil Varetyper på listen: Vare, Stykliste, Ydelse *** KONTROLLERET AF: DATO: *** C5 vers. -> 4.1 Eksempel på tegning af streger SEARCH LagKart OUTPUT LagKart END PgHd PgHd PgHd Body PgFt Epil Epil Epil LagKart Varenummer Navn Kostpris VareNummer VareNavn1 KostPris Varetyper på listen: Vare, Stykliste, Ydelse *** KONTROLLERET AF: DATO: *** Resultat Varenummer Navn Kostpris 18000 Kabinet 1.250,20 16000 Ram 520,40 12000 Harddisk type 2 1.230,75 *** KONTROLLERET AF: DATO: *** Varetyper på listen: Vare, Stykliste, Ydelse I dette eksempel er der anvendt enkeltstreg rundt om overskrifterne i Page Header og dobbelt streg i Epilog til underskrift og dato. Sideskift Sideskift udføres i layoutområdet med funktionen ALT+S, men kan også indsættes fra lokalmenuen under Layout. Indsatte sideskift ses med tegnet og fylder hele linjen. C5 vers. 2012 -> Eksempel på anvendelse sideskift i Prolog SEARCH InvenTable OUTPUT InvenTable END Prol Prol Prol Prol PgHd Body InvenTable ******************************************* * KONTROL AF KOSTPRISER * ******************************************* Varenummer Navn Kostpris ItemNumber ItemName1 CostPrice 242
C5 vers. -> 4.1 Eksempel på anvendelse sideskift i Prolog SEARCH LagKart OUTPUT LagKart END Prol Prol Prol Prol PgHd Body LagKart ******************************************* * KONTROL AF KOSTPRISER * ******************************************* Varenummer Navn Kostpris VareNummer VareNavn1 KostPris Resultat første side ******************************************* * KONTROL AF KOSTPRISER * ******************************************* Resultat efterfølgende sider Varenummer Navn Kostpris 18000 Kabinet 1.250,20 16000 Ram 520,40 12000 Harddisk type 2 1.230,75 Bemærk! I ovenstående eksempel findes der Prolog og Page Header linjer, og resultatet bliver som vist. Hvis der også tilføjes Page Footer linjer, resulterer det i at både Page Header og Page Footer udskrives på Prolog siden. 243
Opgaver: Linjetyper uden kartotek Opgave 1: Page header og -footer i Udlånsliste Formål med opgaven At indsætte Page header og Page footer i rapporten Udlånsliste. Beskrivelse Der skal indsættes Page header og Page footer linjer i rapporten Udlånsliste fra forrige opgave. Page header linjerne anvendes til rapportens navn og overskrifter over felterne. Page footer linjerne anvendes til en tekst om hvordan rapporten er sorteret. Forløb 1 Vælg rapporten Udlånsliste fra forrige opgave 2 Indsæt Page header linjer som følger: Teksten Udlånsliste der er rapportens navn Tegnet streg under rapportens navn, lige så lang som felterne til sammen Overskrifter til hvert felt f.eks. Konto, Udlån, ReturDato og Forsikringssum. Højre- og venstrestil overskrifterne så de passer til felterne Tegnet streg under hver overskrift, men i felternes længde 3 Indsæt Page footer linjer som følger: Blank linje Teksten: Rapporten er sorteret pr. debitor pr. udlånsnummer! 4 Godkend og afprøv rapporten. 244
Opgave 2: Prolog og Epilog i Udlånsliste Formål med opgaven At indsætte linjer af typen Prolog og Epilog i rapporten Udlånsliste. Beskrivelse Der skal indsættes Prolog og Epilog linjer i rapporten Udlånsliste fra forrige opgave. Prolog linjerne skal indeholde informationer om rapportens navn, anvendelse og sortering. Epilog linjerne skal indeholde en besked om feltet ReturDato. Forløb 1 Vælg rapporten Udlånsliste fra forrige opgave. 2 Fjern Page footer linjerne fra rapporten, hvis der er nogen. 3 Indsæt Prolog linjer som følger: Blank linje til ramme Teksten: Rapport...: Udlånsliste Teksten: Anvendelse: Kontrol af udlånsordrer pr. debitor Teksten: Sortering...: Pr. debitor pr. udlånsordre Blank linje til ramme Sideskrift Tegn en ramme der omkranser de tre linjer og tegn en lodret streg efter ledeteksterne. Den lodrette streg skal herefter opdele rammen i to felter. 4 Indsæt Epilog linjer som følger: Blank linje Teksten: Bemærk! ReturDato er den forventede returdato! 5 Godkend og afprøv rapporten. 245
4. Rapport definition felter i layout Mål med lektionen Formålet med denne lektion er, at give deltagerne indsigt i de forskellige typer af værdier, der kan indsættes i felter i layoutområdet. Desuden gives anvisning i de forskellige metoder, der findes til oprettelse af felter. Efter lektionen skal kursisterne kunne: Oprette og formatere felter i rapportlayoutet Oprette kartoteksfelter, felter med regneudtryk, tekst, macroer, variabler og funktioner. Felter generelt Udtrykket felter henviser ofte til værdier fra kartoteker. I rapportgeneratorens layoutområde anvendes tastekombinationen CTRL+F2 da også kun til indsættelse af felter direkte fra kartoteker. C5 vers. 2012 -> Felter i rapport layout kan være mange ting ItemNumber VareNavn1 mmer ItemName1 CostPrice Felter betragtes oftest som værende fra kartoteker, men kan være meget andet C5 vers. -> 4.1 Felter i rapport layout kan være mange ting VareNummer VareNavn1 mmer VareNavn1 KostPris Felter betragtes oftest som værende fra kartoteker, men kan være meget andet Skemaet herunder viser forskellige værdier der kan indsættes i rapportfelter. 246
Indhold i rapportfelter Feltnavne fra kartoteker Tekst Variabler Macroer Funktioner RegneUdtryk Der findes to metoder til oprettelse af felter, men kun den ene anvendes til oprettelse af ovenstående feltindhold. Metoderne beskrives i næste afsnit. Oprettelsesmetoder Der findes to metoder til oprettelse af felter: Metoder til oprettelse af felter Metode Anvendelse Tastekombinationen CTRL+F2 Funktionen Opret felt F2 Indsættelse af felt direkte fra kartotek. Der kan kun indsættes kartoteksfelter. Indsættelse af felt via menu. Der kan både indsættes kartoteksfelter og alle andre typer værdier f.eks. macroer og variabler. Tastekombinationen CTRL+F2 CTRL+F2 anvendes kun til indsættelse af felter direkte fra kartoteker. I det øjeblik funktionen aktiveres, åbnes en liste over alle kartoteker. Ud fra et valgt kartotek, kan der åbnes en ny liste over felter. I feltlisten vælges et felt, der overføres til rapportlayoutet. CTRL+F2 kan således kun anvendes til indsættelse af kartoteksfelter. I alle andre situationer anvendes funktionen Opret Felt. Funktionen Opret Felt - F2 Funktionen Opret felt giver flere muligheder for at påvirke selve feltet allerede under oprettelsen. Funktionen kan startes på lokalmenuen eller via funktionstasten F2. Se huskeliste: Opret felt. 247
Menuen Opret felt Menupunkt Feltudtryk Feltbetingelse Format Subtotal Anvendelse Indsættelse af alle typer udtryk f.eks. macroer, tekst, variabler o.a. Kode med betingelse der afgør om feltværdien skal udskrives Viser feltets format, der evt. kan ændres Opstilling af automatiske totaler Når der oprettes nye felter, er det ikke nødvendigt at gå ind i alle menupunkter. I denne lektion behandles kun Feltudtryk. Menuen anvendes også med funktionen Ret felt F6, når der skal ændres i eksisterende felter. Feltudtryk I menupunktet Feltudtryk åbnes et vindue i form af en editorboks. I boksen skrives XAL kode i form af tidligere nævnte mulige typer af feltindhold. Resultatet eller værdien af dette udtryk udskrives på rapporten. Oprettelse af nyt felt med F2 Cursor F2 Editorboks til indtastning af feltindhold Feltudtryk Feltbetingelse Format Subtotaler I editorboksen kan de samme funktionstaster anvendes som i den normale XAL editor. Der kan dog ikke anvendes kommandoer som f.eks. IF-THEN-ELSE, SEARCH osv. De forskellige former for feltudtryk, der kan indtastes, behandles efterfølgende i egne afsnit. Formattering I menupunktet Formattering gives mulighed for at ændre felters opsætning, så deres værdier skrives på anden vis end standarden. I C5 findes der fem felttyper, der opsættes forskelligt afhængigt af type. 248
Felttyper Heltal Kommatal Tekst Dato Fasttekst Feltopsætning kan udføres, når der oprettes nye felter med F2, og når der rettes i felter med F6. Når menupunktet Formattering vælges, vises der en dialogboks til justering af det aktuelle felt. Dialogboksen har forskelligt indhold afhængigt af felttype. Nedenstående skema indeholder en samlet oversigt over alle justeringsmuligheder. De første fem kolonner viser hvad, der kan justeres på de enkelte felter. Mulige justeringer på rapportfelter Felttype Felt i opsætning Muligheder H K T D F Feltnavn H K T D F Feltets bredde H K T D F Feltets justering Navn på felt (kan ikke ændres) Antal tegn T F Store bogstaver Nej eller Ja Venstrestillet, Højrestillet, Centreret D Rækkefølge (DMÅ) DMÅ (Dag, Måned, ÅR) D 2 seperatorer / -, 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 seperator Ingen, Komma, Punktum, Mellemrum K Decimal tegn Komma (,) eller Punktum (.) K Antal decimaler Antal Mulige værdier i feltudtryk Kartoteksfelter Det mest anvendte feltudtryk består af feltnavne fra kartoteker. Feltnavne angives med eller uden kvalifikation som vist i de næste afsnit. Bemærk! Kartoteker, der indsættes i kartotekskolonnen eller anvendes til kvalifikation af felter, skal altid indgå i XAL kørslen. Hvis dette ikke er tilfældet, skal der anvendes direkte opslag. 249
Kartoteker Kartoteker i kartotekskolonnen, eller i kvalifikation af felter, skal altid indgå i en SEARCH løkke (eller en QT) Kartoteksfelter uden kvalifikation Angives feltnavne uden kvalifikation, står de alene. Felterne SKAL tilhøre kartoteket i kartotekskolonnen. Syntaks for feltnavn uden kvalifikation <feltnavn> C5 vers. 2012 -> Felt uden kvalifikation Body InvenTable ItemNumber VareNavn1 mmer Feltet tilhører kartoteket I eksemplet tilhører ItemNumber-feltet kartoteket InvenTable. På samme måde kan de øvrige felter i lagerkartoteket angives. C5 vers. -> 4.1 Felt uden kvalifikation Body LagKart VareNummer VareNavn1 mmer Feltet tilhører kartoteket I eksemplet tilhører VareNummer-feltet kartoteket LagKart. På samme måde kan de øvrige felter i lagerkartoteket angives. 250
Kartoteksfelter med kvalifikation Felter, der ikke tilhører kartoteket i kartotekskolonnen, skal kvalificeres. Kvalifikation udføres ved, at feltnavnet foranstilles med navnet på det kartotek, feltet tilhører. De to navne adskilles med et punktum. Syntaks for kvalifikation af feltnavn <kartoteksnavn>.<feltnavn> Syntaksen består af kartoteksnavn og feltnavn adskilt med punktum. C5 vers. 2012 -> Felt med kvalifikation Body InvenTrans InvenTable.ItemName1 Feltet tilhører ikke kartoteket, og skal kvalificeres I dette eksempel findes ItemName1-feltet ikke i det givne kartotek StockTrans. For at få fat i varenavnet, der befinder sig i lagerkartoteket, bliver det derfor kvalificeret med navnet på lagerkartoteket som flg. InvenTable.ItemName1. Det forudsættes at både InvenTrans og InvenTable indgår i Rapport-XAL på en eller anden måde f.eks. i en søgeløkke. C5 vers. -> 4.1 Felt med kvalifikation Body LagPost LagKart.VareNavn1 Feltet tilhører ikke kartoteket, og skal kvalificeres I dette eksempel findes VareNavn-feltet ikke i det givne kartotek LagPost. 251
For at få fat i varenavnet, der befinder sig i lagerkartoteket, bliver det derfor kvalificeret med navnet på lagerkartoteket som flg. LagKart.VareNavn1. Det forudsættes at både LagPost og LagKart indgår i Rapport-XAL på en eller anden måde f.eks. i en søgeløkke. Hvornår skal der kvalificeres? Generelt er det en god idé altid at anvende kvalifikation, så der aldrig er tvivl om, hvilke kartoteker de forskellige felter tilhører. Linjetyper uden kartoteksnavn Anvendes kartoteksfelter på linjetyper uden navn i kartotekskolonnen, SKAL disse altid kvalificeres. Dette gælder linjetyperne Page Header og Page Footer, Prolog og Epilog samt Control. C5 vers. 2012 -> Kvalifikation af felt i linjetype uden kartoteksnavn PgHd PgHd Body PgFt InvenTable Varegruppe: InvenTable.Group ItemNumber ItemName1 Linjetypen har ikke kartotek. Feltet skal kvalificeres C5 vers. -> 4.1 Kvalifikation af felt i linjetype uden kartoteksnavn PgHd PgHd Body PgFt LagKart Varegruppe: LagKart.Gruppe VareNummer VareNavn1 Linjetypen har ikke kartotek. Feltet skal kvalificeres Linjetyper med andet kartoteksnavn Anvendes kartoteksfelter på linjetyper med et andet navn i kartotekskolonnen end det kartotek felterne tilhører, SKAL disse felter også kvalificeres. Dette gælder linjetyperne Body, Group Header og Group Footer samt Subtotal. C5 vers. 2012 -> Kvalifikation af felt i linjetype med andet kartoteksnavn 252
Body InvenTrans ItemNumber InvenTable.ItemName1 Linjetypen har andet kartotek. Feltet skal kvalificeres ItemName1-feltet tilhører et andet kartotek end det i kartotekskolonnen, hvorfor det skal kvalificeres som vist. C5 vers. -> 4.1 Kvalifikation af felt i linjetype med andet kartoteksnavn Body LagPost VareNummer LagKart.VareNavn1 VareNavn1-feltet tilhører et andet kartotek end det i kartotekskolonnen, hvorfor det skal kvalificeres som vist. HUSK! Kartoteker, der anvendes til kvalifikation, skal altid indgå i XAL kørslen. Hvis dette ikke er tilfældet, skal der anvendes direkte opslag. Tekst Feltudtryk kan udmærket være ren tekst. Den skal blot skrives i anførselstegn. I eksemplet herunder består feltudtrykket af teksten Godkendt af:, hvor teksten er angivet i anførselstegn. Dette kunne f.eks. være en rapport over kostpriser, hvor en medarbejder skal gennemse rapporten og godkende hver enkelt kostpris. Godkendelsen udføres ved at skrive initialer ud for hver kostpris. C5 vers. 2012 -> Eksempel på feltudtryk med tekst SEARCH InvenTable OUTPUT InvenTable END PgHd PgHd Body InvenTable Linjetypen har andet kartotek. Feltet skal kvalificeres Godkendelse af kostpriser ------------------------------------------ - ItemNumber CostPrice Godkendt af: 253
C5 vers. -> 4.1 Eksempel på feltudtryk med tekst SEARCH LagKart OUTPUT LagKart END PgHd PgHd Body LagKart Godkendelse af kostpriser ------------------------------------------ - VareNummer KostPris Godkendt af: Resultat Godkendelse af kostpriser -------------------------------------------------------------- 1545 4711 15,75 202,50 Godkendt af: Godkendt af: 4718 1,25 Godkendt af: 4850 225,75 Godkendt af: Glemmes anførselstegnene, medfører det en syntaksfejl, idet systemet tror, at der er tale om to kartoteksfelter Godkendt og af, som jo ikke findes. Hvorfor anvende felter med tekst i stedet for tekster direkte i rapportlayoutet? Når tekster oprettes som felter, kan der indsættes betingelser, for hvornår teksten skal skrives ud. Se afsnittet Feltbetingelse. 254
Variabler Der findes to former for variabler, der begge kan indsættes i feltudtryk. Egne variabler og systemvariabler. Det skal erindres, at variabelnavne altid skal foranstilles med &-tegnet. Det er den måde variabler genkendes på i forhold til andre nøgleord i XAL sproget. Dette gælder både egne variabler og systemvariabler. Egne variabler Egne variabler erklæres og vedligeholdes af en selv. De skal altid erklæres i toppen af XAL kørsler. Dette gælder også i rapport XAL. Egne variabler kan tildeles værdier direkte under erklæringen eller efterfølgende med SET kommandoen eller gennem en promptbox. Tildeling af værdier til variabler Metode Direkte under erklæring Med kommandoen SET Gennem en promptbox Eksempel INT &Fradrag = 100 INT &Fradrag SET &Fradrag = 100 INT &Fradrag PROMPT Fradrag,,, Indtast fradrag: GET (&Fradrag) INPUT En variabels indhold kan til enhver tid udskrives på en rapport, hvis dens navn indsættes i et feltudtryk på en rapportlinje. Erklæring af variabel INT &Fradrag &Fradrag Bemærk at variabler altid skal erklæres, inden de kan indsættes i et feltudtryk. Hvis datasøgningen udføres i rapport XAL, erklæres variablerne der. 255
C5 vers. 2012 -> Eksempel på anvendelse af egne variabler REAL &NyPris SEARCH InvenTable SET &NyPris = CostPrice * 1.10 OUTPUT InvenTable END PgHd Body InvenTable Varenummer Gammel pris Ny pris ItemNumber CostPrice &NyPris Variablen &NyPris erklæres i toppen af XAL kørslen i editorboksen. Med SET kommandoen tildeles variablen en værdi i form af et regneudtryk, hvor CostPrice-feltet multipliceres med 1.10. Da tildelingen udføres inde i søgeløkken, udregnes der således en ny pris, for hver vare der udsøges. Idet variablen &NyPris er indsat i Body linjen, udskrives dens aktuelle værdi, hver gang Body linjen aktiveres af kommandoen OUTPUT i søgningen. C5 vers. -> 4.1 Eksempel på anvendelse af egne variabler REAL &NyPris SEARCH LagKart SET &NyPris = KostPris * 1.10 OUTPUT LagKart END PgHd Body LagKart Varenummer Gammel pris Ny pris VareNummer KostPris &NyPris Variablen &NyPris erklæres i toppen af XAL kørslen i editorboksen. Med SET kommandoen tildeles variablen en værdi i form af et regneudtryk, hvor KostPris-feltet multipliceres med 1.10. Da tildelingen udføres inde i søgeløkken, udregnes der således en ny pris, for hver vare der udsøges. Idet variablen &NyPris er indsat i Body linjen, udskrives dens aktuelle værdi, hver gang Body linjen aktiveres af kommandoen OUTPUT i søgningen. Resultat VareNummer Gammel pris Ny pris 1545 4711 15,50 210,00 17,05 231,00 4718 1,20 1,32 4850 230,10 253,11 Systemvariabler 256
Systemvariabler er variabler der i forvejen er defineret i C5 Systemvariabler Skal ikke erklæres og vedligeholdes (udføres automatisk). Indholdet kan til enhver tid udskrives i rapporter. Foranstilles med & tegnet når de anvendes. Eksempler på systemvariabler Systemvariabel Forklaring &Page &Line Indeholder til stadighed det sidenummer, der udskrives. Indeholder det linjenummer, der skrives ud. &Report Indeholder navnet på den aktuelle rapport. C5 vers. 2012 -> Eksempel på feltudtryk med systemvariabler SEARCH InvenTable OUTPUT InvenTable END PgHd PgHd PgHd Body InvenTable Varenummer ItemNumber C5 vers. -> 4.1 Eksempel på feltudtryk med systemvariabler SEARCH LagKart OUTPUT LagKart END PgHd PgHd PgHd Body LagKart &Report &Report Varenummer VareNummer Kostpris CostPric e Kostpris KostPris Side: Side: &Page &Page Variablerne, &Report og &Page, anvendes i den første Page Header linje og udskrives således på hver side. Variablerne erklæres ikke i XAL kørslen, da de er systemvariabler. Resultat Prisoversigt Side: 1 VareNummer Kostpris 1545 15,50 4711 4718 210,00 1,20 Det forudsættes, at rapportens navn er Prisoversigt og at siden der vises er nr. 1. 257
Macroer Der findes et utal af macroer i C5, som anvendes meget forskelligt. Nogle macroer kan indsættes i feltudtryk i rapportfelter. Hvad er macroer? Macroer er mindre XAL kørsler, der kun kan afvikles ved, at de startes fra andre XAL kørsler. I denne lektion skal det blot kendes, at macroer findes i udviklingsmenuen i søjlen MAC, og at de findes som Globale macroer og i Biblioteks macroer. Kendetegn ved macroer Type på macro Forklaring Global Bibliotek Staves med stort begyndelsesbogstav og resten med småt Indsættes uden videre direkte i feltudtryk Staves med STORE bogstaver En samling af enkeltstående macroer, der har noget tilfælles Biblioteket REPORTS består af macroer, der anvendes i rapporter Biblioteket skal først loades ind i XAL kørslen, før dets macroer kan indsættes i feltudtryk Ved anvendelse skal macroer altid foranstilles med et #-tegn, så de f.eks. kan skelnes fra variabler, der altid begynder med et &-tegn. Når rapport opbygningen afsluttes og godkendes, oversættes de indsatte macroer sammen med rapportens XAL kode og bliver en del af denne. Når en rapport afvikles, udføres macroens kode og resultatet udskrives på feltets plads. #Company #Company er en global macro, der anvendes til udskrift af firmanavn på rapporter. Macroen henter den tekst, der står i Name-feltet i firmakartoteket. Den anvendes ofte i linjer af typen Page Header som herunder, men kan også anvendes i alle andre linjetyper. C5 vers. 2012 -> Eksempel på feltudtryk med macroen #Company SEARCH InvenTable OUTPUT InvenTable END PgHd PgHd PgHd Body InvenTable #Company Varenummer ItemNumber Kostpris CostPric e 258
C5 vers. -> 4.1 Eksempel på feltudtryk med macroen #Firma I ældre versioner af C5 hedder den globale makro ikke #Company men #Firma. SEARCH LagKart OUTPUT LagKart END PgHd PgHd PgHd Body LagKart #Firma Varenummer VareNummer Kostpris KostPris Resultat Lises Bolsjefabrik VareNummer Kostpris 1545 4711 15,50 210,00 4718 4850 1,20 230,10 I eksemplet forudsættes det, at det aktuelle firmanavn er Lises Bolsjefabrik. #MacroLoad() Macroer, der ligger i biblioteker, kan ikke anvendes direkte, som det er tilfældet med de globale macroer. Der skal først skaffes adgang til biblioteket ved at loade det ind i XAL-kørslen. Dette udføres med macroen #MacroLoad(). #MacroLoad() indsættes ofte i starten af XAL kørsler, og må gerne udføres før erklæringen af variabler. Syntaks for macroload af biblioteker #MacroLoad(BIBLIOTEKSNAVN) #MacroLoad() er i sig selv en global macro, der i parenteserne skal have et navn på et macrobibliotek. #ReportDatePage #ReportDatePage anvendes til at udskrive dato, klokkeslæt og sidenummer. Macroen findes i biblioteket REPORTS. For at få adgang til at anvende den skal biblioteket REPORTS først loades. 259
Eksempel på udtryk med macroer fra biblioteker #MacroLoad(REPORTS) PgHd #ReportDatePage Biblioteket skal loades inden macroen kan indsættes i feltet Bemærk at biblioteket loades, før der kan indsættes macroer i feltudtryk. C5 vers. 2012 -> Eksempel på feltudtryk med macroen #ReportDatePage #MacroLoad(REPORTS) SEARCH InvenTable OUTPUT InvenTable END PgHd PgHd PgHd Body InvenTable #Company Varenummer ItemNumber Kostpris CostPric e #ReportDatePage Resultat Lises Bolsjefabrik Dato 07/01-09 13:47 Side 1 VareNummer Kostpris 1545 15,50 4711 210,00 4718 1,20 4850 230,10 #RapportDatoSide Ovennævnte makro hedder i ældre versioner af C5 #RapportDatoSide, og anvendes til at udskrive dato, klokkeslæt og sidenummer. Macroen findes i biblioteket REPORTS. For at få adgang til at anvende den skal biblioteket REPORTS først loades. 260
C5 vers. -> 4.1 Eksempel på udtryk med macroer fra biblioteker #MacroLoad(REPORTS) PgHd #RapportDatoSide Biblioteket skal loades inden macroen kan indsættes i feltet Bemærk at biblioteket loades, før der kan indsættes macroer i feltudtryk. C5 vers. -> 4.1 Eksempel på feltudtryk med macroen #RapportDatoSide #MacroLoad(REPORTS) SEARCH LagKart OUTPUT LagKart END PgHd PgHd PgHd Body LagKart #Firma Varenummer VareNummer Kostpris KostPris #RapportDatoSide Resultat Lises Bolsjefabrik Dato 07/01-09 13:47 Side 1 VareNummer Kostpris 1545 15,50 4711 210,00 4718 1,20 4850 230,10 Funktioner Feltudtryk kan også indeholde navne på funktioner. Funktioner er beskrevet i lektionen Funktioner, grundlæggende. Indsættelse i feltudtryk Funktioner kan indsættes i alle linjetyper, da de ikke er afhængige af nogen kartoteker. I dette afsnit vises eksempler på anvendelse af funktionerne ToDay(), CurUserId() og UserId2Name(). 261
C5 vers. 2012 -> Eksempel på feltudtryk med funktioner SEARCH InvenTable OUTPUT InvenTable END PgHd PgHd PgHd Body PgFt InvenTable #Company Dato: ToDay() Varenummer Kostpris ItemNumber CostPric Udskrevet af: UserId2Name(CurUserId()) e C5 vers. -> 4.1 Eksempel på feltudtryk med funktioner SEARCH LagKart OUTPUT LagKart END PgHd PgHd PgHd Body PgFt LagKart #Firma Dato: ToDay() Varenummer Kostpris VareNummer KostPris Udskrevet af: UserId2Name(CurUserId()) Resultat Lises Bolsjefabrik Dato: 07/01-09 VareNummer Kostpris 1545 15,50 4711 210,00 4718 1,20 4850 230,10 Udskrevet af: Karin Petersen I eksemplet forudsættes det at den aktuelle bruger er Karin Petersen. Regneudtryk Feltudtryk anvendes udmærket til udskrivning af beregninger i form af forskellige regneudtryk. Regneudtrykket kan f.eks. være et kartoteksfelt, der multipliceres med et tal eller en variabel. C5 vers. 2012 -> Eksempel på rapport med regneudtryk i felt SEARCH InvenTable OUTPUT InvenTable END PgHd Body IvenTable Varenummer Gl. pris Ny pris ItemNumber CostPrice CostPrice*1.2 C5 vers. -> 4.1 Eksempel på rapport med regneudtryk i felt 262
SEARCH LagKart OUTPUT LagKart END PgHd Body LagKart Varenummer Gl. pris Ny pris VareNummer KostPris KostPris*1.2 Resultat VareNummer Gl. pris Ny pris 1545 4711 15,50 210,00 18,06 252,00 4718 1,20 1,44 4850 230,10 276,12 263
Opgaver : Rapport definition felter i layout Opgave 1: Nye feltudtryk i Udlånsliste Formål med opgaven At anvende felter med forskellige feltudtryk i rapporten Udlånsliste. Beskrivelse Der skal arbejdes videre med rapporten Udlånsliste fra forrige opgave, idet der skal indsættes felter med macroer til firmanavnet, rapportens dato og side. I Bodylinjen skal der indsættes et felt til debitornavn. Feltet skal hente navnet fra debitorkartoteket med et direkte opslag. Forløb i C5 1 Vælg rapporten Udlånsliste fra forrige opgave. 2 Tilføj to nye Page header linjer som linje et og to, således at linjerne kommer til at stå øverst i Page headeren: I første linje indsættes der i venstre side et felt med macroen #Company og en længde på 30 tegn. I højre side indsættes der et felt med macroen #ReportDatePage og en længde på 30 tegn højrestillet. Anden linje udfyldes med en tegnet streg NB: Har du huske at macroloade biblioteket REPORTS? 3 I Bodylinjen indsættes et felt til debitors navn. Det indsættes mellem felterne DebitorKto og UdlånsNr. Feltet udfyldes med et direkte opslag i kartoteket CustTabel, hvor debitors navn hentes. Feltets længde skal være 20 tegn venstrestillet. 4 Tilret overskrifterne så de passer over felterne. 5 Godkend og afprøv om felterne fungerer efter hensigten. 264
5. Linjetypen Control Mål med lektionen Formålet med denne lektion er at lære deltagerne at anvende linjetypen Control. Efter lektionen skal kursisterne kunne: Opbygge og anvende control linjer Anvende macroen #Rep_Execute til styring af control linjer Danne manuelle totaler med macroen #Add, Generelt Control linjer er i virkeligheden de mest magtfulde linjer, idet programmøren med disse linjetyper kan få fuld kontrol over rapporten. Det er den eneste linjetype der ikke styres automatisk og ikke har nogen fast placering på den færdige rapport. Linjetypers placering på færdig udskrift Linjetype Prolog Epilog Placering Én gang i starten af rapporten Én gang i slutningen af rapporten Page Header Page Footer I toppen af hver enkelt side i rapporten I bunden af hver enkelt side i rapporten Group Header Group Footer Før hvert skift til et kartotek Hver gang der sluttes af fra et kartotek Body Hver gang kommandoen OUTPUT anvendes, eller når der sendes automatisk fra en QT. Subtotal Tekslinjer med tekst til automatiske totaler Control Styres ene og alene af programmøren Control linjer er således linjer, der udelukkende styres af programmøren. De anvendes for eksempel i tilfælde, hvor programmøren har vanskeligt ved at løse en opgave alene vha. de andre linjetyper. Opbygning af Control linjer Control linjer opbygges i Rapport Definition ved at angive linjetypen Control. Kartotekskolonnen får i den forbindelse en anden betydning, idet der her skal indtastes et linjenummer i stedet for navn på et kartotek. Nummeret er valgfrit og indtastes i et vindue, der åbnes, når cursoren flyttes ind i kartotekskolonnen. Layoutområdet kan, som ved de andre linjetyper anvendes til tekst og felter af forskellig art. C5 vers. 2012 -> Eksempel på opbygning af Control linje 265
Ctrl 25 Total for : InvenTable.ItemName1 &Total Nummer på den aktuelle control linje. Nummeret er valgfrit og vælges af programmøren C5 vers. -> 4.1 Eksempel på opbygning af Control linje Ctrl 25 Total for : LagKart.VareNavn1 &Total Nummer på den aktuelle control linje. Nummeret er valgfrit og vælges af programmøren Linjenummer Linjenummeret i kartotekskolonnen har en ganske særlig betydning, idet alle control linjer skal have et nummer der kan refereres til fra koden i Rapport XAL eller Rapport QT. Nummeret er valgfrit og vælges af programmøren ved oprettelsen af linjen. Bemærk at systemet selv foreslår nummer nul, men at dette ikke er gyldigt. Anvend fra nummer et og opefter. Der kan være lige så mange control linjer, som der er behov for, og der kan være flere med samme nummer. C5 vers. 2012 -> Flere Control linjer med samme nummer Ctrl Ctrl Ctrl Ctrl Ctrl 3 3 25 25 25 Total for : InvenTable.ItemName1 &Total Der kan være forskellige control linjer i samme rapport, og der må gerne være flere med samme nummer 266
C5 vers. -> 4.1 Flere Control linjer med samme nummer Ctrl Ctrl Ctrl Ctrl Ctrl 3 3 25 25 25 Total for : Der kan være forskellige control linjer i samme rapport, og der må gerne være flere med samme nummer LagKart.VareNavn1 &Total #Rep_Execute #Rep_Execute er en macro, der bl.a. anvendes til styring af control linjer. Macroen befinder sig i biblioteket REPORTS, hvorfor dette bibliotek skal loades før den kan anvendes. Syntaks #Rep_Execute(<nr>) <nr> er nummeret på den control linje, der skal aktiveres. Ved at indsætte macroen i en Rapport XAL eller Rapport QT udskrives den angivne linje, når macroen mødes i programforløbet. Er der mere end en linje med samme nummer, udskrives alle linjer med det nummer i den rækkefølge, de forekommer i rapportdefinitionen. Dette gælder også, hvis de ligger spredt med andre linjetyper ind imellem. Det er således macroen #Rep_Execute() og nummeret, der styrer hvilke control linjer, der udskrives. C5 vers. 2012 -> Eksempel #MacroLoad(REPORTS) REAL &Total SEARCH VendTable OUTPUT VendTable SET &Total = &Total + BalanceMst END #Rep_Execute(3) #Rep_Execute(25) Body Ctrl Ctrl Ctrl VendTable 3 25 25 Account Name Kreditorer i alt: BalanceMst &Total Der kan være forskellige control linjer i samme rapport, og der må gerne være flere med samme nummer C5 vers. -> 4.1 Eksempel 267
#MacroLoad(REPORTS) REAL &Total SEARCH KreKart OUTPUT KreKart SET &Total = &Total + SaldoDkk END #Rep_Execute(3) #Rep_Execute(25) Body Ctrl Ctrl Ctrl KreKart 3 25 25 Konto Navn Kreditorer i alt: SaldoDkk &Total Der kan være forskellige control linjer i samme rapport, og der må gerne være flere med samme nummer Control macroen anbringes i Rapport XAL eller Rapport QT, på det sted hvor linjerne skal udskrives i rapporten. I eksemplet styrer macroen at control linjerne med nummer 3 og 25 igangsættes når søgeløkken er slut. Macroen #Add Macroen #Add anvendes bl.a. til sammentælling af værdier i søgeløkker. Macroen er global, idet den er stavet med stort begyndelsesbogstav og derefter med småt. Syntaks #Add(parameter1, parameter2) Parameter1 er f.eks. navnet på en variabel, der anvendes som tæller, og parameter2 er den værdi, der skal lægges til variablen. De to parametre skal være af samme datatype. Opbygning Macroen er opbygget af SET kommandoen og nogle parametre i form af procenttegn og tal. Åbnes macroen, indeholder den således følgende kode: Kode i macroen #Add SET %1 = (%1) + (%2) Værdierne %1 og %2 svarer til parametrene, der er vist i syntaksen. De steder, hvor der står %1, indsættes parameter1, og hvor der står %2, indsættes parameter2. Datatypen på den værdi der indsættes i parameter1, bestemmer, hvad der kan lægges sammen i macroen. 268
Hvis parameter1 er en tekst, skal parameter2 også være det. I så fald sammenlægges de to tekster til én tekststreng. Er parameter1 en kommatalsvariabel, skal parameter2 også være det. Se eksemplet nenenfor. C5 vers. 2012 Eksempel på macroen #Add #MacroLoad(REPORTS) REAL &Total SEARCH VendTable OUTPUT VendTable #Add(&Total, BalanceMst) END #Rep_Execute(3) Body Ctrl Ctrl Ctrl VendTable 3 3 3 Account Name Kreditorer i alt: BalanceMst &Total C5 vers. -> 4.1 Eksempel på macroen #Add #MacroLoad(REPORTS) REAL &Total SEARCH KreKart OUTPUT KreKart #Add(&Total, SaldoDkk) END #Rep_Execute(3) Body Ctrl Ctrl Ctrl KreKart 3 3 3 Konto Navn Kreditorer i alt: SaldoDkk &Total I dette eksempel anvendes macroen #Add som en tæller til sammentælling af kartotekets saldofelt. Macroen #Rep_Execute(3) sørger for at aktivere de tre control linjer med nummer 3, så disse kan udskrives. Bemærk at control macroen er indsat efter afslutningen af END i søgeløkken. Dette bevirker, at control linjerne udskrives til sidst på rapporten, når søgeløkken er færdig, som vist efterfølgende: Resultat 269
45999000 Microsoft A/S 45934545 IMB Danmark A/S -100.000,00-20.000,00 971249987 Intel Corporation -93.531,00 Kreditorer i alt: -213.531.00 Control linjer og #Add i Rapport-QT Control linjer kan også styres fra Rapport QT. Det er blot vigtigt at indsætte macroerne i de rigtige triggere. Opbygningen af Rapport definition er den samme som vist i de forrige afsnit. C5 vers. 2012 -> Eksempel på macroer i Rapport QT Triggere Kommandoer og macroer Init Post-Output Post-Search #MacroLoad(REPORTS) REAL &Total #Add(&Total, BalanceMst) #Rep_Execute(1) #Rep_Execute(2) #Rep_Execute(3) C5 vers. 2012 -> Eksempel på Rapport Definition Body Ctrl Ctrl Ctrl VendTable 1 2 3 Account Name Kreditorer i alt: BalanceMst &Total C5 vers. -> 4.1 Eksempel på macroer i Rapport QT Triggere Kommandoer og macroer Init Post-Output Post-Search #MacroLoad(REPORTS) REAL &Total #Add(&Total, SaldoDkk) #Rep_Execute(1) #Rep_Execute(2) #Rep_Execute(3) 270
C5 vers. -> 4.1 Eksempel på Rapport Definition Body Ctrl Ctrl Ctrl KreKart 1 2 3 Konto Navn Kreditorer i alt: SaldoDkk &Total Bemærk at control linjerne nu har fået numrene 1, 2 og 3, og at der henvises til disse i Post-Search triggeren. At linjerne har fået disse numre, er ikke en nødvendighed, men kun for at vise, at linjerne godt kan have forskellige numre til forskel fra tidligere eksempler, hvor linjerne havde samme nummer. 271
Opgaver: Linjetypen Control Opgave 1: Control linjer i Udlånsliste Formål med opgaven At anvende control linjer i rapporten Udlånsliste. Beskrivelse Der skal arbejdes videre med rapporten Udlånsliste fra forrige opgave. Rapporten skal udvides med en optælling af hvor mange udlån, der findes af typerne Udlån, Kommission og Andet. Værdierne skal sammentælles i variabler, der oprettes til formålet. Optællingen udføres i søgeløkken og resultatet udskrives med control linjer, når søgeløkken er slut. Forløb 1 Vælg rapporten Udlånsliste fra forrige opgave. 2 I Rapport XAL skal der erklæres en variabel til hver af typerne Udlån, Kommission og Andet. Variablerne skal være af typen heltal. 3 I søgeløkken skal der opstilles tre IF sætninger, der hver for sig undersøger, hvilken af de tre typer udlånene tilhører. I hver sætning adderes værdien 1 til den aktuelle variabel. 4 Efter søgeløkken er afsluttet, aktiveres den eller de Control linjer du opretter eller har oprettet til udskrivning af optællingen Anvend macroen #Rep_Execute 5 I Rapport definition skal nedenstående Control linjer oprettes til udskrivning af resultatet. Vælg selv et eller flere numre til linjerne. Teksten: Fordeling Tegnet: streg Teksten: Udlån, efterfulgt af den tilsvarende variabel Teksten: Kommission, efterfulgt af den tilsvarende variabel Teksten: Andet, efterfulgt af den tilsvarende variabel Tegnet: streg, under de tre linjer til adskillelse mellem i alt Teksten: I alt, efterfulgt af et felt med et feltudtryk, der adderer de tre variabler Tegnet: dobbeltstreg under totalen 6 Godkend og afprøv rapporten. 272
6. Linjetyper med kartoteker Mål med lektionen Formålet med denne lektion er at lære deltagerne at opbygge linjetyper med kartoteker i kartotekskolonnen. Efter lektionen skal kursisterne kunne: Opbygge linjetyperne Group Header, Body, Group Footer og Subtotal Opbygge rapporter med udtræk fra flere kartoteker Udskrive automatiske subtotaler med egen ledetekst. Generelt I Rapport Definition opbygges rapportlinjerne med linjetyper af forskellig art. Nogle linjetyper anvendes uden angivelse af kartotek, medens andre skal have et kartotek i kartotekskolonnen. Denne lektion omhandler de fire linjetyper, der skal have kartoteker. Linjetyper med kartoteker Linje-type Group header Body Group footer Subtotal Først en forklaring til betydningen af kartoteker og derefter gennemgang af de enkelte linjetyper. Bindeled i Rapport XAL og Rapport Definition Kartotekerne er bindeleddet mellem koden i Rapport XAL og linjerne i Rapport Definition. I eksemplet herunder ses Rapport XAL med udtræk af data fra ét kartotek. Data sendes til Rapport Definition med kommandoen OUTPUT og modtages af linjetypen Body, der har samme kartoteksnavn som i OUTPUT linjen. C5 vers. 2012 -> Eksempel med udtræk af data fra ét kartotek SEARCH InvenTable OUTPUT InvenTable END Body InvenTable ItemNumber ItemName1 CostPrice C5 vers. -> 4.1 Eksempel med udtræk af data fra ét kartotek 273
SEARCH LagKart OUTPUT LagKart END Body LagKart VareNummer VareNavn1 KostPris Hvis OUTPUT kommandoen ikke indsættes, virker rapporten ikke, da der ikke sendes data til Rapport Definition. Betydningen af kartotekskolonnen ses bedre af næste eksempel, hvor der i koden i Rapport XAL er indsat to søgeløkker med hvert sit kartotek. I Rapport Definition er der indsat en linje til hver kartotek. Var der ikke en kolonne til angivelse af OUTPUT kartotek, ville systemet ikke vide hvilken linje, der skulle modtage outputtet fra søgeløkkerne. For at anskueliggøre betydningen af kartotekskolonnen, er der i eksemplet indsat to kartoteker, der ikke har noget med hinanden at gøre. C5 vers. 2012 -> Eksempel med udtræk af data fra to forskellige kartoteker SEARCH InvenTable OUTPUT InvenTable END SEARCH LedTable OUTPUT LedTable END Body Body InvenTable LedTable Itemnumber Account ItemName1 AccountName CostPrice C5 vers. -> 4.1 Eksempel med udtræk af data fra to forskellige kartoteker SEARCH LagKart OUTPUT LagKart END SEARCH FinKart OUTPUT FinKart END Body Body LagKart FinKart VareNummer Konto VareNavn1 KontoNavn KostPris Resultat 274
18000 Kabinet 1.250,20 16000 Ram 520,40 12000 14000 Harddisk type 2 CD romdrev 1.230,75 50,10 20000 Skærm 1.000,10 100000 AKTIVER 200000 PASSIVER 300000 RESULTAT 110000 Anlægsaktiver 120000 Omsætningsaktiver Da der således kan trækkes data ud af flere forskellige kartoteker i samme rapport, ses det tydeligt, hvor vigtigt det er, at angive det rigtige kartotek i kartotekskolonnen. Wildcard i form af * Angives der ikke OUTPUT kartotek i bodylinjerne, indsættes der automatisk en * i kartotekskolonnen. Stjernen er et Wildcard, der betyder Alle kartoteker. Dette betyder at alle bodylinjer forsøges udskrevet, hver gang en OUTPUT kommando afvikles i XAL koden, uafhængigt af kartotek. Dette kan resultere i nogle mærkelige udskrifter, men i visse tilfælde kan det være hensigtsmæssigt. I følgende eksempel skal der udskrives en blank linje mellem hver eneste post i begge kartoteker. Derfor angives kun én blank linje i form af en bodylinje med en * i kartotekskolonnen. C5 vers. 2012 -> Eksempel med * i kartotekskolonnen Body Body Body InvenTable LedTable * ItemNumber ItemName1 Account AccountName CostPrice C5 vers. -> 4.1 Eksempel med * i kartotekskolonnen Body Body Body LagKart FinKart * VareNummer VareNavn1 Konto KontoNavn KostPris Hver gang OUTPUT kommandoen udføres i XAL koden, sendes den blanke linje således afsted til rapporten. Resultatet bliver som følger, idet der indsættes blanke linjer mellem hver enkelt post i begge kartoteker. 275
Resultat 18000 Kabinet 1.250,20 16000 Ram 520,40 12000 Harddisk type 2 1.230,75 14000 CD romdrev 50,10 20000 Skærm 1.000,10 100000 AKTIVER 200000 PASSIVER 300000 RESULTAT 110000 Anlægsaktiver 120000 Omsætningsaktiver Når der skal anvendes mere end ét kartotek, kan dette udføres på to måder. Metoder med flere kartoteker Metode Betydning Enkeltstående kartoteker Afhængige kartoteker Kartotekerne afvikles ét ad gangen efter hinanden. Hver gang en post hentes i hovedkartoteket, er der mulighed for at hente tilhørende poster i underkartoteket. Enkeltstående kartoteker Ved enkeltstående uafhængige kartoteker, bliver disse afviklet et ad gangen i den rækkefølge, de forekommer i Rapport XAL eller en evt. Rapport QT. Hver gang ét kartotek er færdigt, startes på det næste. Herunder vises der eksempler på anvendelsen af uafhængige kartoteker i Rapport XAL C5 vers. 2012 -> Eksempel på enkeltstående kartoteker i Rapport XAL SEARCH InvenItemGroup OUTPUT InvenItemGroup END SEARCH InvenTable OUTPUT InvenTable END Body Body InvenItemG InvenTable Group ItemNumber GroupName ItemName1 Group C5 vers. -> 4.1 Eksempel på enkeltstående kartoteker i Rapport XAL 276
SEARCH LagGruppe OUTPUT LagGruppe END SEARCH LagKart OUTPUT LagKart END Body Body LagGruppe LagKart Gruppe VareNummer GruppeNavn VareNavn1 Gruppe Selv om kartotekerne er enkeltstående, har de i dette eksempel alligevel en fællesnævner, idet det første kartotek udskriver en liste over de varegrupper der findes. Dette kan anvendes til manuel reference til de poster, der skrives ud fra det andet kartotek, hvor varegruppen vises, men ikke hvad den hedder. Resultat 10 Harddiske 20 30 Skærme Kabinetter 40 Ram 12000 Harddisk type 2 10 14000 Skærm 14 20 16000 Ram 8 MB 40 16004 Ram 16 MB 40 17006 Harddisk type 5 10 18000 Kabinet 30 20000 Skærm 17 20 Afhængige synkroniserede kartoteker Ved afhængige kartoteker oprettes der i Rapport XAL to søgeløkker, hvor den ene bygges ind i den anden. Den inderste søgeløkke synkroniseres under opbygningen med den yderste. Ved afviklingen af Rapport XAL findes posterne i den yderste søgeløkke (hovedkartoteket) frem en ad gangen. Hver gang en post er fundet, udføres der en gennemsøgning af samtlige poster i den inderste søgeløkke (underkartoteket). Da samtlige poster gennemsøges i den inderste søgeløkke (underkartoteket), er det vigtigt at synkronisere de to søgeløkker (kartoteker) med hinanden således, at der under gennemsøgningen af den inderste søgeløkke kun hentes poster, der kan relateres til den aktuelle post, der er fundet i den yderste søgeløkke (hovedkartoteket). Synkronisering meller hoved- og underkartotek Synkroniseringen i Rapport XAL foregår ved anvendelse af kommandoen WHERE. Kommandoen anvendes ved at opstille en betingelse, der skal være opfyldt, for at en post udvælges fra underkartoteket. Det er vigtigt at bemærke, at synkroniseringen finder sted i den inderste søgeløkke (underkartoteket). Det er altså underkartoteket, der skal synkroniseres med hovedkartoteket og ikke omvendt. 277
Syntaksen for anvendelsen af WHERE er her følgende: Syntaks til WHERE WHERE <Underkartotek.Felt> == <Hovedkartotek.Felt> Herunder vises der eksempler på anvendelsen af flere afhængige kartoteker i Rapport XAL. C5 vers. 2012 -> Eksempel på afhængige kartoteker i Rapport XAL SEARCH InvenItemGroup OUTPUT InvenItemGroup SEARCH InvenTable WHERE InvenTable.Group == InvenItemGroup.Group OUTPUT InvenTable END END Body Body InvenItemG InvenTable Group ItemNumber GroupName ItemName1 Group I figuren med resultatet ses det, hvordan der først trækkes én post ud af hovedkartoteket InvenItemGroup og derefter de tilhørende poster i underkartoteket InvenTable. Det kan ses at synkroniseringen virker, idet der for hver post i hovedkartoteket kun vises de tilhørende synkroniserede poster fra underkartoteket. C5 vers. -> 4.1 Eksempel på afhængige kartoteker i Rapport XAL SEARCH LagGruppe OUTPUT LagGruppe SEARCH LagKart WHERE LagKart.Gruppe == LagGruppe.Gruppe OUTPUT LagKart END END Body Body LagGruppe LagKart Gruppe VareNummer GruppeNavn VareNavn1 Gruppe I figuren med resultatet ses det, hvordan der først trækkes én post ud af hovedkartoteket LagGruppe og derefter de tilhørende poster i underkartoteket LagKart. Det kan ses at synkroniseringen virker, idet der for hver post i hovedkartoteket kun vises de tilhørende synkroniserede poster fra underkartoteket. Resultat 278
10 Harddiske 12000 17006 Harddisk type 2 Harddisk type 5 10 10 20 Skærme 20000 14000 Skærm 17 Skærm 14 20 20 30 Kabinetter 18000 40 Kabinet Ram 30 16000 Ram 8 MB 40 14000 Ram 16 MB 40 Linjetypen Body Linjetypen Body er den vigtigste linjetype i Rapport Definition. Det er den linjetype, der indeholder de data, der fra kartotekerne udskrives på rapporten. Linjetypen indeholder felterne, der tilhører kartotekerne i kartotekskolonnen. Derfor skal der også altid indsættes et kartotek hertil. Linjetypen blev nøje behandlet i lektionen Rapport Definition grundlæggende, hvorfor der henvises til denne lektion om yderligere information. Linjetypen Group Header Linjetypen Group Header skal altid udfyldes i kartotekskolonnen med navn på kartotek eller med en *. I layoutområdet kan der indsættes felter og tekster på samme måde som i andre linjetyper. Aktivering af linjetypen Group Header Linjetypen Group Header aktiveres og udskrives automatisk, hver gang der startes på udskrivning af poster fra et kartotek. Dette gælder både ved enkeltstående kartoteker og afhængige kartoteker. Linjetypen aktiveres således hver gang, der kommer output til et nyt kartotek fra en Rapport XAL eller en evt. Rapport QT. 279
C5 vers. 2012 -> Eksempel på Group Header ved enkeltstående kartoteker uden relation Ved enkeltstående uafhængige kartoteker udskrives Group Headerne hver gang, der startes på et nyt kartotek. SEARCH InvenItemGroup OUTPUT InvenItemGroup END SEARCH InvenTable OUTPUT InvenTable END GrHd GrHd Body GrHd GrHd Body InvenItemG InvenItemG InvenItemG InvenTable InvenTable InvenTable Varegrupper Group Varer ItemNumber GroupName ItemName1 Group C5 vers. -> 4.1 Eksempel på Group Header ved enkeltstående kartoteker uden relation Ved enkeltstående uafhængige kartoteker udskrives Group Headerne hver gang, der startes på et nyt kartotek. SEARCH LagGruppe OUTPUT LagGruppe END SEARCH LagKart OUTPUT LagKart END GrHd GrHd Body GrHd GrHd Body LagGruppe LagGruppe LagGruppe LagKart LagKart LagKart Varegrupper Gruppe GruppeNavn Varer VareNummer VareNavn1 Gruppe 280
Resultat Varegrupper 10 Harddiske 20 Skærme 30 40 Kabinetter Ram Varer 12000 Harddisk type 2 10 14000 16000 Skærm 14 Ram 8 MB 20 40 16004 Ram 16 MB 40 17006 18000 Harddisk type 5 Kabinet 10 30 20000 Skærm 17 20 Eksemplet kunne f.eks. finde anvendelse, hvor en rapport fylder mange sider og der ikke er plads nok på linjerne til gruppenavnet. Rapporten kunne da starte med en liste over varegrupper som opslagsreference for resten af rapporten. Eksempler på Group Headere ved afhængige kartoteker Ved flere afhængige kartoteker vil Group Headerne blive udskrevet hver gang, der skiftes mellem udskrivning fra henholdsvis hovedkartotek og underkartotek. C5 vers. 2012 -> Eksempel på Group Header ved afhængige kartoteker SEARCH InvenItemGroup OUTPUT InvenItemGroup SEARCH InvenTable WHERE InvenTable.Group == InvenItemGroup.Group OUTPUT InvenTable END END Body GrHd Body InvenItemG InvenTable InvenTable Group ItemNumber GroupName ItemName1 Group 281
C5 vers. -> 4.1 Eksempel på Group Header ved afhængige kartoteker SEARCH LagGruppe OUTPUT LagGruppe SEARCH LagKart WHERE LagKart.Gruppe == LagGruppe.Gruppe OUTPUT LagKart END END Body GrHd Body LagGruppe LagKart LagKart Gruppe VareNummer GruppeNavn VareNavn1 Gruppe Resultat 10 Harddiske 12000 Harddisk type 2 10 17006 20 Harddisk type 5 Skærme 10 20000 Skærm 17 20 14000 Skærm 14 20 30 Kabinetter 18000 Kabinetter 30 40 Ram 16000 Ram 8 MB 40 14000 Ram 16 MB 40 I dette eksempel anvendes Group Headeren kun til at sætte en streg, inden der skrives ud fra underkartoteket. På denne måde kommer hovedkartoteket til at virke som en form for overskrift til underkartoteket. Linjetypen Group Footer Linjetypen Group Footer skal altid udfyldes i kartotekskolonnen med navn på kartotek eller med en *. I layoutområdet indsættes der felter og tekster på samme måde som i andre linjetyper. Linjetypen Group Footer aktiveres hver gang, der afsluttes med output fra et kartotek i Rapport XAL eller en evt. Rapport QT. Dette gælder både ved enkeltstående kartoteker og afhængige kartoteker. Linjetypen aktiveres således hver gang, der ikke længere kommer output fra et kartotek i Rapport XAL eller Rapport QT. De to næste sider indeholder eksempler på henholdsvis anvendelse af Group Footer i enkeltstående kartoteker uden relation og i sammenhængende kartoteker med relation. 282
Eksempel på Group Footer ved enkeltstående kartoteker uden relation Ved enkeltstående uafhængige kartoteker udskrives Group Footerne hver gang, der sluttes et kartotek. C5 vers. 2012 -> Eksempel på Group Footer i enkeltstående kartoteker SEARCH InvenItemGroup OUTPUT InvenItemGroup END SEARCH InvenTable OUTPUT InvenTable END GrHd GrHd Body GrFt GrHd GrHd Body GrFt InvenItemG InvenItemG InvenItemG InvenItemG InvenTable InvenTable InvenTable InvenTable Varegrupper Group Varer ItemNumber GroupName ItemName1 Group C5 vers. -> 4.1 Eksempel på Group Footer i enkeltstående kartoteker SEARCH LagGruppe OUTPUT LagGruppe END SEARCH LagKart OUTPUT LagKart END GrHd GrHd Body GrFt GrHd GrHd Body GrFt LagGruppe LagGruppe LagGruppe LagGruppe LagKart LagKart LagKart LagKart Varegrupper Gruppe GruppeNavn Varer VareNummer VareNavn1 Gruppe Resultat 283
Varegrupper 10 20 Harddiske Skærme 30 Kabinetter 40 Ram Varer 12000 Harddisk type 2 10 14000 Skærm 14 20 16000 16004 Ram 8 MB Ram 16 MB 40 40 17006 Harddisk type 5 10 18000 20000 Kabinet Skærm 17 30 20 I eksemplet anvendes Group Footerne kun til at skrive en dobbeltstreg for at vise, at udskrivning af poster fra kartoteket er slut. Definitionsområdet til ovenstående eksempel kunne også sættes op som nedenstående figur, idet Group Footerne med kartoteker erstattes af én enkelt Group Footer med angivelse af * i kartotekskolonnen, hvilket betyder, at den pågældende linje udskrives hver gang, et hvilket som helst kartotek afsluttes. C5 vers. 2012 -> Eksempel på Group Footer med * GrHd GrHd Body GrHd GrHd Body GrFt InvenItemG InvenItemG InvenItemG InvenTable InvenTable InvenTable * Varegrupper Group Varer ItemNumber GroupName ItemName1 Group C5 vers. -> 4.1 Eksempel på Group Footer med * GrHd GrHd Body GrHd GrHd Body GrFt LagGruppe LagGruppe LagGruppe LagKart LagKart LagKart * Varegrupper Gruppe Varer VareNummer GruppeNavn VareNavn1 Gruppe 284
Eksempel på Group Footer ved afhængige kartoteker Ved flere afhængige kartoteker udskrives Group Footerne hver gang, der ikke længere kommer poster fra et af kartotekerne. Det er tilfældet hver gang, der fra underkartoteket vendes tilbage til hovedkartoteket. C5 vers. 2012 -> Eksempel Group Footer ved flere kartoteker SEARCH InvenItemGroup OUTPUT InvenItemGroup SEARCH InvenTable WHERE InvenTable.Group == InvenItemGroup.Group OUTPUT InvenTable END END Body Body GrFt InvenItemG InvenTable * Group ItemNumber GroupName ItemName1 Group C5 vers. -> 4.1 Eksempel Group Footer ved flere kartoteker SEARCH LagGruppe OUTPUT LagGruppe SEARCH LagKart WHERE LagKart.Gruppe == LagGruppe.Gruppe OUTPUT LagKart END END Body Body GrFt LagGruppe LagKart * Gruppe VareNummer GruppeNavn VareNavn1 Gruppe I denne opsætning af definitionsområdet angives der én Group Footer linje med en * i kartotekskolonnen. Det betyder, at hver gang der afsluttes med udskrivning fra et kartotek, udskrives denne linje. Definitionen kan f.eks. give følgende resultat. 285
Resultat 10 Harddiske 12000 Harddisk type 2 10 17006 Harddisk type 5 10 20 Skærme 20000 Skærm 17 20 14000 Skærm 14 20 30 Kabinetter 18000 Kabinetter 30 40 Ram 16000 Ram 8 MB 40 14000 Ram 16 MB 40 I stedet for Group Footeren med * i kartotekskolonnen, kunne der indsættes en Group Footer linje til hvert kartotek med angivelse af kartotek i kartotekskolonnen. Linjetypen Subtotal Opsætning af linjetypen Linjetypen Subtotal har kun ét formål, at udskrive ledetekster til automatiske subtotaler. Kartotekskolonnen skal altid udfyldes med navn på kartotek eller *. I layoutområdet indsættes den ledetekst, der skal stå foran automatiske totaler. Ledeteksten kan udmærket bestå af tekst og evt. relevante felter. Linjetypen Subtotal aktiveres hver gang, der udskrives en total fra et kartotek i Rapport XAL eller en evt. Rapport QT. Dette gælder både ved enkeltstående kartoteker og afhængige kartoteker. C5 vers. 2012 -> Eksempel med Subtotal på ét kartotek SEARCH VendTrans WHERE Account == 971249987 OUTPUT VendTrans END PgHd PgHd Body Subt VendTrans VendTrans Konto Dato Bilag BeløbDkr Account Date_ Voucher Kreditorposter i alt...: AmountMst C5 vers. -> 4.1 Eksempel med Subtotal på ét kartotek 286
SEARCH KrePost WHERE Konto == 971249987 OUTPUT KrePost END PgHd PgHd Body Subt KrePost KrePost Konto Dato Bilag BeløbDkr Konto Dato Bilag Kreditorposter i alt...: BeløbDkk Resultat med linjetypen Subtotal Konto Dato Bilag Beløb Dkr 971249987 23/05-97 500016-222.693,75 971249987 20/10-97 971249987 04/01-98 70025 222.693,75 500025-26.723,25 971249987 02/03-98 70056 26.723,25 971249987 31/03-98 500050-93.531,38 Kreditorposter i alt...: -93.531,38 Herunder følger et eksempel med to afhængige kartoteker. Eksempel på Subtotal ved afhængige kartoteker Ved flere afhængige kartoteker udskrives Subtotal linjerne hver gang, der udskrives en subtotal fra et af kartotekerne. C5 vers. 2012 -> Eksempel med subtotaler på flere kartoteker SEARCH VendTable OUTPUT VendTable SEARCH VendTrans WHERE VendTrans.Account == VendTable.Account OUTPUT VendTrans END END Body Body Subt Subt VendTable VendTrans VendTrans VendTable Account Name Account Date_ AmountMst Poster i alt...: Kreditorer i alt...: BalanceMst C5 vers. -> 4.1 Eksempel med subtotaler på flere kartoteker 287
SEARCH KreKart OUTPUT KreKart SEARCH KrePost WHERE KrePost.Konto == KreKart.Konto OUTPUT KrePost END END Body Body Subt Subt KreKart KrePost KrePost KreKart Konto Navn Konto Dato BeløbDkk Poster i alt...: Kreditorer i alt...: SaldoDkk Resultat med linjetypen Subtotal 971249987 Intel Corporation -93.531,38 971249987 23/05-97 -222.693,75 971249987 20/10-97 222.693,75 971249987 04/01-98 -26.723,25 971249987 02/03-98 26.723,25 971249987 31/03-98 -93.531,38 Poster i alt...: -93.531,38 Kreditorer i alt...: -523.548,88 Ovenstående eksempel viser data fra to kartoteker, med hver sin ledetekst til subtotalerne. I Rapport XAL udsøges faktisk alle kreditorer og poster, men i resultatet i eksemplet vises kun et udsnit af posterne og den samlede subtotal. Hvis der skulle være samme ledetekst til begge kartoteker, havde det været nok med en subtotal linje med * i kartotekskolonnen. Opsætning af felt Opsætning af felter med subtotal udføres i layoutområdet i Rapport Definition. Feltet, der skal summeres åbnes og i menuen Ret felt i menupunktet Subtotaler indsættes en af summerings metoderne fra nedenstående skema. De enkelte metoder gennemgås nøjere i lektionen Subtotaler automatiske. 288
Metoder til summering Metode Sum alle Sum positive Sum negative Anvendelse Alle poster summeres Kun positive poster summeres Kun negative poster summeres Opsætningen foregår som vist i nedenstående figur. C5 vers. 2012 -> Opsætning af subtotal på feltet AmountMst PgHd PgHd Body VendTrans Konto Dato Bilag BeløbDkr Account Date_ Voucher AmountMst F6 Ret felt......... Subtotaler Opsæt subtotal INSERT Sum alle Sum positive Sum negative C5 vers. -> 4.1 Opsætning af subtotal på feltet BeløbDkk PgHd PgHd Body KrePost Konto Dato Bilag BeløbDkr Konto Dato Bilag BeløbDkk F6 Ret felt......... Subtotaler Opsæt subtotal INSERT Sum alle Sum positive Sum negative 289
Opsætning til automatiske subtotaler Rapport-definition CTRL +F6 Opsætning Opsæt subtotaler ENTER * Første kartoteksnavn * Andet kartoteksnavn Subtotal...: Vælg Udskriftsmuligheder (under afvikling) ENTER Udskriv subtotal: KartoteksNavn JA Subtotal...: Vælg Sideskift efter subtotal: I skemaet herover vises opsætningen, som den udføres under Opsætning i Rapport Definition. Det vises øverst i figuren med CTRL+F6, der åbner for boksen Opsætning. Placeres cursoren i feltet Subtotal, og der tastes Enter åbnes boksen Opsæt subtotaler, hvor kartotek vælges. (Er der kun et kartotek vises denne boks ikke. Der hoppes derimod direkte til næste boks.) Efter valgt kartotek åbnes en ny boks med kartoteksnavnet som overskrift. I denne boks, skal der svares JA til om subtotalen skal udskrives eller ej, og det kan med JA, udfyldes, om der skal være sideskift efter at subtotaler er udskrevet. Der findes flere felter i de forskellige bokse, men dette er de vigtigste i nuværende situation. Defaultværdier De værdier, der indsættes under opsætningen, fungerer som default i boksen Udskriftsmuligheder, når denne vises under afviklingen. Boksen Udskriftsmuligheder ses nederst i figuren. I feltet Subtotal tastes Enter og samme bokse vises som under opsætning af Rapport Definition. 290
Opgaver: Linjetyper med kartoteker Opgave 1: Automatisk subtotal i Udlånsliste Formål med opgaven At udføre automatisk sammentælling af feltet ForsikringsSum i rapporten Udlånsliste. Beskrivelse Der skal arbejdes videre med rapporten Udlånsliste fra forrige opgave. I rapporten skal der foretages en automatisk summering af værdierne i feltet ForsikringsSum og der skal indsættes en speciel tekst til totalen i en linje af typen Subtotal. Forløb 1 Vælg rapporten Udlånsliste fra forrige opgave. 2 Opsæt feltet ForsikringsSum således at alle værdier summeres automatisk. 3 Indsæt en linje af typen subtotal med teksten: Forsikringsværdi i alt: Husk at angive det rigtige kartoteksnavn i kartotekskolonnen. 4 Vælg opsætning af rapporten og sæt feltet Udskriv subtotal til JA. 5 Godkend og afprøv rapporten. 291
Opgave 2: Group header og footer i Udlånsliste Formål med opgaven At tilføje en søgning af et ekstra kartotek i rapporten Udlånsliste og at anvende linjetyperne Group header og footer til dette kartotek. Beskrivelse Der skal arbejdes videre med rapporten Udlånsliste fra forrige opgave. Rapporten skal udvides med en søgning af kartoteket UDLUdlånsPost, således at der for hver udlånsordre vises hvilke udlånslinjer, den indeholder. Linjerne skal synkroniseres med ordrerne og der skal indsættes linjer af typerne Group header og footer, for at vise hvor posterne starter og slutter. Forløb 1 Vælg rapporten Udlånsliste fra forrige opgave. 2 I Rapport XAL, i søgeløkken på UDLUdlånsKart, skal der indsættes en ny søgeløkke på UDLUdlånsPost. UDLUdlånsPost skal synkroniseres med UDLUdlånsKart. Posterne fra UDLUdlånsPost skal desuden sendes til Rapport definition til en Bodylinje med samme kartoteksnavn. 3 I Rapport definition skal der oprettes en ny Bodylinje til kartoteket UDLUdlånsPost. Indsæt felterne VareNr, VareNavn og Status. 4 Opret en Group header linje til kartoteket UDLUdlånsPost. Linjen skal være blank og anvendes kun til adskillelse med ordrer og linjer. 5 Opret to Group footer linjer til kartoteket UDLUdlånsPost. Den første skal indeholde en gennemgående tegnet dobbeltstreg og den anden skal være blank. Dette viser at posterne slutter her. 6 Godkend og afprøv rapporten. 292
7. Rapport QT Grundlæggende funktioner Mål med lektionen At give deltagerne grundlæggende indsigt i opsætning af rapport-qt, samt viden om opsætning af brugernes muligheder. Efter lektionen skal kursisterne kunne: Opsætte rapport QT med ét kartotek Opsætte brugermulighederne i rapport-qt. QT generelt QT er en forkortelse for Query Tool, hvilket vil sige forespørgselsværktøj. Værktøjet anvendes til forespørgsler i databasen på lige fod med rapport-xal. Selve QT-boksen minder mest om en promptboks med ledetekster og indtastningsfelter. Opbygningen er derimod helt anderledes. Eksempel på en QT Kartotek Afgrænsning Fra Til Status LagerKartotek Sortering..: Åben Filter...: Åben Kørsler...: Skjul Varenummer.: Åben QT-værktøjet Værktøjet hjælper programmøren til at danne ensartede forespørgsler, og samtidig spares der en del programmeringsarbejde. Desuden får brugeren visse muligheder der ellers er meget besværlige at kode i en XAL-kørsel. Med hensyn til XAL-editoren findes denne i en søjle i udviklingsmenuen og som en del af rapportgeneratoren. Det samme gælder for QT-værktøjet. Det findes også som søjle i udviklingsmenuen og er integreret i rapportgeneratoren. To muligheder for anvendelse af QT-værktøjet Mulighed Anvendelse Selvstændig Proces Integreret i Rapportgeneratoren Selvstændigt forespørgselsværktøj. Findes under QT i udviklingsmenuen. Udtrukne data sendes til skærmen med PRINT. Integreret som en del af rapportgeneratoren. Findes under RAP i udviklingsmenuen. Udtrukne data udskrives i form af rapporter. De to QT er har ikke noget med hinanden at gøre, men de er bygget ens op og fungerer ens, bortset fra at den ene skriver til skærmen, medens den anden sender sine data til rapporten. Denne lektion omhandler kun QT-værktøjet som en integreret del af rapportgeneratoren. 293
QT i forhold til XAL QT en kan sammenlignes med en XAL-kørsel, hvor nogle kommandoer som standard er indbygget som faste komponenter. Det er f.eks. ikke nødvendigt at angive SEARCH for at trække data fra et kartotek. Kartoteksnavnet indsættes blot i et felt i opsætningen af QT en. Fordele og ulemper ved at anvendelse af QT Fordele Søgestrukturer skal ikke programmeres. Større frihed til ændring af afgrænsninger og sortering under selve afviklingen. Generelt mindre programmering. Dialogen omkring afgrænsningen af poster skal ikke programmeres. Dialogen bliver ensartet fra opgave til opgave. Ulemper Der er ikke muligt at styre logikken 100% i programmet. Det er ikke muligt at tilgå de værdier, der indtastes i afgrænsningsboksene. Tre hovedområder i rapportgeneratoren Rapportgeneratoren består altså ikke kun af hovedområderne Rapport-XAL og Rapport-definition, men også af et tredje hovedområde Rapport-QT. De tre hovedområder i rapportgeneratoren Område Anvendelse Rapport-XAL Rapport-QT Rapport-definition Datasøgning vha. XAL-kommandoer. Datasøgning vha. QT-værktøjet. Definition af linjetyper og opsætning af layout. Udtræk med XAL eller QT Data udtrækkes i databasen med enten Rapport-XAL eller Rapport-QT som illustreret i nedenstående figur. 294
Dataudtræk med XAL eller QT Kartoteker Rapport- XAL Rapport- QT Rapport-definition Når rapportgeneratoren vælges, vises Rapport-XAL og Rapport-definition samtidig. Rapport-QT skal derimod først åbnes med funktionen Hop til søgning, ALT+F6. Områdernes placering i rapportgeneratoren ses i figuren herunder. Hovedområdernes placering i rapportgeneratoren Rapport-XAL Rapport-definition Rapport-QT (Kaldes med ALT+F6) Bemærk! Ved oprettelse af nye rapporter er det valgfrit, hvilket hovedelement der anvendes først. XAL og QT i samme rapport Der må ikke forekomme både Rapport-XAL og Rapport-QT i den samme rapport. Hvis begge dele forekommer samtidig, anvender systemet automatisk Rapport-XAL. 295
Systemet anvender Rapport-XAL hvis begge forefindes Kartoteker Rapport- XAL Rapport- QT Rapport-definition Hvis begge værktøjer anvendes i samme rapport, er reglen den, at XAL får første prioritet og derfor anvendes. Det gælder også, hvis der blot er indsat en blank linje eller en kommentar i XAL en. Oprettes der en Rapport-QT, og den ikke kan startes, er det vigtigt først at undersøge, om der evt. findes blanke linjer, kommentarer eller kodelinjer i Rapport-XAL. En rapport kan afprøves med ALT+R uden at være gemt, og derfor opdages en sådan fejl først ved afprøvningen, eller når rapporten gemmes. Når fejlen opstår vises nedenstående meddelelse på skærmen. Fejlmeddelelse ved både Rapport-XAL og Rapport-QT i samme rapport Rapporten... har både søgning og ikke-tom rapport-editorbox. Kun rapport-editorboxen vil blive anvendt under afvikling. Med søgning menes Rapport-QT, og med rapport-editorbox menes Rapport-XAL. Forskelle ved udsendelse af data til rapport Når der fra Rapport-XAL skal sendes data til en rapport, anvendes kommandoen OUTPUT med et kartoteksnavn. Kommandoen anvendes kun i Rapport-XAL. I QT en anvendes der ingen kommando til dette. QT en er implementeret på en sådan måde, at udtrukne data automatisk ledes videre til rapporten. 296
Dataudtræk med XAL eller QT Kartoteker Rapport- XAL Rapport- QT OUTPUT OUTPUT Rapport-definition QT værktøjets vinduer I QT-værktøjet anvendes flere vinduer med felter, der skal udfyldes for at opnå den ønskede funktionalitet i QT en. Vinduer i QT-værktøjet Vinduer Afgrænsningsvinduet Opsætningsvinduet Anvendelse Viser de kartoteker der skal søges i. Felter til afgrænsning kan indsættes. (Kartotekerne indsættes i relationsvinduet.) Opsætning af selve afgrænsningsvinduet mht. overskrift, størrelse på afgrænsningsfelter o.a. Relationsvinduet Indsættelse af kartotek der skal søges i. Kartotekerne ses i afgrænsningsvinduet. (Ved flere kartoteker angives også felter, der skal relatere til hinanden). Sorteringsvinduet Indsættelse af felter eller indeks til sortering. 297
Vinduernes indbyrdes forhold Opsætningsvindue CTRL+F6 Afgrænsningsvindue SH+F2 ENTER i Sortering- feltet Relationssvindue Sorteringssvindue SH+F2 = Oprette SH+F6 = Rette På de næste sider beskrives de forskellige vinduer. Afgrænsningsvinduet Afgrænsningsvinduet er det vindue, brugeren ser, når QT en afvikles. I vinduet ses f.eks. navnet på søgekartoteket og de felter, der kan afgrænses på. Opsætningen af vinduet foregår i rapportgeneratoren, hvor det åbnes med funktionstaster. Afgrænsningsvinduet når det er åbnet i rapportgeneratoren (XAL område) (Rapportområde) -Kartotek-Afgrænsning-Fra-------Til-------Status (Afgrænsningsvinduet i Rapport-QT) 298
Når afgrænsningsvinduet første gang åbnes, er det tomt og består kun af nogle søjleoverskrifter som i eksemplet herover. For at QT en kan fungere skal vinduet først udfyldes med navne på det eller de kartoteker, der skal søges data ud fra. Desuden skal der også indsættes navne på felter, der skal anvendes til afgrænsning af posterne i de angivne kartoteker. Efterfølgende vises et eksempel på en færdig QT. Eksempel på afgrænsningsvindue Kartotek Afgrænsning Fra Til Status LagerKartotek Sortering..: Åben Filter...: Åben Kørsler...: Varenummer.: Skjul Åben I eksemplet fremgår det, at det drejer sig om en søgning i kartoteket InvenTable, og at der er mulighed for at afgrænse på Varenummer-feltet (ItemNumber). Der er ikke angivet nogen sortering i Sortering-feltet. Vedr. søjlen Status henvises til afsnittet Brugernes muligheder i Rapport-QT. Inden kartotekerne kan ses i afgrænsningsvinduet, skal de opsættes i Relationsvinduet. Dette behandles i næste afsnit. Relationsvinduet (ved søgning i ét kartotek) Relationsvinduet består af forskellige felter, der benyttes til styring og angivelse af de kartoteker, der skal søges i. Vinduet anvendes forskelligt, afhængigt af om der skal søges i ét eller flere kartoteker. I denne lektion behandles vinduets anvendelse i forbindelse med søgning i ét kartotek. Nedenstående figur viser relationsvinduet, hvor de felter, der anvendes ved søgning i ét kartotek, er fremhævet med grå skygge. Relationsvinduet ved søgning i ét kartotek Relater Felt Felt Kartoteksnavn Output Altid Før join Alle felter Tilføj Alle felter Samme felter Ingen felter Bemærk at alle felter er synlige, men at kun to af dem skal anvendes. 299
Når vinduet åbnes, er cursoren altid i det øverste felt i højre side. Her indsættes navnet på det kartotek, der skal søges i. I det nederste felt med ledeteksten Tilføj, angives om brugeren selv må have lov til at tilføje felter til afgrænsning, når QT en afvikles. Brugerens muligheder for tilføjelse af felter til afgrænsning i QT en Mulighed Anvendelse Alle felter Samme felter Ingen felter Brugeren har mulighed for at tilføje alle de felter der findes i kartoteket. Dette er default. Brugeren har kun mulighed for at tilføje de samme felter, som programmøren i forvejen har sat på som afgrænsningsfelter. Brugeren må slet ikke tilføje nogen felter, og kan således kun afgrænse på de felter, programmøren har indsat i QT en. Opsætningsvinduet Opsætningsvinduet anvendes til at bestemme, hvordan afgrænsningsvinduet skal se ud mht. overskrift, bredde på kolonner, om søgekartotekets navn skal vises for brugeren o.a. Opsætningsvindue Overskrift...: Lagerliste Bredder Kartoteker Afgrænsning 0 0 Fra Til 15 15 Vis kartoteker.: Vis filter...: Globale formler: Ja Ja Formler Eksempel på opsætning til nedenstående afgrænsningsvindue. Vinduet åbnes ved kald fra afgrænsningsvinduet. Afgrænsningsvindue med overskrift Lagerliste -Kartotek Afgrænsning Fra Til LagerKartotek Sortering..: Filter...: Kørsler...: Varenummer.: Der er følgende muligheder i opsætningen. 300
Muligheder i opsætningsvinduet Mulighed Overskrift Bredder Vis kartoteker Vis filter Globale formler Anvendelse QT ens overskrift. Indtastes som fri tekst. Bredden på søjlerne Kartoteker, Afgrænsning, Fra og Til. Angives i form af antal karakterer. Ja eller Nej (default) til om kartoteksnavnet skal vises for brugeren, når denne anvender QT en. Ja eller Nej til om linjen med filteret skal vises for brugeren, når QT en anvendes (Behandles ikke i denne lektion). Dette felt vises ikke for brugeren, men er beregnet til at åbne for en liste over triggere til indtastning af ekstra kode (Behandles ikke i denne lektion). Sorteringsvinduet Sorteringsvinduet består af tre felter, der anvendes til sortering af poster, der fremfindes, når en QT afvikles. Der kan sorteres på felter og faste indekser. Felter kan sorteres efter stigende eller faldende værdi. Sorteringsvindue Felt Retning Tvunget Index Muligheder i sorteringsvinduet Mulighed Anvendelse Felt Retning Tvunget indeks Angivelse af kartoteksfelter at sortere på. Svarer til ORDER i XAL. Sorteringsfølge for indsatte kartoteksfelter. Svarer til ASCENDING og DESCENDING i XAL. Angivelse af et fast indeks. Svarer til USING i XAL. 301
Procedure for QT til søgning i ét kartotek. Start afgrænsningsvinduet fra en ny eller eksisterende rapport i rapportgeneratoren. Vælg opsætningsvinduet og indsæt overskrift og evt. vis kartoteker. Vælg relationsvinduet og indsæt søgekartotek. Giv evt. bruger rettigheder til selv at tilføje afgrænsningsfelter. Tilbage i afgrænsningsvinduet tilføjes afgrænsningsfelter og QT en godkendes. Eksempel på Rapport-XAL og Rapport-QT Til sammenligning vises efterfølgende eksempler på henholdsvis en rapport-xal og en rapport-qt. Begge opsætninger resulterer i samme rapport. Det vil sige, at Body linjen i layoutområdet er ens i begge tilfælde. Kun søgningen er forskellig. Rapport-XAL Eksempel på Rapport-XAL med promptboks. Indtastede værdier anvendes i søgeløkken. C5 vers. 2012 -> Eksempel på opsætning i rapport-xal STR 10 &FraVare STR 10 &TilVare PROMPT Lagerliste med kostpriser,,, Fra...: GET (&FraVare REF InvenTable.ItemNumber), Til...: GET (&TilVare REF InvenTable.ItemNumber) INPUT SEARCH InvenTable WHERE ItemNumber >= &FraVare AND ItemNumber <= &TilVare OUTPUT InvenTable END Body InvenTable ItemNumber VareNavn1 *** ItemName1 CostPrice 302
C5 vers. -> 4.1 Eksempel på opsætning i rapport-xal STR 10 &FraVare STR 10 &TilVare PROMPT Lagerliste med kostpriser,,, Fra...: GET (&FraVare REF LagKart.VareNummer), Til...: GET (&TilVare REF LagKart.VareNummer) INPUT SEARCH LagKart WHERE VareNummer >= &FraVare AND VareNummer <= &TilVare OUTPUT LagKart END Body LagKart VareNummer VareNavn1 *** VareNavn1 KostPris Afvikling af rapport-xal med promptboksen Lagerliste med kostpriser Fra...: Til...: Resultat 18000 Kabinet 1.250,20 16000 Ram 520,40 12000 Harddisk type 2 1.230,75 14000 CD romdrev 50,10 20000 S kærm 1.000,10 Efterfølgende vises samme opsætning i Rapport-QT. Rapport-QT Tomt afgrænsningsvindue (Vises ved kald af QT værktøjet ALT+F6) Kartotek Afgrænsning Fra Til Status 303
Opsætningsvindue (Indsættelse af overskrift og evt. vis kartotek CTRL+F6) Overskrift...: Lagerliste med kostpriser Bredder Kartoteker Afgrænsning 0 0 Fra Til 15 15 Vis kartoteker.: Vis filter...: Globale formler: Nej Nej Formler C5 vers. 2012 -> Relationsvindue (Valg af kartotek til søgning SH+F2) Relater Felt 123456789012345 InvenTable Felt Output Tilføj Altid Alle felter Før join C5 vers. -> 4.1 Relationsvindue (Valg af kartotek til søgning SH+F2) Relater Felt 123456789012345 LagKart Felt Kart Output Tilføj Altid Alle felter Før join 304
Afgrænsningsvinduet (Tilføje afgrænsningsfelter og godkende QT en) Kartotek Afgrænsning Fra Til Status Lagerkartotek Sortering..: Åben Filter...: Kørsler...: Åben Skjul Varenummer.: Åben Varenummer-feltet (ItemNumber) er indsat som afgrænsningsfelt. På næste side vises det færdige afgrænsningsvindue, der svarer til promptboksen i Rapport-XAL. Det færdige afgrænsningsvindue (som brugeren anvender det) Afgrænsning Fra Til Sortering..: Varenummer.: Det er ikke muligt for brugerne at ændre på promptbokse. De kan imidlertid ændre visse ting i QTbokse. I næste afsnit behandles brugernes muligheder for at ændre i QT boksen under afviklingen. Brugernes muligheder i Rapport-QT Når der anvendes Rapport-QT har brugerne nogle fordele, der ikke findes i Rapport-XAL. Brugeren kan f.eks. selv tilføje og slette afgrænsninger, afhængigt af om programmøren har åbnet for denne mulighed. De enkelte muligheder beskrives i nedenstående skema. Brugerens muligheder ved anvendelse af Rapport-QT Mulighed Anvendelse Tilføj afgrænsning Fjern afgrænsning Kopiere feltindhold Skift mellem 1 og 2 afgrænsninger Opsætning Kan selv tilføje afgrænsninger inden for de muligheder programmøren har opsat i relationsvinduet. Kan selv fjerne både egne og programmørens afgrænsninger. Kan kopiere feltindhold fra et afgrænsningsfelt til et andet. Kan bestemme om der skal være afgrænsningsfelt både i Fra og Til kolonnen eller kun i Fra kolonnen. Der kan ændre bredde på kolonner via opsætning. Kan vælge at vise kartoteker og filter. Slet brugerrettelser Kan slette alle sine egne ændringer i forhold til den oprindelige opsætning udført af programmøren. 305
Afgrænsningsvindue opsat af programmør Afgrænsning Fra Til Sortering..: Varenummer.: Lagerliste med kostpriser Afgrænsningsvindue ændret af bruger under afvikling Lagerliste med kostpriser Kartotek Afgrænsning Fra Til Lagerkartotek Sortering..: Varenummer.: 10000 10000 Varenummer.: 18000 20000 Varegruppe.: 10 ----- Vis kartotek Bredde på kolonner CTRL+F6 Tilføj afgrænsning F2 Slet afgrænsning ALT+F9 Kan begrænses i relationsvinduet 1 eller 2 felter ALT+L Kopiere felt ALT+C Det fremgår, at der findes visse standard opsætningsmuligheder for brugerne. Brugernes mulighed for at tilføje afgrænsningsfelter kan begrænses i relationsvinduet. Ud over ovenstående tiltag for at styre brugernes muligheder, kan de enkelte linjer også styres. Det foregår i afgrænsningsvinduet i søjlen Status. Afgrænsningsvindue med søjlen Status Kartotek Afgrænsning Fra Til Status Lagerkartotek Sortering..: Åben Filter...: Åben Kørsler...: Skjul Varenummer.: Åben 306
Søjlen status har tre valgmuligheder. Mulighed Anvendelse Åben Bruger kan indtaste i felter. Bruger kan desuden tilføje og slette felter, hvis dette er åbent i relationsvinduet. Lås Bruger kan se værdier som programmøren har indlagt i forvejen, men kan ikke ændre disse værdier. Bruger kan selv tilføje afgrænsningsfelter. Skjul Bruger kan ikke se værdier indsat i forvejen. Bruger kan heller ikke tilføje nye afgrænsningsfelter, selv om det er lovligt i relationsvinduet. 307
Opgaver: Rapport QT Grundlæggende funktioner Opgave 1: Rapport QT til Vareudlån Formål med opgaven At oprette Rapport QT til en rapport med navnet Vareudlån. Rapporten er en liste over udlånte varer i kartoteket UDLUdlånsPost. Huskelister Rapport QT Oprette første kartotek Beskrivelse Der skal oprettes Rapport QT til en rapport med navnet Vareudlån. Data til rapporten udtrækkes fra kartoteket UDLUdlånsPost. Der indsættes afgrænsningsfelter til felterne UdlånsNr og VareNr. Forløb 1 Opret en ny rapport. 2 Vælg Rapport QT og giv QT overskriften: Vareudlån. 3 Tilføj kartoteket UDLUdlånsPost. 4 Tilføj afgrænsningsfelterne UdlånsNr og VareNr. 5 Godkend opsætningen af QT en og luk rapporten. 6 Afprøv om QT boksen ser rigtig ud. 308
Opgave 2: Rapport-layout til Vareudlån Formål med opgaven At oprette en Bodylinje og Page headere til rapporten Vareudlån. Beskrivelse I rapporten Vareudlån, fra forrige opgave, skal der oprettes en enkelt Bodylinje med felterne UdlånsNr, VareNr, VareNavn og Status. Desuden skal der oprettes et felt, der henter CostPrise fra InvenTable. Der skal også oprettes Page headere med overskrifter til felterne. Forløb 1 Vælg rapporten Vareudlån fra forrige opgave. 2 Opret en enkelt Bodylinje til kartoteket UDLUdlånsPost og indsæt felterne UdlånsNr, VareNr, VareNavn og Status. Indsæt til sidst på linjen et felt, hvor feltudtrykket består af et direkte opslag, der henter feltet CostPrice på kartoteket InvenTable 3 Indsæt en Page header linje med overskrifter til felterne. Venstre- og højrestil overskrifterne, så de passer til værdierne i felterne. 4 Indsæt en Page header linje med tegnede streger under overskrifterne. Tilpas stregerne efter felternes længde. 5 Godkend rapporten og afprøv rapporten. 309
Opgave 3: Begrænsninger i QT til Vareudlån Formål med opgaven At indsætte begrænsninger i QT en til rapporten Vareudlån, så brugerne kun kan tilføje de samme felter, som du har indsat. Desuden skal det skjules, så brugerne ikke kan se sortering og filter. Beskrivelse I rapporten Vareudlån fra forrige opgave, skal der i QT en opsættes begrænsninger for brugerne, så de kun kan tilføje de samme felter, som de ser på QT en, når den afvikles. Felterne sortering og filter skal desuden skjules for brugerne. Forløb 1 Vælg rapporten Vareudlån fra forrige opgave. 2 Indsæt begrænsninger i Rapport QT, så brugerne kun kan tilføje samme felter, som de ser på QT en. 3 Skjul Sortering og Filter i Rapport QT, så brugerne ikke kan se dem. 4 Godkend rapporten og afprøv om afgrænsningerne virker. 310
8. Rapport QT filtrering og sortering Mål med lektionen Formålet med denne lektion er at give deltagerne kendskab til filtrering og sortering i Rapport QT. Efter lektionen skal kursisterne kunne: Filtrere poster i Rapport QT Sortere poster i Rapport QT og kende: Forskel på Build-filter og Run-filter. Generelt Ved filtrering i Rapport QT forstås muligheden for at indlægge kode, der er bestemmende for, om de udvalgte poster skal sendes videre til Rapport Definition. Sortering i Rapport QT anvendes til at bestemme, den rækkefølge posterne udleveres på. Filtrering Filtrering i Rapport QT giver yderligere mulighed for at udvælge, de poster der skal med på en rapport. Den anden mulighed er afgrænsningsfelterne, som både programmør og bruger kan indsætte. Filtrering foregår i afgrænsningsvinduet i Rapport QT i feltet Filter. Afgrænsningsvindue i Rapport QT med feltet Filter Kartotek Afgrænsning Fra Til Status Debitorkartotek Sortering..: Filter...: Kørsler...: Kontonummer: Åben Åben Skjul Åben I ovenstående eksempel, på et afgrænsningsvindue til debitorkartoteket, ses både feltet Filter og et afgrænsningsfelt i form af kontonummerfeltet. Det skal bemærkes at afgrænsningsvinduet vises, som det ser ud under opsætningen. Under afviklingen ændrer vinduet form, idet kolonnen Status ikke vises, ligesom der er mulighed for at begrænse, hvad brugeren ellers må se under afviklingen. Afgrænsningsfelter I kontonummer-feltet kan der vælges fra og til kontonummer og hvis der skulle være behov for flere intervaller af kontonumre, kan der blot tilføjes et eller flere afgrænsningsfelter mere på feltet. Filter Filter-feltet giver en anden mulighed for filtrering af posterne, idet der her kun indsættes betingelser, der skal være opfyldt for at posterne kommer med i rapporten. Der kan således ikke indtastes XAL kode med kommandoer, men udelukkende betingelser. 311
Filtre i Rapport QT Der findes to filtre i Rapport QT, et der anvendes under opsætningen og et der anvendes under afviklingen. Filtre i Rapport QT Filter Anvendelse Build-filter Run-filter Kan kun udfyldes under opsætningen. Kan ikke ses under afvikling. Kan kun udfyldes under afviklingen. Ses ikke under opbygningen. Build-filter Opsætning af Build-filter Opsætning af Build-filter udføres i afgrænsningsvinduet, ved at placere cursoren i feltet Filter og taste ENTER, hvorved der åbnes en editorboks med overskriften Build-filter. Selv om det er en editorboks, kan der alligevel kun indtastes betingelser, som de der f.eks. anvendes i IF strukturer. Eksempel på opsætning af Build-filter i afgrænsningsvinduet Build-filter saldofelt<>0 ENTER Kartotek Afgrænsning Fra Til Status Debitorkartotek Sortering..: Filter...: Kørsler...: Konto...: Åben Åben Skjul Åben I ovenstående eksempel er der, i filteret, indsat betingelsen Saldofelt<>0. Da der ikke er indsat værdier i afgrænsningsfeltet konto, medtages alle kontonumre, dog træder filteret i kraft og medfører, at kun poster der opfylder betingelsen i Build-filteret, medtages. Run-filter Opsætning af Run-filter Opsætning af run-filter udføres i afgrænsningsvinduet under afviklingen, ved at placere cursoren i feltet Filter og taste ENTER. Til forskel fra opbygningen af Rapport QT en, åbnes denne gang en editorboks med overskriften Run-filter. Selv om det er en editorboks, kan der alligevel kun indtastes betingelser, som de der f.eks. anvendes i IF strukturer. 312
Eksempel på Run-filter under afvikling af afgrænsningsvinduet Run-filter KreditMax>1000 ENTER Kartotek Afgrænsning Fra Til DebitorKartotek Sortering..: Filter...: Konto...: I ovenstående eksempel starter feltet Filter med at være tomt. Det viser at Build-filteret ikke kan ses. Det filter, der ses under afviklingen, er således Run-filteret. Under opbygningen kan der således opbygges et filter, der ikke kan ændres eller ses under afviklingen. Til gengæld kan brugeren selv tilføje sine egne betingelser i Run-filteret. Bemærk! Build-filterets betingelser anvendes før Run-filterets. Dette kan have betydning i visse tilfælde. Hvis der i Build-filteret f.eks. opstilles betingelsen Saldofelt>2000, og der i Run-filteret opstilles betingelsen Saldofelt>1000, giver dette kun poster, der tilsvarer betingelsen fra Build-filteret. Der medtages altså ikke poster, der har mindre saldo end 2000, selv om det anfordres i Run-filteret. Sortering Sortering udføres enten underopsætning eller afvikling. I begge tilfælde foregår det på samme måde i samme vindue. Opsætningen foregår fra Afgrænsningsvinduet i Rapport QT, ved at placere cursoren i feltet Sortering og taste ENTER, hvorved Sorteringsvinduet åbnes. Sorteringsvinduet Sorteringsvinduet består af tre felter der anvendes til sortering af poster. Der kan sorteres på felter og faste indekser, og felter kan sorteres stigende eller faldende. Sorteringsvindue Felt Retning 313
Tvunget Index Muligheder i sorteringsvinduet Mulighed Anvendelse Felt Retning Tvunget indeks Angivelse af kartoteksfelter at sortere på Svarer til ORDER eller ORDER BY i XAL Sorteringsfølge for indsatte kartoteksfelter Svarer til ASCENDING og DESCENDING i XAL Angivelse af et fast indeks Svarer til USING eller USING INDEX i XAL Anvendelse af sorteringsvinduet Åbning af sorteringsvindue under afvikling af Rapport QT Felt Sortering Retning Liste over felter ALT+ H Liste over indekser ALT+H Tvunget Index Kartotek Afgrænsning Fra Til Debitorkartotek Sortering..: Filter...: Konto...: ENTER 314
Opgaver: Rapport QT filtrering og sortering Opgave 1: Filter og sortering efter index i QT til Vareudlån Formål med opgaven At anvende filter og sortering i QT en til rapporten Vareudlån. Beskrivelse Der skal indsættes filter i Rapport QT, så kun varer med status Udlånt vises. Desuden skal linjerne sorteres efter indexet UDLUdlVarIdx, der sorterer efter udlånsnummer og varenummer. Forløb 1 Vælg rapporten Vareudlån fra forrige opgave. 2 Indsæt et filter så kun varer med status Udlånt medtages i rapporten. 3 Indsæt sortering så varerne sorteres efter udlånsnummer og varenummer. Anvend indexet UDLUdlVarIdx. 4 Godkend rapporten og afprøv. 315
Opgave 2: Sortering efter felt i QT til Vareudlån Formål med opgaven At anvende sortering efter et felt i QT en til rapporten Vareudlån. Beskrivelse Der skal arbejdes videre med rapporten fra forrige opgave, idet der her skal sorteres efter et bestemt felt i stedet for et index. Forløb 1 Vælg rapporten Vareudlån fra forrige opgave. 2 Indsæt en sortering så varerne sorteres alene efter feltet VareNr. 3 Hvis der er filter i QT en, skal det fjernes, så alle varer medtages. 4 Godkend rapporten og afprøv. 316
9. Subtotaler automatiske Mål med lektionen At give deltagerne indsigt i anvendelse af automatiske subtotaler i rapporter. Efter lektionen skal kursisterne kunne: Opsætter felter til automatiske subtotaler Anvende automatiske ledetekster foran subtotaler. Automatiske subtotaler generelt Automatiske subtotaler dannes uden erklæring af variabler, og sammentælling udføres uden tildeling af værdier til variabler. Automatiske subtotaler anvendes både sammen med Rapport-XAL og Rapport-QT. Procedure for brug af automatiske subtotaler Ved automatiske subtotaler skal følgende tre trin gennemføres. Procedure for anvendelse af automatiske totaler Trin Anvendelse 1 Opsætning af felt Opsætning af det eller de felter der skal dannes subtotal for. 2 Opsætning af udskrivningsmåde Om og hvordan totalen skal udskrives. 3 Opsætning af ledetekst Opsætning af hvilken type ledetekst der skal anvendes til totalen. De tre trin behandles efterfølgende. Opsætning af felt Felter med subtotal sættes op i layoutområdet i Rapport-definition. Feltet åbnes og i menuen Ret felt i menupunktet Subtotaler indsættes en af summeringsmetoderne fra nedenstående skema. Metoder til summering Metode Sum alle Sum positive Sum negative Anvendelse Alle poster summeres. Kun positive poster summeres. Kun negative poster summeres. Opsætningen foregår som vist i nedenstående figur. 317
C5 vers. 2012 -> Opsætning af subtotal på feltet AmountMst PgHd PgHd Body VendTrans Konto Dato Bilag SaldoDkr ---------- -------- ---------- ----------- Account Date_ Voucher AmountMst F6 Ret felt......... Subtotaler Opsæt subtotal INSERT Sum alle Sum positive Sum negative Efterfølgende vises eksempler på anvendelse af de tre metoder. Eksemplerne har ovenstående rapportdefinition som udgangspunkt. Summering udføres på AmountMst-feltet. De efterfølgende rapporter viser resultatet afhængigt af den valgte metode i feltet. C5 vers. -> 4.1 Opsætning af subtotal på feltet BeløbDkk PgHd PgHd Body KrePost Konto Dato Bilag SaldoDkr ---------- -------- ---------- ----------- Konto Dato Bilag BeløbDkk F6 Ret felt......... Subtotaler Opsæt subtotal INSERT Sum alle Sum positive Sum negative Efterfølgende vises eksempler på anvendelse af de tre metoder. Eksemplerne har ovenstående rapportdefinition som udgangspunkt. Summering udføres på BeløbDkk-feltet. De efterfølgende rapporter viser resultatet afhængigt af den valgte metode i feltet. 318
Resultat Sum Alle Konto Dato Bilag Saldo DKK --------- -------- ---------- ----------- 971249987 23/05-97 500016-222.693,75 971249987 20/10-97 971249987 04/01-98 70025 222.693,75 500025-26.723,25 971249987 02/03-98 70056 26.723,25 971249987 31/03-98 500050-93.531,38 ----------- Grandtotal -93.531,38 =========== Sum alle I dette eksempel dannes der en samlet sum for alle poster både positive og negative. Ved at anvende Sum positive eller Sum negative, vil selve rapporten ligne ovenstående, idet der kun udskrives en total i rapporten. Der kan dog godt anvendes flere metoder samtidig, hvilket fremgår af de to efterfølgende eksempler. Når der angives mere end en metode på samme felt, vil der blive udskrevet en total for enkelt hver metode. Resultat Sum positive og Sum negative samtidig Konto Dato Bilag Saldo DKK --------- -------- ---------- ----------- 971249987 23/05-97 500016-222.693,75 971249987 20/10-97 70025 222.693,75 971249987 04/01-98 500025-26.723,25 971249987 02/03-98 70056 26.723,25 971249987 31/03-98 500050-93.531,38 ----------- Grandtotal 249.417,00-342.948,38 =========== Sum positive Sum negative I dette eksempel dannes der to subtotaler, en for positive og en for negative tal. I næste eksempel anvendes alle metoder samtidig. 319
Resultat alle metoder samtidig Konto Dato Bilag Saldo DKK --------- -------- ---------- ------------------------ 971249987 23/05-97 971249987 20/10-97 500016 70025 222.693,75-222.693,75 971249987 04/01-98 500025-26.723,25 971249987 02/03-98 971249987 31/03-98 70056 26.723,25 500050-93.531,38 ------------------------ Grandtotal Sum positive 249.417,00-93.531,38 Sum alle -342.948,38 Sum negative ======================== Bemærk at værdien for Sum alle (-93.531,38) i eksemplet udskrives på linjen over værdien for Sum negative (-342.948,38). Desuden udskrives beløbs-feltet med negativ forskydning. Dette er nødvendigt, for at kunne se værdien for Sum alle. Negativ forskydning udføres i opsætningen på feltet i format i menuen Ret felt. Hvis der ikke anvendes negativ forskydning, eller den negative forskydning ikke er stor nok, vil værdien for Sum alle blive helt eller delvist overskrevet af værdien for Sum positive. I alle de ovenstående eksempler udskrives ledeteksten Grandtotal foran totalerne. Opsætning af udskrivningsmåde Inden der kan udskrives automatiske totaler på rapporter, skal der også vælges udskrivningsmåde. Det vil sige, at der skal vælges, om rapporten skal udskrives med eller uden totaler. Opsætningen foregår i Rapport-definition i billedet Opsætning eller under afviklingen af rapporten i billedet Udskriftsmuligheder. I begge billeder findes Subtotaler-feltet, der kan åbne for et nyt billede med kartoteksnavnet som overskrift. I dette billedet kan der udføres en nærmere definition af rapportens udseende, når der udskrives med totaler. Billedet indholder følgende felter. 320
Felter ved udskrivning af totaler Felter Anvendelse Udskriv Subtotal Udskriv kun totaler Niveau Linjeskift Sideskift efter subtotal Nulstil efter udskrift Skriv total hvis kun een Gentag ens totaler Linje over subtotal Linje under subtotal Linje under grandtotal Ja eller Nej om subtotalen skal udskrives Ja eller Nej om der KUN skal udskrives totaler Med et tal angives, hvilket niveau der skal udskrives totaler for. Niveauet fremgår af valgt index eller egen sortering i Rapport-XAL eller rapport-qt. Hvor mange linjeskift der skal være efter totalen Ja eller Nej om der skal skiftes side efter subtotalen Ja eller Nej om totalen skal nulstilles efter udskrift Ja eller Nej om totalen også skal udskrives, hvis der kun er een total. Ja eller Nej om totalen skal gentages, hvis samme total har været udskrevet lige før. Hvordan linjen over subtotalen skal se ud. Hvordan linjen under subtotalen skal se ud. Hvordan linjen under grandtotalen skal se ud. Det vigtigste felt er Udskriv subtotal, der skal besvares med Ja eller Nej. Feltet SKAL besvares med Ja for at udskrive totaler. De øvrige felter påvirker rapportens udseende i større eller mindre grad. Opsætning af automatisk ledetekst Teksten i automatiske ledetekster afhænger af, hvilke niveauer der udskrives subtotaler for. Niveau Niveauer opstår når der sorteres i rapporter, idet hvert felt der sorteres på svarer til et niveau. Niveau Felt 0 Intet felt (giver grandtotal) 1 Første felt i sorteringsrækkefølge 2 Andet felt i sorteringsrækkefølge Osv. Osv. Sortering Sortering kan opsættes i: Rapport-XAL i søgeløkker med kommandoerne USING eller ORDER Rapport-QT i Sortering-feltet. 321
Tekst Der er to opsætninger til automatiske ledetekster Kopi af linje Feltnavn værdi. I begge opsætninger afhænger teksten af, hvilket niveau der udskrives subtotaler for. De automatiske ledetekster fremgår af nedenstående skema. Indhold af automatiske ledetekster Opsætning Niveau 0 (grandtotal) Niveau 1 og op Kopi af linje Feltnavn værdi Ingen ledetekst Ved talfelter der ikke summeres udskrives tallet 0 på samme linje som totalen. Udskriver som ledetekst ordet Grandtotal. Udskriver som ledetekst den aktuelle værdi fra Niveau-feltet. Ved talfelter, der ikke summeres, udskrives tallet 0 på samme linje som totalen. Udskriver som ledetekst Niveaufeltets navn efterfulgt af den aktuelle værdi fra feltet. Ledetekster udskrives når Niveau-felter skifter værdi og subtotalen udskrives. Opsætning af ledetekst, niveau og om totaler skal udskrives fremgår af nedenstående skema. 322
Opsætning af ledetekst og udskrivningsmåde Rapport-definition CTRL+F6 Subtotal linje.: Opsætning ALT+H Kopi af linje Feltnavn værdi Subtotal...: Vælg ENTER KartoteksNavn Udskriv subtotal: JA Udskriftsmuligheder (under afvikling) ENTER Niveau...: Subtotal...: Vælg Defaultværdier De værdier, der indsættes under opsætningen, fungerer som default i billedet Udskriftsmuligheder, når dette vises under afviklingen. Eksempler Eksempel med Kopi af linje og niveau 0 Konto Dato Bilag SaldoDkr --------- -------- ---------- ----------- 971249987 23/05-97 500016-222.693,75 971249987 20/10-97 70025 222.693,75 971249987 04/01-98 971249987 02/03-98 500025-26.723,25 70056 26.723,25 971249987 31/03-98 500050-93.531,38 ----------- 0-93.531,38 =========== I dette eksempel udskrives totalen uden ledetekst og under søjlen bilag skrives et 0. 323
Eksempel med Feltnavn værdi og niveau 0 Konto Dato Bilag Saldo Dkr --------- -------- ---------- ----------- 971249987 23/05-97 971249987 20/10-97 500016-222.693,75 70025 222.693,75 971249987 04/01-98 500025-26.723,25 971249987 02/03-98 971249987 31/03-98 70056 26.723,25 500050-93.531,38 ----------- Grandtotal -93.531,38 =========== I dette eksempel udskrives totalen med ledeteksten Grandtotal, og der er intet 0 under kolonnen Bilag. Eksempel med Kopi al linje og niveau 1 Konto Dato Bilag SaldoDkr ---------- -------- ---------- ----------- 971249987 23/05-97 500016 222.693,75 971249987 20/10-97 971249987 04/01-98 70025 222.693,75 500025-26.723,25 971249987 02/03-98 70056 26.723,25 971249987 31/03-98 500050-93.531,38 ----------- 971249987 0-93.531,38 ----------- 7147274141 30/05-94 500018 395.160,00 7147274141 20/10-94 70026 395.160,00 7147274141 03/01-95 7147274141 02/03-95 500049-17.246,63 70008 17.246,63 ----------- 7147274141 0 0,00 ----------- 0-93.531,38 =========== 324
Eksempel med Feltnavn værdi og niveau 1 Konto Dato Bilag SaldoDkr ---------- -------- ---------- ----------- 971249987 23/05-97 500016 222.693,75 971249987 20/10-97 971249987 04/01-98 70025 222.693,75 500025-26.723,25 971249987 02/03-98 70056 26.723,25 971249987 31/03-98 500050-93.531,38 ----------- Konto: 971249987-93.531,38 ----------- 7147274141 30/05-94 500018 395.160,00 7147274141 20/10-94 70026 395.160,00 7147274141 03/01-95 7147274141 02/03-95 500049-17.246,63 70008 17.246,63 ----------- Konto: 7147274141 0,00 ----------- Grandtotal -93.531,38 =========== 325
Opgaver: Subtotaler automatiske Opgave 1: Automatiske subtotaler i Vareudlån Formål med opgaven At udføre automatisk sammentælling af feltet med kostprisen i rapporten Vareudlån. Subtotalerne skal desuden udskrives i forskellige niveauer. Beskrivelse Der skal arbejdes videre med rapporten Vareudlån fra forrige opgave. I rapporten skal der foretages en automatisk summering af værdierne i feltet med kostprisen. Da der altid kun er én vare pr. udlånslinje, er subtotalerne et udmærket udtryk for den samlede kostpris for de udlånte varer. Forløb 1 Vælg rapporten Vareudlån fra forrige opgave. 2 Kontroller at rapporten sorteres alene efter feltet VareNr. 3 Opsæt feltet med kostprisen således at alle værdier summeres automatisk. 4 Vælg opsætning af rapporten og sæt feltet Udskriv total til JA Sæt feltet Subtotal linje med den automatiske ledetekst til værdien Feltnavn værdi. 5 Godkend rapporten og afprøv. 6 Vælg opsætning af rapporten og sæt niveau til 1. 7 Godkend rapporten og afprøv en gang til. 326
10. Rapport QT triggere grundlæggende Mål med lektionen Formålet med denne lektion er at give kursisterne overblik over triggerne i Rapport QT. Med et eksempel afprøves triggerne Init, Pre-body og Post-search. Efter lektionen skal kursisterne kunne: Anvende triggerne Init, Pre-body og Post-search Og kende til: Hvor de forskellige triggere befinder sig. Generelt Triggere i Rapport QT er editorbokse, hvori der kan indtastes XAL kode til yderligere styring af en Rapport QT. Triggerne afvikles på forskellige tidspunkter under afviklingen af Rapport QT en. Næste afsnit giver et overblik over, hvor triggerne befinder sig i Rapport QT. Triggere Oversigt over triggernes placering Der findes triggere to forskellige steder i Rapport QT. Trigger placering I afgrænsningsvinduet I opsætning af afgrænsningsvinduet 327
Triggernes placering i Rapport QT Trigger (Opsætning) Globale formler: Formler ENTER ENTER Liste over globale triggere CTRL+F6 (Afgrænsningsvindue) Kørsler...: Kørsler ENTER Trigger Liste over triggere i kartoteket ENTER Globale triggere i opsætning Triggerne der findes i Opsætning af Afgrænsningsvinduet, kaldes også globale triggere, idet de gælder for hele Rapport QT en med alle kartoteker. 328
Globale triggere Trigger Anvendelse Init Prompt Start Break Stop Error Abort Exit Start af QT. Macroload af biblioteker. Eneste trigger til erklæring af globale variabler. Ekstra promptbokse indsættes her. Triggeren overspringes ved en batchkørsel. Startes umiddelbart efter prompt triggeren inden afviklingen af selve kørslen. Ved Control Break kommandoen. Stop og Exit overspringes. Ved kørsels stop efter fuldendt afvikling. Ved fejl i Control afviklingen. Ved brug af ALT+Q i Afgrænsningsvinduet inden kørslen startes. Ved brug af F3 for at godkende og forlade rapporten efter succesfuld afvikling. Bemærk! Init triggeren er den eneste, hvori der kan erklæres variabler til fælles brug for alle andre triggere. Der kan udmærket erklæres variabler i de øvrige triggere, men disse variabler bliver lokale, i forhold til den trigger de erklæres i. De kan kun anvendes i den ene trigger. Kartotekstriggere Kartotekstriggere er triggere der findes på hver enkelt kartotek, der indsættes i en Rapport QT. Disse triggere gælder således kun, for det kartotek de tilhører. Se i oversigten hvordan de findes. 329
Trigger Pre-search Pre-body Pre-output Post-output Pre-join Post-join Index-break Post-body Post-search Anvendelse Igangsættes umiddelbart før et gennemløb af pågældende kartotek. Igangsættes for hver post i gennemløbet af det pågældende kartotek, umiddelbart efter udvælgelsen af posten. Igangsættes for hver udvalgt post, umiddelbart før posten sendes til output i Rapport Definition. Igangsættes for hver udvalgt post, der sendes til output, umiddelbart efter at den er blevet sendt. Igangsættes for hver udvalgt post umiddelbart før et eller flere underkartoteker gennemløbes. Igangsættes for hver udvalgt post, der forårsagede et gennemløb af et underkartotek, efter gennemløbet. Anvendes ved sortering efter index eller felter. Igangsættes for den sidste post, hver gang indexet brydes, lige inden der startes på nye poster i index. Igangsættes for hver udvalgt post i gennemløbet, umiddelbart før udvælgelsen af den næste post. Igangsættes umiddelbart efter gennemløb af pågældende kartotek. 330
Rækkefølge på triggere Rækkefølge på triggere ved ét kartotek Globale Hovedkartotek SEARCH løkke Init (Afgrænsningsvindue vises) Prompt (Udskriftsmuligheder vises) Start Stop (Udskrift printes / vises) Exit Pre-search Pre-body Pre-output (Danner side x, linje y) Post-output Index-break Post-body Post-Search SEARCH END OUTPUT Break Error Abort 331
Rækkefølge på triggere ved flere kartoteker Globale Hovedkartotek Underkartotek Init (Afgrænsningsvindue vises) Prompt (Udskriftsmuligheder vises) Start Pre-search Pre-body Pre-output (Danner side x, linje y) Post-output Pre-join Pre-Search Pre-body Pre-output Post-output Pre-join Post-join Index-break Post-body Post-join Post-search Index-break Post-body Stop Post-Search (Udskrift printes / vises) Exit Break Error Abort 332
Eksempel på anvendelse Herunder dannes en rapport med en manuel total. Dette kræver erklæring af en variabel, tildeling af værdier til variablen og udskrivning af den samlede sum. Eksemplet vises i en matrix for at sammenligne Rapport QT med Rapport XAL. C5 vers. 2012 -> Triggere anvendt til manuel total Triggere Kode i triggere Kode i Rapport XAL Init (Afgrænsningsvindue vises) Prompt (Udskriftsmuligheder vises) Start Pre-search #MacroLoad(REPORTS) REAL &Sum #MacroLoad(REPORTS) REAL &Sum SEARCH CustTable Pre-body #Add(&Sum,BalanceMst) #Add(&Sum,BalanceMst) Pre-output (Danner side x, linje y) Post-output Index-break Post-body END OUTPUT CustTable Post-Search #Rep_Execute(1) #Rep_Execute(1) Stop (Udskrift printes / vises) Exit I eksemplet forudsættes det at totalen udskrives i Control linje nummer 1. Rapport Definition med Control linje til udskrivning af variabel Body Ctrl Ctrl Ctrl CustTable 1 1 1 Account Name Debitorer i alt: BalanceMst &Sum 333
C5 vers. -> 4.1 Triggere anvendt til manuel total Triggere Kode i triggere Kode i Rapport XAL Init (Afgrænsningsvindue vises) Prompt (Udskriftsmuligheder vises) Start Pre-search #MacroLoad(REPORTS) REAL &Sum #MacroLoad(REPORTS) REAL &Sum SEARCH DebKart Pre-body #Add(&Sum,SaldoDkk) #Add(&Sum,SaldoDkk) Pre-output (Danner side x, linje y) Post-output Index-break Post-body END OUTPUT DebKart Post-Search #Rep_Execute(1) #Rep_Execute(1) Stop (Udskrift printes / vises) Exit I eksemplet forudsættes det at totalen udskrives i Control linje nummer 1. Rapport Definition med Control linje til udskrivning af variabel Body Ctrl Ctrl Ctrl DebKart 1 1 1 Konto Navn Debitorer i alt: SaldoDkk &Sum 334
Opgaver: Rapport QT Triggere, grundlæggende Opgave 1: Triggere i Rapport QT til Vareudlån Formål med opgaven At anvende nogle af triggerne i Rapport QT til rapporten Vareudlån. Triggerne anvendes til erklæring af variabler, sammentælling i variabler og udskrivning af Control linjer. Beskrivelse Der skal arbejdes videre med rapporten Vareudlån fra forrige opgave. Rapporten skal ændres til en manuel optælling af kostprisen, så der gives en samlet kostpris for alle udlån, der præsenteres på rapporten. Kostpriserne skal sammentælles i en variabel, der oprettes til formålet i triggeren Init. Sammentællingen udføres i triggeren Pre-body og udskrivning udføres i triggeren Post-search. Forløb 1 Vælg rapporten Vareudlån fra forrige opgave. 2 Hvis der i forvejen er indsat automatisk subtotal i feltet med kostprisen, skal du fjerne automatikken. 3 I Rapport QT skal der i INIT triggeren, erklæres en variabel med navnet &Sum. Indsæt også en macroload af biblioteket REPORTS. 4 Indsæt i Pre-body triggeren macroen #Add til opsummering i variablen &Sum. Kostprisen (CostPrice) hentes med direkte opslag i lagerkartoteket (InvenTable). 5 I triggeren Post-search aktiveres den eller de Control linjer, du opretter eller har oprettet til udskrivning af resultatet af optællingen. Anvend macroen #Rep_Execute. 6 I Rapport definition skal du indsætte Control linjer til udskrivning af resultatet. Vælg selv et eller flere numre til linjerne. 7 Godkend og afprøv rapporten. 335
11. Rapport QT med flere kartoteker Mål med lektionen At give deltagerne kendskab til opbygning af Rapport QT med flere kartoteker. Efter lektionen skal kursisterne kunne: Opbygge Rapport-QT med flere enkeltstående kartoteker Opbygge Rapport-QT flere relaterede kartoteker. Generelt Rapport QT kan opbygges med flere kartoteker, på samme måde som der i XAL-kørsler kan anvendes flere SEARCH løkker. Når der anvendes mere end ét kartotek i Rapport-QT, kan dette udføres på to måder. Det er vigtigt at kende forskel på de to metoder, da det i starten kan være svært at se forskel på dem. Metoder med flere kartoteker Metode Betydning Enkeltstående kartoteker Relaterede kartoteker Kartotekerne afvikles ét ad gangen efter hinanden. Hver gang en post hentes i hovedkartoteket, er der mulighed for at hente tilhørende poster i underkartoteket. Flere kartoteker Enkeltstående kartoteker Ved enkeltstående kartoteker afvikles disse et ad gangen, i den rækkefølge de forekommer i Rapport- QT en. Hver gang ét kartotek er færdigt, startes på det næste. Herunder vises eksempler på anvendelsen af enkeltstående kartoteker først i en Rapport XAL og derefter i en Rapport QT. C5 vers. 2012 -> Eksempel på enkeltstående kartoteker i Rapport-XAL SEARCH InvenItemGroup OUTPUT InvenItemGroup END SEARCH InvenTable OUTPUT InvenTable END Body Body InvenItemG InvenTable Group ItemNumber GroupName ItemName1 Group C5 vers. -> 4.1 Eksempel på enkeltstående kartoteker i Rapport-XAL 336
SEARCH LagGruppe OUTPUT LagGruppe END SEARCH LagKart OUTPUT LagKart END Body Body LagGruppe LagKart Gruppe VareNummer GruppeNavn VareNavn1 Gruppe Eksempel på enkeltstående kartoteker i Rapport-QT Kartotek Afgrænsning Fra Til Status Varegruppekarto Sortering..: Filter...: Kørsler...: Kørsler Åben Åben Skjul Varekartotek Sortering..: Åben Filter...: Åben Kørsler...: Kørsler Skjul I begge eksempler er det samme opstilling af kartoteker og felter i definitionsområdet. Derfor er dette ikke vist i forbindelse med Rapport-QT en. Begge eksempler vil derfor også kunne resultere i en udskrift som vist i næste figur. I figuren vises først posterne fra kartotek nummer et, der i eksemplet er varegrupperne fra varegruppekartoteket. Efter varegrupperne kommer alle varerne fra kartotek nummer to varekartoteket. Resultat der er ens for begge ovenstående eksempler 10 Harddiske 20 30 Skærme Kabinetter 40 Ram 12000 14000 Harddisk type 2 Skærm 14 10 20 16000 Ram 8 MB 40 16004 17006 Ram 16 MB Harddisk type 5 40 10 18000 Kabinet 30 20000 Skærm 17 20 Der henvises til huskelisterne, idet der gøres opmærksom på, at der er forskel på om der i Rapport-QT oprettes enkeltstående kartoteker, eller om der oprettes relaterede kartoteker. 337
Relaterede kartoteker Ved relaterede kartoteker oprettes der i Rapport-QT først et hovedkartotek og derefter et eller flere underkartoteker. I en Rapport-XAL svarer dette til en ydre og en indre søgeløkke. Ved afvikling af Rapport-XAL eller Rapport-QT med relaterede kartoteker, findes posterne, i den yderste søgeløkke (hovedkartoteket), frem en ad gangen. Hver gang en post findes, udføres der en gennemsøgning af samtlige poster i den inderste søgeløkke (underkartoteket). Da samtlige poster gennemsøges i den inderste søgeløkke (underkartoteket), er det vigtigt at relatere de to søgeløkker (kartoteker) med hinanden, således at der under gennemsøgningen af den inderste søgeløkke kun hentes poster, der kan relateres til den aktuelle post i den yderste søgeløkke (hovedkartoteket). Relatering meller hoved- og underkartotek Relatering i Rapport-XAL foregår ved anvendelse af kommandoen WHERE. Kommandoen anvendes ved at opstille en betingelse, der skal opfyldes, for at en post medtages fra underkartoteket. Det er vigtigt at bemærke, at relateringen finder sted i den inderste søgeløkke (underkartoteket). Det er altså underkartoteket, der skal relateres med hovedkartoteket, og ikke omvendt. Syntaksen for anvendelsen af WHERE er her følgende: Syntaks til WHERE WHERE <Underkartotek.Felt> == <Hovedkartotek.Felt> Herunder vises der eksempler på anvendelsen af flere afhængige kartoteker først i Rapport-XAL og derefter i Rapport-QT. C5 vers. 2012 -> Eksempel på relaterede kartoteker Rapport-XAL SEARCH InvenItemGroup OUTPUT InvenItemGroup SEARCH InvenTable WHERE InvenTable.Group == InvenItemGroup.Group OUTPUT InvenTable END END Body Body InvenItemG InvenTable Group ItemNumber GroupName ItemName1 Group 338
C5 vers. -> 4.1 Eksempel på relaterede kartoteker Rapport-XAL SEARCH LagGruppe OUTPUT LagGruppe SEARCH LagKart WHERE LagKart.Gruppe == LagGruppe.Gruppe OUTPUT LagKart END END Body Body LagGruppe LagKart Gruppe VareNummer GruppeNavn VareNavn1 Gruppe Eksempler på relaterede kartoteker i Rapport-QT Kartotek Afgrænsning Fra Til Status Varegruppekartotek Sortering..: Filter...: Kørsler...: Kørsler Åben Åben Skjul Varekartotek Sortering..: Åben Filter...: Åben Kørsler...: Kørsler Skjul I begge eksempler er det samme opstilling af kartoteker og felter i definitionsområdet. Derfor er dette ikke vist i forbindelse med Rapport-QT. Begge eksempler vil derfor også kunne resultere i en udskrift som vist i næste figur. I figuren ses det, hvordan der først trækkes én post ud af hovedkartoteket varegruppekartoteket og derefter de tilhørende poster i underkartoteket varekartoteket. Det kan ses, at relateringen virker, idet der for hver post i hovedkartoteket kun vises de tilhørende relaterede poster fra underkartoteket. Resultat til begge ovenstående eksempler 10 Harddiske 12000 Harddisk type 2 10 17006 Harddisk type 5 10 20 Skærme 20000 14000 Skærm 17 Skærm 14 20 20 30 Kabinetter 18000 41 Kabinet Ram 30 16000 Ram 8 MB 40 14000 Ram 16 MB 40 Relation i Rapport-QT 339
Når to kartoteker relateres i en RAPPORT-QT, ses dette i form af en streg, der trækkes fra underkartoteket op til hovedkartoteket, som det ses i figuren herunder. Eksempel på Rapport QT med relaterede kartoteker Kartotek Afgrænsning Fra Til Status Varegruppekartotek Sortering..: Filter...: Kørsler...: Kørsler Åben Åben Skjul Varekartotek Sortering..: Åben Filter...: Kørsler...: Kørsler Åben Skjul Stregen viser kun, at de to kartoteker er relaterede. Den er ikke bevis på, om relationen er udført korrekt. Korrekt opstilling af relation Når to XAL-søgeløkker opstilles inden i hinanden, anvendes kommandoen WHERE til at relatere den inderste søgeløkke med den yderste, som vist herunder. C5 vers. 2012 -> Eksempel på relaterede søgeløkker SEARCH InvenItemgroup OUTPUT InvenItemGroup SEARCH InvenTable WHERE InvenTable.Group == InvenItemGroup.Group OUTPUT InvenTable END END C5 vers. -> 4.1 Eksempel på relaterede søgeløkker SEARCH LagGruppe OUTPUT LagGruppe SEARCH LagKart WHERE LagKart.Gruppe == LagGruppe.Gruppe OUTPUT LagKart END END I en Rapport-QT foregår dette ved at angive felterne, der svarer til WHERE i Relationsvinduet, i underkartoteket i Rapport-QT en som vist i figuren på næste side: 340
C5 vers. 2012 -> Relationsvindue til underkartoteket Relater InvenItemGroup Felt 123456789012345 Group InvenTable Felt Group Output Tilføj Altid Alle felter Før join C5 vers. -> 4.1 Relationsvindue til underkartoteket Relater LagGruppe Felt 123456789012345 Gruppe LagKart Felt Gruppe Output Tilføj Altid Alle felter Før join Bemærk, at det i Rapport-XAL eksemplet er i den inderste søgeløkke, at WHERE kommandoen befinder sig. Det er i den inderste søgeløkke, at relationen findes. Dette gælder også for eksemplet med Rapport-QT en. Her er det også i underkartoteket, at relationen opstilles. I eksemplet er det i LagerKart, idet dette kartotek relateres til varegrupperne, efterhånden som disse søges ud i Rapport-QT en. I de to søjler i relationsvinduet ses de to kartoteker med de relaterede felter. Det vigtigste i relationen er de to felter, der indsættes. Det er ikke så meget felternes navne, det kommer an på, men derimod deres indhold. Det drejer sig således om at angive felter, hvis indhold kan relateres til hinanden. Der kan i øvrigt godt indsættes flere relaterede felter, hvis det ønskes, de skal blot relatere til hinanden parvist. Stregen der trækkes mellem to kartoteker i afgrænsningsvinduet, opstår så snart to kartoteker er indsat i relationstabellen, også uden at der er indsat relationsfelter. Stregen er ikke bevis på at relationen er sat korrekt op, kun at der er en relation. 341
Hvis feltrelationerne ikke indsættes, bliver resultatet, at der for hver post i hovedkartoteket udskrives samtlige poster i underkartoteket. Det vil sige også posterne for de andre poster i hovedkartoteket. Efterfølgende eksempel passer til ovenstående Relationsvindue. C5 vers. 2012 -> Eksempel på relaterede kartoteker Kartotek Afgrænsning Fra Til Status InvenItemGroup Sortering..: Åben Filter...: Kørsler...: Kørsler Åben Skjul InvenTable Sortering..: Åben Filter...: Kørsler...: Kørsler Åben Skjul Body Body GrFt InvenItemG InvenTable * Group ItemNumber GroupName ItemName1 Group C5 vers. -> 4.1 Eksempel på relaterede kartoteker Kartotek Afgrænsning Fra Til Status LagGruppe Sortering..: Åben Filter...: Kørsler...: Kørsler Åben Skjul LagKart Sortering..: Åben Filter...: Åben Kørsler...: Kørsler Skjul Body Body GrFt LagGruppe LagKart * Gruppe VareNummer GruppeNavn VareNavn1 Gruppe I denne opsætning af definitionsområdet angives der én Group Footer linje med en * i kartotekskolonnen. Hver gang der afsluttes med udskrivning fra et af kartotekerne, udskrives denne Group Footer derfor. Definitionen kan f.eks. give følgende resultat: Resultat 342
10 Harddiske 12000 Harddisk type 2 10 17006 Harddisk type 5 10 20 Skærme 20000 Skærm 17 20 14000 Skærm 14 20 30 Kabinetter 18000 Kabinetter 30 40 Ram 16000 Ram 8 MB 40 14000 Ram 16 MB 40 I stedet for Group Footeren med * i kartotekskolonnen, kunne der indsættes en Group Footer linje til hvert kartotek med angivelse af kartotek i kartotekskolonnen. 343
Opgaver: Rapport QT med flere kartoteker Opgave 1: Ordreliste Formål med opgaven At oprette en rapport med navnet Ordreliste. Rapporten skal indeholde data fra begge udlånskartoteker på en gang. Beskrivelse Der skal oprettes en rapport, der både henter data i UDLUdlånsKart og UDLUdlånsPost. Rapporten skal fungere som en ordreliste med samtlige informationer om hver enkelt udlånsordre. Forløb 1 Opret en ny rapport med navnet Ordreliste. 2 Indsæt en Rapport QT med kartotekerne UDLUdlånsKart og UDLUdlånsPost. Husk at opsætte relationer mellem kartotekerne. 3 Indsæt Page header linjer med macroerne #Company og #ReportDatePage. Tegn en streg under felterne. 4 Indsæt Bodylinjer på UDLUdlånsKart med nedenstående felter. Felterne skal stå under hinanden på hver sin linje. UdlånsNr, DebitorKto, UdlånsDato, ReturDato, UdlånsType og ForsikringsSum. Foran hvert enkelt felt skal der indsættes ledetekstfelter fra kartoteket. Felterne skal være 15 tegn, venstrestillede og udskrives med store bogstaver. Bag ved feltet DebitorKto skal der indsættes et felt, der med et direkte opslag henter debitorens navn i kartoteket CustTable. 5 Indsæt en Bodylinje fra UDLUdlånsPost med felterne: VareNr, VareNavn, SerieNr og Status Indsæt overskrifter til disse felter i de nederste Body linjer til UDLUdlånsKart, og tegn en streg under overskrifterne. 6 Indsæt en Control linje der kun indeholder et sideskift. Aktiver denne linje i QT en i triggeren Post-join i UDLUdlånsKart, så får du sideskift, hver gang der skiftes til en ny ordre. 7 Godkend rapporten og afprøv. 344
Opgave 2: Ordreliste med prolog (ekstra opgave) Formål med opgaven At indsætte en prolog i rapporten Ordreliste. Beskrivelse Der skal indsættes en prolog i rapporten Ordreliste, der blev oprettet i forrige opgave. Prologen skal indeholde forskellige informationer om rapporten. Informationerne fremgår af forløbet. Forløb 1 Fortsæt i rapporten Ordreliste fra forrige opgave. 2 Opret 13 linjer af typen Prolog. 3 Indsæt følgende tekster og felter i Prolog linjerne: Blank linje Teksten Firma: + felt med firmanavn Teksten Rapport: + felt med rapports navn Teksten Udskrevet af: + felt med brugernavn Teksten Dato: + felt med dags dato Teksten Klokkeslet: + felt med aktuel tid for rapporten Blank linje Teksten Anvendelse: Anvendes til kontrol af status på Teksten udlånsordrer og udlånslinjer. Blank linje Teksten Sortering: Pr. debitor pr. udlånsordre Blank linje Linje med sideskift. 4 Tegn en kasse med dobbeltstreg hele vejen rundt om teksterne og felterne. Øverste linje i kassen skal være på den første blanke linje og den nederste skal være i linje tolv. 5 Godkend og afprøv rapporten. 345
12. Huskelister Rapporter Oprette rapport Funktion Fremgangsmåde Tast Oprette Generelt/Tilpasning/Udviklingsmenu/REP/Opret Når rapportgeneratoren starter op, står du automatisk i definitionsområdet. Navngive Giv rapporten et navn, gerne sigende F10/RAPPORT/ GEM Du kan nu vælge mellem faserne: Oprette rapportlinjer Oprette søge-xal Oprette QT Når du er færdig med en af faserne, kan du vende tilbage hertil og vælge en anden fase eller Godkende Godkende hele rapporten F3 Oprette rapportlinjer (Kolonnerne) Funktion Fremgangsmåde Tast De tre første kolonner i rapportlinjerne kaldes definitionsområdet, den sidste er layoutområdet. Linjetype Vælg linjetype (se bilag Linjetyper ) ENTER Kartotek Vælg kartotek i kartotekskolonnen, hvis den valgte linjetype kræver det (Se bilag Kartoteker ) ENTER Linje-XAL Du kan åbne editorboksen og indtaste XAL-kode ENTER Definitionsområdet Layoutområde Godkend indtastningen i linje-xal Opbygning af rapportens layout (udseende). Her indsættes fritekst, streger og kasser, ledetekstfelter, samt felter med forskelligt indhold. F3 Oprette rapportlinjer med fritekst Funktion Fremgangsmåde Tast Indtaste tekst Du kan uden videre indtaste klar tekst overalt i layoutområdet. 346
Oprette rapportlinjer med streger og kasser Funktion Fremgangsmåde Tast Tegne streger og kasser Du kan frit tegne kasser og linjer i layoutområdet. Funktionen startes med Den valgte stregtype i følge pilene Skift mellem stregtyperne: enkelt streg, dobbelt streg eller udviske streg Afslut kasse/linje ALT+T Alle pile ALT+T ENTER Oprette rapportlinjer med forskellige felter Funktion Fremgangsmåde Tast Oprette felt Opret felt F2 Vælg Feltudtryk i menuen Opret felt og editorboksen Feltformel åbnes. Det du indtaster i editorboksen, bestemmer hvilken type felt du opretter: Kartoteksfelt Hent kartoteksfelt SHIFT+F8 Vælg kartotek Vælg felt ENTER ENTER Variabelfelt Tekstfelt Macrofelt Direkte opslag Indtast variablens navn som &Variabelnavn Indtast tekst i citationstegn Indtast macronavn som #Macronavn Tast direkte opslag som Kartotek[Index,Nøgler].Felt Godkend Godkend editorboksen F3 Godkend feltmenu Godkend menuen for at vende tilbage til layoutområdet. F3 Rapport afprøve (køre) Funktion Fremgangsmåde Tast Generelt/Tilpasning/Udviklingsmenu/REP/Kør Vælge rapport Vælg rapport fra plukkeliste og kør ENTER eller Genvejstast Du kan også afvikle rapporten under oprettelsen ALT+R 347
Rapport QT Oprette første kartotek Funktion Fremgangsmåde Tast Oprette Åbne relationsvindue Du starter med et tomt startskærmbillede, hvori der skal indsættes et kartotek med forskellige oplysninger. Denne fase gælder kun for det første kartotek i QT en. Ved yderligere kartoteker se huskelisten Rapport QT Oprette flere kartoteker. Åbne relationsvindue hvor du i feltet i øverste højre hjørne skal indsætte kartoteksnavnet. ALT+F6 SHIFT+F2 Indsæt kartotek Indsæt kartotek fra plukkeliste ALT+H Spring de øvrige felter over. Godkende Godkend relationsvinduet F3 Du er nu tilbage i startskærmbilledet, hvor dit kartotek nu kan ses i venstre side. 348
Rapport QT Oprette flere kartoteker Funktion Fremgangsmåde Tast Tilføje flere kartoteker Tilføjelse af flere kartoteker foregår i startskærmbilledet. Flyt cursoren Flyt cursoren over i kartotekskolonnen i venstre side. Pil Gå til tomt kartoteksfelt Vælg et tomt kartoteksfelt Pil ned Tilføj kartotek Tilføj kartotek SHIFT+F2 Du ser nu relationsvinduet til indtastning af de kartoteker der skal relateres til hinanden. I øverste venstre hjørne indsættes det bestående kartotek. Indsæt kartotek (Navn) Indsæt kartotek (Relation) Indsæt felter Indsæt kartotek I plukkelisten ser du kun de kartoteker, der er oprettet i QT en i forvejen. I øverste højre hjørne indtastes navnet på det nye kartotek, der skal relateres til det bestående kartotek. Indsæt kartotek fra plukkelisten I kolonnerne felt, under de to kartoteker, skal du indtaste de felter der relaterer til hinanden i kartotekerne f.eks. har kartotekerne Debitorkartotek og Debitorposter feltet KontoNummer som fælles relation. Indsæt felter fra plukkelisten i begge kolonner. Gentag hvis der er flere felter der skal relateres. Spring resten af felterne over. ALT+H ALT+H Alt H Godkend Godkend F3 349
Rapport QT Sortere Funktion Fremgangsmåde Tast Sortere Åbne dialogboksen Vælge felt Vælg feltet Sortering Åbne dialogboksen Sortering Du kan nu: Vælge felt der skal sorteres efter eller ENTER ALT+H Vælge index Vælge index der skal sorteres efter ALT+H Vælge retning Du kan også bestemme retning, som posterne skal sorteres i. Vælg mellem stigende (blank) eller faldende ALT+H Godkend Godkend sorteringsboksen F3 Rapport QT Filtrere Funktion Fremgangsmåde Tast Filtrere Åbne editorboxen Vælg feltet Filter Åbne editorboxen Build-filter Indtast udtryk der for hver post kan evalueres til sand eller falsk f.eks. Saldofelt > 0. Hvis posten er falsk sorteres den fra. ENTER Godkend Godkend editorboksen F3 Rapport QT Feltafgrænse (tilføje / slette) Funktion Fremgangsmåde Tast Felt-afgrænse Du kan tilføje og slette afgrænsningfelter efter behov. Tilføje Tilføj afgrænsningfelt fra listen over kartoteksfelter F2 Slette Slet afgrænsningsfelt ALT+F9 350
Rapport QT Triggere i opsætning Funktion Fremgangsmåde Tast Opsætning Vise triggere Start opsætning af QT Gentages for hver trigger. Gå til feltet Globale formler og åbn feltet Du ser nu en liste over globale triggere. Init triggeren er den første, der køres i QT, og derfor vil det f.eks. være naturligt at erklære sine variabler her. CTRL+F6 ENTER Åbne trigger Vælg Trigger og åbn editorboxen hertil. Pile og Enter Indtast kode. Godkend Godkend koden F3 Rapport QT Triggere på kartoteker Funktion Fremgangsmåde Tast Kartotek Vise triggere Vælg feltet kørsler i det kartotek, hvori der skal indsættes kode i triggere. Gentages for hver trigger. Åbn feltet kørsler Du ser nu triggerne på det aktuelle kartotek. ENTER Åbne trigger Vælg Trigger og åbn editorboxen hertil. ENTER Indtast kode. Godkend Godkend koden F3 351
Subtotaler Funktion Fremgangsmåde Tast Find rapport Generelt/Tilpasning/Udviklingsmenu/REP/Ret Vælg rapport. Opsætte felt Vælg felt, der skal dannes subtotal for. Pile Gentages for hvert felt der skal have totaler. Åbne felt Vælg funktionen Ret felt/subtotaler F6 Indsæt funktion Indsæt funktion for subtotalen f.eks. Sum alle INS Opsætning af rapport Åbne opsætning Ledetekst Udskrivning Manuel ledetekst Linjetypen Subtotal Subtotaler udskrives ikke automatisk. Kun hvis det defineres i Opsætning i rapporten. Åbne dialogboksen Opsætning i rapporten I dialogboksen vælges, hvordan subtotalerne skal udskrives, og om de skal udskrives. De vigtigste felter er: Subtotal-linje vælg metode til udskrivning af automatiske ledetekster. Kopi af linje udskriver værdien af teksten til venstre for subtotalfeltet. Feltnavn værdi udskriver ordet Grandtotal foran totalen. Udskriv subtotal: Svar JA / NEJ til om subtotalen skal udskrives eller ej. Udskriv kun totaler: Svar JA / NEJ til om der kun skal udskrives subtotaler. Manuelle ledetekster indsættes i linjetypen Subtotal. Du kan i stedet for ovenstående automatik selv bestemme den tekst, der skal stå på subtotal linjen ved at oprette en linje af typen subtotal. CTRL+F6 ALT+H ALT+H ALT+H Vælg linjetype Vælg linjetype Subtotal Pile og Enter Vælg kartotek Vælg kartotek til linjetypen ENTER Indtast tekst Indtast tekst til subtotalen i layoutdelen f.eks.: Sum af beløb: Hvis totalen f.eks. er 9.999,00 vil rapporten se sådan ud: Sum af beløb: 9.999,00 352