Microsoft Dynamics C5 Version 2012 Programmering II Copyright 2011 Microsoft. C5 er et varemærke, der tilhører Microsoft. Produkter og firmaer nævnt i dette dokument er varemærker, der tilhører deres respektive 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... 14 1. Multi import... 15 Filer... 15 Elementfiler... 15 Import definitionsfil (Import.def)... 16 Import log (Import.log)... 17 Import kørsel... 17 Multi oversættelse... 19 Matchudtryk... 19 Opgaver: Multi import... 21 2. Kartoteker... 22 Oprettelse af kartoteker... 22 Navngivning af kartoteker... 23 Hvor ligger data... 24 Passwordbeskyttelse af kartoteker... 24 Systemfelter i kartoteker... 25 Nye felter i kartoteker... 25 Opgaver: Kartoteker... 29 3. Indexer... 33 Anvendelse af indexer... 33 Oprettelse af indexer... 34 Navngivning og indexformel... 35 Navngivning af Indexer i nye moduler... 35 Opgaver: Index... 37 4. INTRODUCE og transaktionskommandoer... 40 Åbning af fiktiv post med INTRODUCE... 40 Åbning af faktisk post med INTRODUCE... 42 Åbning af faktisk post med INTRODUCE og index... 44 INSERT, UPDATE, DELETE... 44 INSERT... 45 UPDATE... 45 2
DELETE... 46 INSERT/UPDATE i samme XAL kørsel... 46 Opgaver: INTRODUCE og transaktionskommandoer... 48 5. PROMPT, videregående brugerdialog... 51 Grundlæggende opsætning... 51 Tillægskommandoer... 53 REF... 53 Sammenbyggede tekster... 53 GET på felter... 55 ASENUM... 56 DECIMALS... 57 LENGTH... 59 Opgaver: PROMPT, videregående brugerdialog... 61 6. Videregående løkkekommandoer... 66 WHILE... 66 Afbrydelse af WHILE løkke vha. promptboks... 67 Opgaver: Videregående løkkekommandoer... 69 7. READ og WRITE... 71 READ... 71 WRITE... 73 CLOSE... 74 Faste formater... 74 Opgaver: READ og WRITE... 76 8. Funktioner videregående... 80 Funktionen Box()... 80 Box(1) Infoboks... 81 Box(2) Advarselsboks... 82 Box(3) Ja/Nej boks... 82 Box(4) Pickliste boks... 84 Box(1-3) Bokse med ekstra knapper... 84 Konverteringsfunktioner... 85 Int2Str()... 85 Num2Str... 86 Date2Str()... 88 Enum2Str()... 90 3
Opgaver: Funktioner, videregående... 92 9. Macroer... 93 Kendetegn... 93 Generel opbygning... 93 Macro typer... 95 Globale macroer... 96 Lokale macroer... 97 Macro biblioteker... 97 Specifikke macroer... 98 #Num2Str... 98 #StrLFix... 100 #StrRFix... 101 #Date2Str... 102 #Time2Str... 103 Indirektioner... 104 Indirektioner på fasttekster... 104 Opgaver: Macroer... 106 10. Huskelister XAL sproget... 109 ENUM... 109 Programmering opret... 109 Programmering ret... 111 11. Huskelister Kommandoer og funktioner... 112 PRINT AT... 112 PAUSE... 112 WINDOW... 113 Variabler... 114 Kommentar... 115 SET... 116 PROMPT... 117 Infobox... 117 Advarselsbox... 118 Dialogbox... 118 Ja/Nej box... 119 Picklistebox... 119 SEARCH-END... 120 4
IF-THEN-(ELSE)-ENDIF... 121 NextYr... 121 DayOfWk... 122 DayName... 122 INTRODUCE... 123 INSERT... 124 UPDATE... 124 DELETE... 124 OUTPUT... 125 FIND... 125 WRITE... 126 READ... 126 WHILE-END... 127 PROCESS... 127 #Debug... 127 Del II Kartoteker og skærmbilleder... 129 12. Kartoteker, triggere med inddatakontrol... 130 Kartoteker... 130 Inddatakontrol på kartoteker... 131 Kartoteksfelter... 131 Inddatakontrol på felter... 132 Opgaver: Kartoteker, triggere med inddatakontrol... 133 13. Formens vindue... 136 Blokke i forms... 136 Formens vindue... 136 Triggere (forms formler) generelt... 137 Triggere i Opsætning af vinduet... 138 Forms kontrolkommandoer og macroer... 139 #MacroLoad()... 140 #FormError... 141 #Frm_Index()... 141 #Frm_Search()... 142 #Frm_SearchTop()... 143 5
#Frm_SearchEnd()... 143 Eksempel på fejlhåndtering og styring af poster i en form... 143 Specielt vedr. triggerne Init og Pre-form... 144 Opgaver: Formens vindue... 145 14. Enkelt record blok... 146 Opsætning af Enkelt record blok... 146 Felter... 147 Opgaver: Enkelt record blok... 148 15. Multi record blok... 149 Opsætning Multi record blok... 150 Felter... 151 Opgaver: Multi record blok... 152 16. Virtuelle felter i forms... 154 Oprettelse af virtuelle felter... 154 Opsætning... 155 Tildeling... 157 Opgaver: Virtuelle felter i forms... 158 17. Synkronisering mellem blokke... 160 Fremfinding og visning af poster i underblok... 160 Triggeren Pre-record... 161 Tildeling af værdier fra hovedblok til felter i underblok... 161 Fremfinding af poster i underblok med #Frm_Index()... 161 Placering af cursor på første eller sidste af de fundne poster... 163 Initiering af nye poster i underblok... 163 Triggeren Init-record... 163 Tildeling af initieringsværdier til nøglefelter... 163 Komplet eksempel på synkronisering... 164 Opgaver: Synkronisering mellem blokke:... 165 18. Direkte opslag... 166 Opbygning af direkte opslag... 166 Sammenhæng i direkte opslag... 168 Direkte opslag i XAL kørsel... 169 Opgaver: Direkte opslag... 171 19. Listemenuer... 173 6
Listemenuer i C5... 173 Hvor vedligeholdes listemenuer?... 175 Opsætning af listemenu... 175 Indsættelse af menupunkter i listemenu... 176 Opgaver: Listemenuer... 178 20. Synkronisering mellem forms... 179 Synkronisering mellem forms... 179 Triggere ved synkronisering... 180 Triggeren Pre-Form... 180 Buffer... 180 EXTERN... 181 SET... 182 #Frm_Index()... 183 #Frm_Search() / #Frm_SearchTop() / #Frm_SearchEnd()... 184 Bloktriggeren Init-record... 184 Komplet eks. på synkronisering af forms... 185 Opgaver: Synkronisering mellem forms... 187 21. Tabsider og gruppebokse... 188 Tabsider... 188 Grupppebokse... 189 22. USRKEY triggere... 191 Triggere... 191 Taster... 192 Taster til én blok... 193 Taster til flere blokke... 193 Taster med eksempler... 193 Kontrol kommandoer... 194 Kald af USRKEY trigger... 195 Styring af XAL kode i triggerne... 196 Blokering af tastetryk... 196 Tastetryk og kald fra andre triggere samtidig... 197 Tidspunkter for aktivering af øvrige triggere... 197 Form macroer... 198 REPAINT... 198 Opgaver: USRKEY triggere... 200 7
23. Notater i forms... 203 Procestasten ALT+N... 204 Virtuelt notatfelt... 204 Macroer til notater... 205 #NotesPreKey... 205 #Frm_NoteMark... 207 #NotesPostKeyMark... 207 #NotesMark... 208 #NotesKey... 209 Notater på forms med flere blokke... 209 Kartoteket Notes... 211 Oversigter... 213 Notater på forms med en blok... 214 Notater på forms med flere blokke... 215 Opgaver: Notater i forms... 216 24. SystemVariabler i forms... 219 Systemvariabler... 219 Globale variabler... 221 25. Huskelister forms... 222 Fasttekst Opret ny type... 222 Fasttekst Tilføj tekster til eksisterende type... 223 Fasttekst Ret tekster i eksisterende type... 224 Kartotek Navn (opret/ret)... 225 Kartotek Feltbehandling (opret)... 226 Kartotek Feltbehandling (ret)... 227 Kartotek Feltbehandling (referencer)... 227 Kartotek Dokumentation... 227 Kartotek Index (opret)... 228 Kartotek Index (ret)... 229 Kartotek Index (slet)... 229 Listbillede Opret... 230 Listbillede Ret... 231 Listbillede Slet... 232 Menuer - Lille udviklingsmenu (CTRL F12)... 232 Menuer Lokalmenuer... 233 8
Menuer Opsætning af menupunkt... 234 Form Vindue (opret)... 235 Form Vindue (ret)... 236 Form Vindue (slet ) (dvs. hele formen)... 236 Form Enkelt record blok (opret)... 237 Form Enkelt record blok (ret)... 238 Form Enkelt record blok (slet)... 239 Form Multi record blok (opret)... 240 Form Multi record blok (ret)... 241 Form Multi record blok (slet)... 241 Form Felter (opret)... 242 Form Felter (ret)... 242 Form Felter (slet)... 243 Form Triggere i vinduet... 243 Form Triggere i blokke... 244 Form Triggere i felter... 245 Del III Rapporter... 246 26. Systemvariabler i rapporter... 247 Systemvariabler i rapporter... 247 Globale variabler... 249 Opgaver: Systemvariabler i rapporter... 250 27. Rapport Control macroer... 252 Skema over rapport control macroer... 253 28. Linje-XAL og feltbetingelser... 257 Linje XAL... 257 Kolonnen... 257 Tildeling af værdier til felter og variabler... 258 Styring af om linjer skal udskrives eller ikke.... 259 Direkte anvendelse af RETURN 0 og RETURN 1... 259 Anvendelse med felter... 260 Feltbetingelser... 261 Opgaver: Linje-XAL og feltbetingelser... 263 9
29. Linjetypen Subtotal... 265 Linjetypen Subtotal med egne ledetekster... 265 Subtotal linje med for lang ledetekst... 266 Udskrift i flere niveauer med samme ledetekst... 267 Udskrift i flere niveauer med forskellige ledetekster... 267 &Breaklevel... 268 Linje XAL... 268 Forskellige ledetekster til flere kartoteker... 270 Opgaver: Linjetypen Subtotal... 271 30. Notater i rapporter... 273 Opsætning af linje i Rapport-definition... 273 Søgning efter notater i Rapport-XAL... 275 Søgning efter notater i Rapport-QT... 276 Søgning med macroer... 278 #OutputNotes()... 278 Rapport QT... 278 Opgaver: Notater i rapporter... 280 31. Tekstlag i rapporter... 283 Tekstlag i layoutområdet... 283 Automatisk valg af tekstlag... 285 Opgaver: Tekstlag i rapporter... 287 32. QT control macroer... 291 QT control macroer... 291 Skema med macroer... 292 Anvendt til defaultværdier i QT... 292 Opgaver: QT Control macroer... 295 33. Rapport synkronisering... 297 Synkronisering... 297 Buffer... 298 EXTERN med RENAME... 298 Synkronisering i rapport QT... 299 Synkronisering i rapport XAL... 300 Uden udskriftsmuligheder i rapport... 300 Opgaver: Rapport synkronisering... 303 10
34. Rapporter i Windows... 304 Planlægning af rapport layout... 304 Usynligt gitter... 305 Spatiering i skrifttyper... 306 Forskel på fast spatiering og proportional skrift... 306 Felter i rapporter... 307 Fritekst i rapporter... 307 Opsætning af tekstfelt... 308 Nye skrifttyper i Windows... 309 Printerkoder... 310 Eksempel på rapport i Windows... 311 Opgaver: Rapporter i Windows... 312 35. Multi Export... 315 Elementfiler... 315 Import definitionsfil (Import.def)... 316 Export log (Export.log)... 317 Export kørsel... 317 Matchudtryk... 318 Opgaver: Multi Export... 320 36. Huskelister Rapporter... 321 Oprette rapport... 321 Oprette rapportlinjer (Kolonnerne)... 321 Oprette rapportlinjer med fritekst... 321 Oprette rapportlinjer med streger og kasser... 322 Oprette rapportlinjer med forskellige felter... 322 Rapport afprøve (køre)... 322 Rapport QT Oprette første kartotek... 323 Rapport QT Oprette flere kartoteker... 324 Rapport QT Sortere... 325 Rapport QT Filtrere... 325 Rapport QT Feltafgrænse (tilføje / slette)... 325 Rapport QT Triggere i opsætning... 326 Rapport QT Triggere på kartoteker... 326 Subtotaler... 327 11
Indledning Velkommen til kurset Microsoft Dynamics C5 Programmering II. Kurset er berammet til 4 dage. Kursusmaterialet er udarbejdet til version 2012. Målgruppe Personer der ønsker et udvidet kendskab til udviklingsmiljøet i C5. Forudsætninger Kurset C5 Programmering I Formål Kurset gør deltageren i stand til at beherske C5 udviklingsmiljøet, udarbejde tilretninger og opbygning af nye elementer i systemet. Emner På kurset behandles følgende emner: Datamanipulation ved at indsætte, opdatere og slette poster fra en kørsel Opbygningen af makroer Proceskald Løkkestrukturer Skrivning til- og læsning fra fremmede filer QT til forespørgsler og til rapporter Triggere og kommandoer i QT-værktøjet Proceskald af rapporter Synkronisering mellem skærmbilleder og rapporter Funktioner, makroer, direkte opslag i felter Feltbetingelser Tekster til subtotaler Notater i rapporter vha. makroer Sprog i rapporter Inddatakontrol på kartoteker Synkronisering mellem blokke Kontrol kommandoer Virtuelle felter på skærmbilleder USRKEY og andre triggere Rapporter i Windows-miljøet Kurset afsluttes med en test 12
Videreuddannelse Kurset Microsoft Dynamics C5 Programmering III. Beskrivelse af materialet Materialet er opbygget i uafhængige lektioner, der hver behandler et emne eller funktion. 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 de fleste lektioner findes en huskeliste, der giver et hurtigt overblik over fremgangsmå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. 13
Del I - XAL sproget 14
1. Multi import Formål Formålet med denne lektion er at lære deltagerne at foretage multi import af filer, der er eksporteret med multi export. Efter lektionen skal kursisterne kunne: Uføre multi import. Og kende til: Import.def Import.log Multi oversættelse. Multi import generelt I alle kolonner, i udviklingsmenuen, er der mulighed for at foretage import af elementer, der tilhører den aktuelle kolonne. Der er dog også mulighed for i en og samme kørsel, at importere elementer fra flere kolonner ad gangen. Dette udføres i kolonnen Multi under Import. Multi import udføres på filer, der i forvejen er eksporteret med Multi export. En multi import består af følgende: Elementfiler Import definitionsfil Import logfil Import kørsel Filer Elementfiler Elementfilerne dannes under Multi Export, idet der dannes én elementfil for hvert element, der eksporteres. Filernes navne starter med EXP efterfulgt af et femcifret tal, og afsluttes med punktum og elementtype. Eksempel på elementfiler EXP00001.MAC EXP00002.MAC EXP00264.DBD EXP00265.DBD EXP00001.LST EXP00002.LST EXP00001.XAL EXP00002.XAL EXP00001.FRM EXP00002.FRM EXP00003.FRM 15
Navnene på elementfilerne er ikke de samme som selve elementnavnene. Det fremgår derfor ikke umiddelbart, hvilket indhold filerne har. For at vide hvilke filer der er eksporteret samtidig, er der en liste over disse i import definitionsfilen. Import definitionsfil (Import.def) Import definitionsfilen hedder som standard Import.def, men den kan have et andet navn, hvis det er tilkendegivet under exportopsætningen. Filen indeholder en liste over de eksporterede elementer. Den anvendes under multi import, idet importkørslen her finder de filer, der skal importeres. Ud over de eksporterede elementer, indeholder filen i de to første linjer informationer om stinavn, versionsnummer, dato o.a.: Eksempel på Import.def "Microsoft C5 EXPORT","c:\DebExp\","c:\DebExp\Import.log", "Use Xal: ImportObjekts","Vers. 4.1.0.180 21/12-07 14:00","", "Dbd","CustTable","exp00043.dbd", "LST","CustTable.Account","EXP00001.LST",0 "FRM","CustTable","EXP00001.FRM",4 Definitionsfilens indhold forklares herunder. De forskellige felter i filen adskilles af kommaer. Indhold i linje1 Felt Indhold 1 Teksten Microsoft C5 EXPORT 2 Stinavn på det sted elementfilerne ligger (Sættes under exportopsætning) 3 Stinavn og navn på import loggen (Sættes under exportopsætning) Indhold i linje2 Felt Indhold 1 Teksten Use XAL: ImportObjekts (Navn på XAL kørsel til import) 2 Versionsnummer, dato og klokkeslæt 3 Frivillig kommentar der sættes under eksportopsætningen Indhold i elementlinjerne Felt Indhold 1 Elementtype 2 Elementnavn 3 Navn på eksportfil 4 Applikationsgruppe 16
Import log (Import.log) Under Multi Import oprettes der en import logfil. Navn og placering af denne fil er angivet i Import.def i første linje felt 3. Navnet er som standard Import.log, men kan være ændret under exportopsætningen. Importloggen indeholder informationer om selve importen, idet der vises en liste over importerede filer og eventuelle fejl. Ved en multi import med importdefinitionen i forrige afsnit, dannes der en importlogfil som vist herunder. Eksempel på Import.log Import af applikation 21-12/2007 -------------------------------------------- Vers. 4.1.0.180 21/12-2007 14:00 Export af CustTable Path...: c:\debexp\ Database.. --------------- exp00043.dbd -> CustTable List... --------------- EXP00001.LST -> CustTable.Account Form... --------------- EXP00001.FRM -> CustTable Første linje viser datoen for importen. De to næste tekstlinjer gengiver de to kommentarlinjer, der findes i Import.Def. Kommentarerne efterfølges af en linje med stinavnet, hvorfra filerne er importeret. De enkelte elementer er opstillet i en liste med overskrift for hver elementtype. Det fremgår også af importloggen, hvis der opstår fejl under importen og den efterfølgende oversættelse. Eksempel på Import.log med fejl Form... --------------- *** EXP00001.FRM -> CustTable Fejl i oversættelse Ovenstående eksempel er et udpluk af en Import.log, hvor det angives, at der er fejl i oversættelsen. Bemærk at elementet ér blevet importeret. Det er derfor vigtigt at kontrollere, hvori fejlen består og rette den. Når fejlen er rettet, skal det importerede element oversættes igen. Import kørsel Multi import består i at importere C5 elementer fra nogle af de elementfiler, der tidligere er dannet med en multi export. De elementfiler, der skal importeres fra, er beskrevet i filen Import.def. En multi import anvender således både filen Import.def og de tilhørende elementfiler. 17
Selve importen udføres fra udviklingsmenuen ved aktivering af menupunktet Multi Import. Brugeren ledes igennem to promptbokse med felter, der skal udfyldes. Prompt 1 (Import af applikation til C5UTIL.USR) Felt Forklaring Import def Navne Oprydning pr XAL-kode Fulde stinavn på definitionsfilen Import.def Hvis der ikke angives stinavn, forsøges det at finde filen i C5 s bibliotek Import def eller Export filer Feltet angiver, om elementernes navne skal tages fra de enkelte eksporterede elementer eller fra definitionsfilen. Normalt er dette uden betydning, men er navnene ændret manuelt et af stederne, er angivelsen i dette felt afgørende for elementernes navne efter import. Feltet angiver, at C5UTIL.USR skal reorganiseres efter import af det angivne antal elementer. Da C5UTIL.USR også er opbygget efter versionskontrol-princippet, vil berørte elementer ligge dobbelt i filen. Dette gælder dog kun import af elementer, der allerede eksisterer i C5UTIL.USR. Reorganiseringen fjerner den ældste kopi, som ikke mere er tilgængelig. Ved angivelse af værdien 0 i feltet, foretages ingen reorganisering. Ja eller Nej Udfyldes og accepteres den første prompt, vises der en ny prompt. Øverst i den nye prompt vises stinavn og navn på den aktuelle import definitionsfil med tilhørende kommentarer i form af bl.a. versionsnummer, dato og klokkeslæt. Prompt 2 (Import af applikation) Felt Forklaring Import path Import log Import Fulde stinavn på det directory, der indeholder de filer, der skal importeres. Som standard vises biblioteket fra exportopsætningen. Hvis filerne er flyttet, angives det nye directory her. Fulde stinavn på det directory, der skal indeholde import loggen. Som standard vises biblioteket fra exportopsætningen. Hvis elementfilerne er lagt et andet sted, angives det nye directory her. Import består af en række JA/NEJ felter. Et til hver elementtype. Ved at udfylde disse felter bestemmes hvilke elementtyper, der skal importeres. Det er således muligt at begrænse en import til visse elementtyper, selv om den tilhørende multi export indeholder flere andre. Efter en multi import foreslås det, at multi oversætte hele applikationen. 18
Multi oversættelse Oversættelse Multi oversættelse udfører en komplet oversættelse af hele applikationen. Dette kan være nødvendigt efter en multi import, idet det ikke er altid, at elementerne importeres i den rigtige rækkefølge. Multi oversættelse udføres i udviklingsmenuen i Multi Oversæt. Her åbnes der for en promptboks, med en række felter der bestemmer hvad der skal oversættes. Oversættelse af applikation Felt Forklaring Incl. Excl. Fra Til C_util Kun fejl i logfil Oprydning pr Debuginformation Logfil Kommentar Et udtryk som skal matches af de elementer, der skal oversættes. Efterlades feltet tomt medtages elementtypen ikke. Et udtryk som skal matches af de elementer, der ikke skal oversættes, men som indgår i matchudtrykket i feltet Incl. Navn på element der startes fra (skal indgå i matchudtrykket) Navn på element der sluttes med (skal indgå i matchudtrykket) Her vælges den C5util fil, hvis elementer skal oversættes. Udfyldes feltet Logfil, kan det her angives, om logfilen kun skal indeholde eventuelle fejl, eller alle filer der oversættes. På grund af versionskontrol-princippet findes alle elementerne to gange. Feltet udfyldes med et tal, der angiver hvor mange elementer, der skal oversættes ad gangen, inden der ryddes op i elementerne. Angives nul ryddes, der ikke op (alle elementer ligger dobbelt). Det er muligt under oversættelsen at tilføje debuginformation til elementerne. Hvis dette udføres, skal der foretages en oversættelse senere for at fjerne debuginformationen igen. Fulde navn og stinavn på logfilen der skal indeholde informationer om oversættelsen Der er to kommentarfelter, der kan udfyldes. Værdierne skrives i logfilen. Felt 1: Indeholder som standard versionsnummer, dato og Klokkeslæt. Felt 2: Kan frit udfyldes med ekstra information. Matchudtryk I felterne Incl. og Excl. kan der anvendes matchudtryk. De vigtigste match udtryk vises i skemaet herunder efterfulgt af eksempler. Yderligere forklaring findes i manualerne under ordet Match. 19
Matchudtryk Udtryk aaa <aaa aaa> Forklaring Ethvert element, der indeholder de pågældende tegn, medtages. Ethvert udtryk, der starter med bogstaverne aaa, medtages. Ethvert udtryk, der slutter med bogstaverne aaa, medtages.? eller. Tegnene indsættes i udtrykket som erstatning for enkelte tegn. * Erstatter ingen eller flere forekomster af tegn. Tegnet lige før medtages ikke. + Erstatter én eller flere forekomster af tegn. - Erstatter ingen eller én forekomst af tegnene. Eksempler Udtryk sal <Debf hist> k?ist <Deb?*st> Fak?*st> Forklaring DebitorSaldo, FinansBudgetSaldi, LønSaldiMed DebFakHist, DebFakList, DebFlgJour DebFakHist, KreFakHist DebFakHist, DebFakList, LagerStykListPrompt DebFakHist, DebFakList, DebPost, DebPostList DebFakHist, DebFakList, KreFakHist, KreFakList 20
Opgaver: Multi import Opgave 1: Multi import af kartoteker Formål med opgaven At udføre multi import af kartoteker fra det grundlæggende programmeringskursus. Beskrivelse Der skal udføres multi import af kartotekerne UDLUdlånsKart og UDLUdlånsPost, der blev oprettet på det grundlæggende programmeringskursus. Filerne udleveres af instruktøren. Filerne indeholder kun selve kartotekerne. Der er ingen fastteksttyper, indexer eller listbilleder. Forløb 1 Kontrollér om import definitionsfilen findes og åben den for at se indholdet. Hvilket navn har elementfilerne fået: UDLUdlånsKart: UDLUdlånsPost: 2 Kontrollér om elementfilerne findes 3 Vælg Udviklings menuen og start en multi import 4 Udfyld de relevante felter i promptboks 1 og 2 5 Kontrollér filen Import.log for, at begge filer er importeret uden fejl. 21
2. 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, hver for sig, 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. Supervisoren, eller brugere med tilsvarende rettigheder, kan selv oprette nye kartoteker og felter i C5. 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. 22
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: 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> Kartoteks navn startes således med modulnavnets tre første bogstaver skrevet med STORT efterfulgt kartoteks navn. Eksempel 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. 23
Hvor ligger data Hvor ligger data Eksempel på kartotek DAT DMO Øvrige Midlertidigt regnskab LønKørsel (X) (X) (X) Hvert regnskab CustTable X X X Kun DAT regnskabet ZipCode 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 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. 24
Systemfelter i kartoteker Alle kartoteker i C5 har fire ensartede systemfelter. Systemfelter i C5 Systemfelter LøbeNummer SidstRettet 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 tilsvarer de fem datatyper, der også anvendes til erklæring af variabler. 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. 25
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. Feltnavne Nedenstående regler skal overholdes for navngivning af felter. Regler for feltnavne 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 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 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. 26
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. Referencekartotek Referencefelt 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 Felt Betydning Opdatering af tallet 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. 27
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) 28
Opgaver: Kartoteker Opgave 1: Fasttekster Formål med opgaven At oprette nye fasttekster Huskelister ENUM Beskrivelse Der skal være to fastteksttyper i registreringssystemet. 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 Følg huskelisten hvis du ikke kan huske hvordan, der oprettes fasttekster. 2 Opret først fastteksttypen UDLUdlånsType og indsæt teksterne iflg. ovenstående skema. 3 Opret derefter fastteksttypen UDLUdlånsStatus og indsæt teksterne iflg. ovenstående skema. 29
Opgave 2: Kartoteker Formål med opgaven At oprette nye kartoteker med tilhørende felter At slette et felt i et kartotek. Beskrivelse Der skal oprettes to nye kartoteker til registrering af udlånte varer og et til indhold af procentsatser til udlejningsværdi og forsikringsværdi. Registreringen af udlån 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. 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 til ordrehovederne skal hedde UDLUdlånsKart, og kartoteket til ordrelinjerne skal hedde UDLUdlånsPost. Kartoteket til procentsatserne skal hedde UDLUdlånsSats. Vigtigt! Har du i en tidligere lektion importeret databasedefinitionen til kartotekerne, skal du kontrollere at alle felterne er til stede. Er de ikke det, skal du oprette de der mangler. Kartoteket UDLUdlånsSats mangler helt sikkert og skal oprettes med felter. Hvis importen ikke indeholdt fastteksttyper, skal du bemærke, at felterne af typen fasttekst er importeret med navnet CREATE. Giv disse felter deres rigtige navne og tilføj den rigtige fastteksttype. Kartotek: UDLUdlånsKart Type Specielt Feltnavn Ledetekst Int Absolut UdlånsNummer Nummer Str Højrestillet 10 DebitorKonto Konto Date UdlånsDato UdlånsDato Enum UDLUdlånsType UdlånsType * UdlånsType Str Venstrestillet 25 Attention Attention Date ReturDato ReturDato Real Opdatering af tal: Absolut National valuta: JA ForsikringsSum %3Forsikring ** * Fastteksttypen til feltet UdlånsType er den nyoprettede fasttekst med navnet UDLUdlånsType. ** %3 er en substitutionsvariabel der indsætter præsentationsvalutaen i ledeteksten efter et mellemrum. Anvendes når der samtidig er JA i National valuta. 30
Kartotek: UDLUdlånsPost Type Specielt Feltnavn Ledetekst Int Opdatering af tal: Absolut UdlånsNummer Nummer Str Højrestillet 10 DebitorKonto Konto Str Venstrestillet 10 VareNummer VareNr Str Venstrestillet 30 VareNavn VareNavn Str Venstrestillet 10 SerieNummer SerieNr Enum UDLUdlånsStatus UdlånsStatus * UdlånsStatus Real Real Opdatering af tal: Absolut National valuta: JA Opdatering af tal: Absolut National valuta: JA Udlejningsværdi %3Udlejning ** Forsikringsværdi %3Forsikring ** * Fastteksttypen til feltet Status er den nyoprettede fasttekst med navnet UDLUdlånsStatus. ** %3 er en substitutionsvariabel der indsætter præsentationsvalutaen i ledeteksten efter et mellemrum. Anvendes når der samtidig er JA i National valuta. Kartotek: UDLUdlånsSats Type Specielt Feltnavn Ledetekst Str Venstrestillet 10 VareNummer VareNr Real Opdatering af tal: Absolut UdlejningsPct Udlejning Real Opdatering af tal: Absolut ForsikringsPct Forsikring Forløb 1 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. 2 Opret først kartoteket UDLUdlånsKart og indsæt felterne iflg. ovenstående skema. (Er kartoteket importeret kontrolleres felterne.) 3 Opret derefter kartoteket UDLUdlånsPost og indsæt felterne iflg. ovenstående skema. (Er kartoteket importeret kontrolleres felterne.) 4 Opret herefter kartoteket UDLUdlånsSats og indsæt felterne iflg. ovenstående skema. 5 I UDLUdlånsKart slettes feltet Forsikringssum ved at ændre navnet til Slettet1, og i UDLUdlånsPost slettes feltet VareNavn, ved at ændre feltnavnet til Slettet2. 6 Husk at rette fasttekstfelterne der blev importeret som CREATE. 31
Opgave 3: Dokumentation Mål med opgaven At udskrive dokumentation på kartotekerne. Beskrivelse Efter oprettelse af de tre 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 alle tre kartoteker gå ind i feltet RowNumber 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 Udskriv dokumentation for kartotekerne på printeren 3 Kontrollér at kartotekerne er rigtigt oprettet. 32
3. 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 Indexer. Indexer generelt Indexer oprettes og vedligeholdes i de kartoteker de tilhører. C5 leveres med indexer til de eksisterende kartoteker, men der kan oprettes flere nye, hvis der opstår behov for det. Der kan således være flere indexer til hvert kartotek. De oprindelige indexer kan ikke slettes, men de kan ændres. Det anbefales ikke at foretage ændringer i eksisterende indexer, da det kan give uforudsigelige følger. Hvis der er behov for det, er det bedre at oprette nye indexer. 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. 33
Mangler index kan der kun søges fortløbende, dvs. i den rækkefølge posterne blev indtastet. 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 indexer Indexer oprettes i udviklingsmenuen under DBD/Ret/Kerne/ Vælg et kartotek / Indexbehandling/Opret. Indexer 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 indexer må dog ikke have sammenfaldene navne. Indexer 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 indexer 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 nedenfor. 34
Navngivning og indexformel Indexer navngives ofte ud fra de felter de består af og afsluttes som regel med bogstaverne Idx. Åbnes nogle af de indexer der findes i nuværende C5 kartoteker, ses at der er brugt mange forskellige måder at navngive på. Eksempler på indexnavne IndexNavn AccountIdx AccDateIdx Felter i Indexformel Account Account, Date Eksempler på indexformler IndexNavn Felter i Indexformel AccountIdx AccDateIdx NameIdx Account ASCEND Account ASCEND, Date DESCEND Name DESCEND 3 {Navn faldende 3 tegn} Hvis der skal sorteres på teksten i et fastteksfelt, skal dette først konverteres til en tekst med funktionen Enum2Str. 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. feltet Account i kartoteket CustTable, er det vigtigt at feltet er højrestillet. En højrestilling af feltet betyder således, at eventuelle blanke tegn altid placeres til venstre og værdien af feltet placeres til højre. Hvis feltet er venstrestillet, kan indholdet ikke behandles som en talværdi, men vil blive behandlet som en tekst, hvilket umuliggør en korrekt sortering i både stigende og faldende nummerorden. (Medmindre længden og sammensætningen af alle tal og tegn er ens for alle poster.) Navngivning af Indexer i nye moduler Nye moduler der kodes til C5 af andre end Microsofts egne udviklere, skal overholde følgende syntaks for navngivning af Indexer. Syntaks <3 første tegn i modulets navn med versaler><indexnavn> 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. 35
Eksempel 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. 36
Opgaver: Index Opgave 1: Index Formål med opgaven At oprette indexer på kartoteker Huskelister Kartotek Index Beskrivelse Der skal oprettes indexer 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. Indexer til UDLUdlånsKart Indexnavn Ens nøgler Aktivt Beskrivelse af index (felter) UDLDebDatTypIdx NEJ JA DebitorKonto UdlånsDato UdlånsType UDLUdlIdx NEJ JA UdlånsNummer UDLDebUdlIdx Nej JA DebitorKonto UdlånsNummer NB: Indexet UDLDebDatTypIdx overholder ikke kodestandarden for navngivning af indexer, idet det er lovligt at give indexet et sigende navn som her. Index til UDLUdlånsPost Indexnavn Ens Nøgler Aktivt Beskrivelse af index (felter) UDLUdlVarIdx JA JA UdlånsNummer VareNummer Index til UDLUdlånsSats Indexnavn Ens Nøgler Aktivt Beskrivelse af index (felter) UDLVarIdx NEJ JA VareNummer 37
Forløb 1 Opret først indexer på kartoteket UDLUdlånsKart iflg. skemaet 2 Opret derefter indexet på kartoteket UDLUdlånsPost iflg. skemaet 3 Opret derefter indexet på kartoteket UDLUdlånsSats 38
Opgave 2: Dokumentation Mål med opgaven At udskrive dokumentation på kartotekerne til indexkontrol Huskelister Kartotek Dokumentation Beskrivelse Efter oprettelse af indexer, skal der udskrives dokumentation på kartotekerne og det skal kontrolleres, at indexerne er oprettet korrekt. Forløb 1 Inden udskrivning af dokumentationen skal du i alle tre kartoteker gå ind i feltet RowNumber og indtaste dit navn i hjælpeteksten. (Hvis du ikke har gjort det i forvejen) Dette er kun for, at du kan kende din dokumentation fra de andre kursisters, når den udskrives på printeren. 2 Udskriv dokumentation for kartotekerne på printeren. 3 Kontrollér at indexerne er rigtigt oprettet. 4 Gem dokumentationen i kursusmappen. 39
4. INTRODUCE og transaktionskommandoer Formål Formålet med denne lektion er at lære deltagerne at anvende kommandoen INTRODUCE med dens forskellige muligheder. Desuden undervises i kommandoerne INSERT, UPDATE og DELETE. Efter lektionen skal kursisterne kunne: Anvende INTRODUCE til åbning af fiktive og faktiske poster Anvende kommandoerne INSERT, UPDATE og DELETE. Generelt INTRODUCE anvendes, når der kun skal gives adgang til én post i et kartotek. Til forskel fra SEARCH løkker der giver adgang til mange poster, indfører og åbner INTRODUCE kun én post ad gangen. Der er tre anvendelsesmuligheder med INTRODUCE: Åbning af fiktiv post med INTRODUCE Åbning af faktisk post med INTRODUCE Åbning af faktisk post med INTRODUCE og index. Åbning af fiktiv post med INTRODUCE Poster der åbnes med INTRODUCE kan enten være fiktive eller faktiske. En fiktiv post er tom, dvs. udfyldt med nulværdier, hvor en faktisk post er udfyldt med værdier fra databasen. Åbning af fiktiv post med INTRODUCE XAL kørsel databasedefinition INTRODUCE kartotek Beskrivelse af kartotek med felter Fiktiv (tom) post uden værdier KontoNummer Navn DebitorGruppe Andre felter KontoNummer Navn DebitorGruppe Andre felter 40
Når INTRODUCE anvendes, kigger systemet i databasedefinitionen til det pågældende kartotek, og danner en tom post bestående af felterne i kartoteket. Den tomme post stilles til rådighed for XAL kørslen. Syntaks for åbning af fiktiv post med INTRODUCE INTRODUCE <kartotek> Når en post indføres på denne måde, er der adgang til alle felterne i den, de er bare tomme, og kan tildeles værdier med SET kommandoen. Eksempel på åbning af fiktiv post med INTRODUCE INTRODUCE CustTable SET Account = 1000 SET Name = Søren Sørensen SET Group = DK I eksemplet indføres der en tom post fra debitorkartoteket, og felterne Account, Name og Group tildeles værdier med SET kommandoen. Grunden til af feltet Account tildeles værdien 1000 i anførselstegn, er at feltet i debitorkartoteket er et tekstfelt. Eksemplet, på næste side, viser hvordan INTRODUCE alene efterfulgt af kartoteksnavn, kun indfører en tom post. Eksempel der viser at posten er tom { Indførsel af en tom post med kommandoen INTRODUCE } INTRODUCE CustTable { Udskrivning af den tomme post } PRINT KontoNummer...:, Account PRINT Navn...:, Name PRINT DebitorGruppe..:, Group PRINT { Tildeling af værdier til den tomme post med SET } SET Account = 1000 SET Name = Søren Sørensen SET Group = DK { Udskrivning af den udfyldte post } PRINT KontoNummer...:, Account PRINT Navn...:, Name PRINT DebitorGruppe..:, Group PAUSE 41
Resultat KontoNummer...: Navn...: DebitorGruppe..: KontoNummer...: 1000 Navn...: Søren Sørensen DebitorGruppe..: DK Efter tildeling af værdier til den tomme post, kan den udskrives som vist i eksemplet, men den kan også indsættes i kartoteket med kommandoen INSERT. Åbning af faktisk post med INTRODUCE INTRODUCE kan også åbne for faktiske poster, dvs. poster der eksisterer i kartoteket i forvejen. Faktiske poster åbnes med INTRODUCE og direkte opslag. Åbning af faktisk post med INTRODUCE og direkte opslag XAL kørsel Kartotek INTRODUCE kartotek [direkte opslag] Postering findes i kartoteket KontoNummer Navn Faktisk post udfyldt med værdier fra kartoteket DebitorGruppe Andre felter 1000 Sørensen DK Osv. KontoNummer Navn DebitorGruppe Andre felter 1000 Sørensen DK Osv. Faktiske poster åbnes ved at tilføje et direkte opslag til INTRODUCE kommandoen. Det direkte opslag skal pege på, den post der skal åbnes. Syntaks for åbning af faktisk post med INTRODUCE INTRODUCE <kartoteksnavn> [direkte opslag] 42
Husk, at der i det direkte opslag altid skal angives et index og en værdi der kan bruges til at slå op i dette index med. Eksempel med direkte opslag INTRODUCE CustTable [AccountIdx== 100875 ] I direkte opslag kan lighedstegnene erstattes med et komma. Direkte opslag med komma INTRODUCE CustTable [AccountIdx, 100875 ] Når der angives INTRODUCE med direkte opslag, forsøger programmet at finde posten og indføre den i XAL-kørslen med værdierne fra kartoteket. Findes posten ikke, indføres der alligevel en post, den er bare fiktiv (tom). Faktisk eller fiktiv? Hvordan kan det vides om posten findes (om den er faktisk eller fiktiv)? Alle poster i kartoteker har et RowNumber, der automatisk tildeles posterne på oprettelsestidspunktet. Ved at undersøge om indførte poster har et RowNumber, kan det således kontrolleres om de eksisterer dvs. om de er faktiske. Syntaksen for kontrol af RowNumber INTRODUCE Kartotek [Direkte opslag] IF RowNumber THEN Kommandoblok ENDIF Eksempel INTRODUCE CustTable [AccountIdx== 100875 ] IF CustTable.RowNumber THEN PRINT Posten er faktisk! ELSE PRINT Posten er fiktiv! ENDIF I ovenstående eksempel indføres en post fra CustTable med kontonummer 100875. Da det ikke vides om posten eksisterer, kontrolleres det med en IF struktur om den har et RowNumber. Har den det, er den faktisk. Den eksisterer og teksten Posten er faktisk! udskrives. Er der ikke noget RowNumber springes første del i IF strukturen over, og der fortsættes efter ELSE, hvor teksten Posten er fiktiv! udskrives. Denne struktur kan anvendes sammen med kommandoerne INSERT og UPDATE, der behandles senere i denne lektion. 43
Åbning af faktisk post med INTRODUCE og index I de to foregående afsnit så vi, hvordan INTRODUCE anvendes til åbning af fiktive og faktiske poster. Der kan også åbnes faktiske poster alene med index. I dette tilfælde åbnes en faktisk post, udfyldt med værdier fra første post i det angivne index. Syntaks for åbning af faktisk post med INTRODUCE og index INTRODUCE <kartoteksnavn> [Indexnavn] Eksempel INTRODUCE CustTable [AccountIdx] PRINT Løbenummer...:,RowNumber PRINT Kontonummer..:,Account PRINT Navn...:,Navn PAUSE I dette eksempel åbnes en faktisk post udfyldt med værdier fra det første kontonummer i indexet AccountIdx. Resultat Løbenummer...: 7 Kontonummer..: 20000 Navn...: Central Kopiering Konto 20000 er den første i det anvendte index. Betydningen af index fremgår tydeligere, når retningskommandoerne FIRST, NEXT, PREV og LAST anvendes. Disse behandles i en efterfølgende lektion. INSERT, UPDATE, DELETE Fælles syntaks Kommandoerne INSERT, UPDATE og DELETE er transaktionskommandoer, der anvendes når der udføres transaktioner på poster i kartoteker. Syntaksen for de tre kommandoer er ens, idet alle efterfølges af navnet på det kartotek den aktuelle post tilhører. 44
Syntaks for INSERT, UPDATE og DELETE INSERT <kartoteksnavn> UPDATE <kartoteksnavn> DELETE <kartoteksnavn> INSERT INSERT indsætter nye poster i et kartotek, hvor i de ikke findes i forvejen. Kommandoen kan således anvendes på fiktive tomme poster, der udfyldes med værdier. Kommandoen anvendes typisk i forlængelse af INTRODUCE, efter at der er indført en fiktiv post fra et kartotek, men den kan også benyttes i forbindelse med kommandoen READ til indlæsning af poster fra en fremmed fil. INSERT indsætter en post i det angivne kartotek, efter at den f.eks. er blevet tildelt værdier inde i kørslen. Feltet RowNumber udfyldes automatisk. Eksempel INTRODUCE CustTable SET Account = 1000 SET Name SET Group = Søren Sørensen = DK INSERT CustTable I eksemplet indføres der en tom post fra debitorkartoteket (INTRODUCE CustTable) og felterne Account, Name og Group tildeles værdier med SET kommandoen (SET Account = 1000 osv.) Til sidst indsættes/oprettes den udfyldte post i debitorkartoteket (INSERT CustTable). UPDATE UPDATE opdaterer eksisterende poster der findes i et kartotek i forvejen. Kommandoen anvendes typisk i forlængelse af INTRODUCE, efter at der er indført en faktisk post fra et kartotek. Kommandoen kan således anvendes på faktiske poster, der er udfyldt med værdier fra kartoteket, og hvor værdierne ændres med SET kommandoen. Eksempel med UPDATE INTRODUCE CustTable [AccountIdx, 100875 ] IF CustTable.RowNumber THEN SET CustTable.Adress1 = Koldingvej 25 UPDATE CustTable ENDIF I dette eksempel indføres posten med nummer 100875 fra debitorkartoteket. Hvis den findes tildeles feltet Adress1 værdien Koldingvej 25, hvorefter posten opdateres i kartoteket. 45
DELETE DELETE sletter eksisterende poster der findes i forvejen i et kartotek. Kommandoen anvendes typisk i forlængelse af INTRODUCE, efter at der er indført en faktisk post fra et kartotek. Eksempel med DELETE INTRODUCE CustTable [AccountIdx== 100875 ] IF CustTable.RowNumber THEN PRINT Posten blev fundet, og slettes nu! DELETE CustTable ELSE PRINT Posten findes ikke, og kan ikke slettes! ENDIF I dette eksempel undersøges det om posten findes, idet der checkes på RowNumber (IF CustTable.RowNumber THEN). Findes posten udskrives teksten Posten blev fundet, og slettes nu!, hvorefter den slettes med kommandoen DELETE. Findes den ikke, er der ikke noget RowNumber og anden del af IF strukturen anvendes med teksten Posten findes ikke, og kan ikke slettes!. I stedet for PRINT sætninger, kan funktionen Box anvendes til at udskrive Advarselsbokse eller Infobokse. Eksempel med funktionen BOX til teksterne INTRODUCE CustTable [AccountIdx== 100875 ] IF CustTable.RowNumber THEN SET BOX(1, Posten blev fundet, og slettes nu!,0) DELETE CustTable ELSE SET BOX(2, Posten findes ikke, og kan ikke slettes!,0) ENDIF INSERT/UPDATE i samme XAL kørsel Det kan sagtens lade sig gøre at udføre INSERT og UPDATE i samme XAL kørsel. Hvilken af de to kommandoer der skal anvendes i den aktuelle situation, bestemmes med kontrol af RowNumber. 46
INSERT/UPDATE i samme XAL kørsel INTRODUCE CustTable [AccountIdx== 300 ] SET CustTable.Name = Poul Poulsen IF CustTable.RowNumber THEN UPDATE CustTable ELSE INSERT CustTable ENDIF I eksemplet forsøges det at åbne en post med kontonummer 300. Uanset om posten er fiktiv eller faktisk tildeles feltet CustTable.Name værdien Poul Poulsen. I IF sætningen udføres der RowNumber kontrol, så det kan bestemmes om posten skal opdateres med navnet, eller der skal indsættes (oprettes) en ny post i kartoteket. Bemærk! Hvis posten ikke findes og der oprettes en fiktiv post, vil denne fiktive post automatisk blive tildelt værdien i det direkte opslag. I dette eksempel værdien 300. 47
Opgaver: INTRODUCE og transaktionskommandoer Opgave 1: INTRODUCE med fiktiv post Formål med opgaven At anvende INTRODUCE og INSERT til at indsætte nye poster i et kartotek. Huskelister INTRODUCE Beskrivelse Kartoteket UDLUdlånsSats er helt tomt. Det skal udfyldes med varenumre fra lagerkartoteket InvenTable, og samtidig skal der indsættes faste procentsatser i felterne til UdlejningsPct og ForsikringsPct. Procenterne skal være ens for alle varer. Forløb 1 Opret en ny XAL kørsel 2 Indsæt og tilret startkommentarer 3 Introducer en tom post fra UDLUdlånsSats 4 Indsæt en søgeløkke på lagerkartoteket InvenTable 5 I søgeløkken skal den tomme post tildeles værdier til felterne som følgende: ItemNumber fra lagerkartotekets varenummer UdlejningsPct skal være 10 ForsikringsPct skal være 100 6 Indsæt den udfyldte post i UDLUdlånsSats 7 Godkend kørslen og afprøv den 8 Kontrollér i et listbillede til kartoteket UDLUdlånsSats, at alle varerne er oprettet med procenter og at alle er ens. Hvis du ikke har et listbillede til UDLUdlånsSats, skal du lave et. (Anvend farvesæt 1 i listbilledet). 48
Opgave 2: INTRODUCE med faktisk post Formål med opgaven At afprøve kommandoen INTRODUCE med direkte opslag, for at åbne en bestemt post. Desuden skal der udføres RowNumber kontrol, for at undersøge om posten eksisterer. Huskelister INTRODUCE Beskrivelse Kartoteket UDLUdlånsSats er nu udfyldt med nyoprettede poster. Der skal oprettes en ny XAL kørsel, der starter med en promptboks, hvor i der spørges om et varenummer. Vise udlånssatser for varer Indtast varenummer : Efter indtastning af varenummer skal det undersøges, om nummeret findes i UDLUdlånsSats. Hvis det findes, skal det udskrives på skærmen med forskellige felter, som vist herunder. VareNummer...: 10-GC-1 Udlejning...: 10,00 Forsikring...: 110,00 RowNumber...: 4 Sidst rettet.: 07/09-07 Hvis det ikke findes, skal der udskrives en advarselsboks om at varenummeret ikke findes. Varenummer 1234 findes ikke! OK Se forløbet næste side. 49
Forløb 1 Opret en ny XAL kørsel 2 Indsæt og tilret startkommentarer 3 Spørg i en promptboks hvilket varenummer brugeren ønsker Husk at erklære en variabel først Indsæt reference til kartoteket UDLUdlånsSats og feltet VareNummer 4 Introducer UDLUdlånsSats med direkte opslag, og anvend det indtastede varenummer i opslaget 5 I en IF struktur undersøges om der er et RowNumber Hvis der er det udskrives følgende felter på skærmen, med feltets eget navn som ledetekst foran: ItemNumber, UdlejningsPct, ForsikringsPct, RowNumber og LastChanged Hvis der ikke er et RowNumber, udskrives en advarselsboks med Varenummer xxx findes ikke!. De tre xxx skal erstattes af varenummeret. Dvs. at varenummeret skal indbygges som en del af teksten. 6 Godkend kørslen og afprøv den Indtast både varenumre der findes og ikke findes, så du kan se at begge muligheder fungerer. 50
5. PROMPT, videregående brugerdialog Formål Formålet med denne lektion er at give deltagerne yderligere viden om brugerdialoger med kommandoen PROMPT. Efter lektionen skal kursisterne, ud over de grundlæggende funktioner, kunne: Anvende funktionerne ASENUM, DECIMALS og LENGTH Indsætte forskellige datatyper i overskrifter og ledetekster Anvende GET på kartoteksfelter. Generelt om brugerdialoger Brugerdialoger med promptbokse anvendes til kommunikation mellem brugere og program. Hvor program kan være XAL kørsler, forms osv. I promptbokse kan programmøren stille spørgsmål til brugeren, der kan skrive svarene i indtastningsfelter. De indtastede værdier gemmes i variabler eller kartoteksfelter. Den grundlæggende opsætning af promptbokse er tidligere behandlet i lektionen PROMPT, grundlæggende brugerdialog, og PROMPT med REF er tidligere behandlet i lektionen Brugerdialog med kartoteksopslag. I denne lektion repeteres kort den grundlæggende opsætning, samt referenceopslag med REF. Derefter behandles udvidede funktioner i promptbokse i form af forskellige datatyper i overskrifter og ledetekster, GET på kartoteksfelter, funktionerne ASENUM, DECIMALS og LENGTH. Grundlæggende opsætning Den grundlæggende opsætning af kommandoen PROMPT består af en dialogboks med overskrift, ledetekster og felter til indtastning af værdier. Promptboks med overskrift, ledetekster og indtastningsfelter Indtast vareinformationer Antal...: Varenavn...: Overskrift Ledetekster Indtastningsfelter Overskrift og ledetekster er almindelig fritekst, hvorimod indtastningsfelterne fremkommer vha. kommandoen GET. 51
Grundlæggende promptboks med to spørgsmål og ekstra tekstlinjer STR 15 &Varenr STR 30 &VareNavn PROMPT Indtast vareinformationer,,, Varenummer..: GET (&Varenr), Varenavn...: GET (&VareNavn),, Hvis det ønskes, må varenummeret, gerne være alfanumerisk. INPUT AT 15,4 Resultat Varenummer..: Varenavn...: Indtast vareinformationer Hvis det ønskes, må varenummeret Gerne være alfanumerisk. Se næste side en liste over vigtige punkter om grundlæggende opsætning af promptbokse. Punkter om grundlæggende opsætning af promptbokse: Overskrift og ledetekster skrives ALTID i anførselstegn Indtastningsfelter dannes af GET efterfulgt af variabel i () Variabler erklæres i toppen af kørslen Der skal altid være mindst én GET kommando Der tillades ledetekster uden GET kommando Der tillades GET kommandoer uden ledetekst Linjeskift udføres på kommaernes placering Hvert komma medfører et linjeskift Efter overskriften indsættes altid et ekstra komma Der udføres ikke linjeskift ved komma efter den sidste linje Blanke linjer indsættes med ekstra kommaer Der dannes ikke linjeskift ved kommaer i overskrifter og ledetekster Med INPUT placeres promptbokse i vinduets øverste venstre hjørne Med INPUT AT placeres øverste venstre hjørne af promptbokse i angivne kolonne og linje. 52
Tillægskommandoer REF Udtrykket REF anvende i forbindelse med indtastningsfelter, hvori der indtastes værdier, der findes i andre kartoteker. Ved hjælp af REF får brugeren mulighed for, med ALT+H i indtastningsfeltet, at få en liste over mulige værdier i kartoteket. Én af værdierne kan vælges og overføres til indtastningsfeltet. Grundlæggende promptboks med REF STR 15 &Varenr STR 30 &VareNavn PROMPT Indtast vareinformationer,,, Varenummer..: GET (&Varenr REF InvenTable.VareNummer), Varenavn...: GET (&VareNavn),, Hvis det ønskes, må varenummeret, gerne være alfanumerisk. INPUT AT 15,4 REF efterfølges altid af navne på kartotek og felt der refereres til. Navnene adskilles med et punktum. Resultat (Listbillede fra InvenTable) Indtast vareinformationer Varenummer..: Varenavn...: ALT+H Hvis det ønskes, må varenummeret Gerne være alfanumerisk. Bemærk! Findes der et listbillede med samme navn som referencefeltet, vises dette listbillede. Sammenbyggede tekster Overskrifter og ledetekster i promptbokse kan udvides og bygges sammen med værdier fra andre datatyper f.eks. variabler, kartoteksfelter, funktioner og macroer. Teksterne kan således opsættes til at vise varierende tekst, afhængigt af de værdier de bygges sammen med. Syntaks for sammenbygning af tekst med andre typer værdier Tekst + <værdi> + Tekst 53
Tekster bygges sammen med andre typer værdier ved hjælp af plus tegnet. Hensigten er, at plus tegnet skal knytte det hele sammen til én lang tekststreng. I syntaksen herover er <værdi> f.eks. variabler, kartoteksfelter, funktioner osv. Da teksterne står i anførselstegn og bygges sammen med værdier der ikke gør det, kræver det, at disse værdier i sig selv er tekst eller konverteres til tekst. Konvertering af forskellige datatyper til tekst Datatype Funktion Konvertering til tekst INT INT2STR Heltal vises som de er NUM2STR Heltal vises som kommatal (format kan bestemmes) REAL NUM2STR Kommatal vises som kommatal (format kan ændres) INT2STR Kommatal vises som heltal (decimaler fjernes) STR Ingen Behøver ikke konvertering DATE DATE2STR Datoer vises i standardformat (format kan ændres) ENUM ENUM2STR Talværdien konverteres til tilsvarende fasttekst Funktionerne, vises på næste side, anvendt i eksempler uden yderligere forklaring på deres opbygning. Der henvises til lektionerne om funktioner grundlæggende og videregående, samt til huskelister om disse. Eksempel på forskellige konverteringer til tekst REAL &NyMax SEARCH CustTable SET &NyMax = BalanceMax PROMPT Kontrol af konto + Account + + Name,,, Kreditmax: + NUM2STR(BalanceMax,12,2,1,0), Saldo...: + NUM2STR(BalanceMST,12,2,1,0), ------------, Forskel..: + NUM2STR(BalanceMax- BalanceMST,12,2,1,0),, S.rettet : + DATE2STR(LastChanged,123,2,2,2,2,2), Spærret..: + ENUM2STR(Blocked),,, Ny max...: GET (&NyMax) INPUT AT 10,3 SET BalanceMax = &NyMax UPDATE CustTable END I eksemplet bygges teksten i overskriften sammen med felterne Account og Name der begge er tekstfelter og derfor ikke skal konverteres. Funktionen NUM2STR() konverterer felterne BalanceMax og BalanceMST. Den beregnede forskel konverteres på samme måde. DATE2STR konverterer datofeltet LastChanged og ENUM2STR konverterer værdien i feltet spærret. Bemærk at der på begge sider af plusserne er indsat mellemrum. Det er ikke nødvendigt, promptboksen fungere også uden. 54
Hensigten med eksemplet er at gennemløbe debitorkartoteket. For hver debitor vises promptboksen med de sammenbyggede tekster og ét indtastningsfelt på variablen &NyMax. Brugeren kan læse de forskellige informationer og indtaste en ny kreditmax. Efter hver enkelt debitor sættes feltet BalanceMax lig med variablen &NyMax, hvorefter debitorkartoteket opdateres med den nye værdi (UPDATE CustTable). UPDATE kommandoen behandles andet sted i kursusmaterialet. Resultat Kontrol af 42983214 Super Korn A/S Kreditmax: 100000,00 Saldo...: 30145,90 ------------ Forskel..: 69854,10 S.rettet : 29.08.06 Spærret..: Nej Ny max...: 50000,00 GET på felter GET kommandoen anvendes sammen med en variabler i (), til at danne indtastningsfelter i promptbokse. Variablerne modtager de værdier der skrives i indtastningsfelterne. GET kommandoen kan imidlertid også anvendes på kartoteksfelter, så disse felter direkte modtager den indtastede værdi. Felter kan kun anvendes, når kartoteker har virkefelt. Det vil sige, at kartoteket skal være åbnet med kommandoen SEARCH eller INTRODUCE. Bemærk! De indtastede værdier opdateres ikke automatisk på selve kartoteket. Dette skal udføres med kommandoen UPDATE. Eksempel på GET til kartoteksfelt SEARCH CustTable PROMPT Kontrol af konto + Account + + Name,,, Kreditmax: + NUM2STR(BalanceMax,12,2,1,0), Saldo...: + NUM2STR(BalanceMST,12,2,1,0), ------------, Forskel..: + NUM2STR(BalanceMax- BalanceMST,12,2,1,0),, S.rettet : + DATE2STR(LastChanged,123,2,2,2,2,2), Spærret..: + ENUM2STR(Blocked),,, Ny max...: GET (BalanceMax) INPUT AT 10,3 UPDATE CustTable END Eksemplet er det samme som i forrige afsnit. I dette eksempel er der dog ingen variabler til BalanceMax. I stedet anvendes GET kommandoen direkte sammen med kartoteksfeltet BalanceMax (GET (BalanceMax)) 55
Resultat Kontrol af 42983214 Super Korn A/S Kreditmax: 100000,00 Saldo...: 30145,90 ------------ Forskel..: 69854,10 S.rettet : 29.08.07 Spærret..: Nej Ny max...: 50000,00 ASENUM ASENUM har ikke noget at gøre med de fastteksttyper der oprettes og vedligeholdes i kartotekerne. ASENUM får blot et indtastningsfelt til at fungere, som om der ligger en fasttekst bag. Det gør der i realiteten også, men den er indbygget direkte i indtastningsfeltet. Eksempel på anvendelse af ASENUM INT &Farve PROMPT Vælg farve: GET (&Farve ASENUM Rød\nGrøn\nGul ) INPUT ASENUM angives sidst i parentesen, efterfulgt af en række tekster adskilt af \n. Det skal være et lille n og tekstrækken sættes i anførselstegn. Indtastningsfeltet fungerer som et almindeligt felt med en fasttekst. I stedet for at hente de faste tekster i en fastteksttype, er de bare indbygget direkte i feltet. De værdier der gemmes i variablen eller feltet, er som ved almindelige fasttekster ikke selve teksten, men tekstens nummer i tekstrækken startende med nummer nul for den første tekst. Værdien der gemmes, er således et heltal, hvilket betyder at variablen eller feltet også skal være af typen heltal. HUSK! Første tekst er nummer nul. 56
Eksempel med ASENUM REAL &Kurs REAL &Beløb INT &Metode = 4.468 {100 xx (valuta) i DKK} PROMPT Omregning af valuta,,, Indstil kurs...: GET (&Kurs), (Beløb i DKK svarende til, 100 enheder i fremmed valuta!,,, Beløb..: GET (&Beløb), Metode.: GET (&Metode ASENUM Til fremmed\ntil DKK ), INPUT IF &Metode == 0 THEN PRINT DKK til fremmed valuta:, &Beløb/&Kurs*100 ELSE PRINT Fremmed valuta til DKK:, &Beløb*&Kurs/100 ENDIF PAUSE Ovenstående eksempel er beregnet til omregning af valuta. Der er to metoder, idet et indtastet beløb kan omregnes til fremmed valuta eller til danske kroner. I eksemplet anvendes ASENUM til variablen &Metode, så der kan vælges mellem værdierne Til fremmed og Til DKK. I IF sætningen checkes om metoden er lig med nul, der svarer til den første tekst. Resultat Omregning af valuta Indstil kurs...: 4,47 (Beløb i DKK svarende til 100 enheder i fremmed valuta!) Beløb..: Metode.: 0,00 Til fremmed Til fremmed ALT+H Til DKK Taster der ALT+H indtastningsfeltet til metode vises listen over de indbyggede fasttekster, hvorfra der kan vælges en. DECIMALS Med udtrykket DECIMALS angives hvor mange decimaler, der kan indtastes og vises i indtastningsfelter i promptbokse. Udtrykket kan kun anvendes ved indtastningsfelter til variabler og felter af typen REAL. 57
Værdien angives som et heltal f.eks. 4, der betyder at der kan indtastes og vises tal med fire decimaler. Standardværdien er to decimaler. DECIMALS placeres til sidst (også efter evt. LENGTH). Uden DECIMALS I indtastningsfelter uden DECIMALS, hvor værdien er nul vises værdien 0,00. Der vises de to decimaler, som er standard. Der kan udmærket indtastes tal med flere decimaler, f.eks. 250,2234 der er et tal med fire decimaler. Så snart feltet forlades, ændres værdien dog til den afrundede værdi med to decimaler. Det er desuden også den afrundet værdi, der gemmes i variablen eller feltet Med DECIMALS I indtastningsfelter med DECIMALS, hvor værdien er nul, vises værdien nul komma efterfulgt af så mange nuller som angivet med DECIMALS. Indtastes et tal med det givne antal decimaler f.eks. 4 decimaler som i tallet 250,2234 vises tallet med de fire decimaler, også når indtastningsfeltet forlades. Det er også tallet med de fire decimaler, der gemmes i variabler eller felter. Eksempel med ASENUM REAL &Kurs REAL &Beløb INT &Metode = 4.468 {100 enheder i fremmed valuta i DKK} PROMPT Omregning af valuta,,, Indstil kurs...: GET (&Kurs DECIMALS 4), (Beløb i DKK svarende til, 100 enheder i fremmed valuta!,,, Beløb..: GET (&Beløb), Metode.: GET (&Metode ASENUM Til fremmed\ntil DKK ), INPUT IF &Metode == 0 THEN PRINT DKK til fremmed valuta:, &Beløb/&Kurs*100 ELSE PRINT Fremmed valuta til DKK:, &Beløb*&Kurs/100 ENDIF PAUSE Ovenstående eksempel er det samme i forrige afsnit. Forskellen er at der i det ovenstående eksempel anvendes DECIMALS 4 til kursen. 58
Resultat Omregning af valuta Indstil kurs...: 4,4680 (Beløb i DKK svarende til 100 enheder i fremmed valuta!) Beløb..: Metode.: 0,00 Til fremmed ALT+H Til fremmed Til DKK Kursen kan i eksemplet indtastes med fire decimaler og giver en mere korrekt udregning. LENGTH LENGTH angiver længden på indtastningsfelter i promptbokse. Udtrykket kan anvendes på alle typer variabler og kartoteksfelter INT, REAL, STR, DATE og ENUM. Værdien angives som et helt tal, f.eks. 15, som betyder at pågældende indtastningsfelt, vises som værende 15 tegn langt. I promptbokse placeres LENGTH med talværdien lige efter navnet på variabler eller felter, der skal vises med en bestemt længde. Grundlæggende promptboks med to spørgsmål og ekstra tekstlinjer STR 15 &Varenr STR 30 &VareNavn PROMPT Indtast vareinformationer,,, Varenummer..: GET (&Varenr), Varenavn...: GET (&VareNavn LENGTH 15),, Hvis det ønskes, må varenummeret, gerne være alfanumerisk. INPUT AT 15,4 I dette eksempel anvendes LENGTH 15 i feltet med variablen &Navn. Variablen er erklæret med 30 tegn. Det betyder at der kan indtastes 30 tegn, selv om feltet kun vises med 15 tegn. 59
Resultat Indtast vareinformationer Varenummer..: Varenavn...: Hvis det ønskes, må varenummeret Gerne være alfanumerisk. På næste side vises et skema med informationer standardværdier og de mulige ændringer, samt betydningen af evt. ændringer. LENGTH på forskellige variabel og felttyper Datatyper Bemærkning INT REAL STR DATE ENUM Standardværdi 12 tegn Sættes længden mindre end tolv tegn kan der ikke tastes tal, der fylder mere end indtastningsfeltets længde. Sættes længden større end standardværdien kan der tastes så meget, der er plads til, men der er en øvre og nedre grænse på størrelse af heltal. Hvis indtastede tal passerer denne grænse vises en Infoboks med besked om at tallet ligger uden for grænserne. Desuden vises grænseværdierne. Standardværdi 12 tegn. Længden på kommatalsfelter kan både sættes til at være større og mindre en 12 tegn. Uafhængigt af feltets størrelse kan der altid indtastes tal der fylder mere end feltets længde. Hvis dette er tilfældet udfyldes feltet med *. Standardværdi er variablers længde under erklæring eller feltlængde i databasedefinition. I visse tilfælde er det ønskeligt at tilpasse feltlængden til andre feltet i promptbokse, så den bliver samme længde. Sættes længden mindre end standardværdien, er det alligevel muligt at indtaste det fulde antal tegn som standardlængden bestemmer, teksten forrykkes blot mod venstre under indtastningen. Sættes længden større end standardværdien, kan der kun indtastes det antal tegn, der er i standardværdien. Standardværdi 12 tegn Fuld dato kan indtastes eller hentes med ALT+ H. Er der ikke plads til at vise datoen, vises kun det, der er plads til. Standardværdi 12 tegn Da standardværdien er 12 tegn er det ikke altid den fulde tekst kan ses i indtastningsfeltet. Fastteksttypen Lagerbevægelse har f.eks. flere tekster, der er længere end de 12 tegn. F.eks. Produktionslinje og Styklistefantom. Skal disse ord vises i deres fulde længde er det nødvendigt at indsætte LENGTH. 60
Opgaver: PROMPT, videregående brugerdialog Opgave 1: PROMPT med GET på kartoteksfelter Formål med opgaven At afprøve kommandoen PROMPT med GET direkte på kartoteksfelter i stedet for variabler At anvende kommandoen UPDATE til at opdatere poster, der er ændret i. Beskrivelse Kartoteket UDLUdlånsSats er udfyldt med nyoprettede poster. I forrige opgave oprettede du en promptboks, hvori der promptes for varenummer. Med løbenummer kontrol undersøges om varenummeret findes og hvis det gør det, udskrives værdier fra den fundne post, ellers udskrives en advarselsboks med besked om at posten ikke findes. I denne opgave skal der oprettes endnu en promptboks til indtastning af nye satser. Promptboksen skal vises på skærmen, efter at printlinjerne er udskrevet med satser for den pågældende vare. Udlejningssats...: Forsikringssats..: Satser for varenummer 10,00 110,00 VareNummer...: 10-GC-1 Udlejning...: 10,00 Forsikring...: 110,00 LøbeNummer...: 4 Sidst rettet.: 07/09-99 Det skal således være muligt, på det varenummer der vælges, at indtaste nye satser i felterne UdlejningsPct og ForsikringsPct. Efter ændringen skal posten opdateres med UPDATE, så ændringerne gemmes i kartoteket. Den nye promptboks og UPDATE skal indsættes efter printlinjerne før ELSE. Se forløbet på næste side: 61
Forløb 1 Opret en ny XAL kørsel. 2 Kopiér alle kodelinjer fra forrige opgave, og foretag nødvendige ændringer i standardkommentarerne. 3 Spørg i en ny promptboks om nye værdier til felterne UdlejningsPct og ForsikringsPct. I promptboksen skal de indtastede værdier gemmes direkte i kartoteksfelterne. 4 Opdatér kartoteket med udlånssatserne. 5 Godkend kørslen og afprøv den. Indtast både varenumre der findes og ikke findes, så du kan se at begge muligheder fungerer. 62
Opgave 2: PROMPT med udvidede faciliteter Formål med opgaven At afprøve kommandoen PROMPT med LENGTH og DECIMALS, samt indbygge felter direkte i ledeteksten i en promptboks. Beskrivelse I forrige opgave oprettede du en promptboks til indtastning af nye satser. I denne opgave skal du ændre i opsætningen af boksen. I ledeteksten skal du indbygge varenummeret, så det indgår som en del af selve teksten. Desuden skal du i begge felter indsætte en fast længde på fem tegn og der skal kun være én decimal. Satser for varenummer 10-GC-1 Udlejningssats...: Forsikringssats..: 10,0 110,0 VareNummer...: 10-GC-1 Udlejning...: 10,00 Forsikring...: 110,00 LøbeNummer...: 4 Sidst rettet.: 07/09-08 Forløb 1 Opret en ny XAL kørsel. 2 Kopiér alle kodelinjer fra forrige opgave, og foretag nødvendige ændringer i standardkommentarerne. 3 I promptboksen til indtastning af satser skal du i overskriften indføje feltet VareNummer, så det fremgår af overskriften når brugeren ser den på skærmen. Desuden skal begge feltet sættes til en længde på 5 tegn, og 1 decimal. 4 Godkend kørslen og afprøv den. Kontrollér at de nye faciliteter fungerer. 63
Opgave 3: PROMPT med indbygget fasttekst Formål med opgaven At afprøve kommandoen PROMPT med indbygget fasttekst og at anvende de indtastede værdier i en IF sætning. Beskrivelse I forrige opgave er der en promptboks til indtastning af nye satser i de enkelte varenumre. Opgaven skal ændres så der i den første promptboks, hvor der spørges om varenummer, også spørges om varenummeret kun skal vises, eller det også skal være muligt at ændre satser. Udlånssatser Indtast varenummer: Vise eller ændre..: Vise Forespørgslen udfærdiges med ASENUM, og der skal være to muligheder Vise og Ændre. Vælges Ændre fremkommer promptboksen til indtastning af satser i de to felter. Satser for varenummer 10-GC-1 Udlejningssats...: Forsikringssats..: 10,0 110,0 VareNummer...: 10-GC-1 Udlejning...: 10,00 Forsikring...: 110,00 LøbeNummer...: 4 Sidst rettet.: 07/09-08 Svaret indbygges i en IF sætning der omklamrer promptboksen med satsfelterne. Se forløbet på næste side. 64
Forløb 1 Opret en ny XAL kørsel. 2 Kopiér alle kodelinjer fra forrige opgave, og foretag nødvendige ændringer i standardkommentarerne. 3 I promptboksen til indtastning af varenummer skal der tilføjes et ekstra felt med en variabel. Feltet skal fungere som indbygget fasttekst med værdierne Vise på pos 0 og Ændre pos 1. Indtastningsfeltet sættes til en længde på 10 tegn. 4 Den værdi der indtastes i det nye felt med den indbyggede fasttekst, skal anvendes i en IF sætning hvor det kontrolleres om der svares Vise eller Ændre. Det er kun når der svares Ændre at promptboksen med sats felterne skal aktiveres sammen med opdateringskommandoen. 5 Svares der vise er det således kun printlinjerne, der skal vises på skærmen. Svares der Ændre skal printlinjerne vises først, hvorefter promptboksen med sats felterne fremkommer. Find det rigtige sted at indsætte PAUSE. 6 Godkend kørslen og afprøv den. Kontrollér at de nye faciliteter fungerer. 65
6. Videregående løkkekommandoer Formål Formålet med denne lektion er at lære at anvende kommandoen WHILE. Efter denne lektion skal kursisterne kunne: Anvende kommandoen WHILE. Generelt Løkker er gentagelser af de samme kommandoer flere gange efter hinanden. Kommandoen SEARCH er f.eks. en løkke. Den er afhængig af, at der er poster i et kartotek, og den udføres, indtil der ikke er flere poster at søge i. De kommandoer, der befinder sig mellem SEARCH og END, gentages hver gang en ny post findes frem. Kommandoen WHILE er også en løkkekommando, der udfører indeholdte kommandoer et antal gange. WHILE WHILE er også en løkke, men i modsætning til SEARCH løkken gennemløber den ikke kartoteker. WHILE er afhængig en betingelse i form af et boolsk udtryk. Den udføres et vilkårligt antal gange afhængigt af, om denne betingelse er opfyldt. Syntaks WHILE <boolsk udtryk> [<Kommandoer>] END WHILE løkker anvendes typisk til at foretage en række kommandoer et bestemt antal gange. Hvor mange gange afhænger af om værdien i det boolske udtryk evaluerer til sand eller falsk. Så længe udtrykket er sandt udføres løkken, og de indbyggede kommandoer gentages. Eksempel INT &Nummer WHILE &Nummer < 12 #Add(&Nummer,1) PRINT Nummer:,&Nummer END PAUSE I ovenstående eksempel erklæres der en heltalsvariabel &Nummer. WHILE løkken er afhængig af det boolske udtryk &Nummer < 12. Løkken udføres og kommandoerne gentages, så længe variablen &Nummer er mindre end værdien 12. 66
I eksemplet består kommandoerne af en optælling af variablen &Nummer og en printsætning, der udskriver værdien. Det er vigtigt at programmøren selv sørger for at stoppe løkken, idet den ellers fortsætter i det uendelige. Idet variablen erklæres, får den automatisk værdien nul. Inde i løkken lægges der én til variablen ved hver gentagelse, og i det øjeblik variablen bliver 12, standses løkken, da betingelsen ikke længere er opfyldt. MthName() Eksemplet kunne ændres til noget mere fornuftigt, idet kørslen kunne sættes til at udskrive månedernes navne. Funktionen MthName() kan anvendes til dette. Den er nem at anvende, idet der som parameter i Parenteserne kun skal tilføjes en værdi i form af et heltal. Ved at indsætte variablen i Parenteserne, tilføjes funktionen nye værdier ved hver enkelt gentagelse af løkken. Eksempel på løkke med måneder INT &Nummer WHILE &Nummer < 12 #Add(&Nummer,1) PRINT MthName(&Nummer) END PAUSE Resultat Januar Februar Marts April Maj Juni Juli August September Oktober November December Afbrydelse af WHILE løkke vha. promptboks WHILE løkker kan også afbrydes ved at indsætte en promptboks, der spørger brugeren om en værdi, der indgår i betingelsen til løkken. Brugeren kan således selv bestemme, hvornår løkken skal afbrydes, idet der kan indtastes en værdi der får udtrykket til at evaluere til falsk, så løkken stopper. 67
Eksempel på WHILE løkke med prompt ENUM NejJa &Ok = 1 INT &Nummer WHILE &Ok == 1 PRINT &Nummer #Add(&Nummer,1) END PROMPT Skal der fortsat tælles op?,, Tæl op Nej/Ja : GET(&Ok) INPUT PAUSE Resultat Skal der fortsat tælles op? Tæl op Nej/Ja: Ja 1 2 3 4 5 WHILE løkker er således meget anvendelige til gentagelser af forskellige kommandoer. Det er bare vigtigt, at de opbygges på en sådan måde, at de afbrydes ved hjælp af kode eller ved hjælp af promptboks til brugeren, så brugeren selv kan bestemme. hvornår afbrydelsen skal finde sted. 68
Opgaver: Videregående løkkekommandoer Opgave 1: WHILE til kontrol af værdier i PROMPT Formål med opgaven At afprøve kommandoen WHILE sammen med en promptboks, så det styres at promptboksen ikke kan forlades, hvis de opstillede betingelser ikke er opfyldt. Beskrivelse I forrige opgave er der en promptboks til indtastning af nye satser i de enkelte varenumre. Opgaven skal ændres, så der ikke kan indtastes satser, der er mindre end eller lig med nul. Promptboksen må altså ikke forlades før, der indtastes korrekte værdier i begge felter. Satser for varenummer 10-GC-1 Udlejningssats...: Forsikringssats..: 0,0 0,0 VareNummer...: 10-GC-1 Udlejning...: 10,00 Forsikring...: 110,00 LøbeNummer...: 4 Sidst rettet.: 07/09-99 Indtastes der nul eller mindre, skal der vises en info- eller advarselsboks til hver af de to felter som vist herunder. Til feltet UdlejningsPct. UdlejningsPct SKAL være større end nul! OK Til feltet ForsikringsPct. ForsikringsPct SKAL være større end nul! OK Opgaven løses ved at indsætte promptboksen i en WHILE løkke, og med IF sætninger sikre at løkke ikke forlades hvis der tastes forkert i et af de to felter. Se forløbet på næste side. 69
Forløb 1 Opret en ny XAL kørsel. 2 Kopiér alle kodelinjer fra forrige opgave, og foretag nødvendige ændringer i standardkommentarerne. 3 Der skal indsættes en WHILE løkke, der omkranser promptboksen med satsfelterne. 4 Inde i WHILE løkken efter promptboksen skal der indsættes en IF sætning for hvert indtastningsfelt. I IF sætningen undersøges om værdien er mindre end eller lig med nul. Hvis den er det, må WHILE løkken ikke forlades, og der skal opstilles en info- eller advarselsboks med teksten UdlejningsPct SKAL være større end nul! for det ene felt, og teksten ForsikringsPct SKAL være større end nul! for det andet felt. 5 Godkend kørslen og afprøv den. Kontrollér at de nye faciliteter fungerer. 70
7. READ og WRITE Formål Formålet med denne lektion er at give deltagerne grundlæggende indsigt i anvendelsen af kommandoerne READ og WRITE, så de bliver i stand til at importere og exportere kommafiler og andre filer med faste formater. Efter denne lektion skal kursisterne kunne anvende kommandoerne: READ WRITE CLOSE Generelt Import og export af data til og fra C5 kan udføres ved hjælp af Datamanipulation, hvor brugeren i skærmbilleder udfylder forskellige felter om importen eller exporten. Det er ligeledes muligt at gemme opsætningen, så samme opsætning kan anvendes igen. Programmører eller brugere med adgang til programmeringssproget, har dog også mulighed for selv at oprette XAL kørsler til import og export af data. Dette udføres med kommandoerne READ og WRITE, hvor den grundlæggende anvendelse af de to kommandoer behandles i denne lektion. READ Kommandoen READ anvendes til læsning (import) af eksterne filer. READ er i virkeligheden en løkke, idet den gennemløber samtlige poster i den eksterne fil. Gennemløbet kan kun udføres sekventielt fra den ene ende til den anden, og der er ikke mulighed for at indsætte afgrænsninger. Syntaks READ <filnavn> AS<filtype> [INTO <skabelon>] [<kommandoblok>] END Filnavn Filnavn er fulde stinavn på den fil, der skal åbnes til læsning. Befinder filen sig der, hvor Microsoft Dynamics C5 er installeret, er det nok at angive filnavnet. (I forbindelse med SQL og ODBC udfyldes filnavn med et SQL statement). Filtype Filtype er formatet på den eksterne fil. 71
Skabelon Skabelon består af en række pladser adskilt af kommaer. Hver plads svarer til et af felterne i de poster, der læses i den fremmede fil. Overførsel fra fremmed fil til skabelon Fremmed fil Skabelon Felt 1 Plads 1 Felt 2 Plads 2 Felt 3 Plads 3 Osv. Osv. Variabler Pladserne i skabelonen kan f.eks. udfyldes med navne på variabler, der skal modtage de læste data. Eksempel 1 (Skabelon med variabler) STR 10 &KontoNummer STR 20 &Navn STR 10 &Telefon REAL &SaldoDkr READ Debitor AS COMMA INTO(&KontoNummer, &Navn, &Telefon, &SaldoDkr) PRINT &KontoNummer, &Navn, &Telefon, &SaldoDkr END PAUSE I eksemplet erklæres én variabel til hver af de fire felter i filen. Det forudsættes at posterne i filen består af de nævnte fire felter. Skabelonens pladser udfyldes med de fire variabler, som tildeles værdierne under kørslen. Kartoteksfelter Pladserne kan også udfyldes med kartoteksfelter. Kartoteket skal i så fald først introduceres, så felterne er til rådighed. Eksempel 2 (Skabelon med kartoteksfelter) INTRODUCE CustTable READ Debitor AS COMMA INTO(Account, Name, Phone, BalanceMST) PRINT Account, Name, Phone, BalanceMST END PAUSE I eksempel 2 er skabelonen udfyldt med kartoteksfelter, der modtager data under kørslen. 72
Tomme pladser Under indlæsning af en post læses alle felter på en gang og værdierne tildeles pladserne i skabelonen. Hvis et af de læste felter ikke skal anvendes, skal den pågældende plads mellem to kommaer være tom. Eksempel 3 (Skabelon med tom plads) INTRODUCE CustTable READ Debitor AS COMMA INTO(Account, Name,, BalanceMST) PRINT Account, Name, BalanceMST END PAUSE I eksempel 3 forudsættes det, at filen er den samme som i de to tidligere eksempler. Felt tre er således feltet Phone, der ikke skal anvendes. Da alle felter alligevel indlæses, lades plads tre tom i skabelonen. Samme datatyper i eksterne fil og skabelon Felterne i de eksterne filer beskrives ikke i C5. Derfor er det ikke muligt at kontrollere om felterne er af samme type som dataelementerne i skabelonen. Programmøren skal således selv sikre sig, at der er overensstemmelse mellem værdierne, der indlæses og elementerne i skabelonen. Udlægningen og typen af dataelementerne i skabelonen, skal derfor svare til udlægningen og typen af felterne i kartoteket. WRITE WRITE anvendes til at skrive data fra C5 til eksterne filer. WRITE er ikke en løkke, men en Kommando. Skal der udskrives poster fra et kartotek, er det derfor nødvendigt at WRITE indgår i en søgeløkke med SEARCH. Syntaks WRITE <filnavn> AS <filtype> FROM (<udtryk>) Filnavn Filnavn skal være udtrykt som det fulde stinavn. Findes filen det sted, hvor C5 er installeret, er det nok at skrive selve filnavnet. Filtype Filtype er en af de faste typer. Udtryk Udtryk er en liste over værdier, der skal skrives i den fremmede fil. 73
Værdierne kan opstilles i form af f.eks. kartoteksfelter, variabler og tekster i anførselstegn. De forskellige værdier adskilles med kommaer. Eksempel 1 (Udskrivning af kartoteksfelter) SEARCH CustTable USING AccountIdx WRITE Debitor AS COMMA FROM(Account, Name, Phone) END I eksemplet skrives felterne Account, Name og Phone til filen med navnet Debitor.com. Eksempel 2 (Udskrivning af tekst, felter og funktion) SEARCH CustTable USING AccountIdx WRITE A:\Debitor AS COMMA FROM( Konto:,Account, Name, Phone, Today()) END I eksemplet skrives de samme felter som i eksempel 1, men derudover skrives Teksten Konto: og dags dato i form af funktionen Today(). Desuden skrives filen til A drevet. Skrivning til eksisterende fil Der kan ikke tilføjes nye records direkte til eksisterende eksterne filer. Hvis nye records skal tilføjes en eksisterende fil, skal alle records i filen først læses ind i et tilsvarende C5 kartotek, hvorefter hele C5 kartoteket udskrives for at overskrive den originale eksterne fil. CLOSE Kommandoen CLOSE anvendes til at lukke filer, der er åbnet med READ eller WRITE. Syntaks CLOSE <filnavn> Bemærk! Commandoen CLOSE er case sensitive. Det vil sige, at filnavnet skal skrives nøjagtigt, som det staves med store og små bogstaver de rigtige steder. Anvendelse Normalt lukkes filer af sig selv, når de XAL kørsler afsluttes, som de åbnes og lukkes i. Der kan dog opstå situationer, hvor det er nødvendigt at filerne lukkes manuelt. En og samme fil kan således ikke både læses og skrives i samme XAL kørsel, uden at den først lukkes med CLOSE. Faste formater Efterfølgende skema viser de faste formater, der findes til XAL v. 2.70 og C5 v. 1.70. Det fremgår af skemaet om formatet kan anvendes i READ eller WRITE eller begge steder. 74
Formater til READ og WRITE Fast format Program der kan læse den READ WRITE LOTUS1 Lotus 123 regneark v 1 Ja Ja LOTUS2 Lotus 123 regneark v 2 Ja Ja QUATTRO Quattro regneark Ja Ja QUATTROPRO QuattroPro regneark Ja Ja SYMPHONY10 Symphony regneark v 1.0 Ja Ja SYMPHONY11 Symphony regneark v 1.1 Ja Ja COMMA Standard 8-bit komma fil formatet Ja Ja COMMA7 Standard 7-bit komma fil formatet. Ja Ja TEXT Mulighed for valg af egne skilletegn mellem records og felter. Ja Ja DDE DDE bruges til aktiv kommunikation mellem to windows programmer. Ja Ja ODBC ODBC kompatible databaser Ja Nej SQL SQL databaser (Kun muligt i Oracle versionen). Ja Nej Grunden til at der i ODBC og SQL formatet ikke kan anvendes WRITE er, at disse formater ikke er filer. 75
Opgaver: READ og WRITE Opgave 1: Skrivning til fremmed fil med WRITE Formål med opgaven At afprøve kommandoen WRITE til udskrivning af kartoteksposter til en fremmed fil. Desuden prøves at skrive tekst til den samme fremmede fil. Huskelister WRITE Beskrivelse Der skal oprettes en XAL kørsel, der ved hjælp af WRITE kan eksportere kartoteksposterne fra kartoteket UDLUdlånsSats. Der eksporteres kun værdier fra felterne VareNummer, UdlejningsPct og ForsikringsPct. I filen med de eksporterede poster skal der, øverst i filen lige før posterne, indsættes en linje med navnene på de tre felter og deres typer. Kørslen skal starte med en promptboks, der spørger om navnet på den fil, der skal skrives til. Forløb 1 Opret en ny XAL kørsel 2 Indsæt og tilret startkommentarer 3 Opret en tekstvariabel med en længde på 254 tegn, kald den &Filnavn. 4 Opret en promptboks til indtastning af filnavn, idet du anvender den oprettede variabel til indtastningsfeltet. Indtastningsfeltet må kun være 30 tegn langt. Boksen skal stå i kolonne 20 linje 5. 5 Opret en WRITE der anvender den oprettede variabel til filnavn. WRITE kommandoen skal udskrive følgende tekst til filen: Felter og typer i rækkefølge VareNummer STR 10, UdlejningsPct REAL, ForsikringsPct REAL Dette medfører, at den første linje i filen indeholder ovenstående tekster, som forklaring til de felter, der udskrives i filen. 6 Opret en WRITE mere, der også anvender den oprettede variabel til filnavn. Kun værdier fra felterne VareNummer, UdlejningsPct og ForsikringsPct skal eksporteres. 7 Godkend kørslen og afprøv den Kontrollér at de nye faciliteter fungerer. 76
Opgave 2: Sletning af poster med DELETE Formål med opgaven At afprøve kommandoen DELETE fra lektionen INTRODUCE og transaktionskommandoer. DELETE er en transaktionskommando, der sletter poster i et kartotek. Huskelister DELETE Beskrivelse I forrige opgave eksporterede du med WRITE alle posterne i kartoteket UDLUdlånsSats. I denne opgave skal du opbygge en XAL kørsel, der med kommandoen DELETE, kan slette alle posterne i kartoteket. Forløb 1 Opret en ny XAL kørsel. 2 Indsæt og tilret startkommentarer. 3 Opret en søgeløkke på UDLUdlånsSats og anvend kommandoen DELETE til sletning af posterne. 4 Kontrollér, i et listbillede til UDLUdlånsSats, at kartoteket er helt tomt. 5 Godkend kørslen og afprøv den. Kontrollér at de nye faciliteter fungerer. 77
Opgave 3: Læsning fra fremmed fil med READ Formål med opgaven At afprøve kommandoen READ til læsning af kartoteksposter fra en fremmed fil. Huskelister READ Beskrivelse Den fil der blev dannet i den første opgave med alle posterne fra kartoteket UDLUdlånsSats, skal importeres igen med READ kommandoen. Der skal oprettes en promptboks, hvori der spørges om navnet på den fil, der skal importeres. Indtast filnavn : Import af udlånssatser READ kommandoen skal læse posterne ind i nogle variabler, hvorefter UDLUdlånsSats introduceres, og variablernes indhold tildeles til de tilsvarende felter i den åbnede post. I et lille vindue skal det vises hvilket varenummer, der læses aktuelt. Indlæsning af udlånssatser! Indlæser nu varenummer: 10-RM-1 Når kørslen er slut skrives ordet Slut! i vinduet. Indlæsning af udlånssatser! Indlæser nu varenummer: 10-RM-2 SLUT! Se forløbet på næste side. 78
Forløb 1 Opret en ny XAL kørsel. 2 Indsæt og tilret startkommentarer. 3 Opret en tekstvariabel med en længde på 254 tegn, kald den &Filnavn. Opret desuden variabler til felterne VareNummer, UdlejningsPct og ForsikringsPct. Variablerne må gerne have samme navn som felterne, der skal blot være & tegn foran. 4 Opret en promptboks til indtastning af filnavn, idet du anvender den oprettede variabel til indtastningsfelt. Indtastningsfeltet må kun være 30 tegn langt. Boksen skal stå i kolonne 20 linje 5. 5 Opret en READ løkke der anvender den oprettede variabel til filnavn. Læs posterne ind de tre variabler, der tilsvarer felterne i kartoteket. Introducér kartoteket UDLUdlånsSats med direkte opslag og anvend variablen med varenummeret i opslaget. Tildel variabelværdierne til de tilsvarende kartoteksfelter. Opret et vindue på 40 kolonner og 4 linjer. Vinduet skal stå i kolonne 10 linje 10. 6 Godkend kørslen og afprøv den. Kontrollér at de nye faciliteter fungerer. 79
8. Funktioner videregående Formål Formålet med denne lektion er at give deltagerne indsigt i anvendelsen af videregående funktioner i form af funktionen Box() og forskellige konverteringsfunktioner. Efter denne lektion skal kursisterne kunne anvende funktionerne: Box() Int2Str() Num2Str() Date2Str() Enum2Str() Generelt Generel opbygning, generel virkemåde og generel syntaks for funktioner er gennemgået på tidligere kurser. På kurserne er desuden behandlet funktioner til visning af dags dato, klokkeslæt, brugernummer og brugernavn. Desuden er funktionen Box behandlet på et grundlæggende niveau. Denne lektion behandler funktionen Box på et videregående niveau, efterfulgt af funktioner til konvertering af data til tekst. Funktionen Box() Generel beskrivelse Funktionen BOX() danner en dialogboks, der er en ramme med en tekst. Når boksen vises på skærmen, gives brugeren mulighed for at give respons på teksten. Brugerens svarmuligheder afhænger dog af boksens type, idet der ikke kan svares med fritekst. Derimod kan der vælges mellem faste tekster i form af trykknapper eller linjer i en tabel. Eksempler på de forskellige bokstyper vises på efterfølgende sider. Bokstyper Nummer Type Beskrivelse 1 Infobox Grå boks med tekst. Én knap med teksten OK. 2 Advarselsbox Rød boks med tekst. Én knap med teksten OK. 3 Ja/Nej box Grå boks med tekst. To knapper med teksterne Ja og Nej. 4 Picklistebox Blå boks i form af en liste over værdier. Ingen knapper, men valg mellem de viste værdier. Syntaks Box(Type:INT, Tekst:STR, Std:INT): INT Funktionen Box() anvender tre parametre i form af type, tekst og standardværdi. 80
Parametre Parametre Type Tekst Std Betydning 1 = Infoboks, 2 = Advarselsboks, 3 = Ja/Nej boks, 4 = Picklisteboks. Tekst anføres i citationstegn. Linjeskift udføres med \n, og indsættes som en del af teksten. I type 4 Picklisteboksen adskilles de forskellige tekster også af \n, idet teksterne netop skal stå under hinanden som en liste. I type 1, 2 og 3 er det nummer på den knap, cursoren stiller sig i som default. I type 4 er det nummeret på den linje, cursoren skal stå i. Returværdi Returværdien er et heltal i form af positionen på den knap eller linje, der vælges af brugeren. Ekstra knapper Til Info- Advarsels- og Ja/Nej boksene kan der tilføjes yderligere trykknapper, så brugerne får flere muligheder for tilbagemelding på teksten i boksen. Ekstra knapper dannes ved at placere firkantede parenteser [[ og ]] rundt om de dele af teksten, der skal være knapper. I type 1 infoboksen og type 2 advarselsboksen erstattes OK knappen automatisk af de knapper, der dannes med de firkantede parenteser. I type 3 Ja/Nej boksen bibeholdes knapperne Ja og Nej altid nederst i boksen på en linje for sig, I type 4 Pickliste boksen er det ikke muligt at anvende knapper. Hvis der defineres knapper med firkantede Parenteser og boksen udføres, dannes der ingen knapper. Derimod vises de firkantede Parenteser som en del af teksten. Andre typer Det er muligt at angive andre numre på typer end de fire angivne. Type 5 og 6 svarer til type 1 og opfører sig på samme måde. Type 7 og højere numre kan indsættes, men har ingen praktisk værdi, idet boksen ikke vises. Returværdien er defaultværdien fra parameter 3. Box(1) Infoboks Eksempel 1 (Infoboks med én linje) I dette eksempel dannes der en infoboks. Det tænkes, at der er flere linjer efter SET kommandoen, og at disse linjer udføres, når der tastes ENTER. Kørsel SET BOX(1, Tast ENTER for at starte kørslen,1) 81
Resultat Tast ENTER for at starte kørslen OK Eksempel 2 (Infoboks med flere linjer) I dette eksempel dannes der en infoboks med flere linjer. Linjeskift indsættes med tekstkommandoen \n. Det tænkes, at der er flere linjer efter SET kommandoen, og at disse linjer udføres, når der tastes ENTER. Kørsel SET Box(1, Beregning af kostpriser\ntast ENTER for start,1) Resultat Beregning af kostpriser Tast ENTER for start Box(2) Advarselsboks Eksempel 1 (Advarselsboks med én linje) I dette eksempel dannes der en advarselsboks. Eksemplet tænkes anvendt som en advarsel om, at kørslen ikke er længere. Kørsel OK SET Box(2, Kørslen stoppes nu!,1) 7 Resultat Kørslen stoppes nu! OK Box(3) Ja/Nej boks Ja/Nej bokse anvendes til at stille brugeren spørgsmål, der kan besvares med Ja eller Nej. Som vist i eksemplerne herunder er der forskellige muligheder for at få fat i brugerens svar. Navnet Ja/Nej boks Navnet Ja/Nej boks må ikke forveksles med fastteksttypen Nej/Ja. 82
Det er opstået pga. Microsoft s navne konvention, der altid tildeler værdien 0 til Nej eller Falsk og alle andre værdier til Ja eller Sand. I fastteksttyper er den første værdi altid 0. Derfor er den første værdi i fastteksttypen Nej/Ja teksten Nej, der svarer til 0, og Ja er 1. I funktioner som f.eks. Box(3) er den første værdi altid 1. Derfor er den første værdi i Ja/Nej boksen teksten Ja, der svarer til 1, og Nej er 2. Eksempel 1 (Ja/Nej boks, returværdi tildeles variabel) I dette eksempel tildeles brugerens svar til en variabel, der efterfølgende kontrolleres og anvendes i en IF struktur, hvor der tages stilling til, hvad der skal ske. Kørsel INT &Svar SET &Svar = Box(3, Skal harddisken slettes for data?,2) IF &Svar == 1 THEN {1=Ja} PRINT Det var dumt, hva? PRINT Tænk dig om næste gang! ENDIF PAUSE Resultat Skal harddisken slettes for data? Ja Nej Resultat hvis der svares Ja Det var dumt, hva? Tænk dig om næste gang! Eksempel 2 (Ja/Nej boks direkte i IF struktur) I dette eksempel indsættes boksen direkte i IF strukturen, i stedet for at svaret tildeles en variabel. Kørsel IF Box(3, Skal harddisken slettes for data?,2) == 1 THEN PRINT Det var dumt, hva? PRINT Tænk dig om næste gang! ENDIF PAUSE Eksempel 3 (Ja/Nej boks til standsning af kørsel) I dette eksempel anvendes en Ja/Nej boks til, at spørge brugeren om kørslen fortsat skal udføres. Svares der Nej i eksemplet, sættes værdien i boksen til 2 og kørslen afbrydes med RETURN. 83
Kørsel IF Box(3, Fortsæt udførelse?,2) == 2 {Nej} THEN RETURN ENDIF Resultat Fortsæt udførelse? Ja Nej Box(4) Pickliste boks Pickliste boksen danner en liste over de tekster, der i tekstparameteren adskilles med \n. Der kan ikke indsættes knapper i denne type boks. Picklister ligner til forveksling de lister, der vises fra fasttekster, når der tastes ALT+H i en promptboks eller i en form. Til forskel fra fast-tekster starter den første tekst i en pickliste altid med værdien 1. Desuden kan teksten heller ikke udskrives automatisk i PRINT sætninger. Eksempel 1 (Pickliste boks med 5 linjer) I eksemplet opstilles der en picklisteboks med 5 linjer og cursoren stilles default på linje 2. Kørsel INT &Frugt SET &Frugt = BOX(4, Æbler\nPærer\nBananer\nGrape\nKiwi,2) PRINT &Frugt Resultat Æbler Pærer Bananer Grape Kiwi Box(1-3) Bokse med ekstra knapper Info- Advarsels- og Ja/Nej bokse kan tilføjes flere knapper. Når der indsættes knapper i type 1 og 2 fjernes OK knappen automatisk og i type 3 forbliver JA og NEJ knapperne på den nederste linje. Eksempel 1 (Infoboks med flere knapper) I dette eksempel indsættes knapperne som stående alene i teksten. Funktionen returnerer værdien 1, 2 eller 3 afhængigt af hvilken knap, der vælges. Cursoren stilles default på knap 2, der er B. 84
Kørsel INT &Knap SET &Knap = BOX(1, Vælg mellem [[ A ]] [[ B ]] og [[ C ]],2) PRINT &Knap Resultat Vælg mellem A B og C B Eksempel 2 (Knapper som del af ord) I dette eksempel indsættes knapperne som første bogstav i ordene. På denne måde ser det for brugeren ud som om, der vælges mellem de forskellige frugter. Bemærk i kørslen at linjen med boxen er delt i to. Det er kun muligt ved at dele teksten i to og sammenlægge de to tekster med + tegnet. I resultatet ses knapperne med en lysere farve, og cursoren er placeret på knap nummer to Pærer. Kørsel INT &Frugt SET &Frugt=BOX(1, [[Æ]]bler [[P]]ærer [[B]]ananer + [[G]]rape [[K]]iwi,2) PRINT &Frugt Resultat Æbler Pærer Bananer Grape Kiwi På skærmen udskrives kun nummeret på knappen, og ikke teksten. Hvis teksten skal udskrives, skal der indsættes en IF struktur, der undersøger hvilken knap, der er valgt, og derefter udskriver en tilsvarende tekst. Konverteringsfunktioner Int2Str() Beskrivelse Funktionen Int2Str() konverterer et heltal til en tekst. Dette kan være nødvendigt, når et heltal f.eks. skal udskrives som en del af teksten i en boks. Syntaks Int2Str(i:Int):Str Parametre Parameteren i er et heltal, der skal konverteres til en tekst. Der er ingen parametre til styring af længden på den konverterede tekst. 85
Returværdi Returværdien er tallet konverteret til en tekst på samme længde som antallet af tegn i tallet. Eksempel INT &Antal = 25000 SET BOX(1, Der blev behandlet +Int2Str(&Antal)+ poster! Resultat Der blev behandlet 25000 poster! OK Variablen i eksemplet kan kun udskrives som en del af teksten, fordi den konverteres til en tekst. Hvis den ikke konverteres, vises en fejlmeddelelse i bunden af skærmen (se næste side). Eksempel på fejlmeddelelse INT &Antal = 25000 SET BOX(1, Der blev behandlet +&Antal+ poster! Fejl: 1, Operandernes typer er ikke kompatible med operatoren I eksemplet er funktionen Int2Str() fjernet fra variablen Operanderne er variablen og teksterne. Meddelelsen betyder således at disse ikke er af samme type og derfor ikke kan sammenlægges vha. operatoren, der er tegnet +. Num2Str Beskrivelse Funktionen Num2Str() konverterer et kommatal til en tekst, men kan også konvertere heltal. Tal konverteres f.eks. for at kunne sammenlægges med tekster, der udskrives i funktionen Box(). Det kan også være for at få tal til at være lige lange ved udskrivning i søgeløkker, så værdierne kan komme til at stå i kolonner under hinanden. De konverterede tal højrestilles automatisk. Syntaks Num2Str(x:REAL,i:INT,d:INT,k:INT,t:INT):Str 86
Parametre Værdi Indhold Bemærkning x i Tal der skal konverteres Længden på den resulterende tekst (returværdien) Angives 1 i længden bliver teksten samme længde som antallet af tegn i tallet. d Antal decimaler Sættes antal til 0 eller mindre f.eks. 1 afrundes tallet og udskrives uden decimaler. k t Decimal seperatoren 1=komma 2=punktum Tusind seperatoren 0=ingen 1=komma 2=punktum 3=space (ét blankt tegn) Indsættes andre værdier end de angivne f.eks. 1, anvendes værdien fra feltet Seperatorer i Brugeropsætning. Indsættes andre værdier end de angivne f.eks. 1, anvendes værdien fra feltet Seperatorer i Brugeropsætning. Returværdi Returværdien er tallet konverteret til en tekst med længde, decimaler og seperatorer som angivet. Eksempel REAL &Sum SEARCH VendTable WHERE BalanceMST <> 0 PRINT Num2Str(BalanceMST,15,2,1,2) #Add(&Sum,BalanceMST) END SET BOX(1, Samlet gæld +Num2Str(&Sum,-1,2,1,2)+ Kr,1) Resultat -93.531,38-576,00-47,00-2.475,00-1.905,00-125,000.00-300,014.50 Samlet gæld 523.548,88 kr OK 87
I ovenstående eksempel anvendes Num2Str() på to forskellige måder. I søgeløkken sørger Num2Str() for, at tallene fylder lige meget og højrestilles. I infoboksen anvendes Num2Str sammen med variablen &Sum, så værdien kan udskrives som en del af teksten. Længden er sat til 1, hvilket medfører, at tallet virker som en integreret del af teksten, når den udskrives. Hvis der var angivet en fast længde på f.eks. 15, ville det resultere i blanke tegn foran tallet. Hvis et kommatal eller et heltal skal udskrives sammen med en tekst, og konverteringen glemmes vises følgende fejlmeddelelse i bunden af skærmen. Eksempel på fejlmeddelelse REAL &Sum SEARCH VendTable WHERE BalanceMST <> 0 PRINT Num2Str(BalanceMST,15,2,1,2) #Add(&Sum,BalanceMST) END SET BOX(1, Samlet gæld +&Sum+ Kr,1) Fejl: 1, Operandernes typer er ikke kompatible med operatoren I eksemplet mangler Num2Str i forbindelse med &Sum i Box funktionen. Date2Str() Beskrivelse Funktionen Date2Str konverterer en dato til en tekst. Dette kan være nødvendigt, når datoer skal udskrives som en del af en tekst f.eks. i funktionen Box(). Det kan bestemmes, hvordan datoen skal se ud efter konverteringen. (Se parametre) Syntaks Date2Str(d:DATE,p1:INT,p2:INT,p3:INT,p4:INT,p5:INT,p6:INT):STR I syntaksen kræver funktionen 7 parametre, som beskrevet herunder. Hvis der angives ugyldige parametre til formatteringen, indsættes der automatisk gyldige værdier af programmet. 88
Parametre Parameter d p1 p2 p3 p4 p5 p6 Indhold Dato der skal konverteres Rækkefølge for dag, måned og år. 123 = dag, måned, år 321 = år, måned, dag 312 = år, dag, måned Format på dag 1 = dag vises med 1 eller 2 tal 2 = dag vises altid med 2 tal Angiver det første skilletegn 1 = ét blankt tegn, 2 = punktum, 3 = bindestreg, 4 = skråstreg Format for måned 1 = måned vises med 1 eller 2 tal 2 = måned vises altid med 2 tal 3 = måned vises forkortet som 3 bogstaver 4 = måned vises med hele navnet Angiver det andet skilletegn 1 = ét blankt tegn, 2 = punktum, 3 = bindestreg, 4 = skråstreg Formatet på år 2 = år vises med 2 tal 4 = år vises med 4 tal Returværdi Returværdien er datoen konverteret til en tekst med dag, måned og år arrangeret som bestemt i parametrene. Efterfølgende vises 4 eksempler uden nærmere forklaring, idet parametrene fremgår af ovenstående tabel. Eksempel 1 PRINT Date2Str(15\03\2000,123,2,2,2,2,4) PAUSE Resultat 15.03.2000 Eksempel 2 PRINT Date2Str(15\03\2000,321,2,2,2,2,4) PAUSE 89
Resultat 2000.03.15 Eksempel 3 PRINT Date2Str(15\03\2000,123,2,1,3,1,2) PAUSE Resultat 15 Mar 00 Eksempel 4 SET BOX(1, Kurset starter + Date2Str(15\03\2000,123,2,1,4,1,4),1) PAUSE Resultat Kurset starter 15 Marts 2000 OK Enum2Str() Beskrivelse Enum2Str() konverterer nummeret på en fasttekst til dens tekst. Funktionen fungerer kun på variabler af typen fasttekst, hvorfor disse først skal erklæres. Syntaks Enum2Str(e:ENUM):Str Parametre Parameter e Indhold Variabel til den fasttekst, der skal konverteres. Bemærk at der kun er én parameter i form af en variabel. Variablen SKAL være af typen fasttekst, så systemet automatisk kan vide hvilken fastteksttype, den tilhører. (Bestemmes under erklæringen.) Returværdi Fastteksten til den værdi der står i variablen, idet teksten hentes fra den tilhørende fastteksttype. 90
Eksempel 1 ENUM Sprog &Sprogkode = 3 PRINT &Sprogkode PRINT Enum2Str(&Sprogkode) PAUSE Resultat Tysk Tysk I eksemplet erklæres en variabel &Sprogkode. Den anvender fastteksttypen Sprog med teksterne 0 = Standard, 1 = Dansk, 2 = Engelsk og 3 = Tysk. Under erklæringen tildeles variablen værdien 3. Bemærk at der er to printsætninger. Den første udskriver variablen som den er, og den anden udskriver variablen med konvertering ved hjælp af Enum2Str. I begge tilfælde udskrives teksten Tysk. Der er således ingen forskel på de to printsætninger og det kan derfor virke overflødigt at anvende Num2Str. Konvertering med Num2Str har sin berettigelse, når en fasttekst skal udskrives i forbindelse med anden tekst f.eks. i en Box(). Dette fremgår i næste eksempel. Eksempel 2 ENUM Sprog &Sprogkode = 3 SET Box(1, I Tyskland tales der +Enum2Str(&Sprogkode)+!,1) Resultat I Tyskland tales der Tysk! OK Fejl Hvis en fasttekst skal udskrives sammen med en tekst i f.eks. en Box() og konverteringen glemmes, vises følgende fejlmeddelelse i bunden af skærmen. Eksempel på fejlmeddelelse ENUM Sprog &Sprogkode = 3 SET Box(1, I Tyskland tales der +&Sprogkode+!,1) Fejl: 1, Operandernes typer er ikke kompatible med operatoren I eksemplet mangler Enum2Str i forbindelse med &Sprogkode i Box funktionen. 91
Opgaver: Funktioner, videregående Opgave 1: Liste over udlejningssatser Formål med opgaven At oprette en XAL kørsel med felter konverteret ved hjælp funktionerne NUM2STR() og DATE2STR(). Beskrivelse Du skal oprette en XAL kørsel, der gennemløber UDLUdlånsSats. Kørslen skal udskrive felterne ItemNumber, ItemName (fra lagerkartoteket), CostPrice (fra lagerkartoteket), UdlejningsPct og SidstRettet. Forløb 1 Opret en ny XAL kørsel med startkommentarer. 2 Indsæt en søgning på kartoteket UDLUdlånsSats sorteret i vareorden. I stedet for at hentet felter fra lagerkartoteket med direkte opslag, skal du introducere InvenTable med INTRODUCE. 3 Udskriv følgende felter: ItemNumber ItemName1 fra InvenTable CostPrice fra InvenTable (Lgd=10, 2 decimaler) UdlejningsPct, (Lgd=6, 1 decimal) LastChanged (DMÅ, dag, måned og år med 2 cifre, skilletegn med punktum. 4 Afprøv kørslen. Pga. tekstfelterne ItemNumber og ItemName kommer felterne ikke til at stå under hinanden i søjler. 92
9. Macroer Formål Formålet med denne lektion er give deltagerne en generel indsigt i opbygning og anvendelse af macroer. Der gives specifikke eksempler på macroer. Efter denne lektion skal kursisterne kunne forstå den generelle opbygning af macroer, og anvende følgende specifikke macroer: #Num2Str #StrLFix #StrRFix #Date2Str #Time2Str Generelt Macroer anvendes i vid udstrækning i XAL sproget. De kan til dels sammenlignes med kommandoer og funktioner, idet de udfører bestemte ting, når de aktiveres i en XAL kørsel. Hvor der ikke findes en kommando eller funktion i kernen, er der i mange tilfælde oprettet macroer til erstatning for disse. Andre macroer er oprettet for at gøre det nemmere at anvende nogle af de eksisterende funktioner, idet de indeholder standardværdier som parametre, så disse ikke behøver at udfyldes. Kendetegn Macroer kendetegnes ved at de starter med et # foran navnet, de steder hvor de bruges i applikationselementerne f.eks. XAL kørsler eller forms. Under selve oprettelsen af macroer anvendes # ikke. Generel opbygning Macroer opbygges i udviklingsmenuen i søjlen MAC eller direkte i de elementer, hvori de anvendes. De opbygges som almindelige XAL kørsler med kommandoer, funktioner osv. Macroer er stykker af XAL kode. De kan bare ikke afvikles alene. De kan kun afvikles som dele af rigtige XAL kørsler, forms osv. Problemer ved fejl Da macroer ikke kan afvikles, kan de heller ikke oversættes selvstændigt. Eventuelle fejl findes således først under oversættelsen af det element, de kaldes fra. Det er derfor en god ide, at udføre macroerne som XAL kørsler, inden de omdannes til macroer. Opbygning Macroer opbygges med eller uden parametre. Macroer uden parametre udfører blot den kode, der står i dem. Macroer med parametre tilføres data fra den kørsel, de anvendes i. 93
Macro uden parametre PRINT Bil til salg! Denne macro modtager ingen parametre, og udskriver blot den indeholdte tekst. Macro med parametre PRINT Mærke:, %1, Pris:, %2 Denne macro indeholder forskellige parametre angivet som %1, %2. Tallene med % tegnene fungerer som variabler i macroen. De anvendes til at modtage værdier, der overføres fra den kørsel, der kalder macroen. Overførsel af data til macro Macrokald (p1, p2) Macro med %1 %2 Parametrene overføres fra macrokald til macro som 1 til 1, dvs. første parameter til %1, anden parameter til %2 osv. Inkludering i kørsler Macroer er ikke funktioner med selvstændig hukommelse. Deres indhold indsættes i koden det sted, hvor de kaldes. Den aktuelle kørsel, form osv. ekspanderes således med koden fra macroerne. Dette medfører, at macroers kode tælles med i programmets totale størrelse, der ikke må overstige 64 kb. Indsættelsen i kørslen foretages i det øjeblik, den godkendes og XAL kernen oversætter koden. Kørsel med kald af global macro Kald af global macro Global macro Kopi af kode i global macro Kode indsættes i kørsel under oversættelse (ikke synligt for programmør) 94
Kørsel med lokal macro Lokal macro Kald af lokal macro Kode indsættes i kørsel under oversættelse (ikke synligt for programmør) Kopi af kode i lokal macro Anvendelse af macro fra macro bibliotek Macroload BIBLIOTEK Kald af macro fra macro BIBLIOTEK Åbning for adgang til bibliotek Macro BIBLIOTEK Kopi af macro fra macro BIBLIOTEK Kode indsættes i kørsel under oversættelse (ikke synligt for programmør) I alle tre tilfælde ekspanderes elementerne med koden i macroerne. Macro typer Der findes tre forskellige typer af macroer: Typer Forklaring Scope Globale macroer Lokale macroer Macrobiblioteker Opbygges direkte i udviklingsmenuen. Navnet skrives med små bogstaver. Opbygges i det element hvori de anvendes f.eks. en XAL kørsel eller form. Kan også samles i macrobiblioteker. Opbygges i udviklingsmenuen og indeholder samlinger af lokale macroer. Navnet på biblioteket skrives med STORE bogstaver. Kan bruges overalt direkte. Kan KUN ANVENDES i det element, macroerne opbygges i. Kan anvendes overalt, hvis deres bibliotek først macroloades. 95
Eksempler på globale macroer Bibliotek Indhold Add Sub Firma Macroload Svarer til SET A = A + B Svarer til SET A = A B Returnerer firmanavnet Giver adgang til macroer i givet macrobibliotek Bemærk at navne på globale macroer skrives med små bogstaver. Eksempler på biblioteker Bibliotek Indhold FORMS REPORTS QUERY FUNKTIONER Macroer til brug i forms Macroer til brug i rapporter Macroer til brug i forespørgsler (QT er) Macroer til behandling af tekststrenge, datoer o.a. Bemærk at navne på macrobiblioteker skrives med store bogstaver. Efterfølgende gives eksempler på de forskellige typer af macroer. Globale macroer Globale macroer opbygges direkte i søjlen MAC i udviklingsmenuen. De kendetegnes ved at deres navne skrives med små bogstaver. De kan uden videre kaldes fra alle elementer. Deraf navnet global. Global macro uden parametre PRINT Bil til salg! Denne macro modtager ingen parametre, og udskriver blot den indeholdte tekst. Global macro BilSalg med parametre PRINT Mærke:, %1, Pris:, %2 Denne macro indeholder forskellige parametre angivet som %1, %2. Tallene med % tegnene fungerer som variabler i macroen. De anvendes til at modtage værdier, der overføres fra den kørsel, der kalder macroen. Eksempel med anvendelse af global macro med parametre PRINT Biler til salg! PRINT --------------------------------- #BilSalg( Toyota Carina,250000) #Bilsalg( Toyota Previa,260000) PAUSE 96
Resultat Biler til salg! --------------------------------- Mærke: Toyota Carina Pris: 250000 Mærke: Toyota Previa Pris: 260000 Lokale macroer Lokale macroer opbygges direkte i den kørsel, form osv., hvori de anvendes. Deraf udtrykket lokal. Koden i macroen opbygges på samme måde som i globale macroer. Til forskel fra globale macroer, skal de dog startes med macrodirektivet #LOCALMACRO.Navn og sluttes med #ENDMACRO. Opbygning af lokal macro med navnet BilSalg #LOCALMACRO.BilSalg PRINT Mærke...:, %1, Pris:, %2 #ENDMACRO Denne macro indeholder forskellige parametre angivet som %1, %2. %1 = bilmærke og %2 = pris. Eksempel med anvendelse af lokal macro med parametre #LOCALMACRO.BilSalg PRINT Mærke:, %1, Pris:, %2 #ENDMACRO PRINT Biler til salg! PRINT --------------------------------- #BilSalg( Toyota Carina,250000) #Bilsalg( Toyota Previa,260000) PAUSE Resultat Biler til salg! --------------------------------- Mærke: Toyota Carina Pris: 250000 Mærke: Toyota Previa Pris: 260000 Macro biblioteker Macro biblioteker er blot samlinger af lokale macroer, der som regel har noget til fælles. De oprettes i udviklingsmenuen i søjlen MAC. Bibliotekerne kendetegnes ved, at deres navne er skrevet med store bogstaver, som vist i skemaet herunder. 97
Macro bibliotek BILER med to lokale macroer #LOCALMACRO.Overskrift PRINT Biler til salg! PRINT --------------------------------- #ENDMACRO #LOCALMACRO.BilSalg PRINT Mærke:,%1, Pris:,%2 #ENDMACRO Macroer i macrobiblioteker kan kun anvendes ved først at loade biblioteket ind i den aktuelle kørsel, form osv. Dette udføres med macroen #MacroLoad() Eksempel med anvendelse af macro fra macrobibliotek #MacroLoad(BILER) #Overskrift #BilSalg( Toyota Carina,250000) #Bilsalg( Toyota Previa,260000) PAUSE Resultat Biler til salg! --------------------------------- Mærke: Toyota Carina Pris: 250000 Mærke: Toyota Previa Pris: 260000 Specifikke macroer Efterfølgende specifikke macroer befinder sig alle i biblioteket FUNKTIONER. #Num2Str Beskrivelse Macroen er en omskrivning af funktionen Num2Str. Hvor funktionen skal have alle parametre udfyldt, er macroen skrevet på en sådan måde, at det er frivilligt hvor mange parametre, der udfyldes. Udfyldes en parameter ikke, er der i macroen indsat default parametre, der anvendes i stedet. Som minimum udfyldes tallet, der skal konverteres. 98
#Num2Str (indhold) Num2Str(%1, #IFNOT.EMPTY(%2) #IF.EMPTY(%2) #IFNOT.EMPTY(%3) #IF.EMPTY(%3) #IFNOT.EMPTY(%4) #IF.EMPTY(%4) #IFNOT.EMPTY(%5) #IF.EMPTY(%5) %2 #ENDIF 0 #ENDIF, %3 #ENDIF 0 #ENDIF, %4 #ENDIF 1 #ENDIF, %5 #ENDIF 2 #ENDIF) For hver parameter er der indsat to IF sætninger i form af macroer. #IFNOT.EMPTY Træder i kraft, hvis den givne parameter IKKE ER TOM. Derved er parameterens egen værdi gældende. #IF.EMPTY Træder i kraft, hvis den givne parameter ER TOM. Derved udfyldes parameteren med den værdi, der står i #IF.EMPTY macroen. Syntaks med parametre #Num2Str(x:REAL,i:INT,d:INT,k:INT,t:INT):Str Syntaksen er beskrevet på samme måde som i funktionen Num2Str. Da macroen ofte anvendes uden parametre, vises syntaksen også for dette. Syntaks uden parametre #Num2Str(x:REAL):Str Parametre Værdi Indhold Bemærkning x i Tal der skal konverteres Længden på den resulterende tekst (returværdien) Angives 0 eller mindre f.eks. 1 i længden bliver teksten samme længde som antallet af tegn i tallet. d Antal decimaler Sættes antal til 0 eller mindre f.eks. 1 afrundes tallet og udskrives uden decimaler. k t Decimal seperatoren 1=komma 2=punktum Tusind seperatoren 0=ingen 1=komma 2=punktum 3=space (ét blankt tegn) Indsættes andre værdier end de angivne f.eks. 1, anvendes værdien fra feltet Seperatorer i Brugeropsætning. Indsættes andre værdier end de angivne f.eks. 1, anvendes værdien fra feltet Seperatorer i Brugeropsætning. 99
Returværdi Returværdien er tallet konverteret til en tekst med længde, decimaler og seperatorer som angivet. Angives der ingen parametre, er defaultværdierne ifølge Indhold herover følgende. Defaultværdier Parameter Default værdi Betydning Længde 0 Længde = antal tegn i tallet Antal decimaler 0 Ingen decimaler Decimal seperator 1 Komma Tusind seperator 2 Punktum Eksempel uden parametre #MacroLoad(FUNKTIONER) PRINT #Num2Str(12345.678) PAUSE Resultat 12.346 #StrLFix Beskrivelse Macroen #StrLFix venstrestiller en tekst til en given længde. Navnet er en forkortelse af ordene Streng Left Fix. Macroen anvendes f.eks. i søgeløkker, hvor der udskrives tekstfelter, idet felterne udskrives venstrestillede og lige lange. Macroen tilhører biblioteket FUNKTIONER, hvorfor dette skal loades først. #StrLFix (indhold) (SubStr(%1,1,%2)+StrRep(&Parm,,%2-StrLen(%1))) Macroen tager med SubStr en delstreng af %1. Længden angives med %2. Er længden større end delstrengen, anvendes StrRep til at udfylde den resterende plads med blanke tegn. På denne måde fylder teksten altid den givne længde. Syntaks #StrLFix(Tekst, Længde) 100
Parametre Macroen anvender to parametre. Den første er teksten, der skal konverteres, og den anden er længden på den tekst, der returneres. Returværdi Returværdien er teksten i %1 konverteret til længden i %2. Teksten venstrestilles. Eksempel #MacroLoad(FUNCTIONS) SEARCH CustTable PRINT #StrLFix(Name, 30), #StrLFix(Attention, 20) END PAUSE Resultat Microsoft A/S Super Korn A/S Auto A/S Computer A/S P. Damgaard Hans c. Haugaard Birger Andersen Per Hildebrandt Ved hjælp af #StrLFix opstilles felterne i to kolonner, der er venstrestillede. #StrRFix Beskrivelse Macroen #StrRFix højrestiller en given tekst til en given længde. Navnet er en forkortelse af ordene Streng Right Fix. Macroen anvendes f.eks. i søgeløkker, hvor der udskrives tekstfelter, idet felterne udskrives højrestillede og lige lange. Macroen tilhører biblioteket FUNKTIONER, hvorfor dette skal loades først. #StrRFix (indhold) (StrRep(&Parm,,%2-StrLen(%1))+ SubStr(%1,1,%2)) Macroen udskriver med StrRep et antal blanke tegn. Antallet af tegn er den angivne længde minus længden på teksten. Herefter tager macroen med SubStr en delstreng af %1. Længden af delstrengen angives med %2. Syntaks #StrRFix(Tekst, Længde) Parametre Macroen anvender to parametre. Den første er teksten, der skal konverteres, og den anden er længden på den tekst, der returneres. 101
Returværdi Returværdien er teksten i %1 konverteret til længden i %2. Teksten højrestilles. Eksempel #MacroLoad(FUNCTIONS) SEARCH CustTable PRINT #StrRFix(Account,10),, Name END PAUSE Resultat 45999000 Microsoft A/S 42983214 Super Korn A/S 100000 Auto A/S 33344 Computer A/S Ved hjælp af #StrRFix opstilles feltet Account i en kolonne på 10 tegn højrestillet. #Date2Str Beskrivelse Macroen #Date2Str er en omskrivning af funktionen Date2Str. Den udfylder datoparameteren med %1. Alle andre parametre udfyldes med tallet 1. Bemærk! Da alle parametre er udfyldt med 1, betyder det, at funktionen anvender det format, der angives i skærmbilledet Brugeropsætning i feltet Dato-formattering. #Date2Str (indhold) Date2Str(%1,-1,-1,-1,-1,-1,-1) Syntaks #Date2Str(Dato) Parametre Macroen modtager kun én parameter i form af en dato. Returværdi Datoen returneres i det format, der angives i Brugeropsætning i feltet Dato-formattering. 102
Defaultværdier i feltet Dato-formattering i Brugeropsætning Felt Værdi Rækkefølge (DMÅ) DMÅ 2 seperatorer (/-. #) /- År skrives som Måned skrives som Dag skrives som 2 cifre Altid 2 cifre Altid 2 cifre Eksempel PRINT #Date2Str(15\03\2012) PAUSE Resultat 15/03-09 #Time2Str Beskrivelse Macroen #Time2Str konverterer et antal sekunder til almindelig tid i form af en tekst i formatet TT:MM dvs. timer og minutter med kolon som skilletegn. Macroen findes i biblioteket FUNKTIONER, der skal loades inden anvendelse. #Time2Str (indhold) Num2Str((%1) DIV 3600,2,0,0,0)+ : + #Num2Str0((%1) MOD 3600 DIV 60,2,0,0,0) Timerne udregnes med funktionen Num2Str, idet sekunderne divideres med 3600 og kun heltallet gemmes. Minutterne udregnes med macroen #Num2Str0, der dividerer sekunderne med 3600 og beholder resten, der divideres med 60, for at få hele antal minutter. Syntaks #Time2Str(Sekunder) Parametre Der er kun én parameter i form af antal sekunder. Returværdi Sekunderne konverteret til en tekst i formatet TT:MM. 103
Eksempel 1 (Fast antal sekunder) #MacroLoad(FUNCTIONS) PRINT #Time2Str(44100) PAUSE Resultat 12:15 I stedet for den faste værdi 44100 kan der f.eks. indsættes en funktion som TimeNow(). Indirektioner Indirektioner medtages i denne lektion, da de i virkeligheden er macroer. Ordet betyder faktisk fif eller kneb og indirektioner anvendes netop i vid udstrækning som kneb for at gøre ting nemmere. Mange kommandoer og funktioner er således erstattet af indirektioner. Alle control kommandoer til forms, rapporter og QT er er også erstattet af indirektioner. Ved at undersøge macro bibliotekerne FORMS, REPORTS og QUERY, kan det f.eks. ses, hvordan de forskellige control kommandoer opbygges som indirektioner i form af lokale macroer. Fordelen (fiffet eller knebet) er her, at indirektionerne (macroerne) kontrolleres allerede ved oversættelsen af et element, medens fejl i control kommandoerne først opdages ved afviklingen. Indirektioner på fasttekster Biblioteket ENUMS indeholder indirektioner på nogle af fastteksttyperne. Der er specielt to fordele ved at anvende indirektioner på fasttekster. Koden bliver nemmere at læse. I IF sætninger undersøges indholdet af fasttekst variabler altid ved sammenligning med tekstens nummer i den tilhørende fastteksttype og ikke med tekstens ordlyd. Desuden er det svært, at se hvad tallene i sammenligningen betyder. Dette kan kun ses ved at kontrollere fastteksten. I indirektioner er det makroernes navne, der anvendes i IF sætninger. Eventuelle ændringer i fasttekster bliver nemmere at gennemføre. Hvis der skal ændres i en fastteksttype, er det en fordel, hvis der i alle kørsler, forms, rapporter osv. er anvendt indirektioner i stedet for fasttekster. Hvis en fasttekst ændres til en anden betydning, skal dette rettes manuelt i samtlige kørsler, hvori fastteksten indgår. Er der derimod anvendt indirektioner i stedet for fasttekster, er det nok at ændre i selve fastteksttypen og i den tilhørende macro med indirektionerne. Bemærk! Det anbefales ikke at ændre i eksisterende fastteksttyper. Det kan få uoverskuelige følger. 104
Eksempel 1 (kode uden indirektioner) ENUM Sprog &Sprog PROMPT Vælg sprog: GET(&Sprog) INPUT IF &Sprog == 1 THEN PRINT Valgt sprog:, &Sprog IF &Sprog == 2 THEN PRINT Valgt sprog:, &Sprog IF &Sprog == 3 THEN PRINT Valgt sprog:, &Sprog PAUSE ENDIF ENDIF ENDIF I dette eksempel er det svært at se hvilke sprog, der svarer til tallene 1, 2 og 3. Kan det ikke huskes, kan det være nødvendigt, at slå op i fastteksttypen. Fastteksttypen Sprog Position Fasttekst 0 Standard 1 Dansk 2 Engelsk 3 Tysk Det er nemmere at læse koden og foretage ændringer i fastteksttypen ved, at oprette et macrobibliotek med indirektioner til fastteksten. Macrobibliotek med indirektioner til fastteksttypen Sprog #LOCALMACRO.Dansk #LOCALMACRO.Engelsk #LOCALMACRO.Tysk 1 #ENDMACRO 2 #ENDMACRO 3 #ENDMACRO Biblioteket kan f.eks. kaldes SPROGINDIREKTIONER, og navnet skrives med stort. Ved at erstatte tallene 1, 2 og 3 i eksempel 1, bliver koden nemmere at læse. Se eksempel 2 herunder. Eksempel 2 (kode med indirektioner) #MacroLoad(SPROGINDIREKTIONER) ENUM _Language &Sprog PROMPT Vælg sprog: GET(&Sprog) INPUT IF &Sprog == #Dansk THEN PRINT Sprog:, &Sprog ENDIF IF &Sprog == #Engelsk THEN PRINT Sprog:, &Sprog ENDIF IF &Sprog == #Tysk THEN PRINT Sprog:, &Sprog ENDIF Indirektioner på fastteksttypen sprog (_Language) overalt hvor denne type anvendes, gør det ikke alene nemmere at læse og overskue selve kørslerne, men ved ændringer i rækkefølgen af teksterne i fastteksttypen, er det nok at ændre i fastteksten og i macrobiblioteket med indirektionerne. 105
Opgaver: Macroer Opgave 1: Macroen #UDLSatser Formål med opgaven At oprette en ny global macro med to parametre. Beskrivelse Oprettelse af macro Der skal oprettes en ny global macro til beregning af lejeværdi og forsikringsværdi. Macroen er med to parametre til modtagelse af henholdsvis et beløb og en procentsats. Returværdien er beløbet i parameter 1 forhøjet med satsen i parameter 2. Forløb 1 Åben udviklingsmenuen og opret macroen. 2 Opret en ny macro med navnet UDLSatser. Kode i macro: { %1 er KostPris fra LagerKart } { %2 er procentsats fra et af felterne i UDLUdlånsSats} { Macroen returnerer en værdi i form af kostprisen } { justeret med procentsatsen. } { Kan anvendes på andre beløb og procentsatser. } %1*(%2/100) Macroen foranstilles automatisk med $ tegnet, fordi det er en bruger oprettelse. 3 Godkend macroen. 106
Opgave 2: Liste over udlejningsværdier Formål med opgaven At afprøve den nye globale macro #UDLSatser og konverteringsmacroerne #StrRFix, #StrLFix, #Num2Str og #Date2Str. Beskrivelse Du skal arbejde videre i XAL kørslen fra lektionen om funktioner. Alle felterne skal ændres så du ikke anvender funktioner til konvertering men macroer. Desuden skal felterne ItemNumber og ItemName1 konverteres med #StrRFix og #StrLFix, og lejeværdien skal beregnes den nye macro og udskrives efter feltet med udlejningsprocenten. Forløb 1 Forsæt i XAL kørslen fra forrige opgave og tilret startkommentarerne. 2 Felterne: ItemNumber konverteres med #StrRFix (lgd=10) ItemName1 konverteres med #StrLFix (lgd=28) CostPrice konverteres med #Num2Str (lgd=10, 2 decimaler) Udlejningsprocent konverteres med #Num2Str (lgd=5, 1 decimal) Udlejningsværdi beregnes med #UDLSatser og konverteres med #Num2Str (lgd=10, 2 decimaler) SidstRettet konverteres med #Date2Str 3 Godkend kørslen og kontrollér at den nye macro fungerer. 107
Opgave 3: Liste over udlejningsværdier pause for hver side Formål med opgaven At stoppe kørslen hver gang der er udskrevet 20 poster, samt at indsætte overskrifter. Beskrivelse Du skal arbejde videre i XAL kørslen fra forrige opgave. Kørslen skal ændres således at der holdes en pause for hver 20. postering og skærmen cleares. Desuden skal du indsætte overskrifter på hver side. Forløb 1 Forsæt i XAL kørslen fra forrige opgave og tilret startkommentarerne. 2 Opret en variabel til tælling af poster. 3 Anvend IF sætninger til kontrol af hvor mange linjer der udskrives. 4 Indsæt overskrifter så de udskrives på hver side. 5 Godkend kørslen og kontrollér at den nye macro fungerer. 108
10. 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 109
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 110
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 CTRL+F5 Flyt cursoren til det sted hvor linjen skal indsættes. 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 111
11. Huskelister Kommandoer og funktioner PRINT AT Syntaks Beskrivelse Eksempler PRINT <udtryk> PRINT <udtryk>,<udtryk>,<udtryk> PRINT <udtryk>,<udtryk> AT <kolonne>,<linje> Kommandoen PRINT benyttes til udskrivning af status under 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. Hvis der skal udskrives på andre medier, skal der benyttes WRITE eller OUTPUT. Hvis AT udelades rulles vinduet en linje op, og udskriften placeres på nederste linje i vinduet. Udskrifter bredere end vinduet afskæres, og fortsætter ikke på næste linje. Der kan max udskrives 8 udtryk. Er der behov for flere skal der angives flere PRINT kommandoer. PRINT Ole Olsen PRINT 25 PRINT Ole Olsen, 25, år PRINT Ole Olsen, 25, år AT 20,5 PAUSE Syntaks Beskrivelse Eksempler PAUSE Kommandoen PAUSE anvendes til at stille en kørsel i bero midlertidigt. Kommandoen giver brugeren mulighed for at se udskriften, inden kørslen slutter 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 PRINT Ole Olsen, 25, år AT 20,5 PAUSE 112
WINDOW Syntaks WINDOW <bredde>,<højde> WINDOW <bredde>,<højde> [AT <kolonne>,<linje>] Beskrivelse Eksempler 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 skal placeres på skærmen. Hvis AT udelades placeres vinduet i øverste venstre hjørne. Det oprindelige vindue lukkes før et nyt åbnes. Dette kan benyttes til at rydde det oprindelige vindue. Hvis vinduet f.eks. specificeres med højde og bredde lig 0,0 bliver det ikke åbnet, men det oprindelige lukkes. WINDOW 40,5 AT 20,5 PRINT Ole Olsen, 25, år PAUSE 113
Variabler Syntaks <type> &<variabelnavn> <type>[<variant>] &<variabelnavn> Beskrivelse Eksempler En variabel er en lille 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) Før en variabel kan anvendes skal den erklæres i toppen af programmet. Variabler initialiseres med nul-væ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 LEFT &Navn DATE &AnsatDato ENUM NejJa &Svar 114
Kommentar Syntaks Beskrivelse Eksempler { <kommentar > } En kommentar er en fritekst der indsættes et vilkårligt sted i programmet for at forklare funktionen. 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 Ved erklæring af variabler Ved forklaring af programmet Til at ignorere dele af programmet { Ole Olsen 15.01.2012 } { C5 version 2012 } { Udskrift af debitorer med saldo} { Erklæring af variable } 115
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. Dataelement kan være en lovlig venstreværdi dvs. variabler og felter. Udtryk er en højreværdi f.eks. et algebraisk udtryk. 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. SET &Antal = 100 SET &Beløb = 45.25 SET &Beløb = &Beløb + 350.50 SET &ForNavn = Ole SET &EfterNavn = Olsen SET &Navn = &ForNavn + + &EfterNavn SET &AnsatDato = 25\01\1997 SET &Svar = 1 116
PROMPT Syntaks PROMPT <dialogtekst> [AT <kolonne>,<linje>] <linjer> INPUT AT <kolonne>,<linje> Hvor <linjer> kan være som flg.: <ledetekst> GET (&Var), <ledetekst> GET (&Var LENGTH <heltal>), <ledetekst> GET (&Var DECIMALS <ant. decimaler>), <ledetekst> GET (&Var REF <kartotek>.<felt>), <ledetekst> GET (&Var ASENUM <tekstrække>) Beskrivelse Eksempler Kommandoen PROMPT benyttes til at stoppe op i programmet og spørge brugeren om nogle værdier der indsættes i variabler. Dette kan benyttes til styring videre i kørslen. PROMPT opstiller et modificerbart vindue. Der er dog ikke mulighed for at styre størrelsen af vinduet direkte. Det bliver automatisk tilpasset de specificerede linjer. Kommaerne efter linjerne bevirker linjeskift. Hvert komma giver ét linjeskift. Tekstrække i ASENUM kan være Teksts1\nTekst2\nTekst3 osv. PROMPT Indtast værdier,, Antal..: GET (&Antal), Beløb..: GET (&Beløb DECIMALS 2), Navn...: GET (&Navn LENGTH 15), Dato...: GET (&Dato), Svar...: GET (&Svar) INPUT AT 10,5 Infobox Syntaks Returværdi Box(type:INT,tekst:STR,std:INT):INT INT Beskrivelse Eksempler Funktionen Box findes i fire typer. Infoboxen er en type 1 box. Den vises med grå baggrund. I teksten kan der indsættes linjeskift med \n. SET Box(1, Slut på kørslen,0) 117
Advarselsbox Syntaks Returværdi Box(type:INT,tekst:STR,std:INT):INT INT Beskrivelse Funktionen Box findes i fire typer. Advarselsboxen er en type 2 box. Boxen vises med rød baggrund. I teksten kan der indsættes linjeskift med \n. Eksempler SET Box(2, ADVARSEL\nSlut på kørslen,0) Dialogbox Syntaks Returværdi Box(type:INT,tekst:STR,std:INT):INT INT Beskrivelse Eksempler Funktionen Box findes i fire typer. Dialogboxen er en type 1 box. Boxen vises med grå baggrund. I teksten kan der indsættes linjeskift med \n. I en dialogbox kan der indsættes trykknapper ved at omgive trykknappens tekst med to firkantede paranteser. Der kan være op til 11 trykknapper i en dialogbox. Svaret der kommer ind i variablen er IKKE værdien der står skrevet i knapperne, men positionen på knappen. I std angives det felt (trykknap) cursoren skal stille sig på default. INT &BoxTal SET &Boxtal = Box(1, Vælg mellem [[ A ]] [[ B ]] eller [[ C ]],2) PRINT &BoxTal PAUSE 118
Ja/Nej box Syntaks Returværdi Box(type:INT,tekst:STR,std:INT):INT INT Beskrivelse Eksempel Funktionen Box findes i fire typer. JA/NEJ boxen er en type 3 box. Ved NEJ sættes værdien til 2 og ved JA sættes værdien til 1. Hvis der i eksemplet svares NEJ sættes værdien af boxen til 2 og kørslen stopper med RETURN. IF Box(3, Skal kørslen fortsætte,2) == 2 THEN RETURN ENDIF Picklistebox Syntaks Returværdi Box(type:INT,tekst:STR,std:INT):INT INT Beskrivelse Eksempel Funktionen Box findes i fire typer. Picklisteboxen er en type 4 box. Svaret der vendes tilbage med er positionen i picklisten startende med position 1. Ved flere end 11 positioner i teksten dannes der et rullevindue. SET &Værdi = Box(4, Æbler\nPærer\nBananer,1) PRINT &Værdi PAUSE 119
SEARCH-END Syntaks Beskrivelse SEARCH <kartotek> [RENAME <navn>] [USING [INDEX] <indexnavn>] eller [SEQ] [ORDER [BY] <nøgle> [SHOW <felt>] ] [WHERE <udtryk>] [<kommandoblok>] END Kommandoen SEARCH anvendes til at gennemløbe poster i et kartotek. Med USING kan man angive sorteringsmåde iflg. det angivne index. De poster der udvælges vha. SEARCH kan oprettes, slettes, opdateres eller udleveres til f.eks. rapporter. Eksempler SEARCH CustTable PRINT Account,,Name END PAUSE SEARCH CustTable USING AccountIdx PRINT Account,,Name END PAUSE SEARCH CustTable USING AccountIdx ORDER BY Name SHOW Account WHERE Group == DK PRINT Group,,Account,,Name END PAUSE SEARCH CustTable USING AccountIdx PRINT Account,,Name SEARCH CustTrans WHERE Account == CustTable.Account PRINT Account,,AmountMST,,Date_ END END PAUSE 120
IF-THEN-(ELSE)-ENDIF Syntaks Beskrivelse Eksempler Eksempel med boolsk udtryk IF <udtryk> THEN <udfald 1> [ELSE <udfald 2>] ENDIF Kommandoen IF-THEN-(ELSE)-ENDIF er en betingelsesstruktur der foreskriver én eller to konsekvenser af en opstillet betingelse. Betingelsesstrukturen har tre bestanddele: En betingelse, en betinget konsekvens og en alternativ konsekvens. Hvis betingelsen evaluerer til SAND, afvikles kommandoerne i den betingede konsekvens. Ellers, hvis betingelsen evaluerer til FALSK, afvikles kommandoerne i den alternative konsekvens dvs. efter ELSE. I nogle tilfælde er det ikke nødvendigt at opstille en alternativ konsekvens. I så fald vil der ikke blive udført kommandoer, hvis betingelsen evaluerer til falsk. SEARCH CustTable IF BalanceMST > BalanceMax THEN PRINT Over (betingelsen er sand) ELSE PRINT Under (betingelsen er falsk) ENDIF END PAUSE En IF-THEN-ENDIF betingelse kan også opstilles som et boolsk udtryk med syntaksen: <udtryk>? <Udfald1> : <udfald2> SEARCH CustTable PRINT BalanceMST > BalanceMax? Over : Under END PAUSE NextYr Syntaks Returværdi NextYr(d:DATE):DATE DATE Beskrivelse NextYr beregner den samme dato næste år. Eksempler NextYr(29\02\1988) -> 28\02\1989 NextYr(28\02\1989) -> 28\02\1990 121
DayOfWk Syntaks Returværdi DayOfWk(d:DATE):INT INT Beskrivelse DayOfWk beregner hvilken dag i ugen, det er. Mandag er dag nr. 1. Eksempler DayOfWk(02\02\1989) -> 4 DayName Syntaks Returværdi DayName(i:INT):STR STR Beskrivelse DayName returnerer navnet på ugedagen nummer i. Eksempler DayName(1) -> Mandag DayName(7) -> Søndag 122
INTRODUCE Syntaks Beskrivelse INTRODUCE <Kartotek>[<direkte opslag>] RENAME <Name> INTRODUCE indfører og åbner for én post ad gangen, i modsætning til SEARCH der åbner for mange poster ved et gennemløb af et kartotek. Uden direkte opslag udfyldes posten med nul-værdier. man siger at den er fiktiv. Med direkte opslag udfyldes posten med værdier fra databasen. Man siger at den er faktisk. Hvis man forsøger at åbne med INTRODUCE og et direkte opslag, og posten ikke findes vil den blive fiktiv. Man kan finde ud af om en post er fiktiv eller faktisk ved, at undersøge indholdet i feltet LøbeNummer. Hvis LøbeNummer er 0 er posten fiktiv ellers er den faktisk. Eksempler INTRODUCE CustTable[AccountIdx== 33344 ] PRINT Account,,Name PAUSE INTRODUCE CustTable[AccountIdx== 33344 ] RENAME Customer PRINT Customer.Account,,Customer.Name PAUSE INTRODUCE CustTable SET Account = 1000 SET Name = Søren Sørensen SET Group = UDL INSERT CustTable 123
INSERT Syntaks Beskrivelse INSERT <kartotek> [DELAYED] INSERT anvendes til at oprette nye poster i et kartotek. Benyttes typisk i forlængelse af INTRODUCE, der indfører en fiktiv post. Anvendes også i forbindelse med READ til indlæsning af poster fra en fremmed fil. Eksempler INTRODUCE CustTable SET Account = 2000 SET Name = Ole Olsen SET Group = UDL INSERT CustTable UPDATE Syntaks Beskrivelse UPDATE <kartotek> [DELAYED] UPDATE anvendes til at overskrive en post i et kartotek. Den kan foretage permanente ændringer på poster i et kartotek. Anvendes typisk i forlængelse af en eller flere tildelinger til felter i en post. Ændringerne til posten registreres på disken. Eksempler INTRODUCE CustTable[AccountIdx== 2000 ] SET Adress1 = Koldingvej 25 SET ZipCity = 6000 Kolding SET Adress2 = Bramdrupdam UPDATE CustTable DELETE Syntaks Beskrivelse DELETE <kartotek> [DELAYED] DELETE anvendes til at slette en post i et kartotek. Anvendes typisk i periodiske kørsler, når der skal ryddes op i kartoteker. Eksempler INTRODUCE CustTable[AccountIdx== 2000 ] DELETE CustTable 124
OUTPUT Syntaks Beskrivelse OUTPUT <kartotek> [DELAYED] OUTPUT er en rapport-opbygningsspecifik kommando. Kommandoen udleverer poster til Rapport-opbygning. Anvendes i den kørsel der udleder posterne, som rapporten skal omfatte. Eksempler SEARCH CustTable USING AccountIdx WHERE BalanceMST > 0.00 OUTPUT CustTable END FIND Syntaks Beskrivelse FIND <kartotek> [<direkte opslag>] FIND tildeler nye værdier til en post med virkefelt. Virkefelt kan være tildelt poster der er udsøgt med SEARCH, indført med INTRODUCE eller opfanget med EXTERN. Kommandoen udpeger en post uden først at søge hele kartoteket igennem. FIND finder nye poster vilkårligt mange gange, når der først er blevet indført en én gang vha. INTRODUCE. Sammenligning med INTRODUCE: INTRODUCE opretter poster, FIND udfylder kun. INTRODUCE bruger RENAME, det kan FIND ikke. INTRODUCE bruger hukommelse hver gang, FIND benytter samme hukommelse vilkårligt mange gange. Eksempler INTRODUCE CustTable FIND CustTable[AccountIdx== 33344 ] PRINT Account,,Name PAUSE 125
WRITE Syntaks Beskrivelse WRITE <fremmed fil> AS <filtype> FROM (<udtryk>) Anvendes til at oprette poster i fremmede filer. Udfører en export af data. Data-manipulation benyttes med fordel til, at danne en kørsel til export af data. Gemmes kørslen vil den blive placeret som en $ markeret QTX i udviklingsmenuen. Eksempler SEARCH CustTable USING AccountIdx WRITE CustTable.com AS COMMA FROM (Account,Name) END READ Syntaks Beskrivelse READ <fremmed fil> RENAME <Name> AS <filtype> INTO (<dataelementer>) END READ er en løkke, der afsluttes med END. Anvendes til at gennemløbe poster i en fremmed fil. Data-manipulation kan med fordel benyttes til at danne en kørsel til import af data. Gemmes kørslen vil den blive placeret som en $ markeret XAL-kørsel i udviklingsmenuen. Eksempler INTRODUCE CustTable READ CustTable.com AS COMMA INTO (Account,Name) INSERT CustTable END 126
WHILE-END Syntaks Beskrivelse WHILE <udtryk> <kommandoblok> END Er en løkke, men gennemløber ikke kartoteker som SEARCH. Anvendes typisk til at foretage en række kommandoer et bestemt antal gange. Betingelsen for den fortsatte afvikling af kommandoerne i løkken er et boolsk udtryk. Betingelsen er opfyldt når det boolske udtryk evaluerer til sand. Eksempler INT &Tæller WHILE &Tæller<10 #Add(&Tæller,1) PRINT &Tæller END PAUSE PROCESS Syntaks PROCESS <udtryk1> [<udtryk2>] [USING <kartotek>] Beskrivelse Eksempler INTRODUCE CustTable[AccountIdx== 33344 ] PROCESS 17 FORM=Deb USING CustTable Init-triggeren i formen deb: #MacroLoad(FORMS) Pre-form i formen deb: EXTERN CustTable SET CustTableBlok.Account = CustTable.Account #Frm_Index(CustTableBlok.AccountIdx,1) #Frm_Search(CustTableBlok) Init-record triggeren i CustTableBlok EXTERN CustTable SET CustTableBlok.Account = CustTable.Account #Debug 127
Syntaks Beskrivelse #Debug(&Variabelnavn) Print af variabelnavn og indhold Kørsel oversat med debuginformation Eksempler REAL &Saldo SEARCH CustTable #Add(&Saldo,BalanceMST) PRINT #Debug(&Saldo) END PAUSE 128
Del II Kartoteker og skærmbilleder 129
12. Kartoteker, triggere med inddatakontrol Mål med lektionen Formålet med denne lektion er at give deltagerne kendskab til triggerne i kartoteker og kartoteksfelter. Deltagerne lærer at udføre inddatakontrol i et par af triggerne. Efter lektionen skal kursisterne kunne: Anvende kartotekstriggeren Post-change-record til inddatakontrol af hele records Anvende felttriggeren Checkformel i feltet Check af indtastning til inddatakontrol af feltindhold. Generelt Kartoteker og kartoteksfelter i C5 indeholder en del triggere, der kan anvendes til styring af poster i kartotekerne. Triggerne kan bl.a. anvendes til inddatakontrol direkte i kartoteker og i kartoteksfelter. Kartoteker Alle kartoteker har deres eget sæt af triggere, der aktiveres på forskellige tidspunkter i forhold til behandlingen af indholdet i de enkelte poster i kartotekerne. Triggerne findes i udviklingsmenuen i søjlen DBD under Ret/Kerne/Vælg kartotek. I menuen med kartotekets navn vælges menupunktet Formler for kartotek. Det er samme menu, der vises, når der oprettes nye kartoteker. Formler for kartotek er det samme som kartotekstriggere. Det skal bemærkes, at det ikke kan ses, om der er kode i de enkelte triggere som f.eks. med Forms- Triggere og QT-Triggere. Der bliver ikke anført en stjerne foran triggernavnet, når en kartotekstrigger indholder kode. Derfor kan man ikke danne sig et overblik over, hvilke triggere der er kode i, ved blot at kigge på triggerne i oversigten. Man skal ind i hver enkelt trigger, og efterse om der er kode og i givet fald, hvad koden udfører. Desuden kan kartoteks triggere IKKE debugges. Formler for kartotek (triggere) Trigger Anvendelse Post-change-record Post-load Init-record Pre-delete Post-delete Pre-update Post-update Pre-insert Post-insert (OK) Post-insert (Fail) Kontrollere en komplet indtastning af en post Afvikles når en post læses fra disken Udfyldning af startværdier i en nyoprettet post FØR sletning af post. Kontrollere om en post må slettes EFTER sletning af en post FØR rettelse af en post. Kontrollere om en post må rettes EFTER rettelse af en post FØR oprettelse af en post. Kontrollere om posten må oprettes EFTER oprettelse af en post blev afsluttet med succes EFTER oprettelse af en post blev afvist. 130
Inddatakontrol på kartoteker Triggeren Post-change-record I denne lektion behandles kun triggeren Post-change-record, da den kan anvendes til inddatakontrol. Triggeren afvikles hver gang en post afsluttes og der er ændret i mindst et af felterne. Triggeren anvendes til en samlet kontrol af hele indtastningen af en post. Triggeren kan f.eks. anvendes til kontrol af, at bestemte felter ér blevet udfyldt inden, posten gemmes i kartoteket. Efterfølgende vises et eksempel fra triggeren Post-change-record i kartoteket CustTable. Eksempel på inddatakontrol i Post-change-record i CustTable STR 255 &Message IF NOT Group THEN #Add(&Message, GRUPPE skal angives. \n ) ENDIF IF NOT Account THEN #Add(&Message, KONTO skal angives. \n ) ENDIF IF &Message THEN SET BOX(1,&Message,0) RETURN 0 ENDIF I eksemplet erklæres først en variabel af typen tekst med navnet &Message. Derefter undersøges det i to IF strukturer, om felterne Debitorgruppe (Group) og Kontonummer (Account) er udfyldt (IF NOT). Hvis felterne er udfyldt, springes IF strukturerne over. Er de derimod ikke udfyldt, tilføjes teksten GRUPPE skal angives eller KONTO skal angives, til variablen &Message. (#Add(&Message )). Til sidst undersøges det, om variablen &Message har et indhold (IF &Message). Hvis den har det, er det fordi et af felterne mangler, og værdien i variablen udskrives, SET BOX, derefter vendes tilbage til den form eller det listbillede, hvori posten findes, RETURN 0. Vigtigt! Det er kommandoen RETURN 0, der sørger for, at der vendes tilbage til den form eller det listbillede, hvor posten anvendes lige nu, og at formen eller listbilledet ikke kan forlades, før felterne er udfyldt. Fjernes eller glemmes kommandoen medfører det, at meddelelsen til brugeren blot vises, og at posten alligevel godkendes, som den er, og gemmes i kartoteket. Kartoteksfelter Triggere Ved oprettelse af et nyt kartoteksfelt åbnes der et indtastningsbillede til opsætning og beskrivelse af selve feltet. Alle kartoteksfelter indeholder i dette billede fire felter med felttriggere. 131
Felttriggere Felt (trigger) Værdi Anvendelse Check af indtastning Checkformel Kode der checker om indtastningen er OK Manipulationsformler Førformel Afvikles FØR der ændres i feltet Efterformel Afvikles EFTER der ændres i feltet Udfør Efterformel fra* Efterformel udføres fra et andet angivet felt. Feltliste vises med ALT+H. * Feltet Udfør Efterformel fra er ikke i sig selv en trigger, men derimod et felt beregnet til indsættelse af navn på et andet felt (i kartoteket), hvorfra triggeren Efterformel skal aktiveres. Inddatakontrol på felter Triggeren Check af indtastning I denne lektion behandles kun triggeren Check af indtastning. Triggeren afvikles hver gang, der ændres værdi i det felt, den tilhører og feltet forlades. Bemærk at kontrollen ligger på feltet i databasen og derfor træder i funktion i samtlige forms og listbilleder, hvori feltet indgår og der ændres indhold i det. Triggeren kan indeholde hvad som helst, programmøren har behov for i forbindelse med, at der ændres værdi i et felt. Der kan f.eks. indsættes en besked til brugeren. Eksempel på kontrol i triggeren Check af indtastning IF Date < 01\01\99 THEN SET BOX(2, Dato er for gammel!,0) RETURN 0 ENDIF I ovenstående eksempel forudsættes, at triggeren ligger i et datofelt i et tænkt kartotek. I IF sætningen er der opsat en betingelse, der kontrollere datoen i feltet. Det kontrolleres således, om der indtastes en dato, der er for gammel i forhold til datoen i IF sætningen. Datoen må således IKKE være før 1. Januar 1999. Hvis datoen er i orden overspringes hele koden. Hvis den er for gammel, udføres de to linjer inde i IF strukturen. Først udskrives en advarselsboks med besked til brugeren om, at datoen er for gammel, SET BOX, derefter vendes tilbage til den form eller det listbillede, hvori datoen blev indtastet, RETURN 0. Vigtigt! Det er kommandoen RETURN 0, der sørger for, at der vendes tilbage til det sted, hvor feltet anvendes lige nu og at feltet ikke kan forlades før, der er tastet en korrekt dato. Fjernes eller glemmes kommandoen, medfører det at meddelelsen til brugeren blot vises, og der kan fortsættes med indtastning i næste felt. 132
Opgaver: Kartoteker, triggere med inddatakontrol Opgave 1: Inddatakontrol på UDLUdlånsKart Formål med opgaven At udføre inddatakontrol i kartotekstriggere i UDLUdlånsKart Huskelister Listbillede-opret Beskrivelse Der skal udføres inddatakontrol i triggeren Post-change-record på kartoteket UDLUdlånsKart. Det skal kontrolleres at bestemte felter er udfyldt inden poster kan forlades i listbilleder eller forms til kartoteket. Kontrollerne udføres på samme måde som i triggeren Post-change-record i kartoteket CustTable i C5. Forløb 1 Opret inddatakontrol i triggeren Post-change-record i kartoteket UDLUdlånsKart. Felterne UdlånsNummer, UdlånsDato og Attention SKAL udfyldes. 2 Opret et listbillede til kartoteket UDLUdlånsKart med alle felter, undtagen systemfelterne. 3 Afprøv om inddatakontrollerne fungerer ved at oprette forskellige udlånsnumre med ovenstående felter. Prøv at undlade at udfylde felterne. 133
Opgave 2: Inddatakontrol på UDLUdlånsPost Formål med opgaven At udføre inddatakontrol i kartotekstriggere i UDLUdlånsPost Huskelister Listbillede-opret Beskrivelse Der skal udføres inddatakontrol i triggeren Post-change-record på kartoteket UDLUdlånsPost. Det skal kontrolleres, at bestemte felter er udfyldt, inden poster kan forlades i listbilleder eller forms til kartoteket. Kontrollerne udføres på samme måde som i triggeren Post-change-record i kartoteket CustTable. Forløb 1 Opret inddatakontrol i triggeren Post-change-record i kartoteket UDLUdlånsPost. Felterne UdlånsNummer, DebitorKonto og VareNummer SKAL udfyldes. 2 Opret et listbillede til kartoteket UDLUdlånsPost med alle felter, undtagen systemfelterne. 3 Afprøv om inddatakontrollerne fungerer ved at oprette forskellige udlånslinjer med ovenstående felter. Prøv at undlade at udfylde felterne. 134
Opgave 3: Inddatakontrol på kartoteksfelter Formål med opgaven At udføre inddatakontrol i en trigger i et felt i kartoteket UDLUdlånsKart Beskrivelse Der skal udføres inddatakontrol i triggeren Checkformel på felterne UdlånsDato og ReturDato i kartoteket UDLUdlånsKart. Det skal kontrolleres, at datoen der indtastes i feltet UdlånsDato, ikke er mere end én måned gammel. Hvis den er det, skal der udskrives en advarselsboks med forklaring til brugeren. I feltet ReturDato skal det desuden kontrolleres, at returdatoen ikke er mindre end UdlånsDatoen. Kontrollerne skal udføres på en sådan måde, at felterne ikke kan forlades før datoerne er rigtige. Forløb 1 Opret inddatakontrol i triggeren Checkformel i kartoteket UDLUdlånsKart i feltet UdlånsDato. Datoen må ikke være mere end én måned gammel. Hvis den er det, skal der udskrives en advarselsboks og returneres til feltet. Feltet må ikke forlades, før datoen er rigtig. 2 Opret inddatakontrol i triggeren Checkformel i kartoteket UDLUdlånsKart i feltet ReturDato. Datoen må ikke være før UdlånsDatoen. Hvis den er det, skal der udskrives en advarselsboks og returneres til feltet. Feltet må ikke forlades før datoen er rigtig. 3 Afprøv om inddatakontrollerne fungerer ved at oprette forskellige udlån med ovenstående felter. Prøv at indtaste forskellige datoer der er forkerte, så du kan se, at inddatakontrollerne fungerer efter hensigten. 135
13. 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 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. 136
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. Formens tre niveauer med triggere dvs. 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. 137
Vindue Blokke Form formler Felter Blok formler Felt formler 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 138
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 parantes adskilt med kommaer. 139
Sammenligning mellem kontrolkommando og -macro Control Index InvenTable ItemIdx #Frm_Index(InvenTable, ItemIdx) 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. Hvis der ønskes yderlige information i Teknisk Reference, skal der søges efter de tilsvarende kontrolkommandoer. 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. Der findes mange forskellige macrobiblioteker i XAL sproget. Nogle er dedikeret til specielle formål, hvilket ofte fremgår af bibliotekets navn. 140
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. Eksempel Trigger Init Macroer #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 Error Macroer #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. Syntaks #Frm_Index(<bloknavn>, <indexnavn>) 141
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. Eksempel Trigger Pre-Form Macroer #Frm_Index(InvenTable, ItemIdx) I dette eksempel anvendes blokken InvenTable og indexet 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. 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 Macroen indsættes som regel i triggeren Pre-Form under macroen #Frm_Index(). Eksempel Trigger Pre-Form Macroer #Frm_Index(InvenTable, ItemIdx) #Frm_Search(InvenTable) Husk at det er blokkens navn, der angives som parameter og ikke kartoteksnavnet. 142
#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(). Eksempel Trigger Pre-Form Macroer #Frm_Index(InvenTable, ItemIdx) #Frm_SearchEnd(InvenTable) 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. Triggere Init Pre-form Error Macroer #MacroLoad(FORMS) #Frm_Index(InveTable, ItemIdx) #Frm_Search(InvenTable) #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. 143
Specielt vedr. triggerne Init og Pre-form Ovenfor vises den foreløbige anvendelse af triggerne Init og Pre-form. 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 Preform 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. 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. 144
Opgaver: Formens vindue Opgave 1: Vindue til formen UDLUdlånsKart 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 kartoteket UDLUdlånsKart. Desuden skal relevante triggere udstyres med macroer til styring og fejlhåndtering Forløb 1 Opret vinduet til formen UDLUdlånsKart. Giv den navnet UDLUdlånsKart. Teksten i rammen skal være Udlånskartotek. Størrelsen på vinduet skal være 22 høj 63 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. 5 Indsæt macro der kan styre, at der startes på den første post i det angivne index. Benyt bloknavnet UDLUdlånsKart. 145
14. 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. 146
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: Debitorer Kontonummer skal indtastes Navn...: Telefon...: Ledetekster fremkommer automatisk Cursor bestemmer feltets plads Fritekst kan skrives overalt Felter indsættes fra kartotek med F2 og Enter 147
Opgaver: Enkelt record blok Opgave 1: Form med enkelt record blok Formål med opgaven At oprette en form med én enkelt record blok At 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. Blokken skal have samme navn som kartoteket. Nummer...: Konto...: Attention: Udlånskartotek UdlånsType: UdlånsDato: ReturDato.: 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. Felterne er: UdlånsNummer, DebitorKonto, Attention, UdlånsType, UdlånsDato og ReturDato. 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 UDLUdlånsType fungerer i feltet UdlånsType. 8 Prøv at bladre mellem ordrene. 9 Kontrollér om listbillederne til felterne UdlånsNummer og DebitorKonto åbnes direkte. Ellers skal du foretage de nødvendige ændringer, så de kommer til det. 148
15. 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 Varelinjer Varenummer Varenavn 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. 149
Multi record blok med enkeltstående felter Varelinjer Varenummer Varenavn 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. 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. 150
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: Varelinjer Varenummer Varenavn 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. 151
Opgaver: Multi record blok Opgave 1: Form med multi record blok Formål med opgaven At oprette en multi record blok i en form der allerede har en anden blok. Huskelister Form Multi record blok Form Felter Beskrivelse Der skal oprettes en multi record blok i vinduet til formen UDLUdlånsKart. Formen består i forvejen af en enkelt record blok med navnet UDLUdlånsKart. Multi record blokken skal tilknyttes kartoteket UDLUdlånsPost og den skal have samme navn. Blokken skal være autogenereret og starte i kolonne 0 linje 12 som vist herunder. Nummer...: Konto...: Attention: Udlånskartotek UdlånsType: UdlånsDato: ReturDato.: Varenr SerieNr UdlånsStat Dkk Udlejn Dkk Forsik 152
Forløb 1 Fortsæt i formen der blev anvendt i den forrige lektion. 2 Opret blokken på vinduet med Ja i autogenér og giv den samme navn som kartoteket UDLUdlånsPost. Blokken skal starte i kolonne 0 linje 12. 3 Indsæt felterne og lad dem blive placeret automatisk som ovenfor. Felterne er: VareNummer, SerieNummer, UdlånsStatus, UdlejningsVærdi og Forsikringsværdi. 4 Godkend formen. 153
16. Virtuelle felter i forms Mål med lektionen Formålet med denne lektion er at lære deltagerne at anvende virtuelle felter i forms. Efter lektionen skal kursisterne kunne: Indsætte virtuelle felter i forms Tildele værdier af forskellig art til virtuelle felter. Generelt Forms består altid af en eller flere blokke, hvorpå der indsættes felter, der hentes fra det tilknyttede kartotek. Til tider er der behov for at anvende Virtuelle felter. Virtuelle felter er felter, der ikke tilhører et bestemt kartotek. Felterne anvendes f.eks. til visning af værdier, der ikke skal gemmes i kartoteker. Der kan oprettes blokke der ikke tilknyttes et kartotek. Hvis en blok ikke tilknyttes et kartotek, kan der kun indsættes virtuelle felter. Et eksempel herpå er lommeregneren, Calculator, i C5. Denne består udelukkende af virtuelle felter. Oprettelse af virtuelle felter Virtuelle felter oprettes næsten på samme måde som almindelige kartoteksfelter. I Enkelt Record blokke oprettes felterne manuelt og i Multi Record blokke oprettes de automatisk. Felterne oprettes med funktionen Opret felt der startes med F2. Funktionen åbner en boks med indtastningsfeltet Feltnavn, hvori der angives navnet på det felt, der skal oprettes. Vigtigt! Kartoteksfelter indsættes fra en liste over felter ved at taste ENTER og vælge et felt. Virtuelle felter oprettes ved at indtaste navnet på feltet. Navngivning Virtuelle felter navngives efter samme principper som kartoteksfelter. Desuden må der ikke være sammenfald med navne fra andre felter i formen eller kartoteker der er knyttet til blokke i formen. Regler for feltnavne 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 154
Virtuelle felter foranstilles automatisk med et & tegn. Dette skal således ikke indsættes manuelt. Under oprettelsen indtastes blot selve navnet på det virtuelle felt. Virtuelle felter kan formatteres eller opsættes på ligefod med almindelige kartoteksfelter. Opsætning Opsætning eller formattering kan udføres når virtuelle felter oprettes eller ændres med funktionerne Opret felt F2 eller Ret felt F6. Når funktionerne aktiveres, fremkommer der en dialogboks til justering af det aktuelle felt. Dialogboksen har forskelligt indhold afhængigt af felttype. Der er seks felttyper at vælge mellem, når der oprettes virtuelle felter. Typer på virtuelle felter i C5 Felttyper (virtuelle) Heltal Kommatal Alfanumerisk Dato Fasttekst Trykknap Skemaet, på næste side, indeholder en samlet oversigt over opsætningsmulighederne i virtuelle felter. De første seks kolonner viser hvad, der kan justeres på de enkelte felter, og svarer til skemaet herover. 155
Opsætningsmuligheder på virtuelle felter i forms Felttyper Felt i opsætning Muligheder H K A D F T Feltnavn Navn på felt (kan ikke ændres) H K A D F T Feltets bredde Antal tegn H K A D F T Feltets justering Venstrestillet, Højrestillet, Centreret A F Store bogstaver Nej eller Ja H K A D F Rette i indhold Nej eller Ja H K A D F T Hvor mange linjer Alle linjer eller én linje H K A D F T Feltet autoplaceres Nej eller Ja H K A D F T Automatisk ledetekst Nej eller Ja H K A D F Autohop næste felt Nej eller Ja H K A D F Kopier felt Nej eller Ja H K A D F Skal feltet vises Nej eller Ja H K A D F T Ledetekst Evt. ny ledetekst (hvis blank bruges databasens) H K A D F T Brugeropsættes Nej eller Ja H K A D F Spring feltet over Nej eller Ja H K A D F Søgning efter input Nej eller Ja H K A D F Formler på feltet 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 T National valuta Nej eller Ja K Automatisk dec. tegn Nej eller Ja T Skygge Nej eller Ja T Start/Sluttegn i ender Nej eller Ja T Tænd/sluk knap Nej eller Ja T Farve for inaktiv Nummer på farve 156
Tildeling Virtuelle felter betragtes som variabler, hvilket fremgår af, at deres navne foranstilles med & tegnet. Felterne er ikke variabler i den forstand, at de skal erklæres inden, de kan bruges. De oprettes blot som virtuelle felter og skal herefter behandles som variabler. Tildeling af værdier til virtuelle felter udføres således med SET kommandoen på samme måde som ved variabler. Der kan tildeles mange forskellige typer af værdier til felterne. Det kan være værdier i form af tekster, heltal, kommatal, funktioner, direkte opslag osv. Husk! Værdierne skal svare til felttypen. Eksempel på funktionen Today() SET &DagsDato = Today() I eksemplet forudsættes det, at der i en form er oprettet et virtuelt felt med navnet &DagsDato. Meningen med feltet er, at det i formen skal vise, hvilken dato det er i dag. Når virtuelle felter skal tildeles værdier, foregår det i en af triggerne i formen. I ovenstående eksempel kunne tildelingen f.eks. foregå i felttriggeren Post-Load på feltet selv. Denne trigger aktiveres hver gang en post vises på skærmen, hvad enten det er en ny der oprettes eller der bladres mellem eksisterende poster. Det er ikke altid de samme triggere der anvendes. Det afhænger af de aktuelle situationer, og skal derfor bestemmes fra gang til gang. 157
Opgaver: Virtuelle felter i forms Opgave 1: Virtuelle felter Formål med opgaven At indsætte virtuelle felter i en form med to blokke. Beskrivelse Der skal indsættes virtuelle felter i den nye form UDLUdlånsKart. Der skal indsættes et felt i hovedet til visning af den samlede lejeværdi for udlånet og i linjerne skal der indsættes et felt til visning af varenavnet. Desuden skal der i hver blok, også indsættes et Notat felt. Der skal således indsættes fire virtuelle felter på formen, som vist herunder. Nummer...: Konto...: Attention: Udlånskartotek UdlånsType: UdlånsDato: ReturDato.: Dkk Forsikring: Dkk Lejeværdi.: Notat...: Varenr VareNavn SerieNr UdlånsStat Dkk Udlejn Dkk Forsik Notat Opdatering af virtuelle felter Opdateringen af de virtuelle felter vil finde sted i andre lektioner. Lejeværdien opdateres under lektionen USRKEY triggere. VareNavn opdateres under lektionen Direkte opslag og notatfelterne opdateres under lektionen Notater. 158
Forløb 1 Anvend formen fra UDLUdlånsKart fra opgaven i forrige lektion. 2 Placér cursor i blokken UDLUdlånsKart. Indsæt manuelt felter i hovedblokken UDLUdlånsKart. ForsikringsSum: (REAL, Lgd=10, Ledetekst=%3Forsikring, Spring over = JA) LejeSum: (REAL, Lgd=10, Ledetekst=%3Lejeværdi, Spring over = JA) NotatUdlånsKart: (INT, Lgd=5, Ledetekst = Notat, Spring over = JA) 3 Skift til blokken UDLUdlånsPost. Indsæt felterne nedenfor og lad dem blive placeret automatisk som ovenfor. VareNavn: (STR, Lgd=30, Ledetekst = VareNavn, Spring over = JA) NotatUdlånsPost: (INT, Lgd=5, Ledetekst = Notat, Spring over = JA) 4 Placér cursor på feltet VareNavn og Ændre indtastningsrækkefølge på feltet til nr. 2. Dette skal automatisk placere feltet på højre side af Varenummeret. 5 Godkend og afprøv formen. Du må ikke kunne komme ind i nogen af de virtuelle felter, da de er sat til at skulle springes over. Felterne må heller ikke udvise nogen værdier. HUSK at felterne vil blive opdateret i andre lektioner. 159
17. Synkronisering mellem blokke Mål med lektionen Formålet med denne lektion er at lære deltagerne at udføre synkronisering mellem flere blokke i samme form. Efter lektionen skal kursisterne kunne: Anvende forms kontrol macroer til synkronisering mellem blokke i samme form Vælge de rigtige triggere til synkroniseringen. Generelt Synkronisering mellem blokke anvendes i skærmbilleder med flere blokke, hvor indholdet i en blok er afhængig af indholdet i en anden blok. I kursusmaterialet betegnes blokkene som hovedblokke og underblokke. Oprettes der f.eks. en hovedblok til visning af varer fra lagerkartoteket og en underblok til visning af lagerposter, vil det være naturligt, at de poster der vises i underblokken, passer til den post der vises i hovedblokken. Synkronisering mellem blokke InvenTable (hovedblok) Enkelt record blok med varer Synkronisering LagerTrans (underblok) Multi record blok med vareposter Vises varenummer 1750 i hovedblokken, skal det således kun være lagerposter til vare 1750, der vises i underblokken og ikke andre varers poster. Synkroniseringen er nødvendig for at få helhed og sammenhæng i skærmbilledet. Fremfinding og visning af poster i underblok Når hovedblokken udfyldes med en post, skal de rette poster straks vises i underblokken. Til dette formål skal der anvendes en trigger, der i hovedblokken aktiveres på det rette tidspunkt. Der findes et sæt ens triggere i alle blokke. Triggeren Pre-record er den rigtige til synkroniseringen af posterne i underblokken, så de vises på rette tidspunkt. 160
Triggeren Pre-record Triggeren Pre-record aktiveres hver gang, der vises en ny post på skærmen. Det gælder også så snart skærmbilledet åbnes, og den første post vises. Triggeren anvendes f.eks. til tildeling af værdier i sin egen blok, men også til tildeling af værdier i andre blokke. Pre-record i en hovedblok kan således anvendes til at styre, hvad der skal ske i en underblok. Synkroniseringen i Pre-record består af tre punkter: Tildeling af feltværdier fra hovedblok til opslagsfelter i underblok Fremfinding af poster i underblokken med macroen #Frm_Index() Placering af cursor på den første eller sidste af de fundne poster. Tildeling af værdier fra hovedblok til felter i underblok Inden posten kan findes i underblokken, skal denne forsynes med informationer om posterne. De vigtigste informationer er værdier, der kan anvendes til opslag efter posterne i et af de indexer, der er tilknyttet underblokkens kartotek. Tildelingen af disse værdier udføres med SET kommandoen på samme måde som ved variabler. Syntaksen for denne tildeling af opslagsfelter beskrives på næste side. Syntaks SET Underblok.Opslagsfelt = Hovedblok.Opslagsfelt Bemærk at Underblok og Hovedblok er bloknavne og ikke kartoteksnavne. Det er derfor det er en god idé, at give blokke samme navne som tilknyttede kartoteker. Eksempel SET InvenTrans.ItemNumber = InvenTable.ItemNumber I eksemplet findes underblokken InvenTrans med feltet ItemNumber og hovedblokken InvenTable med feltet ItemNumber. Felterne behøver nødvendigvis ikke at have samme navne. Det er vigtigt, ved synkronisering, at feltet i underblokken indgår som første komponent i et index til blokkens kartotek. Er det ikke tilfældet, kan der ikke fremfindes nogen poster. Der kan udmærket tildeles værdier til flere felter i underblokken, hvis der er behov for det. Det gælder også felter, der ikke har med synkronisering at gøre. Selve fremfindingen af posterne udføres med control macroen #Frm_Index(). Fremfinding af poster i underblok med #Frm_Index() Fremfinding af poster i underblokken udføres med macroen #Frm_Index(), der tilsvarer kontrol kommandoen Control Index. 161
Syntaksen for macroen er som vist herunder. Syntaks #Frm_Index(Bloknavn, Indexnavn, x) Bemærk igen at det er bloknavn og ikke kartoteksnavn der angives. I macroen angives som parameter to navnet på det index, der skal anvendes, når posterne skal findes. Det angives ikke hvilke felter, der skal anvendes fra blokken. Macroen finder automatisk de felter i blokken, der svarer til felterne i det angivne index. Er felterne udfyldt, kan de således anvendes til fremfinding af poster. Er de ikke udfyldt, kan der ikke findes nogen poster. Er der mere end et nøglefelt i indexet, skal alle de tilsvarende felter i blokken være udfyldt for at give resultat. Hvis det kun er et af nøglefelterne, der er udfyldt, skal det angives i macroen, så der i indexet kun ledes efter poster, der passer til dette felt. Antallet af felter angives som parameter tre, der i syntaksen er mærket med x. Bemærk! Tallet angiver hvor mange nøgler i indexet, der skal søges på fra venstre mod højre i de felter der indgår i indexet. Eksempel på anvendelse af første komponent i index SET InvenTrans.ItemNumber = InvenTable.ItemNumber #Frm_Index(InvenTrans,ItemDateIdx,1) I ovenstående eksempel fremgår det, at der kun tildeles værdi til ét felt i blokken InvenTrans, nemlig feltet ItemNumber. I macroen til blokken InvenTrans anvendes indexet ItemDateIdx, der indeholder felterne ItemNumber og Date. Da det kun er feltet ItemNumber, der er udfyldt med værdier i blokken, er der taget hensyn til dette ved i macroen at angive tallet 1, der låser indexet på første komponent. Hvis feltet Dato også var blevet tildelt værdi med SET kommandoen, og den skulle anvendes i indexet, skulle tallet ændres til 2. Eksempel på anvendelse af to komponenter i index SET InvenTrans.Date_ = 15\08\99 SET InvenTrans.ItemNumber = InvenTable.ItemNumber #Frm_Index(InvenTrans,ItemDateIdx,2) Forskellen I eksempel 1 vises alle poster til det ItemNumber, der er fremme i hovedblokken. I eksempel 2 vises også poster til varenummeret i hovedblokken, men i fremfindingen af posterne er datoen også anvendt, så der desuden kun vises poster, der har den givne dato. 162
Placering af cursor på første eller sidste af de fundne poster Når posterne er fundet med macroen #Frm_Index(), skal de vises på skærmen, men først skal det bestemmes om cursoren skal stå på den første eller den sidste af de poster, der er fundet frem. Dette udføres med en af følgende tre macroer, der er behandlet i en tidligere lektion. Kontrol macro #Frm_Search(Bloknavn) #Frm_SearchTop(Bloknavn) #Frm_SearchEnd(Bloknavn) Anvendelse Slår op på første post iflg. angivne index Slår op på første post iflg. angivne index Slår op på sidste post iflg. angivne index Skal cursoren f.eks. stå på første post anvendes følgende eksempel. Eksempel med opslag på første post #Frm_Search(InvenTrans) Initiering af nye poster i underblok Når der skal oprettes nye poster i underblokken, er det vigtigt at disse får tildelt nogle initieringsværdier (startværdier). Til dette formål skal der anvendes en trigger i underblokken, der aktiveres på det rette tidspunkt. Triggeren Init-record er den rigtige til initiering af nye poster. Triggeren Init-record Triggeren Init-Record aktiveres hver gang, der skal oprettes en ny post. Den anvendes for det meste til tildeling af værdier til felter i sin egen blok. Det kan være almindelige startværdier, f.eks. tildeling af en oprettelsesdato til et datofelt, og det kan være tildeling af værdier til nøglefelter. Tildeling af initieringsværdier til nøglefelter Nøgleværdier er i denne henseende værdier til felter, der indgår som nøgler i indexer. Tildelingen udføres med SET kommandoen som tidligere vist. Eksempel SET InvenTrans.ItemNumber = InvenTable.ItemNumber I eksemplet forudsættes det, at der må oprettes lagerposter i blokken InvenTrans. Oprettes der en ny post i underblokken på formen, aktiveres triggeren Init-record, og posten initieres med varenummeret fra hovedblokken. Feltet ItemNumber i underblokken InvenTrans tildeles værdien fra feltet ItemNumber i hovedblokken InvenTable. 163
Som regel skal der udføres initiering i Init-record af de samme felter, som tildeles værdier i Pre-record, da det er nøglefelterne. På denne måde sikres det, at der altid er sammenhæng mellem poster i underblok og hovedblok. Komplet eksempel på synkronisering Nedenstående eksempel viser en færdig synkronisering med fremfinding af poster fra triggeren Prerecord og initiering af nye poster i triggeren Init-record. Fremfinding af poster i underblok udført fra Pre-record i hovedblok SET InvenTrans.ItemNumber = InvenTable.ItemNumber #Frm_Index(InvenTrans,ItemDateIdx,1) #Frm_SearchEnd(InvenTrans) Initiering i Init-record i underblok SET InvenTrans.ItemNumber = InvenTable.ItemNumber 164
Opgaver: Synkronisering mellem blokke: Opgave 1: Synkronisering mellem to blokke Mål med opgaven At synkronisere to blokke i samme form. Beskrivelse De to blokke i formen UDLUdlånsKart, fra den forrige opgave, skal synkroniseres med hinanden, således at der altid kun vises udlånslinjer, der tilhører det udlån der aktuelt vises i hovedblokken. Forløb 1 Åben formen UDLUdlånsKart fra opgaven i forrige lektion. 2 Udfør synkronisering mellem de to blokke, så der i underblokken kun vises poster, der tilhører den aktuelle post i hovedblokken. Anvend UDLUdlVarIdx. 3 Udfør initiering af nye poster i underblokken således, at de altid tildeles nødvendige nøgleværdier. I dette tilfælde felterne UdlånsNummer og DebitorKonto. 4 Opret et par nye udlån med tilhørende linjer. 5 Afprøv om de rigtige linjer vises, når du bladrer i udlånsordrerne. 6 Åben listbilledet til UDLUdlånsPost og kontrollér at felterne UdlånsNummer og DebitorKonto er udfyldt. Hvis de ikke er det, skal du foretage de nødvendige ændringer i synkroniseringen. 165
18. 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 (CustTable) 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. 166
Komponenter i et direkte opslag Denne værdi er kendt og kan evt. stamme fra det aktuelle kartotek Kartoteksnavn [IndexNavn, Udtryk]. Feltnavn Disse tre værdier tilhører alle det kartotek, der skal slås op i. Bemærk placeringen af de firkantede paranteser, kommaet og punktummet. Kommaet kan evt. erstattes af to lighedstegn som vist herefter. Syntaks for direkte opslag med lighedstegn Kartoteksnavn[IndexNavn == Udtryk].Feltnavn Syntaks for direkte opslag med komma Kartoteksnavn[IndexNavn, Udtryk].Feltnavn De enkelte komponenter behandles i nedenstående skema. 167
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 paranteser omkring indexnavnet og udtrykket. Komma Punktum Når der skal hentes en bestemt værdi i opslagskartoteket, 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. Der henvises til programmeringsmanualen, for yderligere information om direkte opslag og anvendelse med Index. 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. 168
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. Eksempel på XAL kørsel med direkte opslag efter bynavn Search CustTable PRINT Name PRINT Adress1 PRINT ZipCity,, ZipCode[ZipCodeIdx, ZipCode].CityName PRINT END PAUSE 169
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. 170
Opgaver: Direkte opslag Opgave 1: Direkte opslag til feltet ItemName Mål med opgaven At benytte direkte opslag for at hente værdier fra andre kartoteker. Beskrivelse I formen UDLUdlånsKart skal det virtuelle felt VareNavn tildeles varenavnet fra lagerkartoteket. Tildelingen skal udføres med direkte opslag i InvenTable. Da feltet er virtuelt, indeholder det aldrig automatisk nogen værdi, hvorfor det både skal opdateres, når der bladres mellem udlånsordrer i hovedblokken, og når der oprettes nye varenumre i underblokken. Forløb 1 Åben formen UDLUdlånsKart fra forrige opgave 2 Indsæt direkte opslag i triggeren på underblokken, så feltet VareNavn altid opdateres, når der bladres mellem posterne i hovedblokken. Dvs. hver gang en ny post er kommet frem på skærmen. 3 Indsæt direkte opslag i triggeren på feltet, så feltet VareNavn altid opdateres når der oprettes nye udlånslinjer, eller der ændres varenummer på en linje. 4 Godkend og afprøv formen. 171
Opgave 2: Direkte opslag til UdlejningsVærdi og Forsikringsværdi Mål med opgaven At benytte direkte opslag for at hente værdier fra andre kartoteker Beskrivelse I formen UDLUdlånsKart skal kartoteksfelterne UdlejningsVærdi og ForsikringsVærdi i blokken UDLUdlånsPost ikke indtastes manuelt. Felternes værdi skal indsættes automatisk, hver gang der oprettes et nyt varenummer i en af udlånslinjerne. Værdien beregnes ved at tage kostprisen i lagerkartoteket og forhøje med den procentsats, der svarer til feltet. Værdien udregnes ved hjælp af den nye macro med navnet #UDLSatser. Da felterne er databasefelter, gemmes de beregnede værdier i databasen. Derfor behøver beregningen kun at blive udført, hver gang der oprettes en ny vare eller ændres varenummer på en af udlånslinjerne. Forløb 1 Åben blokken UDLUdlånsPost i formen UDLUdlånsKart fra forrige opgave. 2 Anvend macroen #UDLSatser til beregning af værdien for feltet UdlejningsVærdi. Benyt direkte opslag til at hente værdierne til de to parametre der skal indsættes i macroen. Parameter 1: Parameter 2: Indsættes i feltet: Indsættes i triggeren: 3 Anvend macroen #UDLSatser til beregning af værdien for feltet ForsikringsVærdi. Benyt direkte opslag til at hente værdierne til de to parametre der skal indsættes i macroen. Parameter 1: Parameter 2: Indsættes i feltet: Indsættes i triggeren: 4 Godkend og afprøv formen. 172
19. 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 i C5 Listemenuer er menuer i form af menupunkter opsat som en liste under hinanden. 173
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 XAL og C5, idet de kan tilknyttes f.eks. en procestaste eller en hvilken som helst anden menu. 174
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. 175
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. 176
Eksempel 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. Undermenuer Undermenuer oprettes ved at vælge processen Undermenu og give menupunktet et navn. I menuen efterfølges navnet automatisk af tegnet >. 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...: 177
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 fra lokalmenuen i formen CustTable kalde formen UDLUdlånsKart. DebKart Lokal menu UDLUdlånsKart Forløb 1 Åben formen CustTable og opret et nyt menupunkt i lokalmenuen. Menupunktet skal kalde formen UDLUdlånsKart. 2 Afprøv det nye menupunkter som følger: 3 Åben skærmbilledet debitor og foretag et kald af UDLUdlånsKart. 4 Du skal kunne se og bladre i alle debitorers udlån. 178
20. 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 179
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 i de efterfølgende afsnit. 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. 180
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 OrdreKart 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> 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. 181
Åbningen af bufferen skal da se ud som følger. Eksempel EXTERN SalesTable 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 til form Buffer OrdreKart Tildeling med SET fra buffer felter til felter i blok i form Hovedform Ordrekartotek Underform Ordrelinjer Lokal menu EXTERN SalesTable 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> I eksemplet fra afnittet om EXTERN med kald af ordrelinjer fra ordrekartoteket, vil SET kommandoen da se ud, som følger. 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. Ved hjælp af macroen #Frm_Index() kan de rigtige poster herefter findes frem. 182
#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 OrdreKart Posterne findes med #Frm_Index(Blok, Index, 1) Hovedform Ordrekartotek Lokal menu Ordrelinjer Underform EXTERN SalesTable 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 SalesLine fra SalesTable, er der f.eks. kun én kendt værdi, der kan hentes i bufferen og som samtidig kan anvendes til fremfinding af posterne i SalesLine. Det er OrdreNummeret (Number), da dette felt findes i begge kartoteker. OrdreNummeret fra bufferen bliver da også med SET kommandoen tildelt OrdreNummeret i blokken 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. Eksempel #Frm_Index(SalesLine, NumTransLineIdx, 1) 183
Blokken SalesLine er tilknyttet et kartotek SalesLine, der har et index NumTransLineIdx, der består af 4 komponenter. Indexnavn NumTransLineIdx Komponenter (felter) i indexet Number, Transaction, LineNumber, RowNumber Da det kun er den første komponent i indexet dvs. Number, 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. 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. Pre-form EXTERN SalesTable SET SalesLine.Number = SalesTable.Number 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. Init-record EXTERN SalesTable 184
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. Komplet eks. på synkronisering af forms Synkronisering i triggere i vinduet og blokke Buffer OrdreKart Triggere i vinduet Init Error Pre-form Hovedform Ordrekartotek Lokal menu Underform Ordrelinjer (Vindue) (Blok) Eksemplet indeholder kun triggere, der anvendes i underformen, idet hovedformen ikke har nogen ændringer i sine triggere. Eksemplet er vist på næste side. Triggere i blok Komplet eksempel med triggere og tilhørende kode Trigger i vinduet Init Anvendelse #MacroLoad(FORMS) Init-record Pre-form EXTERN SalesTable SET SalesLine.Number = SalesTable.Number #Frm_Index(SalesLine, NumTransLineIdx, 1) #Frm_SearchEnd(SalesLine) Error #FormError Triggere i blokken Anvendelse 185
Init-record EXTERN SalesTable SET SalesLine.Number = SalesTable.Number SET SalesLine.Account = SalesTable.Account 186
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 to forms. Huskelister Form Triggere i vinduet Form Triggere i blokke Beskrivelse Efter oprettelse af et nyt menupunkt i lokalmenuen, i formen CustTable til kald af formen UDLUdlånsKart, skal de to forms synkroniseres med hinanden. I formen UDLUdlånsKart skal der således kun vises poster, der tilhører den aktuelle debitor, der kaldes fra. Forløb 1 Åben formen til UDLUdlånsKart og opsæt synkroniseringen til CustTable. Benyt indexet UDLDebDatTypIdx til opslag og start på første post i indexet. HUSK også tildeling af værdier til nye poster. 2 Afprøv synkroniseringen som følger: 3 Åben formen CustTable og foretag et kald af UDLUdlånsKart. Du må kun kunne se og bladre i udlån til den aktuelle debitor. 4 Opret et nyt udlån på en debitor og indsæt 2-3 udlånslinjer. 5 Gentag punkt 4 et par gange med en anden debitor. 6 Afprøv om du stadig kun kan bladre i udlån og udlånslinjer der tilhører den aktuelle debitor. 7 Åben listbilledet til UDLUdlånsPost og kontrollér at felterne DebitorKonto og UdlånsNummer er udfyldt. Hvis de ikke er det, skal du foretage nødvendige ændringer i synkroniseringen 187
21. Tabsider og gruppebokse Mål med lektionen Formålet med denne lektion er, at give oversigt over tabsider og gruppebokse, samt at vise hvordan de anvendes i henholdsvis den tegnbaserede og den GUI baserede udgave af Navision XAL og C5. Efter denne lektion skal kursisterne kunne: Oprette tabsider Oprette gruppebokse. Tabsider Tabsider er kun henvendt til GUI versionen, hvor forms kan inddeles i flere tabsider med hver sin overskrift. Tabsider er blot almindelige sider i forms. De kan dog nu få tildelt overskrifter, der vises i fanerne på tabsiderne. Ved at dele en forms felter eller blokke over flere sider, kommer formen mere til at ligne Windows overfladen. Der er dog den bieffekt ved tabsider, at der i den tegnbaserede udgave kommer lige så mange sider, som der er tabsider. Desuden kan de tildelte overskrifter ikke ses i denne udgave. Det eneste der viser, at der er flere sider, er sidetallene i øverste venstre hjørne. Det overblik der gives i GUI versionen, følger altså ikke med i den tegnbaserede version. Tabsider oprettes som hidtil i den tegnbaserede udgave af C5, da det kun er her, der kan oprettes forms. De oprettes ved at danne en ny side med PAGE UP eller PAGE DOWN. Når siden er fremme på skærmen, gives den en overskrift med CTRL+F8. Når forms er i drift skiftes der mellem sider og tabsider med ALT+F7 og ALT+F8. Dette gælder begge versioner. Når forms er under udarbejdelse i den tegnbaserede udgave, skiftes der mellem siderne med PAGE UP og PAGE DOWN. Tabsider i GUI og almindelige sider i tegnbaseret udgave 2/2 Side 1 Side 2 1/2 Tabsider Almindelige sider 188
Bemærk! Overskrifterne og tabsiderne kan kun ses i GUI versionen. I den tegnbaserede version kommer der en ny side for hver tabside. Grupppebokse Gruppebokse eller groupboxes anvendes til at opdele felter i skærmbilleder i mindre enheder, hvor felterne f.eks. grupperes efter indhold. Boksene er ikke andet end almindelige bokse, der tegnes med ALT+T. Der er dog nu tilføjet muligheden for at vælge forskellige rammetyper og der er mulighed for at skrive en tekst i toppen af rammen. Tekst og type vælges med ALT+Y, medens boksen er i gang med ALT+T. Teksten står altid i toppen, men kan venstrestilles, højrestilles eller centreres i forhold til rammen. Boksene er kun til visuel kontrol. De har således ingen indflydelse på data, der indtastes eller vises i formen. Boksene optræder forskelligt, afhængigt om de vises i den tegnbaserede eller den GUI baserede udgave af Navision XAL eller C5. Kassernes udseende i tegnbaseret og GUI baseret C5 Type Tegnbaseret GUI baseret 0 Ingen synlig ramme Flad kasse med sort streg. Tekst i rammen. 1 Enkelt streg (som 0) 2 Dobbelt streg Ophævet kasse. Tekst i rammen. 3 (som 2) Nedsænket kasse. Tekst i rammen. 4 (som 1) Flad kasse med fordybet streg. Tekst i rammen. 5 (som 2) (som 4) 6 (som 1) Flad kasse med sort streg. Tekst i sort felt i tekstens længde. 7 Fed streg Flad kasse med sort streg. Tekst i sort felt i kassens længde. 8 (som 1) Flad kasse med grå streg. Tekst i gråt felt i tekstens længde. 9 (som 7) Flad kasse med grå streg. Tekst i gråt felt i kassens længde. Som det fremgår er det kun type 0, 1, 2 og 7, der umiddelbart kan finde anvendelse i den tegnbaserede udgave af C5. Dette gælder i det mindste, når de grå standardfarver anvendes i forms. Bemærk! Boksene er kun beregnet til at gruppere felter eller tekst i formen, de har ingen indflydelse på formens funktioner. I det efterfølgende vises, hvilke gruppebokse der dannes og hvordan de ser ud i den GUI baserede og den tegnbaserede version. 189
Eksempel på gruppebokse i GUI versionen Eksempel på gruppebokse i den tegnbaserede version 190
22. USRKEY triggere Formål Formålet med denne lektion er at lære deltagerne at anvende USRKEY triggere i forms. Efter lektionen skal kursisterne kunne: Anvende USRKEY triggere til indtastning af XAL kode Aktivere USRKEY triggere vha. tastetryk Aktivere USRKEY triggere fra andre triggere vha. kontrol macroer. Generelt USRKEY triggere er som alle andre triggere editorbokse til indtastning af XAL kode. De aktiveres dog ikke automatisk, som de øvrige triggere i forms, men kun vha. taster eller kald fra andre triggere. Lektionen består af følgende afsnit: Triggere Taster Kontrol kommandoer Styring af XAL kode Form macroer. Triggere I alle blokke i forms findes der er 10 USRKEY triggere. USRKEY triggere i blokke i forms Triggere USRKEY0 USRKEY1 USRKEY2 USRKEY3 USRKEY4 USRKEY5 USRKEY6 USRKEY7 USRKEY8 USRKEY9 191
Triggerne er, som alle andre triggere, editorboxe til indtastning af XAL koder. De kan benyttes til mange forskellige formål f.eks. beregninger. Triggerne befinder sig i de enkelte blokke. USRKEY triggere i blokke FORM Opsætning for blok Blok formler USRKEY0 SH+F6 ENTER USRKEY9 Blok formler: Formler Taster Nogle taster kan anvendes sammen med USRKEY triggerne, idet disse triggere er anderledes end de øvrige triggere. USRKEY triggerne kan kun aktiveres med tastetryk eller ved kald fra andre triggere. Taster bundet til USRKEY triggere Tasterne ALT+0 til ALT+9 er bundet sammen med de tilsvarende USRKEY triggere. Taster og USRKEY triggere Taster Triggere ALT+0 ALT+1 ALT+2 ALT+3 ALT+4 ALT+5 ALT+6 ALT+7 ALT+8 ALT+9 USRKEY0 USRKEY1 USRKEY2 USRKEY3 USRKEY4 USRKEY5 USRKEY6 USRKEY7 USRKEY8 USRKEY9 192
Bindingen mellem taster og USRKEY triggere er permanent. Det betyder, at det ikke er nødvendigt selv at udføre nogen programmering for at binde tasterne til triggerne. I USRKEY triggerne skal der blot indtastes den XAL kode, der er behov for, så virker det. Taster til én blok Det er nemt at anvende tasterne sammen med USRKEY triggerne i én blok. Prøv at indtaste følgende kode i formen CustTable i blokken CustTable i triggeren USRKEY3. Eksempel SET BOX(1, Hej, med dig!\ndu tastede ALT+3,0) Herefter er det blot at starte formen CustTable, og prøve at taste ALT+3. Så vises følgende box midt på skærmen. Resultat Hej, med dig! Du tastede ALT+3 OK Taster til flere blokke Det er også nemt at anvende tasterne sammen med USRKEY triggerne i flere blokke. Tasterne er bundet til USRKEY triggerne i den blok, cursoren befinder sig i. Der er ikke nogen forskel på kodning i triggerne og der skal heller ikke kodes noget for at tasterne fungerer. Det er lige så nemt som i ovenstående eksempel. Da de samme USRKEY triggere findes i hver blok i formen, betyder det, at de samme taster kan have forskellige betydning afhængigt af, hvilken blok cursoren befinder sig i. Eksempel USRKEY2 kan i én blok udføre et kald af et skærmbillede, medens samme trigger i en anden blok udfører en beregning. Når cursoren står i den første blok og der tastes ALT+2 åbnes skærmbilledet. Når der skiftes til den anden blok og der igen tastes ALT+2 udføres beregningen. På næste side vises et par eksempler på andre ting der kunne kodes i USRKEY triggere. Taster med eksempler Kald af anden proces I USRKEY triggerne kan der indlægges kald af andre processer. 193
Der kunne f.eks. bindes en rapport til en af tasterne ved at kalde processen Rapport-Afvikling. Eksempel PROCESS 15 REPORT=CustAccStatement OUTPUT=Printer,getopts- Indsættes ovenstående kode i USRKEY7 i en form f.eks. CustTable, udskrives rapporten CustAccStatement (Kontoudtog), hver gang der tastes ALT+7 i formen. Kald af båndoptager I USRKEY triggere kan der også indlægges kald af båndoptageren. Hvis en virksomhed har forskellige varetyper, der hver for sig indeholder mange ens udfyldte felter på de enkelte varer, kunne der oprettes forskellige båndoptagelser til hver varetype. Ved at afspille båndoptagelsen når der oprettes en ny vare, udfyldes de indspillede felter automatisk, hvorefter resten af felterne udfyldes manuelt. I stedet for at starte båndoptageren hver gang og vælge optagelse at afspille, kan afspilningen indlægges i en USRKEY trigger, der startes med et tastetryk. Hver indspilning bindes til sin egen USRKEY taste. Eksempel PROCESS 8 Mode=execute name=varetype_1 Proces 8 er båndoptageren. Parameteren Mode=execute viser at båndoptageren skal eksekveres, og name=varetype_1 viser navnet på den indspilning, der skal udføres. Kontrol kommandoer Triggerne kan også aktiveres eller kaldes fra andre triggere med specielle forms kontrol kommandoer og macroer. 194
Kontrol kommandoer og macroer til kald af USRKEY triggerne Triggere Kommandoer Macroer USRKEY0 CONTROL USRKEY0 #Frm_USRKEY(bloknavn, 0) USRKEY1 CONTROL USRKEY1 #Frm_USRKEY(bloknavn, 1) USRKEY2 CONTROL USRKEY2 #Frm_USRKEY(bloknavn, 2) USRKEY3 CONTROL USRKEY3 #Frm_USRKEY(bloknavn, 3) USRKEY4 CONTROL USRKEY4 #Frm_USRKEY(bloknavn, 4) USRKEY5 CONTROL USRKEY5 #Frm_USRKEY(bloknavn, 5) USRKEY6 CONTROL USRKEY6 #Frm_USRKEY(bloknavn, 6) USRKEY7 CONTROL USRKEY7 #Frm_USRKEY(bloknavn, 7) USRKEY8 CONTROL USRKEY8 #Frm_USRKEY(bloknavn, 8) USRKEY9 CONTROL USRKEY9 #Frm_USRKEY(bloknavn, 9) Anvendes det samme stykke XAL kode ofte i mange forskellige triggere i en form, kan det med fordel lægges i bare én af USRKEY triggerne. XAL koden i den pågældende USRKEY trigger, kan herefter kaldes fra en hvilken som helst anden trigger i formen. Hvis samme XAL kode f.eks. er fordelt på mange forskellige triggere og der skal rettes et eller andet, kan der være fare for at ændringerne glemmes i en af triggerne. Fordelen er klar. Ved at lægge XAL koden i bare én trigger er det meget nemmere at vedligeholde den. Kald af USRKEY trigger Når USRKEY triggere skal kaldes fra andre triggere, anvendes en af kontrol kommandoerne eller macroerne i ovenstående skema. I alle tilfælde er der to ting der skal angives i kaldet: Hvilken blok triggeren befinder sig i Triggerens nummer Kald med kontrol kommando Syntaks CONTROL USRKEY0 <bloknavn> Ovenstående kommando medfører at USRKEY0 triggeren i blokken <Bloknavn> kaldes. Syntaksen er analog for de øvrige USRKEY triggere. 195
Bemærk! Anvendes control kommandoen, er det frivilligt at angive blokkens navn. Hvis den ikke angives, kaldes USRKEY triggeren i den aktive blok. Kald med kontrol macro Syntaks #Frm_USRKEY(<bloknavn>, <nummer>) Ovenstående macro medfører at USRKEY triggeren <nummer> i blokken <bloknavn> kaldes. Styring af XAL kode i triggerne USRKEY triggere kan som vist aktiveres på to forskellige måder: Med tasterne ALT+0 til ALT+9 Med kontrolkommandoer og macroer. Blokering af tastetryk Det er ikke altid XAL koden, i en trigger, må udføres, når der trykkes på den tilhørende taste. Tastetrykket kan blokeres ved at indlægge en kontrol i starten af koden i USRKEY triggeren. Til kontrollen anvendes systemvariablen &CMD, der betyder &Command. Variablen indeholder altid den sidste taste, der er trykket på. Ved at undersøge om der er trykket på den taste der tilhører den aktuelle USRKEY trigger, kan der træffes afgørelse om, om koden i triggeren må udføres. Eksempel (triggeren USRKEY3) IF &CMD == USRKEY3 THEN RETURN 0 ENDIF {Øvrig kode der kun skal udføres} {ved kald fra andre triggere. } I ovenstående eksempel undersøges i IF sætningen om systemvariablen &CMD indeholder USRKEY3. Gør den det udføres kommandoen RETURN 0, der stopper afviklingen af XAL koden i triggeren og vender tilbage til skærmbilledet. På denne måde kan det blokeres, at koden i triggeren udføres når der trykkes på tasten. 196
Tastetryk og kald fra andre triggere samtidig I nogen tilfælde kan det være ønskeligt, at en URSKEY trigger skal udføre én ting, når der trykkes på den tilhørende taste og en anden ting når triggeren kaldes med control kommandoen eller macroen fra en anden trigger. Kontrollen, der blev nævnt i foregående eksempel, anvendes også i dette tilfælde. Eksempel (USRKEY3) IF &CMD == USRKEY3 THEN PROCESS 8 Mode=execute name=varetype_1 RETURN 0 ENDIF SET &SaldoIalt = 0 SEARCH CustTable USING AccountIdx #Add(&SaldoIalt,BalanceMST) END Udføres ved tryk på ALT+3 Udføres ved kald fra andre triggere I eksemplet undersøges det, i betingelsen i IF sætningen, om systemvariablen &CMD indeholder USRKEY3. Gør den det, er det ensbetydende med, at betingelsen er opfyldt og XAL koden i IF sætningen udføres. Først udføres Process 8, der er kald af båndoptageren. Derefter udføres RETURN 0, der afslutter afvikling af koden i triggeren og vender tilbage til skærmbilledet. Hvis triggeren kaldes fra en af de andre triggere, udføres kontrollen i IF sætningen også. Da der ikke er trykket på ALT+3, indeholder &CMD ikke USRKEY3. Betingelsen er altså ikke opfyldt. IF sætningen springes over og der fortsættes med den øvrige XAL kode i triggeren. I eksemplet sættes variablen &SaldoIalt = 0. Derefter gennemløbes CustTable og variablen optælles med feltet BalanceMST. HUSK! Variablen &SaldoIalt kan lige så godt være et virtuelt felt i en form, idet virtuelle felter også foranstilles med & tegnet, når de anvendes i XAL kode. Tidspunkter for aktivering af øvrige triggere Når USRKEY triggerne kaldes fra andre triggere for at udføres som subrutiner, er det vigtigt at kende til, hvornår de andre triggere aktiveres i løbet af en forms åbningstid. Nedenstående skema viser eksempler på nogle få triggere og deres aktiveringstidspunkter. 197
Aktiveringstidspunkt for triggere i forms Trigger Placering Aktiveringstidspunkt Init Opsætning Når formen åbnes Pre-Record Blok Når der skiftes til ny post Post-Insert Blok Når der oprettes en ny post Post-Delete Blok Når der slettes en post Post-Update Blok Når der ændres i en post Post-Change Felt Når der ændres i feltet, og før posten godkendes Form macroer COMMIT COMMIT kommandoen bruges til at opdatere kartoteket med værdierne i de felter der er vist i alle blokke. Normalt bliver kartoteket først opdateret, dvs. der køres en bagvedliggende COMMIT kørsel, når man fra en: Enkelt Record blok skifter blok eller fra en Multi-Recod Blok forlader et felt. Til tider kan det være hensigtsmæssigt, at kartoteket opdateres straks efter, at der er indtastet i et felt på blokken i formen. Dette gøres med COMMIT indsat i en eller flere af feltets triggere og/eller i en eller flere af blokkens triggere, alt afhængigt af det ønskede resultat. Skal man f.eks. foretage et gennemløb af et kartotek, via en SEARCH kommando, er det hensigtsmæssigt, at kartoteket er fuldt opdateret med alt data, også nyt indtastet data. Syntaks #Frm_Commit(<Bloknavn>,CHANGE) CHANGE parameteren er valgfrit. Hvis den sættes i forlængelse af bloknavnet, bliver kartoteket kun opdateret, hvis der er foretaget en ændring i selve feltets værdi. REPAINT Repaint anvendes til at genindlæse hele formen. Den aktiverer alle ændringer som f.eks. felt længde ændringer osv og genindlæser formen. Kommandoen kan bl.a. bruges til notater i Forms, hvor den indsættes efter macroen #Frm_NoteMark(Bloknavn,Notatfeltnavn), hvis denne ligger EFTER #Frm_Index(BlokNavn, Index) og #Frm_Search(BlokNavn) macroerne. Dette skyldes, at formen skal genindlæses efter at notatmacoerne er brugt i Pre-Form triggeren. Denne genindlæsning foretages af #Frm_Index(BlokNavn, Index) og #Frm_Search(BlokNavn) macroerne. Bliver notatmacroerne lagt EFTER disse macroer, skal der derfor en REPAINT kommando til. 198
Syntaks #Frm_Repaint Bemærk, at der ikke skal specificeres bloknavn idet en REPAINT genindlæser hele Formen. 199
Opgaver: USRKEY triggere Opgave 1: USRKEY triggere med beregninger Mål med opgaven At benytte USRKEY triggere til fælles beregninger At aktivere USRKEY triggere fra andre triggere vha. kontrol macroer. Beskrivelse I formen UDLUdlånsKart har du indsat to virtuelle felter i form af ForsikringsSum og LejeSum. I opgaven skal du sørge for, at begge felter til enhver tid indeholder den samlede værdi for alle linjerne i den nederste blok. Beregningen skal udføres i en af USRKEY triggerne, der også skal anvendes til opdatering af hvert af de to felter. USRKEY triggeren skal herefter kaldes fra nogle af de andre triggere, der er nødvendige, for at opdateringerne finder sted på de rigtige tidspunkter som følger: Tidspunkt Trigger / blok / felt Efter formen åbnes og første post vises på skærmen Efter linjerne vises på skærmen Efter der indsættes en ny linje Efter det slettes en linje Efter der ændres varenummer på en linje Efter ændring af varenummer uden at linjen forlades Efter der ændres status på en linje Husk også at anvende macroen #Frm_Commit til opdatering af kartoteket. 200
Forløb 1 Åben formen UDLUdlånsKart. 2 Vælg triggeren USRKEY5 og indsæt kode i form af en søgeløkke på UDLUdlånsPost. Udfør en sammentælling af felterne ForsikringsVærdi og UdlejningsVærdi fra UDLUdlånsPost. Sammentællingen foregår i de virtuelle felter &ForsikringsSum og &LejeSum. Medtag kun varelinjer med status = Udlånt. 3 Vælg nu hver af triggerne fra skemaet herover og indsæt et kald af USRKEY5 i hver af dem. Husk at indsætte #Frm_Commit, hvor det er nødvendigt, for at kartoteket opdateres inden opsummeringen. 4 Godkend og afprøv formen. 5 Opret nogle ordrer med flere linjer på hver ordre og afprøv om opsummeringen udføres korrekt. 201
Opgave 2: Taster til én blok Formål med opgaven At anvende tasten der er knyttet til USRKEY1, så der kaldes en form. Beskrivelse I USRKEY triggeren der tilhører tastekombinationen ALT+1, skal der indlægges kode til at hente skærmbilledet med lagerbeholdninger, så brugeren kan gå direkte ind i billedet og se hvor mange der er på lager af en given vare. Billedet skal kun kunne kaldes fra blokken med varelinjerne. Forløb 1 Åben formen UDLUdlånsKart i blokken UDLUdlånsPost. 2 Vælg triggeren USRKEY1, og indsæt kode til kald af formen LagerBeholdning. Vælg den rigtige blok idet formen kun skal kaldes fra linjerne. Koden er som flg.: Proces 17 Form=InventorySum PARM= +ItemNumber 3 Godkend og afprøv formen ved at stå på forskellige udlånslinjer og taste ALT+1. 202
23. Notater i forms Formål Formålet med denne lektion er at give deltagerne kendskab til opsætning af notatmuligheder i forms og vise hvordan dette udføres vha. macroer. Efter lektionen skal kursisterne kunne: Opsætte notater på forms med én og flere blokke Oprette en lokal procestaste til kald af notater Anvende de macroer der benyttes til behandlingen af notater på skærmbilleder Anvende virtuelle felter til markering af om notater eksisterer. Generelt Der kan oprettes notater i næsten alle skærmbilleder i C5. Notater oprettes på poster i skærmbilleder ved at taste ALT+N, der åbner et notatvindue til indtastning af teksten i notatet. Når notatet er indtastet og godkendt lukkes vinduet igen. For at vise om den aktuelle post har et notat eller ikke, er der på skærmbilledet et notatfelt, der kan vise dette med et lille n eller et stort N. Notatvinduet kan også åbnes ved at klikke i notatfeltet med musen, hvis denne benyttes. Selve notatfunktionaliteten bygges op vha. et sæt macroer, der findes i macrobiblioteket FORMS. I procedureoversigten, på næste side, vises de trin, der skal udføres for at få notatfunktionaliteten til at fungere. Procedure for opbygning af notater i forms Oprette procestaste Oprette virtuelt notatfelt Indsætte macro til notatvindue Indsætte macro til ændring af mærke i notatfelt Indsætte macro til ajourføring af notatfelt ved ændringer Indsætte macro til ajourføring af notatfelt ved bladring Indsætte macro til åbning af notatvindue med mus 203
På de efterfølgende sider beskrives de enkelte procedurer. Procestasten ALT+N Procestasten ALT+N anvendes som standard til kald af notater i C5. Generelt kan der benyttes en hvilken som helst taste. Vær opmærksom på at der findes både globale og lokale procestater. Til notater i forms anvendes der lokale procestaster, der oprettes i formen med ALT+P. Disse overstyrer de globale procestaster, der er oprettet i Generelt/Tilpasning/Taster/ Processer. Oprettelse af en lokal procestaste ligner oprettelsen af et menupunkt på en lokal menu, idet det angives, hvilken proces og parametre der anvendes. I nedenstående skema vises indholdet i felterne under opbygning af en procestaste til notater. Opbygning af lokal procestaste til notater Opbygning af lokalprocesser ALT+P Proces Parametre til proces Hjælpetekst Tast Form-afvikling Form=Notes (eller kun Notes) Notat ALT+N Proces Vinduet der vises på skærmen, når der tastes ALT+N, er i virkeligheden en form, der hedder Notes. Processen der skal kaldes og afvikles, er derfor Form-afvikling. Parametre til proces Formen der åbnes, hedder Notes. I parametre til processen angives derfor navnet på formen, dvs. Form=Notes. Hele behandlingen af notater i skærmbilleder foregår vha. macroer. I disse er det indkodet, at de i proceskaldet skal se efter ordet Notes i feltet parametrene til proces. Derfor er det nok blot at skrive ordet Notes i parametrene i stedet for Form=Notes. Virtuelt notatfelt For at se om der er notater til en postering, skal der oprettes et Notatfelt, der med et lille n eller et stort N kan markere, om der er et notat. Notatfeltet Notatfeltet skal oprettes som et virtuelt heltalsfelt på formen og kan i sig selv kun vise tallene 0 eller 1. 204
Indhold i notatfeltet Værdi Betydning 0 Notat eksisterer ikke 1 Notat eksisterer Da det ikke er meningen at Notatfeltet skal vise værdien som 0 eller 1, men som n og N, skal der foretages en forandring af selve Notatfeltet. Dette udføres med macroen #Frm_NoteMark. Macroer til notater #NotesPreKey Macroen #NotesPreKey styrer selve notatvinduet. Som nævnt tidligere er notatvinduet i virkeligheden en form, der hedder Notes og den findes i udviklingsmenuen sammen med de øvrige forms. Det er samme form, der benyttes til notater overalt i C5, men macroen #NotesPreKey kan håndtere den på forskellig vis, afhængig af hvor den benyttes. #NotesPreKey giver mulighed for at bestemme hvilken blok og dermed også hvilket kartotek, notater skal tilknyttes. Desuden gives der mulighed for at bestemme størrelse, placering og tekst i notatvinduets ramme. Macroen afvikles kun hvis proceskaldet, i feltet Parametre til proces, indeholder Form=Notes eller bare ordet Notes. Syntaks #NotesPreKey(Bloknavn,Bredde,Højde,Kolonne,Linje, Tekst ) Forklaring til syntaks for #NotesPreKey Parametre Forklaring Bloknavn Bredde Højde Kolonne Linje Tekst Navnet på blokken hvori notatet anvendes Notatvinduets bredde i kolonner Notatvinduets højde i linjer Den kolonne i formen som notatvinduets øverste venstre hjørne skal starte i Den linje i formen som notatvinduets øverste venstre hjørne skal starte i Den tekst der skal stå i notatvinduets ramme Eksempel #NotesPreKey(CustTable,78,10,1,13, Notat på debitor ) 205
I ovenstående eksempel knyttes notatet til blokken CustTable. Notatvinduet er 78 kolonner bredt og 10 linjer højt. Notatvinduets øverste venstre hjørne placeres i formen i kolonne 1 linje 13. Teksten i notatvinduets ramme er Notat på debitor. Nedenstående illustrationen viser opsætningen af notatvinduet med placering, størrelse osv. Opsætning af notatvindue Placering: Notatvinduets øverste venstre hjørne angives med kolonne og linje nummer Form Blok 1 Blok 2 Tekst i ramme Notatvindue Blok: Det angives hvilken blok notatvinduet tilhører Størrelse: Højde og bredde på notatvinduet angives Triggeren PreKey Navnet #NotesPreKey viser, at macroen skal indsættes i triggeren PreKey i formen i Opsætning af vinduet. Pre-key triggeren afvikles hver gang, der trykkes på en tilfældig procestaste. Indsættes macroen #NotesPreKey i triggeren Pre-key, udføres den derfor hver gang, der tastes ALT+N, hvor ved notatvinduet åbnes. Trigger Pre-key Macro #NotesPreKey Klar til indtastning af notater Efter oprettelse af en lokalprocestaste og indsættelse af #NotesPreKey i triggeren Pre-key, kan der indtastes notater i et skærmbillede. Det kan dog ikke ses på skærmbilledet, om der eksisterer et notat eller ej. Dette beskrives i de følgende afsnit. 206
#Frm_NoteMark #Frm_NoteMark indsættes for at ændre mærket i det virtuelle notatfelt. For at få notatfeltet til at vise bogstaverne lille n og store N i stedet for tallene 0 og 1, indsættes macroen #Frm_NoteMark. Indhold i notatfeltet efter #Frm_NoteMark Mærke Betydning n N Notat eksisterer ikke Notat eksisterer Macroens navn siger ikke så meget om, hvilken trigger den anvendes i, men måske mere lidt om hvad den anvendes til. Syntaks #Frm_NoteMark(BlokNavn,FeltNavn) I parametrene til macroen angives hvilket felt, der skal ændres markering i og hvilken blok feltet befinder sig i. Det fremgår af syntaksen herover, at blokkens navn angives først og derefter feltets navn. De to værdier adskilles med komma. Eksempel #Frm_NoteMark(CustTable,Notes) I ovenstående eksempel hedder det virtuelle heltalsfelt Notes og det er tilknyttet blokken CustTable. Feltet behøver ikke nødvendigvis at hedde Notes. Macroen indsættes i triggeren Pre-form. Triggeren Pre-form #Frm_NoteMark indsættes i Pre-form triggeren, der er den anden trigger, der udføres efter Init, når formen startes. Dette medfører at notatfelterne vises rigtigt med bogstaverne i stedet for tallene. Da det er Pre-form triggeren vises det korrekt allerede, når den første post dukker op på skærmen. Trigger Pre-form Macro #Frm_NoteMark #NotesPostKeyMark #NotesPostKeyMark anvendes til at ajourføre notatfelter ved ændringer. Hver gang notatvinduet har været åbnet med ALT+N, skal det virtuelle notatfelt ajourføres med enten et lille n eller et stort N, afhængig af om vinduet er tomt eller udfyldt når det lukkes. Dette sker ikke automatisk, men udføres med macroen #NotesPostKeyMark. 207
Med #NotesPostKeyMark undersøges om notatvinduet er tomt eller udfyldt og notatvisningsfeltet sættes til at vise enten n eller N. Det engelske ord Mark i macroens navn viser, at den anvendes til at markere, om der er et notat eller ikke. Syntaks #NotesPostKeyMark(BlokNavn,FeltNavn) I parametrene til macroen angives navn på notatfelt, der skal ajourføres og hvilken blok feltet befinder sig i. Det fremgår af syntaksen at blokkens navn angives først og derefter feltets navn. De to værdier adskilles med komma. Eksempel #NotesPostKeyMark(CustTable,Notes) I eksemplet er det blokken CustTable og feltet Notes, der opdateres, når notatvinduet afsluttes og godkendes. Triggeren Post-key Ordet PostKey i macroens navn angiver, at macroen skal indsættes i triggeren Post-Key. Triggeren Post-key aktiveres netop efter at proceskaldet er afsluttet, dvs. efter at vinduet er blevet lukket. Trigger Post-key Macro #NotesPostKeyMark #NotesMark #NotesMark anvendes til at ajourføre notatfelter ved bladring mellem poster. Notatfeltet er virtuelt og findes kun på selve formen. Det skal derfor ajourføres, når der ændres i notaterne og når der bladres mellem posterne. Det er faktisk hele tiden nødvendigt, at undersøge om den aktuelle post har et notat eller ikke, for at vide hvordan notatfeltet skal ajourføres. Undersøgelsen og opdateringen af feltet skal udføres hver gang, en post vises i skærmbilledet, både når skærmbilledet åbnes og når der bladres mellem posterne. Dette udføres med macroen #NotesMark. Med #NotesMark udføres denne undersøgelse og den rigtige markering sættes i notatfeltet i form af et lille n eller et stort N. Syntaks #NotesMark(BlokNavn,Feltavn) 208
I parametrene til macroen angives igen navnet på feltet, der skal ajourføres og hvilken blok feltet befinder sig i. Det fremgår i syntaksen at blokkens navn angives først og derefter feltets navn. De to værdier adskilles med komma. Eksempel #NotesMark(CustTable,Notes) I eksemplet er det blokken CustTable og feltet Notes, der opdateres. Opdateringen skal udføres hver gang en post loades ind i formen, enten fordi formen startes eller fordi der bladres mellem posterne. Macroen indsættes i triggeren Post-Load. Triggeren Post-load Da opdateringen af notatfeltet skal udføres straks efter at en postering er kommet frem på skærmen (er loadet ind i formen), skal macroen indsættes i en trigger, der aktiveret på netop dette tidspunkt. Triggeren Post-load i opsætningen af blokken er passende, da den netop aktiveres hver gang en post er loadet ind i formen. Triggeren Post-load på selve Notatfeltet har samme virkning. Trigger Macro på blok eller felt Post-Load #NotesMark #NotesKey Macroen #NotesKey anvendes til åbning af notatvinduet med musen. Når der anvendes mus i C5, kan notatvinduet også åbnes ved at klikke med musen i selve Notatfeltet. Denne funktion foregår ikke automatisk, men skal opsættes med macroen #NotesKey. Når der klikkes med musen i et felt, f.eks. notatfeltet, bevirker det at triggeren Mouse aktiveres. Macroen #NotesKey i Mouse triggeren sørger for at notatvinduet åbnes, så der kan skrives i det. Macroen indsættes i triggeren Mouse på selve feltet. Trigger Mouse Macro #NotesKey Notater på forms med flere blokke Der er forskel på hvordan notater behandles i forms med én blok og med flere blokke. Husk at notatvinduet tilknyttes en bestemt blok og at blokken tilknyttes et bestemt kartotek. Det betyder at macroen #NotesPreKey, der åbner notatvinduet, skal indsættes én gang for hver blok (med kartotek), hvorpå der skal kunne oprettes notater. 209
Den lokale procestaste, ALT+N, der oprettes i formen for at åbne notatvinduet, oprettes kun én gang i formen og gælder således alle blokke i formen. Vigtigt at åbne rigtigt notatvindue Er der flere blokke med notater og der tastes ALT+N i skærmbilledet, er det altså vigtigt at åbne det rigtige notatvindue. Det der tilhører den aktuelle blok. Til forskel fra lokalmenuer der tilhører de blokke hvorpå de oprettes, er lokale processer uafhængige af hvilken blok, de kaldes fra. Procestaster kontra lokalmenuer Blok 1 (kartotek 1) Lokalm enu Procestaster gælder for hele formen Er fælles for alle blokke Blok 2 (kartotek 2) Lokalm enu Lokalmenuer tilhører hver sin blok Da en lokalproces således ikke tilhører en bestemt blok, men er fælles for alle blokke i en form, skal der indlægges en logik, der kan åbne det rigtige notatvindue til den rigtige blok, når der trykkes ALT+N. Det er altså nødvendigt at vide hvilken blok, cursoren befinder sig i, når notatvinduet åbnes. Den interne systemvariabel &CurBlk (Current blok=nuværende blok) holder hele tiden styr på, hvilken blok der er aktuel. Åbningen af notatvinduet sker som tidligere nævnt i Pre-key triggeren med macroen #NotesPreKey. Denne macro binder notatvinduet sammen med blokken og kartoteket, idet blokkens navn angives som parameter i macroen. Hvis der er mere end én blok med notater, skal macroen derfor angives en gang for hver blok. Trigger Pre-key Macro #NotesPreKey (til 1. Blok) #NotesPreKey (til 2. Blok) Når der trykkes på procestasten, udføres alle de macroer, der findes i Pre-key. Ved i triggeren at undersøge indholdet af systemvariablen &CurBlk, kan der med en IF-THEN sætning, opstilles en logik, der kan åbne det rigtige notatvindue. 210
Nedenstående er et eksempel på logikken i Pre-Key i en tænkt form med blokkene CustTable og CustTrans: IF &CurBlk== CustTable THEN #NotesPreKey(CustTable,78,4,1,19, Notat på debitor ) ELSE #NotesPreKey(CustTrans,60,6,1,18, Notat på poster ) ENDIF Bemærk at parametrene i de to tilfælde hvor #NotesPreKey er benyttet, ikke er ens. De to notatvinduer der åbnes, behøver således ikke at være samme størrelse eller med samme rammetekst. Skift af blok pga. mus Når brugeren arbejder i et skærmbillede med flere blokke, kan der skiftes mellem blokkene med SHIFT+F7 og SHIFT+F8. Når musen anvendes til at åbne for notatvinduet i en af blokkene, klikkes der i notatfeltet i den pågældende blok. Hvis der med musen klikkes i den modsatte blok, end den brugeren har skiftet til, skal der foretages et skift mellem blokkene rent programmeringsmæssigt. Det kan udføres med macroen #Frm_GoBlk(). Syntaks #Frm_GoBlk(Bloknavn) Macroen anvendes til flytte cursoren til den blok, hvis navn er angivet i parametrene. Ved at placere macroen i triggeren Mouse i notatfeltet før macroen #NotesKey i den aktuelle, skiftes der automatisk blok, når musen klikker i det aktuelle notatfelt. Gennem triggeren Pre-key åbnes det rigtige notatvindue. Trigger Mouse Macro #Frm_GoBlk(Bloknavn) #NotesKey Kartoteket Notes Alle notater ligger i ét fælles kartotek med navnet Notes. 211
Noteskartotekets sammenhæng med andre kartoteker CustTable RowNumber LastChanged Account Name Osv. Notes RowNumber LastChanged NotesRecId NotesFileId LineNumber Txt RecId FileId RecId FileId I ovenstående eksempel ses det, hvordan Notes-recorden arver RecId og FileId, fra den post i CustTable der dannede notatet og værdierne gemmes i felterne NotesRecId og NotesFileId i Notes kartoteket. I Notes kartoteket ligger der således informationer, om hvor notater hører til. På Notes kartoteket er der et index med følgende indexformel: Indexnavn NotesIdx Indexformel NotesFileId, NotesRecId, LineNumber Ved oprettelse af et nyt notat i et skærmbillede, vedligeholdes indexet automatisk, så notaterne altid kan findes frem igen: Bemærk Hvis der oprettes en XAL kørsel eller en form, hvori der kan slettes, f.eks. debitorer, uden at notaterne også slettes, kan notaterne ikke genfindes, idet nøglerne til notatet ikke længere findes i debitorkartoteket. Der findes så notater uden ejer. 212
Oversigter Macroer og tilhørende triggere Form formler Init Exit Abort Refresh * Pre-key * Post-key Mouse Error Event * Pre-form Post-form #NotesPreKey #NotesPostKeyMark #NotesMark #NotesKey #Frm_NotesMark Felt formler Pre-field Post-field Post-Change * Post-Load Post-Edit * Mouse 213
Notater på forms med en blok Procestast Oprette procestaste ALT+P Proces...: Form-afvikling Parametre til proces: Form=Notes (eller kun Notes) Hjælpetekst...: Notater Tast...: Alt N Notatfelt Oprette virtuelt notatfelt F2 Opret et virtuelt heltalsfelt til notatvisning Pre-key Macro til notatvindue #NotesPreKey(Blok,Bredde,Højde,Kollonne,Linje, Tekst ) Pre-form Macro til ændring af mærke i notatfelt (0 / 1 til n / N) #Frm_NoteMark(Blok,felt)- (Før #Frm_Search og #Frm_Index) Post-key Macro til ajourføring af notatfelt ved ændringer #NotesPostKeyMark(Blok,felt) Post-load Macro til ajourføring af notatfelt ved bladring #NotesMark(Blok,felt) Mouse Macro til åbning af notatvindue med mus #NotesKey 214
Notater på forms med flere blokke Procestast Oprette procestaste ALT+P Proces...: Form-afvikling Parametre til proces: Form=Notes (eller kun Notes) Hjælpetekst...: Notater Tast...: Alt N Notatfelt 1 Oprette virtuelt notatfelt F2 (i blok 1) Opret et virtuelt heltalsfelt til notatvisning Notatfelt 2 Oprette virtuelt notatfelt F2 (i blok 2) Opret et virtuelt heltalsfelt til notatvisning Pre-key Macro til notatvinduer IF &CurBlk == Blok1 THEN #NotesPreKey(Blok1,Bredde,Højde,Kollonne,Linje, Tekst ) ELSE #NotesPreKey(Blok2,Bredde,Højde,Kollonne,Linje, Tekst ) ENDIF Pre-form Macroer til ændring af mærke i notatfelter (0 / 1 til n / N) #Frm_NoteMark(Blok1,felt1) - (Før #Frm_Search og #Frm_Index) #Frm_NoteMark(Blok2,felt2) - (Før #Frm_Search og #Frm_Index) Post-key Macroer til ajourføring af notatfelter ved ændringer #NotesPostKeyMark(Blok1,felt1) #NotesPostKeyMark(Blok2,felt2) Post-load 1 Macro til ajourføring af notatfelt ved bladring (i blok 1) #NotesMark(Blok1,felt1) Post-load 2 Macro til ajourføring af notatfelt ved bladring (i blok 2) #NotesMark(Blok2,felt2) Mouse 1 Macroer til åbning af notatvindue med mus (i blok 1) #Frm_GoBlk(Blok1) #NotesKey Mouse 2 Macroer til åbning af notatvindue med mus (i blok 2) #Frm_GoBlk(Blok2) #NotesKey 215
Opgaver: Notater i forms Opgave 1: Oprette procestaste til notater i form Formål med opgaven At oprette en procestaste til kald af notater i en form. Beskrivelse I hoved- og underblokkene findes der to virtuelle felter til visning af, om der er notater. Notatfunktionaliteten fungere ikke endnu og en af de første ting der skal udføres, er oprettelse af en procestaste, der kan anvendes til kald af notater. I denne opgave skal du oprette procestasten, der aktiveres med ALT+N. Opbygning af lokalprocesser Proces Parametre til proces Hjælpetekst Tast Forløb 1 Åben formen UDLUdlånsKart. 2 Opret en ny procestaste der aktiveres med ALT+N. Tasten skal kalde formen Notes. 3 Du kan ikke afprøve tasten, før notatfunktionaliteten er klar i næste opgave. 216
Opgave 2: Notater på forms med én blok Formål med opgaven At afprøve funktionaliteten vedrørende notater på én blok. Beskrivelse I hovedblokken findes der et virtuelt felt til visning af, om der er notater eller ej. Feltet er kun oprettet og fungerer ikke. I denne opgave skal du opbygge funktionaliteten, så der kan oprettes notater til posterne i hovedblokken og så notatfeltet kan vise, om der er notater eller ikke er. I forløbet herunder vises de trin, der skal udføres for at få notaterne til at fungere i hovedblokken. Du kan vælge at følge dette forløb eller du kan anvende skemaet Notater på forms med én blok, som findes sidst i lektionen. Forløb 1 Anvend formen fra UDLUdlånsKart fra opgave i forrige opgave. 2 Indsæt macro til notatvindue. 3 Indsæt macro til ændring af mærke i notatfelt. 4 Indsæt macro til ajourføring af notatfelt ved ændringer. 5 Indsæt macro til ajourføring af notatfelt ved bladring. 6 Indsæt macro til åbning af notatvindue med mus. 7 Godkend og afprøv formen. 217
Opgave 3: Notater på forms med flere blokke Formål med opgaven Afprøve funktionaliteten vedrørende notater på flere blokke i samme form. Beskrivelse I underblokken findes der et virtuelt felt til visning af, om der er notater på linjen eller der ikke er. Feltet er kun oprettet, men fungerer ikke. I denne opgave skal der bygges videre på den foregående, så der kan oprettes notater til udlånslinjerne i underblokken og ligeledes så notatfeltet kan vise, om der er notater eller ikke er. Forløb Du kan vælge at følge dette forløb eller du kan anvende skemaet Notater på forms med flere blokke, som findes sidst i lektionen. Forløb 1 Anvend formen fra UDLUdlånsKart fra opgaven i forrige opgave. 2 Indsæt macro til notatvindue. 3 Indsæt macro til ændring af mærke i notatfelt. 4 Indsæt macro til ajourføring af notatfelt ved ændringer. 5 Indsæt macro til ajourføring af notatfelt ved bladring. 6 Indsæt macro til åbning af notatvindue med mus. 7 Godkend og afprøv formen. 218
24. SystemVariabler i forms Mål med lektionen Formålet med denne lektion er at give deltagerne kendskab til nogle af de systemvariabler, der kun kan anvendes i forms og nogle af de globale variabler, der kan anvendes overalt. Lektionen skal betragtes som et tillæg med en liste over systemvariabler og globale variabler. Efter lektionen skal kursisterne have kendskab til: Systemvariabler i forms Globale variabler. Systemvariabler Systemvariabler i forms kan anvendes i alle triggerne. Variablerne udtrykker en øjeblikkelig status over formens tilstand. De indeholder information om følgende: Hvor cursoren befinder sig Hvor cursoren formentlig vil bevæge sig hen Hvilken kommando der sidst er givet til formen Navnet på det datasæt, der er blevet overført fra en anden form Returværdier fra kontrol kommandoerne (fejlkoder) Fejltekster til brugeren. Variablerne anvendes mest til at sørge for at kommandoer udføres, når visse betingelser er til stede, iflg. den status der udgøres i variablerne. Skema med systemvariablerne findes på næste side. 219
Systemvariabler i forms Navn Type Indhold &Cmd STR 10 Sidste kommando der er blevet afgivet i form af tryk på en taste &CurFld STR 32 Navn på det felt curseren står i &CurBlk STR 16 Navn på den blok curseren står i &CurPge INT Nummer på aktuelle side &CurLine INT Nummer på posteringslinje, ikke form linje &NewFld STR Navn på næste felt cursoren vil bevæge sig til iflg. sekvensnummerrækkefølgen. &ExtBuf STR 16 Navnet på evt. ekstern buffer &RecNo INT Record nummer &Form STR 24 Navnet på formen &Event INT Hvilken event handling der lige er sket &FrmStat INT Værdi der returneres hver gang en control kommando er udført. &TransBlk STR Navn på blok hvis indhold skal overføres til en anden proces f.eks. form &MenuLine INT Valgt linjenummer fra lokalmenu &Mouse INT Et heltal for hvordan der blev trykket på musen &MouseX INT X koordinaten for sidste museaktivitet &MouseY INT Y koordinaten for sidste museaktivitet &Help STR Kan tildeles hjælpetekst der vises i bunden af skærmen &Error STR Tekst der udskrives i bunden af skærmen &Parm STR 249 Anvendes både internt i forms og globalt mellem forskellige processer. Internt i forms INIT og PRE-FORM værdien fra proceskaldet PRE-KEY parameterstrengen fra taste der udløste Pre- Key triggeren ERROR den kommando der udløste fejl i afvikling af en control sætning. Der henvises til manualen Teknisk Reference og til hjælpeteksten for yderligere forklaring til de enkelte systemvariabler. 220
Globale variabler Globale variabler der kan anvendes overalt Navn Type Indhold &MacroInt INT Alle macro variablerne bruges som globale variabler i hele XAL en. Derfor skal de altid afleveres med samme værdi, som de indeholdt, da de blev modtaget. &MacroReal REAL Se ovenfor &MacroDate DATE Se ovenfor &MacroText STR 254 Se ovenfor &SystemDato DATE System datoen &FirmaValuta STR 3 Den aktuelle valuta regnskabet anvender &FirmaNavn STR 40 Navnet på regnskab &Parm STR 249 Global anvendelse Bruges til at gemme alle mulige værdier, og anvendes til at sende disse frem og tilbage mellem forskellige processer også forms. Der henvises til manualen Teknisk Reference og til hjælpeteksten for yderligere forklaring til de enkelte variabler. 221
25. 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 222
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 223
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 224
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. CustTable. Print Navn Skriv det navn kartoteket skal kaldes i det daglige f.eks. Debitorkartotek. Navn på kartotek 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: 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 225
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 226
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 ENTER Udfyld billedet Udskriftsmuligheder med nødvendige informationer. Godkend med F3 Vælg kartotek fra kartotekslisten ENTER 227
Kartotek Index (opret) Funktion Fremgangsmåde Tast Finde kartotek til index Oprette index Gentages for hvert index der skal oprettes IndexNavn Ens Nøgler tilladt 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): Giv indexet et sigende navn. Eksempel på indexnavn: KtoDatoIdx.Navnet viser at indexet består af felterne KontoNr og Dato. 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. ENTER ENTER 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 228
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 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 229
Listbillede Opret Funktion Fremgangsmåde Tast Finde kartotek til listbillede Generelt/Tilpasning/Udviklingsmenu/Lst/Opret Opsætte vindue 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 230
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. ENTER ENTER CTRL+F6 Godkend med Du er tilbage i Design af listbillede. Indsætte felter Felter indsættes i Design af listbillede. 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 231
Listbillede Slet Funktion Fremgangsmåde Tast Finde listbillede Generelt/Tilpasning/Udviklingsmenu/Lst/Slet Slette listbillede Vælg kartotek fra liste Vælg listbillede fra liste Boksen Slet listbillede vises. Slet listbilledet (Listbilledet slettes.) ENTER ENTER JA 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 232
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 233
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=CustTable, hvis det er processen Formafvikling. 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 234
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 eller der kan oprettes blokke (se huskelister hertil). F3 F3 235
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 236
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 237
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 eller blokke og felter kan behandles (se huskelister hertil) SHIFT+F6 F3 F3 238
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 et andet værktøj til editering af filer.) 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 239
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 240
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). 241
Form Felter (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. I enkelt record blok I multi record blok Indsætte felt Gentages for hvert felt der skal indsættes 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 242
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 243
Form Triggere i blokke Funktion Fremgangsmåde Tast Finde blok med triggere Generelt/Tilpasning/Udviklingsmenu/Frm/Ret Vælg form fra listen over forms ENTER 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 SHIFT+F8 SHIFT+F6 PILE ENTER Åbne trigger Vælg trigger og åbn tilhørende editorboks PILE ENTER Gentages ved flere triggere Indtast ønsket kode. Afslutte bloktrigger Godkend og afslut koden Vælg anden trigger eller luk listen over triggere Godkend og afslut Opsætning for blok Afslut selve formen F3 ESC F3 F3 244
Form Triggere i felter Funktion Fremgangsmåde Tast Finde felt med triggere Generelt/Tilpasning/Udviklingsmenu/Frm/Ret Vælg form fra listen over forms ENTER 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 PILE F6 PILE ENTER Åbne trigger Vælg trigger og åbn tilhørende editorboks PILE og ENTER Gentages ved flere triggere Indtast ønsket kode. Afslutte felttrigger 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 245
Del III Rapporter 246
26. Systemvariabler i rapporter Mål med lektionen Formålet med denne lektion er, at give deltagerne kendskab til nogle af de systemvariabler der kun kan anvendes i rapporter og nogle af de globale variabler der kan anvendes overalt. Lektionen skal betragtes som et tillæg med en liste over systemvariabler og globale variabler. Efter lektionen skal kursisterne have kendskab til: Systemvariabler i rapporter Globale variabler. Generelt Generelt kan det siges, at alle de variabler, beskrevet på næste side, kan bruges, som om de var erklæret af en selv. Der bør dog udvises forsigtighed, hvis de ændres. Variablen &Parm anvendes f.eks. i alle menukald, idet den indeholder det, der skrives i feltet Parametre til proces, medmindre &Parm tildeles en anden værdi. Nogle systemvariabler kan kun anvendes i rapporter, medens andre er globale og kan anvendes i forskellige elementer som rapporter, forms, XAL kørsler osv. Systemvariabler i rapporter Systemvariablerne i rapporter anvendes til forespørgsel på forskellige parametre i forbindelse med rapportafviklingen. 247
Navn Type Indhold &Page INT Indeholder aktuelleside nummer på rapport &Line INT Indeholder aktuellelinje nummer på den pågældende side i rapport &LinesLeft INT Indeholder antal linjer, der er tilbage på den aktuelle side. &CharsLeft INT Indeholder antal tegn på linjen Opdateres efter Control Pitch Efter Control Goto opdateres med rest antal tegn på linjen &BreakLevel INT Aktuelle niveau ved udskrivning af totaler ifølge anvendte index 0=grandtotal, 1=første indexkomponent osv. &BreakField STR 32 Feltnavn på felt der brydes på i aktuelle index, eller ordet Grandtotal ved &Breaklevel=0 &Language ENUM SPROG Aktuelle sproglag i rapporten &StartTime INT Starttidspunkt for rapporten &Report STR 25 Navn på rapporten &Parm STR 256 Teksten der blev angivet i kaldet af rapporten i parameteren PARM &AsciiReport STR 80 Navn på fil som rapportens linjer er læst fra eller skrevet til &AsciiXAL STR 80 Navn på fil som indholdet i rapportens XAL editorboks er læst fra eller skrevet til &AsciiQt STR 80 Navn på fil som rapportens QT søgning er læst fra eller skrevet til &FileName STR 80 Spoolfilnavn, filnavn eller printernavn afhængigt af hvortil der skrives. Der henvises til manualen Teknisk Reference og til hjælpeteksten for yderligere forklaring til de enkelte systemvariabler. 248
Globale variabler Globale variabler der kan anvendes overalt Navn Type Indhold &MacroInt INT Alle macro variablerne bruges som globale variabler i hele XAL en. Derfor skal de altid afleveres med samme værdi, som de indeholdt, da de blev modtaget. &MacroReal REAL Se ovenfor &MacroDate DATE Se ovenfor &MacroText STR 254 Se ovenfor &SystemDato DATE Se ovenfor &FirmaValuta STR 3 Den aktuelle valuta regnskabet anvender &FirmaNavn (Kun XAL) STR 40 Navnet på det aktuelle regnskab &Parm STR 256 Parameter variablen bruges til at gemme alle mulige værdier, og anvendes til at sende disse frem og tilbage mellem forskellige processor. Der henvises til manualen Teknisk Reference og til hjælpeteksten for yderligere forklaring til de enkelte systemvariabler. 249
Opgaver: Systemvariabler i rapporter Opgave 1: Udlånsliste Formål med opgaven At oprette en rapport med datasøgning via Rapport QT, samt anvendelse af systemvariabler i felter. Beskrivelse Du skal oprette en rapport over udlånslinjer. Rapportens poster skal sorteres efter DebitorNummer, UdlånsNummer og VareNummer. Datasøgning foregår i Rapport-QT i kartoteket UDLUdlånsPost. Der skal dannes automatiske subtotaler for felterne UdlejningsVærdi og ForsikringsVærdi. Rapporten i eksemplet viser kun totaler for første niveau, men andre muligheder skal afprøves i forløbet. Indholdet i rapporten gennemgås nøjere i forløbet. Eksempel Lises Bolsjefabrik A/S Side: 1 OPG53_R04_1 Dato: 09/09-08 Udlejning Forsikring KontoNr UdlånsNr VareNr Værdi Værdi Status 20000 1050 10-HD-4 720,00 7.920,00 Udlånt 20000 1050 10-HD-4 720,00 7.920,00 Udlånt 20000 1050 10-HD-4 720,00 7.920,00 Udlånt 20000 1300 10-MB-2 512,30 5.635,30 Udlånt 20000 1400 10-HD-4 720,00 7.920,00 Udlånt Konto: 20000 3.392,30 37.315,30 250
Forløb 1 Opret en ny rapport. 2 Rapport-QT Datasøgningen skal udføres i Rapport-QT med udgangspunkt i kartoteket UDLUdlånsPost. Der skal sorteres på felterne DebitorKonto, UdlånsNummer og VareNummer. Tilføj afgrænsningsfelterne DebitorKonto og UdlånsNummer. Overskriften i QT en skal være Udlånsliste, kartoteker og filter skal vises. 3 Rapport-definition og layout De fire øverste linjer er Page Header linjer med felter i form af systemvariablerne &FirmaNavn, &Report, &Page og &SystemDato, derefter er der PageHeader linjer med overskrifter og streger. 4 De næste linjer fremkommer med én Body linjer på kartoteket UDLUdlånsPost, med felterne i rækkefølge fra venstre mod højre. DebitorKonto, UdlånsNummer, VareNummer, UdlejningsVærdi, ForsikringsVærdi og UdlånsStatus. 5 Automatisk Subtotal Der skal dannes automatiske subtotaler på felterne UdlejningsVærdi og ForsikringsVærdi. 6 Afprøvning Godkend rapporten og afprøv den. 7 Prøv at udskrive rapporten i hvert niveau 0=Grandtotal, 1=DebitorKonto, 2=UdlånsNummer og 3=VareNummer. Prøv med de to muligheder for automatiske ledetekster og bemærk forskellen. Prøv at ændre sorteringskriterier til DebitorKonto og UdlånsStatus, og prøv rapporten i forskellige niveauer. 8 Prøv at anvende et af filtrene så du kun får alle udlånsposter med status Udlånt. (I eksemplet vises kun poster med status Udlånt ) 9 Godkend rapporten. 251
27. Rapport Control macroer Mål med lektionen Formålet med denne lektion er, at give deltagerne kendskab til de specielle rapport control macroer der findes. Lektionen er kun tænkt som et tillæg med en liste over control macroer. Der er ingen ekstra forklaringer eller eksempler. Ønskes dette, henvises der til manualen Teknisk Reference eller hjælpeteksten i hjælpefilerne. Efter lektionen skal kursisterne kende til: Rapport control macroer. Rapport Control macroer Rapport control macroer er en erstatning for de rapport control kommandoer, der findes til rapporter. Macroerne er opbygget ved hjælp af kommandoerne og udfører således de samme funktioner. Både control macroer og control kommandoer kan anvendes i rapporter, men oftest anvendes kun macroerne. Fordele ved control macroer En af fordelene ved at anvende macroerne er, at disse syntaks checkes. Dette udføres ikke ved kommandoerne. Der er også parameter kontrol. Rapport control macroerne findes i macro biblioteket REPORTS, der altid skal loades, inden macroerne kan anvendes. Dokumentation Når der skal findes dokumentationen på macroerne, skal der ses på macronavnet, hvorefter den tilsvarende control kommando findes i manualen eller i hjælpe filen. Macroen #Rep_Execute tilsvarer f.eks. kommandoen Control Execute. Alle macroerne starter med #Rep_ efterfulgt af navnet på kommandoen. Parametrene til macroerne er de samme som til kommandoerne. Der er dog forskel ved angivelsen, idet de i kommandoer adskilles med mellemrum og i macroer adskilles med komma. Skema med macroer findes på efterfølgende sider. 252
Skema over rapport control macroer Navn Funktion Parametre #Rep_Newline #Rep_NewLine() Gå til ny linje #Rep_NewLine(n) Gå <n> linjer ned, højst til næste side skift #Rep_NewLine(Force,n) Gå <n> linjer ned, uden at stoppe ved sideskift #Rep_Newpage #Rep_NewPage(-F) Gå til næste side, uden footerlinjer på nuværende side #Rep_NewPage(+F) Gå til næste side, skriv først footerlinjer på nuværende side Disable Control Disable Der udskrives ikke linjetyper Prolog, (findes kun som control linjetype Epilog, Header og Footer indtil de kommando) genaktiveres med Control Enable Enable (findes kun som control kommando) #Rep_Execute Control Enable linjetype Genaktiverer linjetyperne Prolog, Epilog, Header og Footer #Rep_Execute(linjetyp) Udfør linjetyperne Prolog, Epilog, Header og Footer #Rep_Execute(nr) Udfør linjetyperne med control nummer <nr> #Rep_JobType #Rep_Jobtype(jobtype) Sæt jobtype for spoolet printjob #Rep_JobDesc #Rep_JobDesc(beskriv) Sæt jobbeskrivelse for spoolet printjob #Rep_Columns #Rep_SetCol #Rep_Columns(antal kol) #Rep_SetCol(kolonne, fra pos, bredde) Hvor mange kolonner der skal være i rapporter. Efterfølges af #Rep_SetCol I rapporter med denne macro svarer sideskift til Gå til næste kolonne Kolonnens nummer, startposition og bredde. Kolonne=1,2,3,... #Rep_Ignore #Rep_Ignore(kartotek) Når det beregnes hvornår Groupheader og Group-footer skal udskrives, så se bort fra angivne kartotek #Rep_LockCol #Rep_LockCol(kolonne) Hvilken kolonne der skal ses ved udskrift til skærm #Rep_FF #Rep_FF(ON) #Rep_FF(OFF) Send eller send ikke Form Feed koder til printeren f.eks. ved udskrift ved labels, hvor sidehøjde er højde på label. #Rep_Header #Rep_Header(TOP,n) #Rep_Header(BOTTOM,n) Hvor <n> er 8 og HEADER fylder 3 linjer, afsættes 8 linjer til Headeren og Headeren skrives i de 3 øverste linjer hvis TOP og de 3 nederste hvis BOTTOM. 253
Navn Funktion Parametre #Rep_Footer #Rep_Footer(TOP,n) #Rep_Footer(BOTTOM,n) Hvor <n> er 8 og FOOTER fylder 3 linjer, afsættes 8 linjer til Footeren, og Footeren skrives i de 3 øverste linjer hvis TOP er specificeret og i de tre nederste hvis BOTTOM er specificeret. #Rep_BuildParm #Rep_BuildParm(tekst) Sætter systemvariablen &Parm til den argumentstreng, der skal bruges til at køre samme rapport på samme måde i nyt kald af rapportafviklig. #Rep_InitLine #Rep_InitLine() Kør printerkoderne i position 1 i linje 1 uden at skrive noget. Relevant hvis f.eks. papirkode er angivet i linje 1. Efter #Rep_InitLine vil systemvariablerne der afhænger af papirkoderne være initialiseret. #Rep_Warning #Rep_Warning(ON) Infoboksen Rapporten består af 0 linjer vises ved tom rapport. #Rep_Warning(OFF) Infoboksen Rapporten består af 0 linjer vises ikke ved tom rapport. #Rep_Language #Rep_Language(Sprog) Systemvariablen &Language sættes til <sprog> og tekstlaget <sprog> benyttes i rapporten. Argumentstrengen til rapportafvikleren skal indeholde LANGUAGE=* #Rep_ExLan #Rep_ExLan(sprog) Undersøger om tekstlaget <sprog> er oprettet i rapporten. Hvis det er sættes &Language=værdien ellers til nul. #Rep_Lpi #Rep_Pitch #Rep_Lpi(linjeafstand) <linjeafstand>=navn på linjeafstand i aktuelle printerdriver #Rep_Pitch(skrifttype) <skrifttype>=navn på skrifttype i aktuelle printerdriver #Rep_Paper #Rep_Paper(papir) <papir>=navn på papirformat i aktuelle printerdriver 254
Navn Funktion Parametre #GrpStrat #Rep_PutReal #Rep_PutInt #Rep_PutStr #Rep_PutDate #Rep_PutEnum #Rep_GrpStrat(alter) #Rep_GrpStrat(stack) #Rep_PutReal(værdi, kolonne, længde, format, flag) #Rep_PutInt(værdi, kolonne, længde, format, flag) #Rep_PutStr(værdi, kolonne, længde, format, flag) #Rep_PutDate(værdi, kolonne, længde, format, flag) #Rep_PutEnum(værdi, kolonne, længde, Hver gang der skiftes kartotek, udskrives Group-Footer for det gamle kartotek og Group-Header for det nye kartotek. (Dette er default hvis kommandoer ikke angives) Udskrivning af Group-Headere og Group-Footere sker efter en stakorienteret strategi. Først kommer alle Group-Headerne, og derefter kommer alle Group- Footerne Et felt af typen REAL indsættes under afviklingen af rapporten uden at være oprettet på en af linjerne. Format: udfyldes ikke. Flag: 0=venstre, 1=højre, 2=centreret Et felt af typen INT indsættes under afviklingen af rapporten uden at være oprettet på en af linjerne. Format: udfyldes ikke. Flag: 0=venstre, 1=højre, 2=centreret Et felt af typen STR indsættes under afviklingen af rapporten uden at være oprettet på en af linjerne. Format: udfyldes ikke. Flag: 0=venstre, 1=højre, 2=centreret, 3=ledetekst venstrestillet og efterfulgt med...: 8=som 0 med versaler 9=som 1 med versaler 10=som 2 med versaler 11=som 3 med versaler Et felt af typen DATE indsættes under afviklingen af rapporten uden at være oprettet på en af linjerne. Format: udfyldes ikke. Flag: 0=venstre, 1=højre, 2=centreret Et felt af typen ENUM indsættes under afviklingen af rapporten uden at være oprettet på en af linjerne. 255
Navn Funktion Parametre format, flag) 256
28. Linje-XAL og feltbetingelser Formål Formålet med denne lektion er at give deltagerne kendskab til kolonnen Linje XAL, så deltagerne kan lære at udnytte nogle af de muligheder der findes heri. Desuden undervises der i feltbetingelser. Efter lektionen skal kursisterne kunne: Anvende linje-xal til tildeling af værdier til variabler inde i layoutområdet. Styre om en linje skal udskrives eller ej Anvende feltbetingelser. Generelt Linje XAL og feltbetingelser har ingen umiddelbar sammenhæng, men behandles begge i denne lektion, da de begge benytter sig af betingelser. Linje XAL kan både indeholder almindelig XAL kode og betingelser, medens feltbetingelser kun kan indeholde betingelser. Linje XAL Kolonnen Linje-XAL er den smalle kolonne der befinder sig mellem kartotekskolonnen og layoutområdet. Kolonnen har en helt speciel betydning, idet den indeholde en XAL editorboks for hver linje, der oprettes. Editorboksen åbnes når cursoren placeres i boksen og der tastes ENTER. Rapport-definition med de fire kolonner Linje-XAL Linjetyper Kartoteker Layout område Enter Formel (XAL editorboks) 257
Den XAL kode der indtastes i editorboksen udføres før linjen udskrives i rapporten, og før evt. beregninger på felterne i den aktuelle linje. I Felterne anvendes således dataværdierne, hvis de ændres i Linje XAL. Anvendelse De to vigtigst funktioner i Linje XAL er: Tildeling af værdier til felter og variabler under afvikling af udskrift. Styring af om en linje skal udskrives eller ikke. Tildeling af værdier til felter og variabler Felter og variabler kan tildeles værdier i Linje XAL lige inden de behandles inde i layoutområdet. Skal der for eksempel dannes en udskrift over kreditorer med feltet BalanceMST (SaldoDkr), vises dette felt normalt med to decimaler med kroner og ører. I Linje XAL kan feltet tildeles en ny værdi således, inden linjen udskrives. Feltet kan f.eks. afrundes til hele tusinder. Eksempel SEARCH VendTable OUTPUT VendTable END Body VendTable Account VareNavn1 mmer Name BalanceMST SET BalanceMST=ROUND(BalanceMST,1000) Resultat 230896 Kreds Tester A/S -2.000,00 45934545 IBM Danmark A/S -5.000,00 71124987 Intel Corporation -46.000,00 I eksemplet anvendes funktionen ROUND. Første parameter er navn på felt der skal afrundes, og anden parameter er værdien der afrundes med. Der afrundes op eller ned til nærmeste multiplum af parameter to. Som det fremgår af eksemplet udføres afrundingen i Linje-XAL, inden feltet udskrives. 258
Styring af om linjer skal udskrives eller ikke. Linje XAL anvendes også til at bestemme om en linje skal udskrives eller ikke skal udskrives. Dette udføres ved hjælp af kommandoen RETURN. Syntaks RETURN X Kommandoen RETURN efterfølges af en sand eller falsk værdi, der i syntaksen udtrykkes med X. Sand Sande værdier er alle tal forskellige fra nul, men kan f.eks. også være et felt eller en variabel med et indhold. Dette svarer til tallet 1. Afsluttes Linje XAL med RETURN X, og X er en sand værdi, udskrives linjen. Afsluttes Linje XAL med en kommando, der ikke er en RETURN, udskrives linjen også. Falsk Falske værdier er tallet nul, men kan f.eks. være et felt eller en variabel uden indhold. Dette svarer til tallet nul. Afsluttes Linje XAL med RETURN X, og X er en falsk værdi, udskrives linjen ikke. NB! Sande og falske værdier kan også udtrykkes i form af udtryk der evaluerer til sand eller falsk. Eksempel RETURN Telefon<> I eksemplet består udtrykket af Telefon<>. Er der et telefonnummer svarer udtrykket til 1. Er der IKKE noget telefonnummer svarer udtrykket til 0. Direkte anvendelse af RETURN 0 og RETURN 1 I nogen situationer kan det være nødvendigt at afprøve en rapport uden at alle linjer udskrives under testen. I stedet for at slette sådanne linjer, kan de forhindres i udskrivning med RETURN 0. Eksempel I næste eksempel findes der to bodylinjer med felterne Adresse1 og Adresse2. Feltet Adresse1 har i Linje XAL RETURN 1 og udskrives. Feltet Adresse2 har i Linje XAL RETURN 0 og udskrives ikke. 259
Eksempel SEARCH VendTable OUTPUT VendTable END Body Body Body VendTable VendTable VendTable << << << Account VareNavn1 mmer RETURN 1 Name Adress1 Adress2 BalanceMST RETURN 0 Resultat 230896 Kreds Tester A/S -2.000,00 Kredsvej 12B 45934545 IBM Danmark A/S -5.000,00 Nymøllevej 91 71124987 Intel Corporation -46.000,00 Building C03-05 I eksemplet er det kun Adress1 der udskrives. Eksemplet er i øvrigt det samme som tidlige med hensyn til funktionen ROUND på feltet BalanceMST. Anvendelse med felter Som beskrevet tidligere kan sande og falske værdier være tallene 1 og 0, men også variabler eller felter med eller uden indhold. I eksemplet herunder testes der i Linje XAL på om felterne Telefon og Fax har et indhold. Er der indhold i felterne er værdierne sande. Det svarer til RETURN 1, og linjen udskrives. Er der IKKE indhold i felterne er værdierne falske. Det svarer til RETURN 0, og linjen udskrives ikke. Eksempel SEARCH VendTable OUTPUT VendTable END Body Body Body VendTable VendTable VendTable << Account Name VareNavn1 << mmer Telefon...: Phone << Fax...: Fax RETURN Telefon BalanceMST RETURN Fax 260
Resultat 230896 Kreds Tester A/S -2.000,00 Telefon...: 35 31 55 66 48143030 Dtpartner A/S 0,00 Telefon...: 48 14 30 30 Fax...: 48 14 34 34 45934545 IBM Danmark A/S -5.000,00 Telefon...: 45 93 45 45 71124987 Intel Corporation -46.000,00 Telefon...: 97 124 9987 Bemærk at det kun er et sted, at der udskrives en linje med Fax. Resten af linjerne har kun telefon. Eksemplet er i øvrigt det samme som tidlige med hensyn til funktionen ROUND på feltet BalanceMST. Feltbetingelser Når der oprettes nye felter i rapporter fremkommer en menu med teksten Opret felt, og når der ændres i eksisterende felter fremkommer menuen Ret felt. Menupunkterne er de samme. Et af menupunkterne er Feltbetingelse. Når menupunktet anvendes åbnes der for en XAL editorboks til indtastning af XAL kode. Vigtigt! I editorboksen til feltbetingelser, kan der ikke indtastes almindelig XAL kode i form af SEARCH, PRINT, IF-THEN-ELSE osv. Der kan kun indsættes udtryk i form af betingelser. Betingelserne skal kunne evaluere til sand eller falsk. I eksemplet herunder er der sat feltbetingelser på de to ledetekstfelter der er oprettet på felterne Telefon og Fax. I feltet Telefon er betingelsen sat op som et udtryk og i feltet Fax som et feltnavn. Eksempel SEARCH VendTable OUTPUT VendTable END Body Body Body VendTable << Account Name VareNavn1 VendTable << VendTable mmer Telefon...: Phone << Fax...: Fax VareNavn1 mmer Telefon<> BalanceMST Fax 261
Resultat 230896 Kreds Tester A/S -2.000,00 Telefon...: 35 31 55 66 48143030 Dtpartner A/S 0,00 Telefon...: 48 14 30 30 Fax...: 48 14 34 34 45934545 IBM Danmark A/S -5.000,00 Telefon...: 45 93 45 45 71124987 Intel Corporation -46.000,00 Telefon...: 97 124 9987 Bemærk at det kun er et sted der udskrives en linje med Fax. Resten af linjerne har kun Telefon. 262
Opgaver: Linje-XAL og feltbetingelser Opgave 1: Linje-XAL og feltbetingelser Formål med opgaven At prøve at anvende Linje-XAL og feltbetingelser i rapporter. Beskrivelse Der skal arbejdes videre med rapporten fra den forrige opgave, idet der tilføjes lidt kode i søjlen Linje- XAL og der skal oprettes fem nye felter med feltbetingelser. Koden i Linje-XAL skal sørge for at feltet ForsikringsVærdi afrundes til hele 1000 kroner, da der ikke forsikres i mindre beløb. Feltet UdlånsStatus skal erstattes af fem andre felter der hver især kun viser første bogstav i hver af de fem mulige former for udlånsstatus der findes. Til hvert af felterne skal der knyttes en feltbetingelse der sikrer at feltet kun udskrives når denne betingelse er opfyldt. Linje-XAL, nye felter og betingelser gennemgås nøjere i forløbet. Eksempel Lises Bolsjefabrik A/S Side: 1 OPG53_R04_1 Dato: 09/09-08 Udlånt Returne Solgt KontoNr UdlånsNr VareNr Udlejning Forsikring Værdi Værdi Bortko Skrot 20000 1050 10-HD-4 720,00 8.000,00 U 20000 1050 10-HD-4 720,00 8.000,00 R 20000 1050 10-HD-4 720,00 8.000,00 S 20000 1300 10-MB-2 512,30 6.000,00 S 20000 1400 10-HD-4 720,00 8.000,00 B Konto: 20000 3.392,30 38.000,00 Se forløbet næste side: 263
Forløb 1 Åben rapporten fra forrige opgave og fortsæt i denne eller gem den under et nyt navn der passer til denne opgave, og fortsæt så i kopien. 2 Linje-XAL I Linje-XAL på Body linjen skal der indsættes et stykke kode der tildeler en afrundet værdi til feltet ForsikringsVærdi. Se eksempel på anvendelse af funktionen ROUND i lektionen. 3 Nye tekstfelter med feltbetingelser Feltet UdlånsStatus skal fjernes og erstattes af fem andre felter der kun fylder ét tegn hver. Felterne skal i feltudtryk kun indeholde det første bogstav i hver af de fem mulige former for UdlånsStatus. Til hver felt skal der knyttes en feltbetingelse som gør at feltet kun udskrives hvis det indeholder en værdi der tilsvarer fastteksten med begyndelsesbogstav som indtastet i feltudtrykket. 4 Afprøvning Gem rapporten og afprøv den for at se om alle koden i Linje-XAL fungerer, og om de fem tekstfelter viser de rette bogstaver på de rigtige tidspunkter. 264
29. Linjetypen Subtotal Formål Formålet med denne lektion er at give deltagerne udvidet kendskab til linjetypen Subtotal. Kursisterne lærer at anvende linjetypen sammen med systemvariablen &Breaklevel til dannelse af specielle tekster for hvert sorteringsniveau i rapporten. Efter lektionen skal kursisterne kunne: Anvende linjetypen Subtotal til udskrivning af egne ledetekster foran automatiske subtotaler i rapporter. Anvende systemvariablen &BreakLevel til styring af korrekt tekst til sorteringsniveau. Generelt Linjetypen Subtotal behandles grundlæggende i lektionen Linjetyper med kartoteker. I denne lektion behandles selve opsætningen af det felt der skal dannes totaler for. Linjetypen Subtotal anvendes udelukkende til opsætning af egne ledetekster til automatiske totaler. Der kan dog udmærket anvendes automatiske ledetekster til subtotaler. Dette behandles i lektionen Subtotaler, automatiske. Denne lektion behandler indgående egne ledetekster i linjetypen subtotal, både i kartoteker med sortering i ét niveau og sortering i flere niveauer. Linjetypen Subtotal med egne ledetekster Linjetypen anvendes udelukkende til udskrivning af egne ledetekster til subtotaler i stedet for de automatiske ledetekster. Når linjetypen anvendes lukkes der automatisk af for anvendelse af de automatiske ledetekster i form af Kopi af linje og Feltnavn værdi. Det er frit hvilken tekst der skal stå i layoutet på subtotal linjen, som vist i nedenstående eksempel. Rapport-definition med Subtotal linje PgHd PgHd Body Subt VendTrans VendTrans Konto Dato Bilag SaldoDkr ---------- -------- ---------- ----------- Account Date Voucher AmountMST Kreditorer i alt...: Det skal bemærkes, at Subtotal linjen kun indeholder den ledetekst, der skal udskrives, og at der ikke angives noget subtotalfelt eller nogen variabel på selve linjen for at udskrive subtotaler. Ovenstående rapport-definition kunne f.eks. resultere i følgende rapport. 265
Egen indtastet ledetekst i linjetypen Subtotal Konto Dato Bilag Saldo 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 ----------- Kreditorer i alt...: -93.531,38 =========== Subtotal linje med for lang ledetekst Hvis ledeteksten på subtotal linjen bliver for lang, så den går ind under feltet med den automatiske subtotal, eller hvis selve subtotalen bliver så stor at den går ind over teksten, da vil subtotalen ikke blive udskrevet. Dette vises i næste eksempel. Eksempel på subtotal linje med for lang ledetekst PgHd PgHd Body Subt VendTrans VendTrans Konto Dato Bilag SaldoDkr ---------- -------- ---------- ----------- Account Date Voucher AmountMST Kreditorer i alt...: I eksemplet går teksten.: ind over feltet AmountMST. Ovenstående rapport-definition kunne f.eks. resultere i følgende rapport. Eksempel på rapport med for lang ledetekst 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 ----------- Kreditorer i alt...: =========== Da ledeteksten er for lang udskrives totalen ikke. 266
Udskrift i flere niveauer med samme ledetekst Under Rapport-definition i billedet Opsætning kan der i feltet Subtotaler åbnes for et nyt billede til definition af udskrivnings måde. Billedet er navngivet med udskrivningskartoteks navn. I billedet kan der i feltet Niveau indsættes et tal til angivelse for hvilket niveau der skal udskrives subtotaler for. Hvis billedet åbnes i Rapport-definition herunder, og niveauet sættes til 1, og der sorteres på feltet kontonummer, vil eksemplet udløse en rapport der ser ud som nedenstående eksempel. Rapport-definition med én Subtotal linje (niveau 1 sorteret på Kontonummer) PgHd PgHd Body Subt VendTrans VendTrans Konto Dato Bilag SaldoDkr ---------- -------- ---------- ----------- Account Date Voucher AmountMST Kreditorer i alt...: Resultat af rapport Konto Dato Bilag SaldoDkr ---------- -------- ---------- ----------- 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 ----------- Kreditorer i alt...: -93.531,38 ----------- 7147274141 30/05-94 500018 395.160,00 7147274141 20/10-94 70026 395.160,00 7147274141 03/01-95 500049-17.246,63 7147274141 02/03-95 70008 17.246,63 ----------- Kreditorer i alt...: 0,00 ----------- Kreditorer i alt...: -93.531,38 =========== Bemærk at der står samme tekst ud for hver subtotal og grandtotalen. Udskrift i flere niveauer med forskellige ledetekster I forrige afsnit var der et eksempel på en rapport udskrevet i ét niveau, og det kunne ses at samme ledetekst blev udskrevet for hver eneste subtotal og grandtotalen. På samme måde som der kan indsættes flere Page Header linjer, Body linjer osv. kan der kan også indsættes flere linjer af typen subtotal. Hvis der f.eks. indsættes to subtotallinjer i det forrige eksempel, vil dette blot medføre at begge linjer udskrives hver gang, der skal udskrives en subtotal. Hvis hver linje skal anvendes til sin egen type total f.eks. subtotal og grandtotal, kræver det en speciel styring at få teksten udskrevet på det rigtige niveau. 267
Styringen foretages ved hjælp systemvariablen &BreakLevel, og udføres i Rapport-definitions søjle Linje-XAL. &Breaklevel Variablen &BreakLevel er en systemvariabel der til enhver tid indeholder nummeret på det niveau der udskrives. I det tidligere nævnte eksempel blev rapporten udskrevet i ét niveau. Faktisk udskrives rapporten i to niveauer som følger: Niveau Totaltype 0 Grandtotal 1 Subtotal Ved at kontrollere værdien i &BreakLevel inde i søjlen Linje-XAL i rapport-definition, kan det udskrivningen af linjetypen subtotal styres. Linje XAL Søjlen Linje-XAL i rapport-definition anvendes bl.a. til styring af om linjer skal udskrives eller ikke skal udskrives. For at en Subtotal linje kan udskrives kræver det at kolonnen med Linje XAL enten er tom eller at indholdet resulterer i et udtryk der er sandt. Et sandt udtryk er f.eks. tallet 1 eller to værdier der sammenlignes med hinanden. I forbindelse med udskrivning af subtotallinjer kan der i Linje Xal opstilles et udtryk der sammenligner værdien af systemvariablen &Breaklevel. Eksempel 1 RETURN &BreakLevel==1 Hvis &BreakLevel er 1 svarer det til at resultatet er sandt, og linjen udskrives. Eksemplet kan også skrives som vist herunder. Eksempel 2 IF &BreakLevel==1 THEN RETURN 1 ELSE RETURN 0 ENDIF Det er muligt at referere til felter i subtotallinjen. I subtotallinjer kan der udskrives værdier fra felter i det kartotek der er angivet i kartotekskolonnen. I nedenstående eksempel er feltet Account indsat i starten af den ene subtotal linje, og udskrives hver gang der er en total for en konto. Dette kræver at posterne i det givne kartotek sorteres efter kontonummer som første felt, og det angives at der skal udskrives totaler for niveau 1. 268
Rapport-definition med to subtotal linjer med egen ledetekst PgHd PgHd Body Subt Subt VendTrans VendTrans VendTrans < < Konto Dato Bilag SaldoDkr ---------- -------- ---------- ----------- Account Date Voucher AmountMST Account i alt...: Kreditorer i alt...: RETURN &BreakLevel == 1 RETURN &BreakLevel == 0 Bemærk at ledeteksten for kontonummeret (subtotalen) er niveau 1 og at ledeteksten for kreditorer i alt (grandtotalen) er niveau 0. Sorteres der på kontonummer og niveau er et, udskrives der totaler hver gang der afsluttes et kontonummer, og til sidst udskrives en samlet total for hele rapporten. Grandtotalen svarer til niveau 0, og kontototalerne svarer til niveau 1. Som det fremgår af eksemplerne udskrives der forskellige tekster til hvert niveau. Resultat af rapport med to subtotal linjer med egne ledetekster Konto Dato Bilag SaldoDkr ---------- -------- ---------- ----------- 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 ----------- 971249987 i alt...: -93.531,38 ----------- 7147274141 30/05-94 500018 395.160,00 7147274141 20/10-94 70026 395.160,00 7147274141 03/01-95 500049-17.246,63 7147274141 02/03-95 70008 17.246,63 ----------- 7147274141 i alt...: 0,00 ----------- Kreditorer i alt...: -93.531,38 =========== 269
Forskellige ledetekster til flere kartoteker Da der kan være flere kartoteker med bodylinjer i samme rapport, er der også mulighed for forskellige ledetekster til subtotalerne for de enkelte kartoteker. Derfor skal der for subtotallinjerne også angives kartotek i kartotekskolonnen. Se nedenstående eksempel. Rapport-definition med to subtotallinjer med egen ledetekst PgHd PgHd PgHd Body Body Subt Subt VendTable VendTrans VendTable VendTrans Konto Navn SaldoDkr Konto Dato Bilag ---------- -------- ---------- ----------- Account Name BalanceMST Account Date Voucher AmountMST Total for kreditorer...: Total for poster...: Resultat af rapport med to subtotallinjer med egne ledetekster Konto Navn SaldoDkr Konto Dato Bilag BeløbDkr ---------- -------- ---------- ----------- ----------- 971249987 Intel Corporation -93.531,38 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 ----------- 971249987 i alt...: -93.531,38 =========== 7147274141 AST Research, Inc 0,00 7147274141 30/05-94 500018 395.160,00 7147274141 20/10-94 70026 395.160,00 7147274141 03/01-95 500049-17.246,63 7147274141 02/03-95 70008 17.246,63 ----------- 7147274141 i alt...: 0,00 =========== ----------- Kreditorer i alt...: -93.531,38 =========== 270
Opgaver: Linjetypen Subtotal Opgave 1: Linjetypen Subtotal og &BreakLevel Formål med opgaven At prøve at anvende Linjetypen Subtotal til at indsætte egne ledetekster foran automatiske subtotaler. Linjeteksterne udskrives afhængigt af indholdet i systemvariabler &BreakLevel. Beskrivelse Der skal arbejdes videre med rapporten fra den forrige opgave idet der tilføjes nogle linjer af typen Subtotal. Der skal indsættes en linje for hvert niveau i sorteringskriterierne og en for grandtotalen. Systemvariablen &BreakLevel anvendes i Linje-XAL til at bestemme hvornår de forskellige subtotal linjer skal udskrives. Subtotal linjerne og systemvariablen gennemgås nøjere i forløbet. Eksempel Lises Bolsjefabrik A/S Side: 1 OPG53_R04_1 Dato: 09/09-08 Udlånt Returne Solgt Udlejning Forsikring Bortko KontoNr UdlånsNr VareNr Værdi Værdi Skrot 20000 1050 10-HD-4 720,00 8.000,00 U 20000 1050 10-HD-4 720,00 8.000,00 R 20000 1050 10-HD-4 720,00 8.000,00 S I alt udlånsnummer 1050 2.160,00 24.000,00 20000 1300 10-MB-2 512,30 6.000,00 S I alt udlånsnummer 1300 512,30 6.000,00 20000 1400 10-HD-4 720,00 8.000,00 B I alt udlånsnummer 1400 720,00 8.000,00 I alt debitornummer 20000 3.392,30 38.000,00 Se forløbet næste side: 271
Forløb 1 Åben rapporten fra forrige opgave og fortsæt i denne eller gem den under et nyt navn der passer til denne opgave, og fortsæt så i kopien. 2 Subtotal linjer Opret fire nye subtotal linjer til hver af de fire niveauer der kan dannes totaler for. Teksterne skal være: 0. Grandtotal 1. I alt debitornummer 2. I alt udlånsnummer 3. I alt varenummer Hver af de tre nederste tekster skal efterfølges af et felt med det tilsvarende felt fra kartoteket. 3 Linje-XAL I Linje-XAL på hver subtotal linje, skal der indsætte et udtryk bestående af kommandoen RETURN efterfulgt af udtrykket &BreakLevel == x, hvor x erstattes af det pågældende niveau i sorteringskriterierne. Ovenstående tekster svarer til sorteringen DebitorKonto, UdlånsNummer, VareNummer. Ændres der på sorteringen skal teksten ændres tilsvarende. 4 Afprøvning Gem rapporten og afprøv den en gang med hver af de fire niveauer og læg mærke til forskellen. Eksemplet viser kun sortering på de to første niveauer. 272
30. Notater i rapporter Formål Formålet med denne lektion er at lære deltagerne at udskrive notater i rapporter. Efter lektionen skal kursisterne kunne: Anvende de macroer der knytter sig til udskrivning af notater i rapporter Opsætte rapport-definition med layout og felter til udskrivning af notater. Generelt Der kan oprettes notater i næsten alle skærmbilleder i C5. De samme notater kan også udskrives i rapporter. Udtræk af notaterne kan udføres på tre forskellige måder: I Rapport-XAL I Rapport-QT Med macroer i Rapport-XAL eller Rapport-QT Udtræk ved hjælp af macroer er den nemmeste, og det anbefales at anvende denne metode i dagligdagen. De to andre metoder gennemgås kort med et eksempel af hensyn til helheden. Rapport linje Inden gennemgangen af søgning efter notater behandles Opsætning af linje i Rapport-definition. Opsætning af linje i Rapport-definition Udskrivning af notater kræver under alle omstændigheder opsætning af en Body linje i Rapportdefinition. Body linjen består af linjetypen Body, kartoteket Notes og feltet Tekst. Eksempel Body Notes Tekst 273
Bemærk! Når tekstfeltet indsættes, vises der en infoboks som følger: Feltlængde reduceret OK Det betyder i virkeligheden, at feltet indsættes med en længde på 250 tegn. Da der ikke kan være 250 tegn på rapporten, er det nødvendigt manuelt at gå ind i feltet og rette formatet til en længde, der passer til den aktuelle rapport f.eks. 60 tegn. Blød linje Når der oprettes notater i et skærmbilleder, er det muligt at indskrive tekster, der fylder mere end der umiddelbart er plads til på de enkelte linjer. Sådanne tekster fortsætter blot ud over kanten i højre side at notatvinduet. Udskrives denne type notatlinjer i en bodylinje med et Tekst felt, der er reduceret til f.eks. 60 tegn, afkortes notatlinjen, så der kun udskrives de 60 tegn. Resten af teksten udskrives ikke. Skal hele teksten vises, må bodylinjen ændres til en Blød linje. Bløde linjer opsættes ved at placeres cursoren på linjen og taste ALT+B. Bløde linjer kendetegnes ved, at de starter med en lodret streg lige i starten af layoutområdet. I eksemplet herunder er linjen ændret til en Blød linje. Bemærk! Under indtastning af notater i skærmbilleder er det også muligt at anvende ALT+B til indtastning af Bløde linjer, så undgås problemet med, at der tastes ud over kanten på notatvinduet. Eksempel (Blød linje) Body Notes Tekst Tegn for at Blød linje er aktiv. Efter opsætning af rapportlinjen skal notaterne hentes i Notes kartoteket. Dette kan f.eks. udføres i Rapport XAL. Bemærk! Når der anvendes blød og ikke blød linje i både indtastning og rapport kan det give mærkelige resultater. Specielt hvis notattekster skal stå i en ramme eller de efterfølges af andre felter på rapportlinjen. Nedenstående matrix forklarer nogle af de mærkværdigheder der opstår. 274
Anvendelse af Blød og Ikke blød linje Indtastning i form Felt i rapport Resultat Blød Blød Hver linje udskrives på tværs af siden, ud over feltlængden i rapporten. * Blød Ikke blød Ikke blød Ikke blød Blød Blød Er der en tegnet en ramme, brydes denne, og eventuelle felter bag tekstfeltet skrives med ud. Den fulde tekst skrives i en ubrudt kasse, hvis feltet er oprettet i en sådan. Eventuelle felter oprettet bag kassen, gentages uden for denne på hver linje med tekst. Hver linje skrives som blød linje i rapporten over hele linjen og ned på næste linje. Er der en kasse rundt om tekstfeltet, afbrydes denne og evt. efterfølgende felter skrives midt i teksten. Hver linje der er indtastet afkortes i rapporten til feltets længde. En eventuel kasse forbliver intakt og evt. efterfølgende felter kommer ud for hver tekstlinje. * Dette er bedste resultat. Der bør dog ikke udskrives andre felter på samme linje. Søgning efter notater i Rapport-XAL Kartoteket Notes Alle notater i C5 ligger i ét fælles kartotek med navnet Notes. Noteskartotekets sammenhæng med andre kartoteker CustTable RowNumber LastChanged Account Name Osv. Notes RowNumber LastChanged NotesRecId NotesFileId LineNumber Txt RecId FileId Oprettes der et notat på skærmbilledet CustTable, gemmes notatet i kartoteket Notes i feltet Tekst. 275
Sammen med teksten gemmes også felterne RecId og FileId. Felterne gemmes i de tilsvarende felter med navnene NotesRecId og NotesFileId. Ved hjælp af disse felter holdes styr på hvilke kartoteker, de forskellige notater tilhører. Denne viden anvendes, når notaterne udsøges med SEARCH løkken. Eksempel (søgeløkke) SEARCH CustTable OUTPUT CustTable SEARCH Notes WHERE Notes.NotesRecId == CustTable.RecId AND Notes.NotesFileId == CustTable.FileId OUTPUT Notes END END Body Body CustTable Notes Account Txt Name I eksemplet hentes kun de notater, der tilhører de aktuelle debitorer, der gennemløbes i søgeløkken. Sætningen WHERE synkroniserer notaterne med debitorerne ved hjælp af felterne NotesRecId og NotesFileId. OUTPUT kommandoen sørger for, at fundne notater sendes til Rapport-definition og udskrives i feltet Txt. Da Body linjen er opsat som Blød linje, udskrives alt tekst, der findes. Der er ingen linjer, der afkortes. Notaterne kan også findes i Rapport-QT. Søgning efter notater i Rapport-QT Notaterne kan også hentes i Rapport-QT. Eksemplet fra forrige afsnit om Rapport-XAL vises herunder udført i Rapport-QT. 276
Eksempel på Rapport QT med notater Kartotek Afgrænsning Fra Til Status CustTable Sortering..: Åben Filter...: Åben Kørsler...: Kørsler Skjul Notes Sortering..: Åben Filter...: Åben Kørsler...: Kørsler Skjul Stregen viser kun, at de to kartoteker er relaterede. Den er ikke bevis på, at relationen er udført korrekt. Korrekt opstilling af relation I Rapport QT opstilles relationerne i Relationsvinduet på underkartoteket, som i dette tilfælde er Notes. Relationsvindue til underkartoteket Notes Relater CustTable Felt RecId 123456789012345 FileId Notes Felt NotesRecId NotesFileId 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 Notes, idet dette kartotek relateres til debitorerne i CustTable 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 godt indsættes flere relaterede felter, som vist i eksemplet med felterne RecId og FileId. Begge felterne er nødvendige for at finde de rigtige notater. 277
Stregen der trækkes mellem to kartoteker opstår så snart to kartoteker er indsat i ralationstabellen, også uden at der er indsat relationsfelter. HUSK! Stregen er ikke et bevis på, at relationen er sat korrekt op, kun at der er en relation. Hvis feltrelationerne ikke indsættes, bliver resultatet, at der for hver post i hovedkartoteket udskrives samtlige notater i Notes kartoteket. Søgning med macroer I stedet for at for at indsætte Notes kartoteket med relationer i Rapport-XAL eller Rapport-QT, kan der anvendes en macro, der kan hente de rigtige notater. #OutputNotes() Macroen #OutputNotes() anvendes til at hente notater til et givent kartotek, uden at kartoteket indsættes som søgeløkke i Rapport XAL eller som søge kartotek i Rapport QT. Syntaks #OutputNotes(<kartoteksnavn>) Det fremgår af syntaksen, at macroen i de efterfølgende paranteser skal have angivelse af navnet på det kartotek, notaterne tilhører. Macroen befinder sig i macrobiblioteket REPORTS, hvorfor dette bibliotek skal loades inden macroen kan tages i anvendelse i en rapport. Rapport XAL I Rapport XAL skal biblioteket loades som det første i XAL koden, som vist i følgende eksempel. Eksempel (macro) #MacroLoad(REPORTS) SEARCH CustTable OUTPUT CustTable #OutputNotes(CustTable) END Body Body CustTable Notes Account Txt Name Bemærk at der ud over SEARCH løkken på CustTable, kun er indsat de to macroer. Det er således nemmere at udskrive notater ved hjælp af macroen, hvorfor dette anbefales i det daglige. Rapport QT Macroerne kan også anvendes i Rapport QT ved, at indsætte dem i de rigtige triggere i QT en. Desuden er Notes kartoteket overflødigt i afgrænsningsvinduet. 278
Trigger til #MacroLoad(REPORTS) Macroen #MacroLoad(REPORTS) skal ALTID indsættes i triggeren Init i Opsætningsvinduet. Det er denne trigger, der aktiveres ført, når rapporten startes. Triggere til #OutputNotes() Macroen #OutputNotes() kan indsættes i forskellige triggere afhængigt af hvornår, notaterne skal udskrives i forhold til hovedkartoteket. Typisk anvendes en af triggerne i feltet Kørsler i kartoteket i Afgrænsningsvinduet. Triggere i Afgrænsningsvinduet Trigger Tidspunkt for aktivering Pre-search Pre-body Pre-output Post-output Pre-join Post-join Index-break Post-body Post-search Inden søgeløkken startes Når der er taget fat i posten Inden posten udskrives Efter posten er udskrevet Inden adgang til underkartotek Efter tilbagevenden fra underkartotek Når der brydes på index iflg. sortering Lige inden posten afsluttes Efter at søgeløkken er afsluttet Ved valg af trigger til #OutputNotes() skal der tages hensyn til, om notaterne skal udskrives før eller efter posten fra hovedkartoteket er udskrevet, og om det skal være før eller efter adgang til et evt. underkartotek. Hvis notaterne skal udskrives efter, posten i hovedkartoteket er udskrevet, anvendes typisk triggeren Post-output eller Post-body. 279
Opgaver: Notater i rapporter Opgave 1: Udlånsordre med notater Formål med opgaven At opbygge en udlånsordre med forskellige typer af felter, samt anvendelse af notater i rapporten. Beskrivelse Der skal oprettes en ny rapport i form af en udlånsordre, som vist i eksemplet herunder. Eksempel Lises Bolsjefabrik A/S Sukkervej 45 6300 Gråsten Tlf: 4564536 UDLÅNSORDRE Central Kopiering Postboks 35 Nummer...: 1000 UdlånsDato: 09/09-09 Ny Østergade 172 1101 København K ReturDato.: 30/09-09 Side...: 1 Bemærkninger Alle varer skal afleveres i rengjort stand Varenummer Navn Serienummer Lejebeløb 10-GC-1 Grafikkort ET-4000 W32P VL 123-ab 56,32 10-GC-1 Grafikkort ET-4000 W32P VL 123-ab1 56,32 10-HD-1 Harddisk AT Conner 420 MB 12-34-56 89,00 10-HD-4 Harddisk SCSI IBM-OEM 2GB 12-34-100 720,00 Se forløbet næste side: 280
Forløb 1 Opret en ny rapport. 2 Datasøgning i Rapport-QT Datasøgning skal udføres på to kartoteker og i viste rækkefølge: UDLUdlånsKart UDLUdlånsPost Kartotekerne skal synkroniseres vha. feltet UdlånsNummer der findes begge steder. På kartoteket UDLUdlånsKart skal der afgrænses på feltet UdlånsNummer. Overskriften til QT en skal være Følgesedler til udlånsordrer og der skal vises kartoteker. INIT (trigger) Biblioteket REPORTS skal loades Der skal oprettes en variabel af typen enum NoYes til at holde styr på om der skal udskrives notater. (Anvendes i en promptboks i prompt triggeren) PROMPT (trigger) Opret en promptboks med teksten Skal der udskrives notater og anvend den oprettede variabel til at modtage værdien. Pre-Body (trigger) Alle informationer om eget firmanavn, adresse og så videre, skal hentes fra firmakartoteket. Introducér og videresend med OUTPUT kartoteket CompanyInfo. Debitors adresseinformationer skal hentes fra debitorkartoteket. Introducer og videresend med OUTPUT kartoteket CustTable. Post-Output (trigger) Notaterne skal udskrives efter bodylinjer på UDLUdlånsKart. Hent notaterne med macroen #OutputNotes(UDLUdlånsKart). Stregerne over og under notatet udskrives med control macroer (med tilhørende Control linjer). Post-Body (trigger) Der skal skiftes side hver gang en ordre er færdig udskrevet. Macroen #Rep_NewPage skifter side. 281
Forløb (fortsat) 3 Rapport-definition Rapport-definition består af forskellige linjetyper med forskellige felter. Page Header I page header linjerne oprettes hovedet af rapporten bestående af eget navn og adresse, debitors navn og adresse samt ordre informationer. Egne informationer hentes fra kartoteket CompanyInfo og består af felterne: Name, Adress1, Adress2, ZipCity og Phone. Debitors informationer hentes fra kartoteket CustTable og består af felterne: Name, Adress1, Adress2 og ZipCity. Ordrens informationer hentes fra UDLUdlånsKart og består af felterne: UdlånsNummer, UdlånsDato og ReturDato. Desuden udskrives systemvariablen &Page med sidenummer. De forskellige ledetekster indsættes som fritekst. Body linjer Der oprettes én bodylinje til kartoteket Notes med feltet: Txt Der oprettes én bodylinje til kartoteket UDLUdlånsPost med felterne: VareNummer, direkte opslag efter varenavn i InvenTable, SerialNumber og UdlejningsVærdi. Group Header linjer Overskrifterne til varelinjerne og deres understregninger er fritekst indsat i Group Headerne til kartoteket UDLUdlånsPost. Control linjer Der anvendes Control linjer til rammen over og under Notesfeltet. 4 Linje-XAL Linje-XAL anvendes til Body linjen med Notatet og de to control linjer der anvendes til kassen rundt om notatet. Der skal indsættes kode så notat med ramme kun udskrives når der er svaret JA i promptboksen med teksten Skal der udskrives notater. 5 Godkend rapporten Afprøv rapporten 282
31. Tekstlag i rapporter Formål Formålet med denne lektion er at lære deltagerne at anvende tekstlag i rapporter, og at forstå sammenhængen mellem tekstlagene og felter med sprogkoder i kartoteker. Efter lektionen skal kursisterne kunne: Opsætte tekstlag i layoutområdet Tilknytte tekstlag i rapportområdet til felter med sprog i kartoteker. Generelt Tekstlag i rapporter er fritekster, der kan skrives på forskellige sprog. Tekstlagene kan indsættes direkte i layoutområdet i rapporter, og udskrives på printeren. Tekstlagene kan vælges ved udskrivningen eller knyttes til sprogkoden i kartoteker. Tekstlag i layoutområdet Tekstlag i layoutområdet anvendes til tekster i forskellige sprog i samme rapport. Teksterne skrives faktisk i hvert sit lag i rapporten. Lagene svarer til de sprog, der findes i fastteksttypen Language_. I den danske version af C5 er de tre første sprog: Dansk Engelsk Tysk Tekstlagene kan faktisk vælges selv om rapportdefinitionen er helt tom, men selvfølgelig også når der er felter og tekster i den. Eksempel Vælg tekstlag *Dansk Engelsk Tysk ALT+Z Når der vælges tekstlag fremkommer ovenstående boks med de tekster, der er oprettet i brugerens C5 installation. Der er en * ud for hvert tekstlag hvori, der er indtastet tekster. 283
Kun fritekster Der kan oprettes forskellige former for tekster i layoutområdet, Fritekster der bare skrives og evt. formatteres, ledetekst/overskrift felter der oprettes med ALT+F2 og felter oprettet med F2 hvori feltudtryk er udfyldt med tekst i citationstegn. Tekstlagene gælder kun for friteksterne. I mange tilfælde anvendes fritekster til søjleoverskrifter og ledetekster som i næste eksempel. Eksempel (dansk tekstlag) PgHd Body CustTable Kontonummer Navn Account Name Eksempel (engelsk tekstlag) PgHd Body CustTable Kontonummer Navn Account Name I ovenstående eksempler er der først det danske tekstlag og derefter det engelske. I det nederste eksempel fylder det engelske ord for kontonummer mere end det danske. Overskrifterne forrykkes derfor i forhold til felterne. Flytning / kopiering / indsætning af felter Det er kun i det danske tekstlag, at det kan lade sig gøre, at skubbe til felter med SPACE og BACKSPACE, samt når der evt. skrives tekst mellem to felter. Forsøges dette i et af de andre tekstlag fremkommer infoboksen: Ikke plads til tekst OK Derimod kan der i alle tekstlag flyttes CTRL+F5, kopieres SH+F5 og indsættes F2 felter. Bemærk! Flyttes, kopieres og indsættes der felter i ét tekstlag, berører det også alle de andre lag. 284
Tekstlagene anvendes således kun til de fritekster, der indtaster i hvert enkelt lag. Friteksterne er de eneste, der kan være forskellige fra lag til lag, medens felter og ledetekstfelter er ens. Felter og ledetekstfelter bør faktisk kun flyttes, kopieres og indsættes i det danske tekstlag. Afvikling af rapporter med tekstlag Når der skal udskrives en rapport med tekstlag, fremkommer der først en boks, hvori det vælges hvilket tekstlag, der skal udskrives på rapporten. Automatisk valg af tekstlag Automatisk valg af tekstlag anvendes f.eks. når, der udskrives rapporter, hvor tekstlaget er afhængigt af en sprogkode i et andet kartotek. Startes der f.eks. en rapport med tekstlag fra menuen i debitorskærmbilledet, kan det ønskes, at teksterne udskrives i debitorens sprog. Det kunne f.eks. være et eksternt papir, der sendes til debitoren i dennes sprog. Macroen #Rep_Language() Macroen #Rep_Language bestemmer tekstlaget, der udskrives i rapporten. Syntaks #Rep_Language(<sprogkode>) Som det fremgår af syntaksen udfyldes paranteserne med en parameter i form af en sprogkode. Sprogkoden er et heltal, der svarer til nummeret i fastteksttypen Sprog. Macroen er en kopi af control kommandoen Control LANGUAGE. Macroen indsættes et passende sted i Rapport XAL eller i en trigger i Rapport QT, hvad der er anvendt i den aktuelle rapport. Bemærk! Anvendes macroen #Rep_Language i en rapport, kræver det at rapporten fremover kaldes fra en menu eller et andet sted, hvor processen Rapport-afvikling kan startes. Desuden skal en af argumenterne til menupunktet eller processen være LANGUAGE=*. Rapporten kan altså ikke længere afvikles direkte uden, at det kan give problemer med udskrivningen af friteksterne i tekstlagene. De kan ikke styres korrekt. Macroen #MacroLoad() Macroen #Rep_Language() befinder sig i macrobiblioteket REPORTS, hvorfor dette bibliotek først skal loades ind i toppen af Rapport XAL eller i Init triggeren i Rapport QT, afhængigt af hvad der anvendes i den aktuelle rapport. Syntaks #MacroLoad(REPORTS) 285
Eksempel (Rapporten Sælger (SalesRep)) #MacroLoad(REPORTS) SEARCH CustTable #Rep_Language(SprogKode) OUTPUT CustTable #Rep_NewPage END PgHd PgHd Body Body Body Body CustTable CustTable CustTable CustTable Sælger til kunde Kontonummer...: Account Navn...: Name Telefon...: Phone Sælger...: SalesRep I Rapport XAL anvendes macroen #Rep_Language, så tekstlaget kan hentes automatisk. Sprogkoden i paranteserne er feltet sprogkode fra CustTable. Feltet indeholder debitorens sprog, der så anvendes ved udskrivningen. Macroen #Rep_NewPage udfører et tvunget sideskift. I dette eksempel er det nødvendigt med et tvunget sideskift, da PageHeaderne ellers udskrives i den første kundes sprog på hver side. Engelsk tekstlag PgHd PgHd Body Body Body Body CustTable CustTable CustTable CustTable Salesman for customer Account number: Account Name...: Name Phone...: Phone Salesman...: SalesRep Tysk tekstlag PgHd PgHd Body Body Body Body CustTable CustTable CustTable CustTable Verkäufer für kunde Kontonummer...: Account Name...: Name Telefon...: Phone Verkäufer...: SalesRep Eksempel på menupunkt i f.eks. formen CustTable Proces...: Rapport-afvikling Parametre til proces..: Report=SalesRep Language=* Menupunktets navn...: Sælger Bogstav til hurtigvalg: S Hjælpetekst...: Liste med sælger til debitor i sprog Rapporten kan også udføres fra Rapport QT. Da skal #Macroload(REPORTS) indsættes i Init triggeren, og #Rep_Language() kan f.eks. indsættes i Pre-output. 286
Opgaver: Tekstlag i rapporter Opgave 1: Udlånsordre med tekstlag Formål med opgaven At indsætte engelsk og tysk tekstlag på en rapport. Beskrivelse Der skal indsættes tekstlag på udlånsordren på engelsk og tysk, som vist i eksemplerne herunder. Eksempel dansk tekstlag Lises Bolsjefabrik A/S Sukkervej 45 6300 Gråsten Tlf: 4564536 UDLÅNSORDRE Central Kopiering Postboks 35 Nummer...: 1000 UdlånsDato: 09/09-09 Ny Østergade 172 1101 København K ReturDato.: 30/09-09 Side...: 1 Bemærkninger Alle varer skal afleveres i rengjort stand Varenummer Navn Serienummer Lejebeløb 10-GC-1 Grafikkort ET-4000 W32P VL 123-ab 56,32 10-GC-1 Grafikkort ET-4000 W32P VL 123-ab1 56,32 10-HD-1 Harddisk AT Conner 420 MB 12-34-56 89,00 10-HD-4 Harddisk SCSI IBM-OEM 2GB 12-34-100 720,00 287
Eksempel engelsk tekstlag Lises Bolsjefabrik A/S Sukkervej 45 6300 Gråsten Tlf: 4564536 LOAN ORDER Central Kopiering Postboks 35 Loan number: 1000 Loan Date..: 09/09-09 Ny Østergade 172 Return Date: 30/09-09 1101 København K Page...: 1 Remarks Alle varer skal afleveres i rengjort stand Serial Loan Item Name Number Amount 10-GC-1 Grafikkort ET-4000 W32P VL 123-ab 56,32 10-GC-1 Grafikkort ET-4000 W32P VL 123-ab1 56,32 10-HD-1 Harddisk AT Conner 420 MB 12-34-56 89,00 10-HD-4 Harddisk SCSI IBM-OEM 2GB 12-34-100 720,00 288
Eksempel tysk tekstlag Lises Bolsjefabrik A/S Sukkervej 45 6300 Gråsten Tlf: 4564536 LEIHAUFTRAG Central Kopiering Postboks 35 Leihnummer: 1000 Leihdatum.: 09/09-09 Ny Østergade 172 Rückdatum.: 30/09-09 1101 København K Seite...: 1 Bemerkung Alle varer skal afleveres i rengjort stand Waren Serien nummer Name nummer Leihbetrag 10-GC-1 Grafikkort ET-4000 W32P VL 123-ab 56,32 10-GC-1 Grafikkort ET-4000 W32P VL 123-ab1 56,32 10-HD-1 Harddisk AT Conner 420 MB 12-34-56 89,00 10-HD-4 Harddisk SCSI IBM-OEM 2GB 12-34-100 720,00 Forløb 1 Der skal fortsættes i rapporten fra forrige opgave 2 Tekstlag Der skal indsættes tekster i både det engelske og tyske sproglag Teksterne fremgår af eksemplerne herover. 3 Godkend rapporten Afslut, godkend og afprøv rapporten i de forskellige tekstlag, idet du vælger sprog ved start af rapporten, når du præsenteres for boksen med tekstlagene. 289
Opgave 2: Forberede automatisk tekstlag Formål med opgaven At forberede rapporten til automatisk valg af tekstlag ved kald fra f.eks. lokalmenuer. Beskrivelse Macroen #Rep_Language() skal indsættes i en af triggerne i rapporten, så der automatisk vælges tekstlag under udskrivningen. Forløb 1 Der skal fortsættes i rapporten fra forrige opgave 2 Macroen #Rep_Language() Macroen indsættes i triggeren Pre-Output, så den aktiveres inden, der skrives på papiret. Debitorens sproglag indsættes i paranteserne med et direkte opslag i debitorkartoteket (CustTable). Feltet DebitorKonto i kartoteket UDLUdlånsKart anvendes i opslaget. 3 Godkend rapporten Afslut, godkend og afprøv rapporten. Læg mærke til, at det kun er de ordrer med et tekstlag, der svarer til det du vælger, der vises med tekstlag. De andre vises ikke med tekstlag. Tekstlaget er ikke loadet ind rapporten. Dette kan kun udføres i kaldet af rapporten fra f.eks. en lokalmenu, idet menukaldet tilføjes LANGUAGE=* i parametre til proces. 4 Opret lokalmenu Opret en lokalmenu på formen UDLUdlånsKart med LANGUAGE=* I Parametre til proces skal der kun stå Report=rapportens navn og LANGUAGE=* 5 Godkend og afprøv Godkend rapporten og afprøv igen. Denne gang kaldt fra det nyoprettede menupunkt. Vælger du samtlige ordrer udskrives de med det korrekte tekstlag. 6 Afprøv igen Afprøv igen rapporten med kald direkte fra REP/Kør i udviklingsmenuen. Nu er det kun rapporter der svarer til det tekstlag der vælges, som udskrives med tekstlag. 290
32. QT control macroer Mål med lektionen Formålet med denne lektion er, at give deltagerne kendskab til de specielle QT control macroer, der findes. Lektionen er kun tænkt som et tillæg med en liste over control macroer. Der er ingen ekstra forklaringer eller eksempler. Ønskes dette, henvises der til manualen Teknisk Reference eller hjælpeteksten i hjælpefilerne. Efter lektionen skal kursisterne kende til: QT control macroer Generelt QT control macroer er en erstatning for de QT control kommandoer, der findes til søge værktøjet QT. Macroerne er opbygget ved hjælp af kommandoerne og udfører således de samme funktioner. Både control macroer og control kommandoer kan anvendes i QT er, men oftest anvendes kun macroerne. QT control macroer Fordele ved control macroer En af fordelene ved at anvende macroerne er, at disse syntaks checkes. Dette udføres ikke ved kommandoerne. Der er også parameter kontrol. QT control macroerne findes i macro biblioteket QUERY, der altid skal loades, inden macroerne kan anvendes. Dokumentation Når der skal findes dokumentation på macroerne, skal der ses på navnet, hvorefter den tilsvarende control kommando findes i manualen eller i hjælpe filen. Control macroen #QT_Fill tilsvarer kommandoen Control QFill. Alle macroerne starter med #QT_ efterfulgt af navnet på kommandoen. Parametrene til macroerne er de samme som til kommandoerne. Der er dog forskel ved angivelsen, idet de i kommandoer adskilles med mellemrum og i macroer adskilles med komma. 291
Skema med macroer QT control macroer Navn Funktion Parametre #QT_Fill #QT_Clear #QT_Fill(<felt>, <værdi fra>, <værdi til>) #QT_Clear(<felt>, <værdi fra>, <værdi til>) Udfylder <felt> i QT en med <værdi fra> og <værdi til> Clearer eller tømmer <felt> i QT en, i felterne <værdi fra> og <værdi til> #QT_Title #QT_Title(<titel>) Indsætter ny titel på QT boksen QT_Skip #QT_Skip() Ingen parametre Skjuler QT boksen for brugeren #QT_Break #QT_Break() Ingen parametre Afbryder kørslen med det samme #QT_Execute #QT_Execute(kartotek) Igangsætter QT en fra angivne kartotek. Fungerer som en slags subrutine. Kan f.eks. igangsættes inden den virkelige QT startes. #QueryError #QueryError() Ingen parametre Anvendt til defaultværdier i QT QT control macroerne anvendes bl.a. til indsættelse af defaultværdier i QT er. Anvendes i triggeren Error. Viser fejl i control kommandoerne. Ved i Init triggeren at tildele værdier til nogle af kartoteksfelterne med SET kommandoen, kan disse felters værdier gøres til defaultværdier i QT en. Dette udføres vha. macroen #QT_Fill. Efterfølgende vises forskellige eksempler på indsættelse af defaultværdier i QT er. Eksemplerne kan f.eks. indsættes i rapporten DebitorStamData. Bemærk! #QT_Fill kun kan anvendes på felter, der er synlige i QT en. (Felter indsættes med F2). Eksempel 1 #MacroLoad(QUERY) SET CustTable.Group = UDL SET CustTable.Country = England #QT_Fill(CustTable) I eksempel 1 anvendes kun parameteren CustTable til #QT_Fill. Dette medfører at felterne Group og Country udfyldes i QT en, hvis felterne er synlige. 292
Eksempel 2 #MacroLoad(QUERY) SET CustTable.Group SET CustTable.Country = UDL = England SET CustTable.SalesRep = AH SET CustTable.BalanceMax = 100000 #QT_Fill(CustTable,Group) #QT_Fill(CustTable,SalesRep) I eksempel 2 anvendes felterne Group og SalesRep også som parametre i #QT_Fill. Dette medfører at kun disse to felter udfyldes i QT en, selv om der er andre felter, der også har fået tildelt værdier med SET kommandoen. Eksempel 3 #MacroLoad(QUERY) SET CustTable.BalanceMax = 100000 #QT_Fill(CustTable,BalanceMax, From ) SET CustTable.BalanceMax = 250000 #QT_Fill(CustTable,BalanceMax, TO ) I eksempel 3 tildeles feltet BalanceMax værdien 100000, hvorefter #QT_Fill anvender feltet for at indsætte værdien i den tilhørende QT. Da der yderligere er tilføjet parameteren From, er det kun Fra feltet, der udfyldes med værdien. Efterfølgende tildeles en ny værdi til feltet BalanceMax, nemlig værdien 250000, og #QT_Fill gentages for at indsætte denne værdi i QT en. Denne gang i Til siden. Dette udføres med parameteren To. Eksempel 4 #MacroLoad(QUERY) SET CustTable.Group = UDL SET CustTable.Country = England SET CustTable.SalesRep = AH SET CustTable.BalanceMax = 100000 #QT_Clear(CustTable) #QT_Fill(CustTable,Group) #QT_Fill(CustTable,SalesRep) #QT_Fill(CustTable,BalanceMax, From ) SET CustTable.BalanceMax = 250000 #QT_Fill(CustTable,BalanceMax, TO ) I eksempel 4 er de forskellige muligheder kombineret, og #QT_Clear er indsat for at tømme QT en for værdier inden defaultværdierne indsættes. 293
#QT_Clear anvendes til at sørge for at alle felter i QT en tømmes inden brugen. Brugerindtastede værdier fra tidligere anvendelse af QT en fjernes også. 294
Opgaver: QT Control macroer Opgave 1: Defaultværdier i QT Formål med opgaven At indsætte defaultværdier i en QT. Beskrivelse QT en i rapporten fra forrige opgave skal opsættes, så der automatisk indsættes defaultværdier i feltet UdlånsDato. Desuden skal der automatisk indsættes en anden overskrift når rapporten afvikles. Forløb 1 Der skal fortsættes i rapporten fra forrige opgave. 2 I init triggeren skal biblioteket QUERY macroloades idet der i dette bibliotek findes QT macroer der anvendes til automatisk udfyldning af QT en. 3 Feltet UdlånsDato skal tildeles dags dato med funktionen der kan hente denne. 4 Feltet Udlånsdato skal automatisk udfyldes i QT en Find selv den rette QT control macro i lektionen. 5 Titlen på QT boksen skal ændres til: Udlånsordrer pr. dags dato. NB: Titlen skal kun ændres under afviklingen. Du skal altså ikke røre ved den oprindelige titel. Find selv den rette QT control macro, så teksten kun ændres under afviklingen. 6 Godkend rapporten Afslut, godkend og afprøv rapporten. 295
Opgave 2: Menupunkt til rapport Formål med opgaven At kalde rapporten i forrige opgave fra en menu så sprogene vises korrekt. Beskrivelse Der skal oprettes et menupunkt i gittermenuen under Debitor/Udskrifter i undermenuen med overskriften Debitor. Forløb 1 Der skal oprettes et menupunkt i Debitor/Udskrifter/Debitor nederst i menuen. 2 Kald menupunktet for Dagens udlån. 3 Find selv den rigtige proces. 4 Find selv den rigtige parameter så alle sproglagene bliver loadet korrekt inden rapporten udskrives. 5 Godkend menupunktet Afslut, godkend og afprøv rapporten via menupunktet. 296
33. Rapport synkronisering Mål med lektionen Formålet med denne lektion er at lære deltagerne at synkronisere rapporter med forms, således at indeholdet i en rapport er afhængigt af indholdet i en form. Det vises desuden, hvordan billedet med udskriftmuligheder kan overspringes ved udskrivning af rapporter Efter lektionen skal kursisterne kunne: Synkronisere rapporter med forms Overspringe billedet udskriftsmuligheder. Generelt Rapport synkronisering anvendes, når en rapport udskrives direkte fra en form. Et eksempel på en sådan synkronisering kunne være en følgeseddel, der udskrives direkte fra et ordreskærmbilled, idet der kun udskrives en følgeseddel til den ordre der ses på skræmbilledet. Synkroniseringen består i, at den kaldte rapport sættes op, så indholdet stemmer overens med indholdet i den form der kaldes fra. Synkronisering Betydning Synkronisering mellem forms og rapporter udføres som hovedregel ved hjælp af kald fra lokalmenuen i en form og opsætning af selve synkroniseringen i den rapport der kaldes. I illustrationen herunder er Ordrekartotek hovedform til rapporten Følgeseddel. Kald af rapport fra lokalmenu i form Ordrekartotek Lokal menu Følgeseddel 297
Det er i selve rapporten, at synkroniseringen finder sted. Derfor er der i rapporten brug for informationer fra formen. Det er vigtigt at forstå, at et kald af en rapport via en lokal menu i en form ikke alene er nok til, at overføre de rigtige informationer til den kaldte rapport. Informationerne skal hentes i en buffer, som vist i næste afsnit. Buffer Når der foretages et kald af en rapport via en lokalmenu, gemmes skærmens aktuelle post og data i en buffer. Det betyder, at der til enhver tid kan hentes information i bufferen om den post eller record, der blev kaldt fra. Bufferen indeholder den aktuelle record Buffer Aktuel record Information om aktuel record (ordre) hentes i bufferen Hovedform Ordrekartotek Rapport Følgeseddel Lokal menu I rapporten er det vigtigt at vide, hvilken post der kaldes fra, så den rigtige postering kan findes frem. Dette kan gøres ved at åbne bufferen med kommandoen EXTERN. EXTERN med RENAME Kommandoen EXTERN åbner for en buffer med informationer om den record, der kaldes fra. 298
Åbning af buffer med EXTERN Buffer OrdreKart Bufferen åbnes med kommandoen EXTERN buffernavn Hovedform Ordrekartotek Lokal menu Rapport EXTERN OrdreKart Følgeseddel Hvis bufferen i rapporten har samme navn, som bufferen i formen der kaldes fra, kan kommandoen RENAME anvendes til at give formens buffer et andet midlertidigt navn, så der kan kendes forskel på hvilken buffer, der refereres til. Syntaksen for EXTERN med RENAME er som følger, idet kommandoen efterfølges af bufferens dvs. kartotekets navn. Syntaks EXTERN <buffer> RENAME <midlertidigt buffernavn> Hvis der f.eks. fra formen SalesTable skal foretages et kald af rapporten Følgeseddel, og følgeseddelen har udgangspunkt i samme kartotek som formen, vil bufferen til formen have samme navn som kartoteket i rapporten. Derfor er det nødvendigt at anvende RENAME. I følgesedlen kan der f.eks. åbnes for bufferen til SalesTable for, at se hvilket ordrenummer der blev kaldt fra. Åbningen af bufferen skal da se ud som følger. Eksempel EXTERN SalesTable RENAME OK {Forkortelse for SalesTable} Når bufferen er åbnet, skal blokkens nøglefelter tildeles værdier fra den. Det udføres med kommandoen SET. Synkronisering i rapport QT Synkronisering i rapport QT udføres i triggeren INIT, der er den første trigger, der aktiveres i en QT. I triggeren åbnes formens buffer med EXTERN og værdier fra den åbnede buffer tildeles med SET kommandoen til de tilsvarende felter i QT ens buffer. Efterfølgende udfyldes felterne i QT en med macroen #QT_Fill. 299
Triggeren Init i rapport QT #MacroLoad(REPORTS) #MacroLoad(QUERY) EXTERN SalesTable RENAME OK {Forkortelse for SalesTable} SET SalesTable.Number = OK.Number #QT_Fill(SalesTable,Number) Synkronisering i rapport XAL Synkronisering i rapport XAL udføres ved at åbne bufferen inden SEARCH kommandoen. Inde i selve søgeløkken anvendes kommandoen WHERE derefter til sammenligning af kartoteksfelter med bufferfelter, så der kun udsøges poster der stemmer med posten i bufferen. Rapport XAL med SEARCH #MacroLoad(REPORTS) EXTERN SalesTable RENAME OK {Forkortelse for SalesTable} SEARCH SalesTable WHERE SalesTable.Number = OK.Number OUTPUT SalesTable END Synkroniseringen i rapport XAL kan også udføres i forbindelse med kommandoen INTRODUCE, som vist i eksemplet herunder. Rapport XAL med INTRODUCE #MacroLoad(REPORTS) EXTERN SalesTable RENAME OK {Forkortelse for SalesTable} INTRODUCE SalesTable[NumTransIdx==OK.Number] OUTPUT SalesTable I dette eksempel åbnes bufferen også med EXTERN. Værdien i feltet OK.Number anvendes derefter til opslag i indexet i INTRODUCE kommandoen, således at posten findes direkte. Uden udskriftsmuligheder i rapport Når der udskrives rapporter, fremkommer der altid et billede med udskrifts-muligheder. I billedet kan der angives bestemmelsessted for rapporten, og hvordan udskriften skal foregå. Felterne i billedet kan automatisk udfyldes med værdier, der overføres fra menukaldet, og billedet kan springes helt over, så brugeren ikke ser det, og derfor heller ikke kan udfylde felterne i det. Rapporter afvikles altid med processen Rapport-afvikling, der f.eks. kan startes fra en lokalmenu i en form. 300
Processen Rapport-afvikling Processen skal mindst have angive navnet på rapporten, der skal afvikles, men der kan også angives forskellige andre parametre, der f.eks. styrer om rapporten skal skrives til skærm eller printer. De forskellige parametre er beskrevet i Teknisk Reference under processen Rapport-afvikling. Efterfølgende gives dog eksempler på anvendelse af parameteren OUTPUT. OUTPUT Parameteren OUTPUT anvendes bl.a. til at udfylde felter i billedet udskriftsmuiligheder. Destination OUTPUT=SCREEN OUTPUT=SPOOL OUTPUT=PRINTER OUTPUT=ASCII Betydning Udskrift til skærm Udskrift til spoolfil (navn angives i printeropsætning) Udskrift til valgt printer Udskrift til ASCII fil (navn angives i dialogboks) Ud over disse fire destinationsmuligheder kan der f.eks. tilføjes følgende ekstra faciliteter: Parameterværdi MSGWND eller MSGWND- GETOPTS eller GETOPTS- ALLPAGES eller ALLPAGES- Betydning MesSaGe WiNDow Et statusvindue med side og linje der er ved at blive dannet. Afsluttes med vises vinduet ikke. GET OPTionS Dialogboksen Udskriftsmuligheder fremkommer før udskrift, så brugeren selv kan vælge. Afsluttes med vises dialogboksen ikke. Denne værdi kan kun anvendes efter OUTPUT=Screen, og bevirker at alle sider dannes inden rapporten vises på skærmen. Afsluttes med dannes én side ad gangen. Som det fremgå af skemaet herover kan de forskellige muligheder slås til og fra ved at angive henholdsvis et eller et + efter muligheden. Plusset kan undlades. Eksempler 1 OUTPUT=Screen I dialogboksen med udskriftsmuligheder sættes feltet Skriv til automatisk til Skærm. Eksempler 2 OUTPUT=Screen,msgwnd 301
I dialogboksen med udskriftmuligheder sættes feltet Skriv til automatisk til Skærm, og et statusvindue åbnes. Eksempler 3 OUTPUT=Printer,msgwnd,getopts- I dialogboksen med udskriftsmuligheder sættes feltet Skriv til automatisk til Printer, og et statusvindue åbnes. Desuden springes selve dialogboksen med udskriftsmuligeheder over så brugeren ikke kan ændre nogen af felterne. Eksempler 4 OUTPUT=Screen,msgwnd,getopts-,allpages I dette eksempel skrives til skærmen, der vises et statusvindue, Udskriftsmuligheder springes over, og alle sider dannes inden rapporten vises på skærmen. 302
Opgaver: Rapport synkronisering Opgave 1: Synkronisering og udfyldning af QT Formål med opgaven At synkronisere en rapport med en form og udfylde felter i en QT automatisk, samt at sørge for at springe rapportudskrivningsboksen over. Beskrivelse Rapporten fra forrige opgave skal synkroniseres, så der altid kun udskrives ordre til den post, der aktuelt er åben. QT en skal desuden automatisk udfyldes og overspringes. Boksen med printeropstillingen skal også springes over. Vælges der udskrivning af rapporten, skal den altså udskrives direkte uden nogen form for pauser, inden udskrivningen begynder. Forløb 1 Fortsæt i rapporten fra forrige opgave. 2 I init triggeren åbnes bufferen til kartoteket UDLUdlånsKart. Bufferen RENAMES til Buffer. Kontrollér i en IF sætning om der er et løbenummer. Er der det, sættes rapportens (UDLUdlånsKart) UdlånsNummer=bufferens udlånsnummer. Med #QT_Fill udfyldes feltet UdlånsNummer og med #QT_Skip overspringes QT en. IF sætningen skal også indeholde en ELSE, hvori linjerne fra forrige opgave indsættes, så rapporten stadig kan afvikles, fra det menupunkt du oprettede i forrige lektion. Det drejer sig om linjerne med udlånsdatoen og linjen med titlen på QT boksen. 3 Lokal menu I formen til UDLUdlånsKart oprettes endnu et menupunkt med følgende indhold i parameter til proces: Report=rapportens navn LANGUAGE=* OUTPUT=Screen,Getopts- 4 Godkend rapporten Afslut, godkend og afprøv rapporten. 5 Hvad skete der med Notaterne Spørgsmålet i promptboksen kommer ikke frem mere. Det er fordi, prompt triggeren også springes over, når #QT_Skip aktiveres. Flyt indholdet i prompt triggeren over i start triggeren og du får spørgsmålet igen. 303
34. Rapporter i Windows Mål med lektionen At deltagerne kan foretage nødvendige ændringer i DOS rapporter, så rapporterne også udskrives korrekt i Windows versionen af C5. Efter lektionen skal kursisterne kunne: Opsætte skrifttyper i printerdriverne Standard og Standard Windows Markere felter og tekst i rapporter og tildele nye skrifttyper Indsætte nye skrifttyper i Windows Sætte feltlængder på fritekster til anvendelse i Windows Anvende fed, kursiv osv. Generelt Rapporter oprettes og vedligeholdes altid i DOS udgaverne af C5. Når rapporterne udskrives i DOS anvendes som regel skrifttyper med fast spatiering. Udskrives de samme rapporter derimod i Windows, anvendes der automatisk skrifttyper med proportional spatiering. Dette bevirker, at overskrifter ikke altid kommer til at stå direkte over de tilhørende kolonner. Denne lektion behandler nogle af de problemer, der opstår, når rapporter skal kunne udskrives både i DOS og Windows. Planlægning af rapport layout Ved planlægningen af rapport layout er der tre hensyn at tage: Planlægningen udføres i DOS Rapporter kan udskrives i DOS Rapporter kan udskrives i Windows. Planlægning udføres i DOS Rapporter opbygges altid i DOS udgaven af C5. Deres udseende opsættes i layoutområdet i Rapport-definition, der er et DOS vindue, hvor alle tegn fylder lige meget. Der er plads til 60 tegn i selve layoutområdet, men der kan skrives ud over kanten i højre side. Alle felter og tekster opstilles i forhold til de kolonner, der ses i layoutområdet. Rapporter kan udskrives i DOS De fleste rapporter, der udskrives i DOS versionen, anvender skrifttyper, hvor alle bogstaverne fylder lige meget. Det siges, at skrifttypen har fast spatiering. Da skrifttyperne i layoutområdet også fylder lige meget, er det derfor nemt at planlægge rapporters udseende, når de skal udskrives i DOS, idet de bliver som planlagt i layout området. 304
Rapporter kan udskrives i Windows Det er sværere at planlægge rapporter, der skal udskrives i Windows, idet Windows for det meste anvender proportional spatiering under udskriften. Bogstaverne fylder således ikke det samme i rapporten som i definitionsvinduet. Rapporter, der skal udskrives i Windows, kræver derfor mere aftestning, da det endelige resultat kun kan ses ved at starte rapporten fra C5 i Windows. Usynligt gitter Problemerne kan opstå i alle rapporter, hvor der anvendes forskellige skrifttyper eller størrelser på skrifttyper. Under udskrift i Windows anvendes der et usynligt gitter, der bestemmer, hvor felter og tekster placeres på rapporten. Maskerne i gitteret afhænger af skrifttypen i rapporten, idet det er skrifttypens Pitch eller CPI, der bestemmer maskernes bredde. Skrifttypen Lucinda console i 6, 10 og 12 pitch 6 tegn pr. tomme 10 tegn per tomme 12 tegn per tomme Default skrifttype for rapporten Der kan vælges en default skrifttype til hver enkelt rapport. Skrifttypen indsættes i Skrifttype-feltet i opsætningen af rapporten med CTRL+F6. Der kan kun vælges mellem skrifttyper, der i forvejen er defineret på printeren, der er valgt til rapporten. Hvis der ændres i skrifttypen, skal der efterfølgende udføres Slet rettelser for alle brugere med CTRL+F9. Den valgte skrifttype gælder for alle linjer, der opsættes i layoutområdet. Hvis der ikke foretages nogen ændringer, er maskebredden den samme i alle linjer i layoutet. Samme skrifttype og samme pitch giver ensartet gitter Forskellige skrifttyper pr. linje Det usynlige gitter kan på de enkelte linjer ændres til en anden maskestørrelse ved at give linjen en anden skrifttype eller samme skrifttype med en anden pitch. Det første tegn i hver linje i layout området bestemmer hvilken skrifttype og pitch, der gælder for den pågældende linje under udskriften. Dette gælder både ved udskrivning i DOS og Windows, men det har særlig betydning ved udskrifter i Windows, hvor der anvendes proportional spatiering. 305
Skrifttypen til første tegn bestemmer gitteret for hele linjen Der kan således udmærket være forskellige linjer med hver sin usynlige maskestørrelse. Spatiering i skrifttyper Skrifttyper eller fonte har enten fast eller proportional spatiering. Fast spatiering Fast spatiering betyder, at alle tegn og bogstaver fylder lige meget. Skrifttyper med fast spatiering anvendes for det meste til regneark og databaser, hvor det er vigtigt at felter og tekster opstilles pænt i kolonner. De anvendes også, når der udskrives fra DOS udgaverne af C5. Proportional spatiering Proportional spatiering betyder, at tegn og bogstaver ikke fylder mere end nødvendigt. Bogstavet I fylder således ikke det samme som bogstavet M. Skrifttyper med proportional spatiering anvendes meget i programmer til tekstbehandling, men anvendes også i Windows udskrifter fra C5. Eksempler på skrifttyper Spatiering Skrifttyper (eksempler på fonte) Fast Courier, Letter Gothic, Lineprinter, Lucinda Console Proportional CG Times, Arial, Times New Roman, Helvetica * * Helvetica er standard i C5, når der udskrives fra Windows. Forskel på fast spatiering og proportional skrift Forskellen på tekster udskrevet med fast spatiering og tekster udskrevet med proportional skrift er ganske tydelig og fremgår af eksemplerne herunder. Eksemplerne indeholder kolonneoverskrifter til en rapport. Det er samme overskrifter i begge eksempler, så det er nemmere at se forskellen på skrifttyperne. Skrifttype med fast spatiering (Lucinda Console) VareNummer Navn Serienummer Lejebeløb 306
Skrifttype med proportional spatiering (Helvetica) VareNummer Navn Serienummer Lejebeløb Felter i rapporter Når felter planlægges i en linje i layoutområdet, placeres de med start i en af kolonnerne i linjen, og feltet fylder et givet antal tegn eller kolonner. Udskrives linjen i DOS, fylder feltet på tilsvarende måde det samme antal tegn som planlagt, idet hver kolonne i layoutet svarer til en celle i det usynlige gitter. Udskrives linjen derimod i Windows, fylder feltet stadig det planlagte antal celler, men selve feltindholdet udskrives med proportional spatiering. Proportional spatiering er således ligeglad med den faste celle størrelse. Felternes indhold kan udskrives venstrestillet, centreret eller højrestillet. I eksemplet herunder vises et felt med teksten Grafikkort. Øverst vises feltet udskrevet med fast spatiering og nederst med proportional spatiering. Selve feltet fylder lige meget, som det fremgår af kassen, men den proportionale skrift fylder mindre i feltet. Felter med fast og proportional spatiering Fast spatiering Grafikkort Proportional spatiering Grafikkort Grafikkort Grafikkort Venstrestillet Centreret Højrestillet Talfelter bør altid højrestilles så værdierne kommer til at stå pænt under hinanden. Fritekst i rapporter Fritekst er tekster, der skrives direkte i layoutområdet. De anvendes som regel til overskrifter, ledetekster eller almindelig tekst. I eksempel 1 herunder er overskrifterne indsat som fritekst. Eksemplet er udskrevet i DOS, og som det ses fylder alle tegn det samme som i et usynligt gitter. 307
Eksempel 1 udskrift i DOS VareNummer Navn Serienummer Lejebeløb 10-GC-1 10-GC-1 Grafikkort ET-4000 W32P VK 123-ab Grafikkort ET-4000 W32P VK 123-ab1 56,32 56,32 10-HD-1 Harddisk AT Conner 420 MB 12-34-56 89,00 10-HD-4 Harddisk SCSI IBM-OEM 2GB 12-34-100 720,00 Eksempel 2 udskrift i Windows VareNummer Navn 10-GC-1 10-GC-1 10-HD-1 10-HD-4 Serienummer Lejebeløb Grafikkort ET-4000 W32P VL Grafikkort ET-4000 W32P VL Harddisk AT Conner 420 MB Harddisk SCSI IBM-OEM 2GB 123-ab 123-ab1 12-34-56 12-34-100 56,32 56,32 89,00 720,00 Eksempel 2 er udskrevet i Windows, og som det ses passer overskrifterne ikke over kolonnerne. For at undgå den store sammentrækning mellem teksterne i overskrifterne, skal linjen ændres til tekstfelter med et felt til hver overskrift. Opsætning af tekstfelt Opsætningen udføres ved at placere cursoren på en af teksterne f.eks. VareNummer, og taste F6. Derved åbnes en boks med overskriften Formattering af tekst. Felter i Formattering af tekst Felt Anvendelse Tekst Tekstens max længde Overskrift/Ledetekst Tekstens justering Indeholder al fritekst mellem to felter, både formaterede tekstfelter og almindelige felter. Er der ingen felter på linjen, indeholder feltet al tekst på den. Teksten formateres til et tekstfelt af længden i dette felt. Om feltet skal fungere som overskrift eller ledetekst. Ved ledetekst sættes automatisk punkter og kolon efter teksten Venstrestillet, højrestillet eller centreret. Bemærk! Hver overskrift skal formateres for sig. Længden sættes til antal tegn i det usynlige gitter, der gælder for den aktuelle linje. Efter omformateringen består linjen af flere enkelte felter, der er placeret på deres bestemte pladser i layoutet, og under udskrivning i Windows skrives teksterne med proportional spatiering inden for den givne feltlængde. Eksemplet herunder viser samme eksempel som tidligere, men med fritekster omdannet til tekstfelter. 308
Udskrift i Windows med fritekst i form af felter VareNummer Navn Serienummer Lejebeløb 10-GC-1 10-GC-1 10-HD-1 10-HD-4 Grafikkort ET-4000 W32P VL Grafikkort ET-4000 W32P VL Harddisk AT Conner 420 MB Harddisk SCSI IBM-OEM 2GB 123-ab 123-ab1 12-34-56 12-34-100 56,32 56,32 89,00 720,00 Nye skrifttyper i Windows Printerdrivere Der kan indsættes nye skrifttyper i printerdriverne efter behov. Skal en ny skrifttype anvendes i rapporter, der udskrives i Windows, skal skrifttypen tilføjes i to printerdrivere: Standard Standard-Windows (eller evt. en anden Windows printerdriver). Grunden til at skrifttypen både skal indsættes i Standard og Standard-Windows printerdriverne er, at rapporter oprettes i DOS og som sådan kun kan anvende printerdrivere beregnet til DOS f.eks. Standard. Standard driveren anvendes således kun under opbygningen af rapporten, medens Standard-Windows printerdriveren anvendes under udskriften i Windows. Opbygning af skrifttyper i driverne Skrifttyperne oprettes ved at vælge opsætningen af den pågældende printerdriver og vælge menupunktet Skrifttype. Promptboksen, der vises, er lidt forskellig i de to typer printerdrivere (DOS og Windows). Opbygning af skrifttype i DOS printerdriver Felt Anvendelse Navn Start kode Stop kode Pitch Tabel Navn på skrifttype (samme som i Windows) Udfyldes ikke (Indeholder normalt ESC koder til start af skrifttypen) Udfyldes ikke (Indeholder normalt ESC koder til stop af skrifttypen) Tegn pr. tomme Udfyldes ikke (Anvendes f.eks. til oversættelse af specialtegn i DOS) 309
Opbygning af skrifttype i Windows printerdriver Felt Anvendelse Navn Skrifttype Tegnbredde Tegnhøjde Navn på skrifttype (samme som i DOS) Navn på font i Windows fontbibliotek. Efterlades feltet tomt, udfyldes det automatisk, når fonten vælges, første gang rapporten afvikles i Windows. Tegn pr. tomme (samme som Pitch i DOS) Skrifttypens højde i punkter. Udfyldes dette felt tages ikke længere højde for tegnbredden, selv om denne alligevel skal udfyldes. Hvis skrifttyperne i Standard-Windows printerdriveren skal anvendes i en rapport, skal du sikre dig, at de samme skrifttyper også er defineret i Standard DOS printer driveren. Nogle gange kendes den nøjagtige stavemåde på fontens navn ikke. I disse tilfælde efterlades feltet til fontnavnet blankt, når fonten defineres i Windows printerdriveren. Når rapporten eksekveres i GUI versionen, promptes der med et valg mellem de Windows skriftfonte, der er til rådighed. Når en af fontene er valgt, gemmes den i Microsoft Dynamics C5 Windows printerdriveren. Beregning af feltstørrelse Skal der indsættes felter med større skrifttype end default, kan det være svært at finde ud af hvor meget feltet kommer til at fylde på rapporten, når den udskrives i Windows. Størrelsen på feltet i udskriften kan beregnes med følgende formel. (Antal tegn i felt) * (CPI default font) / (CPI valgt font) Skrifttype mindre end defaulttypen Hvis der indsættes skrifttyper, der er mindre en defaulttypen, og det ser ud til at linjerne ikke behandles korrekt, kan dette ordnes ved, altid at definere defaultfonten til 17 CPI, eller hvad der er den mindste skrifttype, der er defineret. Skrifttype til et bestemt felt i en rapport Der vælges en anden skrifttype til et bestemt felt i en rapport ved at markere feltet med ALT+A, og derefter vælge lokalmenuen og herefter Blok/Indsæt kode for at tildele skrifttypen til feltet. Printerkoder Koderne, der tilknyttes, kan ses i printerlayoutet med ALT+E. Når der dannes rapporter i udviklingsmenuen, er det muligt at angive forskellige koder for fonte, farver osv. Efter indsættelsen kan koderne vises med forkortelser. Herunder vises en liste over de forskellige forkortelser. 310
Forkortelser til printkoder Kode Betydning <F+> <F-> <DF+> <DF-> <C+> <C-> <DC+> <DC-> <T+> <T-> <O> <P> <L> Font on Font off Default font on Default font off Color on Color off Default color on Default color off Typestyle on TypeStile off Printer option Printer paper Line spacing Eksempel på rapport i Windows Lises Bolsjefabrik A/S Sukkervej 45 6300 Gråsten Tlf: 4564536 UDLÅNSORDRE Central Kopiering Postboks 35 Ny Østergade 172 1101 København K Bemærkninger Alle varer skal afleveres i rengjort stand Nummer : UdlånsDato : ReturDato : Side : 1000 09/09-99 30/09-99 1 Varenummer Navn Serienummer Lejebeløb 10-GC-1 10-GC-1 10-HD-1 10-HD-4 Grafikkort ET-4000 W32P VL Grafikkort ET-4000 W32P VL Harddisk AT Conner 420 MB Harddisk SCSI IBM-OEM 2GB 123-ab 123-ab1 12-34-56 12-34-100 56,32 56,32 89,00 720,00 311
Opgaver: Rapporter i Windows Opgave 1: Udlånsordre i Windows Formål med opgaven At ændre den oprettede udlånsordre, så den også fungerer korrekt i Windows. Beskrivelse Når den oprettede udlånsordre afvikles i GUI versionen af C5, står teksterne ikke rigtigt i forhold til felterne. Dette skal ændres, ligesom der skal ændres skrifttype på firmanavnet og formularnavnet. Eksempel Lises Bolsjefabrik A/S Sukkervej 45 6300 Gråsten Tlf: 4564536 UDLÅNSORDRE Central Kopiering Postboks 35 Ny Østergade 172 1101 København K Bemærkninger Alle varer skal afleveres i rengjort stand Nummer : UdlånsDato : ReturDato : Side : 1000 09/09-99 30/09-99 1 Varenummer Navn Serienummer Lejebeløb 10-GC-1 10-GC-1 10-HD-1 10-HD-4 Grafikkort ET-4000 W32P VL Grafikkort ET-4000 W32P VL Harddisk AT Conner 420 MB Harddisk SCSI IBM-OEM 2GB 123-ab 123-ab1 12-34-56 12-34-100 56,32 56,32 89,00 720,00 Se forløbet næste side: 312
Forløb 1 Tag en kopi af den sidste Udlånsordre du oprettede. 2 Ret alle overskrifterne over varelinjerne og overskriften Bemærkninger så de bliver formatterede til tekstfelter. Bemærkninger skal centreres. VareNummer, Navn og Serienummer skal venstrestilles. Lejebeløb skal højrestilles. Alle felterne skal desuden også sættes til fed skrift. 3 Udfør ændringerne i alle sproglagene. Dette kan være svært, så hav tålmodighed til du får ideen om hvordan, det skal gøres. 4 Ret ledetekstfelterne til ordreinformationerne. Husk at ledetekster selv sætter prikkerne efter teksten. 5 Opret i printerdriveren Standard-Windows to nye skrifttyper som følger: Skrifttypen FirmaNavn: Navn...: Firmanavn Skrifttype : Udfyldes ikke TegnBredde : 1.0 TegnHøjde.: 40.0 Skrifttypen Formular Navn...: Formular Skrifttype : Udfyldes ikke TegnBredde : 1.0 TegnHøjde.: 20.0 6 Opret i printerdriveren Standard de samme to skrifttyper som følger: (udfyld kun de viste felter, resten skal være blanke) Skrifttype FirmaNavn: Navn...: Firmanavn Pitch...: 10.0 Skrifttypen Formular Navn...: Formular Pitch...: 10.0 7 Markér feltet Firmaoplysninger.Navn og indsæt skrifttypen FirmaNavn. Markér feltet med formularnavnet og indsæt skrifttypen Formular. Bemærk: For at få plads til formularnavnet skal du sørge for at navnet er en formatteret tekst i form af en overskrift på 30 tegn og højrestillet. Så kommer teksten til at passe på udskriften. Teksten skal være højrestillet, og fylder kun lidt af de 30 tegn der er afsat. Afmærkningen der skal passe med teksten i længde skal derimod ligge venstrestillet i forholde til teksten. Markér kun selve teksten dvs. bogstaverne, mens de er venstrestillet i de 30 tegn, og højrestil bagefter. 8 Gå ind i GUI versionen af XAL og udskriv formularen fra det tidligere oprettede menupunkt. Da GUI versionen ikke kender skrifttyperne FirmaNavn og Formular, bliver du promptet for disse når du startet formularen. Vælg selv en skrifttype til FirmaNavn og en anden skrifttype til Formular. 313
Forløb 9 Afprøv rapporten ind imellem indtil du er tilfreds med resultatet. Afprøv rapporten i alle tre sproglag, og kontrollér at teksterne står rigtigt i alle lagene. 314
35. Multi Export Formål Formålet med denne lektion er at lære deltagerne at udføre multi export af applikationselementer fra C5 Efter lektionen skal kursisterne kunne: Udføre multi export og kende til: Import.def Export.log Elementfiler Wildcards i form af matchudtryk. Multi export generelt I hver kolonne i udviklingsmenuen kan der foretages export af elementer, der tilhører den aktuelle kolonne. I kolonnen Multi kan der udføres export af elementer fra flere forskellige kolonner på en gang. Det udføres i menupunktet Export. En multi export består af følgende: Elementfiler Import definitionsfil Export logfil Export kørsel. Elementfiler Under Multi Export dannes der én elementfil for hvert enkelt element der exporteres. Elementfilernes navne startes med EXP efterfulgt af et femcifret tal, og afsluttes med punktum og elementtype. Eksempel på elementfiler EXP00001.MAC EXP00002.MAC EXP00264.DBD EXP00265.DBD EXP00001.LST EXP00002.LST EXP00001.XAL EXP00002.XAL EXP00001.FRM EXP00002.FRM EXP00003.FRM 315
Indeholdet i elementfilerne fremgår af import definitionsfilen Import.def, der også dannes under exporten. Import definitionsfil (Import.def) Navnet på import definitionsfilen er Import.def, men den kan tildeles et andet navn under exportopsætningen. Ud over en liste med exporterede elementer, indeholder filen i de to første linjer informationer om stinavn, versionsnummer, dato o.a. Filen anvendes ved Multi Import, idet importkørslen læser de ovennævnte værdier, og navnene på de elementfiler, der skal importeres. Eksempel på Import.def "Microsoft C5 EXPORT","c:\DebExp\","c:\DebExp\Import.log", "Use Xal: ImportObjekts","Vers. 4.1.0.180 21/12-07 14:00","", "Dbd","CustTable","exp00043.dbd", "LST","CustTable.Account","EXP00001.LST",0 "FRM","CustTable","EXP00001.FRM",4 1. linje i definitionsfilen Felt Indhold 1 Teksten Microsoft C5 EXPORT 2 Stinavn på det sted elementfilerne ligger (Sættes under exportopsætning) 3 Stinavn og navn på import loggen (Sættes under exportopsætning) 2. linje i definitionsfilen Felt Indhold 1 Teksten Use XAL: ImportObjekts (Navn på XAL kørsel til import) 2 Versionsnummer, Dato og klokkeslæt 3 Frivillig kommentar der sættes under exportopsætningen Elementlinjerne Felt Indhold 1 Elementtype 2 Elementnavn 3 Navn på exportfil 4 Applikationsgruppe 316
Export log (Export.log) Der oprettes en logfil med navnet Export.log under Multi Exporten. Navnet kan evt. ændres under exportopsætningen. Exportloggen indeholder en rapport over hændelser under selve exporten. Eksempel på Export.log Export af applikation: Vers. 4.1.0.180 21/12-07 14:00 Path...: c:\debexp\ Database: CustTable CustTable -> exp00043.dbd 14:00 18.106 LST...: CustTable CustTable.Account -> exp00001.lst 14:00 1.060 FRM...: CustTable CustTable -> exp00001.frm 14:00 25.812 I loggen vises C5 version, dato og Klokkeslæt for udførelsen af exporten, og det ses hvilken sti filerne blev exporteret til. De enkelte elementer opstilles efter elementtype, og det ses hvilken elementfil de ligger i. Klokkeslæt og størrelse på elementfilen ses også. Export kørsel Selve exporten udføres fra udviklingsmenuen ved aktivering af menupunktet Multi og Export. I menupunktet fremkommer en promptboks i form af en matrix, hvori det med matchudtryk angives hvilke elementtyper der skal med i exporten. 317
Multi export Felter Incl. Excl. Fra Til Kun nye Enums C_Util Path Export log Import def Import log Kommentar Crypt Forklaring Udtryk for elementer der skal medtages. Er feltet tomt medtages elementtypen ikke. Udtryk for elementer der ikke skal medtages, selv om disse er indeholdt i udtrykket under Incl. Mindste værdi for elementnavne der medtages. Skal være indeholdt i udtrykket under incl. Største værdi for elementnavne der medtages. Skal være indeholdt i udtrykket under incl. Skal der kun medtages nye kartoteker i forhold til de originale. Kartoteksnavn skal desuden være indeholdt i udtrykket i incl. Skal fastteksttyperne medtages i exporten. Hvis JA placeres de i elementfilen med det første kartotek. C_Util fil der skal exporteres fra. Kun elementer der ikke findes i andre C_Util filer medtages. Directory hvori de exporterede elementer skal placeres. Navn på export log. Er feltet tomt dannes der ingen logfil. Navn på import definitionsfil. Er feltet tomt dannes der ingen definitionsfil. Forslag til navn på import log. Kan overskrives under import. Værdierne skrives i starten af log- og definitionsfilerne. Ved senere import fremgår kommentarerne af dialogen. Felt 1: Versionsnummer, dato og Klokkeslæt. Felt 2: Kan frit udfyldes med ekstra information. Angives et serienummer krypteres de exporterede elementer. Efterfølgende kan disse elementer kun importeres i en installation med det angivne serienummer. Matchudtryk I felterne Incl. og Excl. kan der anvendes matchudtryk. De vigtigste match udtryk vises i skemaet herunder, efterfulgt af eksempler. Yderligere forklaring findes i manualerne under ordet Match. 318
Matchudtryk Udtryk aaa <aaa aaa> Forklaring Ethvert element, der indeholder de pågældende tegn, medtages. Ethvert udtryk, der starter med bogstaverne aaa, medtages. Ethvert udtryk, der slutter med bogstaverne aaa, medtages.? eller. Tegnene indsættes i udtrykket som erstatning for enkelte tegn. * Erstatter ingen eller flere forekomster af tegn. Tegnet lige før medtages ikke. + Erstatter én eller flere forekomster af tegn. - Erstatter ingen eller én forekomst af tegnene. Eksempler Udtryk sal <Debf hist> k?ist <Deb?*st> Fak?*st> Forklaring DebitorSaldo, FinansBudgetSaldi, LønSaldiMed DebFakHist, DebFakList, DebFlgJour DebFakHist, KreFakHist DebFakHist, DebFakList, LagerStykListPrompt DebFakHist, DebFakList, DebPost, DebPostList DebFakHist, DebFakList, KreFakHist, KreFakList 319
Opgaver: Multi Export Opgave 1: Multi export Formål med opgaven At udføre multi export af applikationselementer. Beskrivelse Der skal udføres multi export af alle de nye applikationselementer, der er blevet dannet under kurset incl. fastteksttyper og printerdrivere. Forløb 1 Dan dig et overblik over hvilke nye applikationselementer du har fremstillet under kurset. Kryds evt. modulerne af herunder. Modulerne er opstillet i samme rækkefølge, som i indtastningsbilledet i Multi Export. Macro (MAC) Database (DBD) Listbilleder (LST) Triggere (SXL) XAL kørsler (XAL) Forespørgsler (QTX) Forms (FRM) Printere (PRD) Rapporter (REP) Brugerformler (UXL) Undermenuer (MNU) 2 Udfør en Multi Export af alle de markerede elementtyper, idet du exporterer elementerne. 320
36. 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. 321
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 Genvejs-taste Du kan også afvikle rapporten under oprettelsen ALT+R 322
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. 323
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 324
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. SaldoDkr > 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 325
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 326
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 327