Microsoft Dynamics C5 Version Programmering II

Størrelse: px
Starte visningen fra side:

Download "Microsoft Dynamics C5 Version 2012. Programmering II"

Transkript

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

2 Indholdsfortegnelse Indledning Del I - XAL sproget Multi import Filer Elementfiler Import definitionsfil (Import.def) Import log (Import.log) Import kørsel Multi oversættelse Matchudtryk Opgaver: Multi import Kartoteker Oprettelse af kartoteker Navngivning af kartoteker Hvor ligger data Passwordbeskyttelse af kartoteker Systemfelter i kartoteker Nye felter i kartoteker Opgaver: Kartoteker Indexer Anvendelse af indexer Oprettelse af indexer Navngivning og indexformel Navngivning af Indexer i nye moduler Opgaver: Index INTRODUCE og transaktionskommandoer Åbning af fiktiv post med INTRODUCE Åbning af faktisk post med INTRODUCE Åbning af faktisk post med INTRODUCE og index INSERT, UPDATE, DELETE INSERT UPDATE

3 DELETE INSERT/UPDATE i samme XAL kørsel Opgaver: INTRODUCE og transaktionskommandoer PROMPT, videregående brugerdialog Grundlæggende opsætning Tillægskommandoer REF Sammenbyggede tekster GET på felter ASENUM DECIMALS LENGTH Opgaver: PROMPT, videregående brugerdialog Videregående løkkekommandoer WHILE Afbrydelse af WHILE løkke vha. promptboks Opgaver: Videregående løkkekommandoer READ og WRITE READ WRITE CLOSE Faste formater Opgaver: READ og WRITE Funktioner videregående Funktionen Box() Box(1) Infoboks Box(2) Advarselsboks Box(3) Ja/Nej boks Box(4) Pickliste boks Box(1-3) Bokse med ekstra knapper Konverteringsfunktioner Int2Str() Num2Str Date2Str() Enum2Str()

4 Opgaver: Funktioner, videregående Macroer Kendetegn Generel opbygning Macro typer Globale macroer Lokale macroer Macro biblioteker Specifikke macroer #Num2Str #StrLFix #StrRFix #Date2Str #Time2Str Indirektioner Indirektioner på fasttekster Opgaver: Macroer Huskelister XAL sproget ENUM Programmering opret Programmering ret Huskelister Kommandoer og funktioner PRINT AT PAUSE WINDOW Variabler Kommentar SET PROMPT Infobox Advarselsbox Dialogbox Ja/Nej box Picklistebox SEARCH-END

5 IF-THEN-(ELSE)-ENDIF NextYr DayOfWk DayName INTRODUCE INSERT UPDATE DELETE OUTPUT FIND WRITE READ WHILE-END PROCESS #Debug Del II Kartoteker og skærmbilleder Kartoteker, triggere med inddatakontrol Kartoteker Inddatakontrol på kartoteker Kartoteksfelter Inddatakontrol på felter Opgaver: Kartoteker, triggere med inddatakontrol Formens vindue Blokke i forms Formens vindue Triggere (forms formler) generelt Triggere i Opsætning af vinduet Forms kontrolkommandoer og macroer #MacroLoad() #FormError #Frm_Index() #Frm_Search() #Frm_SearchTop()

6 #Frm_SearchEnd() Eksempel på fejlhåndtering og styring af poster i en form Specielt vedr. triggerne Init og Pre-form Opgaver: Formens vindue Enkelt record blok Opsætning af Enkelt record blok Felter Opgaver: Enkelt record blok Multi record blok Opsætning Multi record blok Felter Opgaver: Multi record blok Virtuelle felter i forms Oprettelse af virtuelle felter Opsætning Tildeling Opgaver: Virtuelle felter i forms Synkronisering mellem blokke Fremfinding og visning af poster i underblok Triggeren Pre-record Tildeling af værdier fra hovedblok til felter i underblok Fremfinding af poster i underblok med #Frm_Index() Placering af cursor på første eller sidste af de fundne poster Initiering af nye poster i underblok Triggeren Init-record Tildeling af initieringsværdier til nøglefelter Komplet eksempel på synkronisering Opgaver: Synkronisering mellem blokke: Direkte opslag Opbygning af direkte opslag Sammenhæng i direkte opslag Direkte opslag i XAL kørsel Opgaver: Direkte opslag Listemenuer

7 Listemenuer i C Hvor vedligeholdes listemenuer? Opsætning af listemenu Indsættelse af menupunkter i listemenu Opgaver: Listemenuer Synkronisering mellem forms Synkronisering mellem forms Triggere ved synkronisering Triggeren Pre-Form Buffer EXTERN SET #Frm_Index() #Frm_Search() / #Frm_SearchTop() / #Frm_SearchEnd() Bloktriggeren Init-record Komplet eks. på synkronisering af forms Opgaver: Synkronisering mellem forms Tabsider og gruppebokse Tabsider Grupppebokse USRKEY triggere Triggere Taster Taster til én blok Taster til flere blokke Taster med eksempler Kontrol kommandoer Kald af USRKEY trigger Styring af XAL kode i triggerne Blokering af tastetryk Tastetryk og kald fra andre triggere samtidig Tidspunkter for aktivering af øvrige triggere Form macroer REPAINT Opgaver: USRKEY triggere

8 23. Notater i forms Procestasten ALT+N Virtuelt notatfelt Macroer til notater #NotesPreKey #Frm_NoteMark #NotesPostKeyMark #NotesMark #NotesKey Notater på forms med flere blokke Kartoteket Notes Oversigter Notater på forms med en blok Notater på forms med flere blokke Opgaver: Notater i forms SystemVariabler i forms Systemvariabler Globale variabler Huskelister forms Fasttekst Opret ny type Fasttekst Tilføj tekster til eksisterende type Fasttekst Ret tekster i eksisterende type Kartotek Navn (opret/ret) Kartotek Feltbehandling (opret) Kartotek Feltbehandling (ret) Kartotek Feltbehandling (referencer) Kartotek Dokumentation Kartotek Index (opret) Kartotek Index (ret) Kartotek Index (slet) Listbillede Opret Listbillede Ret Listbillede Slet Menuer - Lille udviklingsmenu (CTRL F12) Menuer Lokalmenuer

9 Menuer Opsætning af menupunkt Form Vindue (opret) Form Vindue (ret) Form Vindue (slet ) (dvs. hele formen) Form Enkelt record blok (opret) Form Enkelt record blok (ret) Form Enkelt record blok (slet) Form Multi record blok (opret) Form Multi record blok (ret) Form Multi record blok (slet) Form Felter (opret) Form Felter (ret) Form Felter (slet) Form Triggere i vinduet Form Triggere i blokke Form Triggere i felter Del III Rapporter Systemvariabler i rapporter Systemvariabler i rapporter Globale variabler Opgaver: Systemvariabler i rapporter Rapport Control macroer Skema over rapport control macroer Linje-XAL og feltbetingelser Linje XAL Kolonnen Tildeling af værdier til felter og variabler Styring af om linjer skal udskrives eller ikke Direkte anvendelse af RETURN 0 og RETURN Anvendelse med felter Feltbetingelser Opgaver: Linje-XAL og feltbetingelser

10 29. Linjetypen Subtotal Linjetypen Subtotal med egne ledetekster Subtotal linje med for lang ledetekst Udskrift i flere niveauer med samme ledetekst Udskrift i flere niveauer med forskellige ledetekster &Breaklevel Linje XAL Forskellige ledetekster til flere kartoteker Opgaver: Linjetypen Subtotal Notater i rapporter Opsætning af linje i Rapport-definition Søgning efter notater i Rapport-XAL Søgning efter notater i Rapport-QT Søgning med macroer #OutputNotes() Rapport QT Opgaver: Notater i rapporter Tekstlag i rapporter Tekstlag i layoutområdet Automatisk valg af tekstlag Opgaver: Tekstlag i rapporter QT control macroer QT control macroer Skema med macroer Anvendt til defaultværdier i QT Opgaver: QT Control macroer Rapport synkronisering Synkronisering Buffer EXTERN med RENAME Synkronisering i rapport QT Synkronisering i rapport XAL Uden udskriftsmuligheder i rapport Opgaver: Rapport synkronisering

11 34. Rapporter i Windows Planlægning af rapport layout Usynligt gitter Spatiering i skrifttyper Forskel på fast spatiering og proportional skrift Felter i rapporter Fritekst i rapporter Opsætning af tekstfelt Nye skrifttyper i Windows Printerkoder Eksempel på rapport i Windows Opgaver: Rapporter i Windows Multi Export Elementfiler Import definitionsfil (Import.def) Export log (Export.log) Export kørsel Matchudtryk Opgaver: Multi Export Huskelister Rapporter Oprette rapport Oprette rapportlinjer (Kolonnerne) Oprette rapportlinjer med fritekst Oprette rapportlinjer med streger og kasser Oprette rapportlinjer med forskellige felter Rapport afprøve (køre) Rapport QT Oprette første kartotek Rapport QT Oprette flere kartoteker Rapport QT Sortere Rapport QT Filtrere Rapport QT Feltafgrænse (tilføje / slette) Rapport QT Triggere i opsætning Rapport QT Triggere på kartoteker Subtotaler

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

13 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

14 Del I - XAL sproget 14

15 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

16 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 / :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

17 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/ Vers / :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

18 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

19 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

20 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

21 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

22 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

23 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

24 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

25 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

26 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

27 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

28 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

29 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

30 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

31 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

32 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

33 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

34 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

35 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

36 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

37 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

38 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

39 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

40 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

41 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

42 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

43 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== ] I direkte opslag kan lighedstegnene erstattes med et komma. Direkte opslag med komma INTRODUCE CustTable [AccountIdx, ] 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== ] 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 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

44 Å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..: Navn...: Central Kopiering Konto 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

45 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, ] IF CustTable.RowNumber THEN SET CustTable.Adress1 = Koldingvej 25 UPDATE CustTable ENDIF I dette eksempel indføres posten med nummer fra debitorkartoteket. Hvis den findes tildeles feltet Adress1 værdien Koldingvej 25, hvorefter posten opdateres i kartoteket. 45

46 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== ] 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== ] 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

47 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

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

49 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

50 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

51 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

52 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

53 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

54 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

55 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 Super Korn A/S Kreditmax: ,00 Saldo...: 30145, Forskel..: 69854,10 S.rettet : 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

56 Resultat Kontrol af Super Korn A/S Kreditmax: ,00 Saldo...: 30145, Forskel..: 69854,10 S.rettet : 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

57 Eksempel med ASENUM REAL &Kurs REAL &Beløb INT &Metode = {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

58 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 = {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

59 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

60 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

61 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

62 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

63 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

64 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

65 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

66 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

67 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

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

69 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

70 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

71 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

72 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

73 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

74 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 og C5 v Det fremgår af skemaet om formatet kan anvendes i READ eller WRITE eller begge steder. 74

75 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

76 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

77 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

78 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

79 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 Godkend kørslen og afprøv den. Kontrollér at de nye faciliteter fungerer. 79

80 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

81 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

82 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

83 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

84 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

85 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

86 Returværdi Returværdien er tallet konverteret til en tekst på samme længde som antallet af tegn i tallet. Eksempel INT &Antal = SET BOX(1, Der blev behandlet +Int2Str(&Antal)+ poster! Resultat Der blev behandlet 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 = 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

87 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 ,38-576,00-47, , ,00-125, , Samlet gæld ,88 kr OK 87

88 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

89 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 Eksempel 2 PRINT Date2Str(15\03\2000,321,2,2,2,2,4) PAUSE 89

90 Resultat 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

91 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

92 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

93 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

94 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

95 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

96 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

97 Resultat Biler til salg! Mærke: Toyota Carina Pris: Mærke: Toyota Previa Pris: 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: Mærke: Toyota Previa Pris: 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

98 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: Mærke: Toyota Previa Pris: 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

99 #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

100 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( ) PAUSE Resultat #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

101 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

102 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 Microsoft A/S Super Korn A/S Auto A/S 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

103 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

104 Eksempel 1 (Fast antal sekunder) #MacroLoad(FUNCTIONS) PRINT #Time2Str(44100) PAUSE Resultat 12:15 I stedet for den faste værdi 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

105 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

106 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

107 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

108 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

109 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

110 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

111 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

112 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

113 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

114 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

115 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 } { C5 version 2012 } { Udskrift af debitorer med saldo} { Erklæring af variable } 115

116 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 = SET &Beløb = &Beløb SET &ForNavn = Ole SET &EfterNavn = Olsen SET &Navn = &ForNavn + + &EfterNavn SET &AnsatDato = 25\01\1997 SET &Svar = 1 116

117 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

118 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

119 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

120 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

121 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\

122 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

123 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== ] PRINT Account,,Name PAUSE INTRODUCE CustTable[AccountIdx== ] 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

124 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

125 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== ] PRINT Account,,Name PAUSE 125

126 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

127 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== ] 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

128 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

129 Del II Kartoteker og skærmbilleder 129

130 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

131 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

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

133 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

134 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

135 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

136 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

137 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

138 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

139 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

140 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

141 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

142 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

143 #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

144 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

145 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

146 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

147 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

148 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

149 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

150 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

151 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

152 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

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

154 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

155 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

156 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

157 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

158 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

159 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

160 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

161 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

162 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

163 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

164 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

165 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

166 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

167 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

168 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

169 Virkemåden i et direkte opslag Debitorkartoteket (CustTable) AccountIdx Konto Pos Poster Pos Konto Navn Tlf Olsen Jensen Hansen Petersen 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

170 Resultat IBM Danmark A/S Nymøllevej Lyngby Central Kopiering A/S Postbox 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

171 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

172 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

173 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

174 Eksempel på listemenu Finans Kontoplan > Posteringer > Kontoudtog Balancer > Budgetter > Regnskab Pengeinstitut > Dimensioner > Forespørgsler > Menupunkter med tegnet > viser at der åbnes en undermenu. Menupunkter uden tegnet > starter det tilknyttede program direkte. Det kan f.eks. være et skærmbillede eller en rapport. Listemenuer findes forskellige steder i menusystemet, men opsættes og vedligeholdes ens. Listemenuer i C5 Listemenu Undermenu til gittermenuer Undermenu til listemenu Lokalmenuer i forms Generelle menuer Forklaring Menupunkter i celler i gittermenuer består altid af en listemenu. Et menupunkt i en listemenu kan kalde en undermenu i form af en anden listemenu. Lokalmenuer er menuer, der kan kaldes frem med F10 i et åbent skærmbillede. Menuen er netop lokal, idet den kun findes i det ene skærmbillede. En lokalmenu kan således heller ikke kaldes fra andre skærmbilleder. Hvert skærmbillede har sin egen lokalmenu. Generelle menuer er selvstændige listemenuer der oprettes og vedligeholdes i udviklingsmenuen i søjlen MNU. Til forskel fra lokalmenuer kan generelle menuer kaldes overalt i XAL og C5, idet de kan tilknyttes f.eks. en procestaste eller en hvilken som helst anden menu. 174

175 Listemenuer Gittermenuen Undermenu til gittermenu Undermenu til listemenu Skærmbillede Lokal menu til skærmbillede Generel menu til procestaste eller listemenu Hvor vedligeholdes listemenuer? Vedligeholdelse af listemenuer består i opsætning af selve menuen og indsættelse af menupunkter. Vedligeholdelse foregår der, hvor listemenuen befinder sig. Vedligeholdelsessted Listemenu Undermenu til gittermenu Undermenu til listemenu Lokalmenu Generel menu Sted for oprettelse og vedligeholdelse I celler i gittermenuer Generelt/Tilpasning/Udviklingsmenu/MNX/Ret I en hvilken som helst anden listemenu Generelt/Tilpasning/Udviklingsmenu/MNX/Ret I den valgte gittermenu vælges undermenu der skal vedligeholdes I det skærmbillede der indeholder lokalmenuen Generelt/Tilpasning/Udviklingsmenu/FRM/Ret I udviklingsmenuen i søjlen MNU Generelt/Tilpasning/Udviklingsmenu/MNU/Ret Opsætning og indsættelse af menupunkter er ens for alle listemenuer. Se afsnittet Opsætning af listemenu. Opsætning af listemenu Opsætning af listemenuer udføres med funktionen Opsætning, der startes med CTRL+F6. Funktionen åbner billedet Opsætning af menu. Billedet indeholder felter til indtastning af menuens titel osv. 175

176 Felter i Opsætning af menu Felt Forklaring Menutitel Ryd baggrund Første menu i serie Forlad menu efter valg Rammetype Tekst der skrives som overskrift til menuen. Hvis teksten fylder mere end det længste navn på et af menupunkterne, afkortes den automatisk. Skal der være en længere tekst, skal et af menupunkternes navne forlænges med blanke tegn. Om baggrunden skal ryddes når menupunktet åbnes Om det er første menu i en serie. Det kan ikke bestemmes, hvor menuen skal placeres på skærmen, men ved at svare ja her, placeres menuen i øverste venstre hjørne af skærmen for at gøre plads til flere undermenuer. Om menuen skal forlades efter valg. Ved at forlade menuen efter valg vendes der ikke tilbage til den igen når menupunktet er afsluttet. Hvilken ramme type der skal være rundt om menuen Bemærk: Det er ikke muligt at bestemme placering og størrelse på menuen. Indsættelse af menupunkter i listemenu I alle menupunkter foregår der et programkald af et skærmbillede, en rapport, en kørsel eller andet der skal afvikles. Menupunkter indsættes med funktionen Insert, der åbner billedet Opsætning af menupunkt. Felter i Opsætning af menupunkt Felter Betydning Proces Parametre til proces Menupunktets navn Bogstav til hurtigvalg Hjælpetekst Gruppe rettigheder Navn på den proces der skal afvikles. Hver proces kan have forskellige parametre. Som regel skal der mindst angives navn på det applikationselement, der skal afvikles. Angives som Parameter=værdi Parameter=værdi... Den tekst der skal stå som menupunkt i menuen. Et bogstav i menupunktets navn. Bogstavet bør ikke være anvendt et andet sted i menuen. Bogstavet aktiverer menupunktet med det samme. Den tekst der skal vises i bunden af skærmen, når cursoren står på menupunktet. Navn på den eller de grupper der må afvikle dette menupunkt. Kun de grupper, der angives her, kan se menupunktet. 176

177 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

178 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

179 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

180 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

181 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

182 Å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

183 #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

184 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

185 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

186 Init-record EXTERN SalesTable SET SalesLine.Number = SalesTable.Number SET SalesLine.Account = SalesTable.Account 186

187 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

188 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

189 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

190 Eksempel på gruppebokse i GUI versionen Eksempel på gruppebokse i den tegnbaserede version 190

Microsoft Dynamics C5 Version 2012. Programmering I

Microsoft Dynamics C5 Version 2012. Programmering I Microsoft Dynamics C5 Version 2012 Programmering I Copyright 2011 Microsoft. C5 er et varemærke, der tilhører Microsoft. Produkter og firmaer nævnt i dette dokument er varemærker, der tilhører deres respektive

Læs mere

Microsoft Dynamics C5 Version 2012. Programmering III

Microsoft Dynamics C5 Version 2012. Programmering III Microsoft Dynamics C5 Version 2012 Programmering III Copyright 2011 Microsoft. C5 er et varemærke, der tilhører Microsoft. Produkter og firmaer nævnt i dette dokument er varemærker, der tilhører deres

Læs mere

De vigtigste funktionstaster Microsoft Dynamics C5

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

Læs mere

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

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

Læs mere

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

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

Læs mere

Kursusbeskrivelse. Forarbejde. Oprettelse af en Access-database

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

Læs mere

Axapta 3.0 Konverteringsvejledning

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

Læs mere

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

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

Læs mere

Hvordan laver jeg en faktura i C5? Brugervejledning, Microsoft Dynamics C5 (op til version C5 2012)

Hvordan laver jeg en faktura i C5? Brugervejledning, Microsoft Dynamics C5 (op til version C5 2012) Sådan laver du en faktura til en kunde Når du har solgt en vare eller en ydelse til en kunde, vil du naturligvis gerne sende en faktura, så du kan få betaling for det, du har solgt. Du kan lave en faktura

Læs mere

Indholdsfortegnelse. EasyIQ IDM 5.4 Brugermanual

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

Læs mere

Selene brugervejledning

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

Læs mere

Abonnementsstyring. Start af Stellar Abonnement. Indledende tekst. Indholdsfortegnelse

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

Læs mere

Vejledning til Kilometer Registrering

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

Læs mere

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

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

Læs mere

Integration mellem OpenBizBox og E conomic

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

Læs mere

Indhold. Indholdsfortegnelse

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

Læs mere

Det nye husdyrgodkendelse.dk Sagsbehandlermodulet Fra ansøgning til godkendelse V. 1.0 28/4 2011

Det nye husdyrgodkendelse.dk Sagsbehandlermodulet Fra ansøgning til godkendelse V. 1.0 28/4 2011 2. Sådan kommer du fra ansøgning til godkendelse Før du kan komme i gang med at arbejde på en miljøgodkendelse, skal du have åbnet den tilhørende ansøgning. Det gør du enten ved at indtaste skemanummer

Læs mere

Professionel håndtering af klinikregnskab

Professionel håndtering af klinikregnskab Professionel håndtering af klinikregnskab Kom godt i gang med TDfinans. Dette introduktionshæfte beskriver, hvordan du nemt og hurtigt kommer i gang med at bruge TDfinans, og hvordan du løser de daglige

Læs mere

Brugervejledning til KasseRapporten LIGHT

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

Læs mere

I denne manual kan du finde en hurtig introduktion til hvordan du:

I denne manual kan du finde en hurtig introduktion til hvordan du: VORES NORDSJÆLLAND HURTIGT I GANG MANUAL 01: Bruger HVAD INDEHOLDER DENNE MANUAL? I denne manual kan du finde en hurtig introduktion til hvordan du: 1. Finder Vores Nordsjælland hjemmesiden 2. Opretter

Læs mere

My booking. Generelt. Forsiden. Version 9.0

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

Læs mere

Nyheder til version 2013-3

Nyheder til version 2013-3 Nyheder til version 2013-3 En stærk brancheløsning fra Inventio.IT 1 Indledning... 3 2 C5 2012 SP 2 Nyheder... 3 2.1 Generelle revisor nyheder i C5... 3 3 C5 online Integration (fra version 2013)... 3

Læs mere

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

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

Læs mere

Kom godt i gang med Dyreregistrering

Kom godt i gang med Dyreregistrering Kom godt i gang med Dyreregistrering Denne vejledning er tænkt som en hjælp til, at landmandsbrugere hurtigt kan komme i gang med Dyreregistrering. Derfor er kun de mest nødvendige funktioner beskrevet.

Læs mere

Manual Version 2. til oprettelse af hjemmesider for landsbyer i Rebild kommune

Manual Version 2. til oprettelse af hjemmesider for landsbyer i Rebild kommune Manual Version 2 til oprettelse af hjemmesider for landsbyer i Rebild kommune Oversigt: Login Hjemmeside...... side 3 Login Administrationsmodul... side 5 Kategorier.. side 6 Opret/rediger første side...

Læs mere

DK-Unit Point version 2.xx til PWE 37

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

Læs mere

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

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

Læs mere

FSFIs lynguide til DFRs elektronisk bevissystem

FSFIs lynguide til DFRs elektronisk bevissystem FSFIs lynguide til DFRs elektronisk bevissystem Dette er en kort guide i anvendelsen af Dansk Førstehjælpsråd elektroniske bevissystem. Guiden viser og forklarer hvordan du som instruktør og medlem af

Læs mere

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

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

Læs mere

LEMAN / Præsentation

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

Læs mere

e-konto manual 01.08.2011 e-konto manual Side 1

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

Læs mere

HJÆLP TIL IGANGSÆTNING AF WINKOMPAS 3

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

Læs mere

Web MTC manual. Version 1.1 08-11-2012

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

Læs mere

ectrl Skabelonkonvertering

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

Læs mere

HOFTEALLOPLASTIK - DATAUDTRÆK OG IMPORT TIL EXCEL

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

Læs mere

Daglig brug af JitBesked 2.0

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

Læs mere

ViKoSys. Virksomheds Kontakt System

ViKoSys. Virksomheds Kontakt System ViKoSys Virksomheds Kontakt System 1 Hvad er det? Virksomheds Kontakt System er udviklet som et hjælpeværkstøj til iværksættere og andre virksomheder som gerne vil have et værktøj hvor de kan finde og

Læs mere

Vistemmernu. Et webbaseret værktøj udviklet af Programdatateket i Skive. E-mail: programdatateket@viauc.dk Web: http://www.programdatateket.

Vistemmernu. Et webbaseret værktøj udviklet af Programdatateket i Skive. E-mail: programdatateket@viauc.dk Web: http://www.programdatateket. Vistemmernu Et webbaseret værktøj udviklet af Programdatateket i Skive E-mail: programdatateket@viauc.dk Web: http://www.programdatateket.dk Kolofon HVAL-vejledning Vistemmernu på HVAL.DK Forfatter: Susanne

Læs mere

Indholdsfortegnelse. 1. Installation af LØN... 1. 2. Introduktion til LØN... 2. 3. Indtastning af lønseddel... 7. 4. Udskrifter...

Indholdsfortegnelse. 1. Installation af LØN... 1. 2. Introduktion til LØN... 2. 3. Indtastning af lønseddel... 7. 4. Udskrifter... Løn til Windows Indholdsfortegnelse 1. Installation af LØN... 1 2. Introduktion til LØN... 2 2.1. Første start af LØN...2 2.1.1. Ét eller flere distrikter...2 2.1.2. Lønperioder...3 2.1.3. Kartoteker...4

Læs mere

National sprogscreening af EUD-elever. skolens egne logins

National sprogscreening af EUD-elever. skolens egne logins Kompetencecenter for e-læring Det Nationale Videncenter for e-læring Vejledning til National sprogscreening af EUD-elever ved anvendelse af skolens egne logins Sprogscreeningen tilgås via et link Indhold

Læs mere

Introduktion til FileMaker Pro 4.0/4.1

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

Læs mere

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

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

Læs mere

Funktions Manual. Skyhost WebPortal. Login (Bemærk: for at kunne bruge WebPortalen skal du have et aktivt abonnement fra Skyhost)

Funktions Manual. Skyhost WebPortal. Login (Bemærk: for at kunne bruge WebPortalen skal du have et aktivt abonnement fra Skyhost) Funktions Manual Skyhost WebPortal Login (Bemærk: for at kunne bruge WebPortalen skal du have et aktivt abonnement fra Skyhost) 1: Gå ind i på www.skyhost.dk - Klik på WebPortal knappen øverst på siden

Læs mere

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

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

Læs mere

GECKO Booking Vejledning til spørgeskema-modul. Læsevejledning. Indholdsfortegnelse

GECKO Booking Vejledning til spørgeskema-modul. Læsevejledning. Indholdsfortegnelse GECKO Booking Vejledning til spørgeskema-modul Er der behov for at få et indgående kendskab til kunden, når de bruger bookingsystemet? Hvad siger brugerne efterfølgende om den service, de har fået? Ved

Læs mere

Statistikmodul i WinPLC

Statistikmodul i WinPLC Juni 2018 Statistikmodul i WinPLC Indlæs patientfortegnelse fra sundhed.dk Inden du benytter statistikmodulet i WinPLC, er det en god ide at indlæse en opdateret patientfortegnelse fra sundhed.dk. Denne

Læs mere

Digitale uddannelsesaftaler. Vejledning til virksomhed

Digitale uddannelsesaftaler. Vejledning til virksomhed Digitale uddannelsesaftaler Vejledning til virksomhed Side 1 af 12 Indholdsfortegnelse Indledning... 3 Adgang til Digitale uddannelsesaftaler i Elevplan... 5 Browser... 6 Ændr status og slet aftale...

Læs mere

Uddannelsesplaner i MinUddannelse

Uddannelsesplaner i MinUddannelse Uddannelsesplaner i MinUddannelse Denne vejledning giver et overblik over arbejdet med MinUddannelse fra en UU-vejleders synspunkt. Indhold 1. Introduktion... 2 2. Tekniske specifikationer... 2 3. Som

Læs mere

Der findes i Axapta en ret fleksibel afstemningsfunktion. For at kunne anvende den skal den først aktiveres og så skal der også lige sættes lidt op.

Der findes i Axapta en ret fleksibel afstemningsfunktion. For at kunne anvende den skal den først aktiveres og så skal der også lige sættes lidt op. Bankafstemning Der findes i Axapta en ret fleksibel afstemningsfunktion. For at kunne anvende den skal den først aktiveres og så skal der også lige sættes lidt op. Aktivering af bankafstemning For at aktivere

Læs mere

Genvejstaster eller museskade?

Genvejstaster eller museskade? Genvejstaster eller museskade? Hop fra ordrehoved til ordrelinjer eller fra finanskladdelinje til momsgruppe med genvejstaste! I forbindelse med skift af økonomisystem fra et DOS-baseret økonomisystem

Læs mere

Huskesedler. Design og automatisering af regneark. Microsoft Excel 2013

Huskesedler. Design og automatisering af regneark. Microsoft Excel 2013 Huskesedler Design og automatisering af regneark Microsoft Excel 2013 Januar 2017 Knord Side 2 Indholdsfortegnelse Ark... 4 Beskyttelse... 6 Diagram... 7 Eksport af data... 8 Fejlretning i formler... 9

Læs mere

Indholdsfortegnelse. Indholdsfortegnelse.. side 2. Adgang til webgraf 3. Opslag adresse... 4. Styring af layout.. 5. Zoom funktioner..

Indholdsfortegnelse. Indholdsfortegnelse.. side 2. Adgang til webgraf 3. Opslag adresse... 4. Styring af layout.. 5. Zoom funktioner.. Indholdsfortegnelse Indholdsfortegnelse.. side 2 Adgang til webgraf 3 Opslag adresse... 4 Styring af layout.. 5 Zoom funktioner.. 6 Panorere på skærmen. 7 Information om grafikken.... 8-10 Print et udsnit.....

Læs mere

Oktober Dokumentpakker

Oktober Dokumentpakker Oktober 2017 Dokumentpakker Dokumentpakkerne er et værktøj til at udskrive dynamiske breve, som har en standardtekst i brevet, og hvor der automatisk sættes blandt andet patientens navn, adresse og aftaletid

Læs mere

Manual til Dynamicweb Februar 2010

Manual til Dynamicweb Februar 2010 Manual til Dynamicweb Februar 2010 Login... 2 Skabeloner og formater... 3 Filarkivet... 4 Lav en PDF... 5 Opret en ny side... 7 Navngiv siden... 9 Aktiver siden... 9 Sorter sider... 9 Flyt siden... 11

Læs mere

Microsoft Dynamics C5. Factsheet om OIOUBL Opsætning, bruger og teknisk vejledning

Microsoft Dynamics C5. Factsheet om OIOUBL Opsætning, bruger og teknisk vejledning Microsoft Dynamics C5 Factsheet om OIOUBL Opsætning, bruger og teknisk vejledning Opdateret pr. 20.03.2012 INDHOLDSFORTEGNELSE Indledning... 3 Opsætning af OIOUBL... 4 1. XML skema... 4 2. Opsætning af

Læs mere

Elektronisk spørgeskema 2009. Vejledning

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

Læs mere

Opsætning af 60 dags regel

Opsætning af 60 dags regel 2015 Opsætning af 60 dags regel Indhold... 0 Guide til opsætning af 60-dags regel i Autolog Klienten... 1 Hvad er forskellen mellem den Automatiske og Manuelle opsætning af 60-dags reglen?... 2 Hvordan

Læs mere

Vejledning. Indlæsning af studerende til gruppedannelse i STADS. Indhold. Studie-IT Tlf.:

Vejledning. Indlæsning af studerende til gruppedannelse i STADS. Indhold. Studie-IT Tlf.: Studie-IT Tlf.: 9940 9720 Vejledning Indlæsning af studerende til gruppedannelse i STADS Indhold Indledning.... 2 Udvælgelse af data. i istads... 2 Generering af data... 5 Generering af data fra et excel-ark...

Læs mere

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

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

Læs mere

Vejledning til Planmodul i FLEX

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

Læs mere

DDElibra H Å N D B O G

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

Læs mere

QUICK GUIDE. til E-handel

QUICK GUIDE. til E-handel QUICK GUIDE til E-handel QUICK GUIDE Via vores hjemmeside www.ecolab.dk får du adgang til vores E-handel. Her kan du bl.a. finde produktbeskrivelser, sikkerhedsdatablade samt se hvilke produkter, der er

Læs mere

elib Aleph, ver.18 Introduktion til GUI FUJITSU SERVICES A/S

elib Aleph, ver.18 Introduktion til GUI FUJITSU SERVICES A/S Introduktion til GUI FUJITSU SERVICES A/S, 2008 Indholdsfortegnelse 1. Skrivebordet... 3 2. Flytte rundt m.m.... 4 3. Log ind... 6 4. Valg af database... 7 5. Rudernes størrelse... 8 6. Kolonner... 9 7.

Læs mere

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

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

Læs mere

Rapport generator til Microsoft C5

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

Læs mere

18/11 2010 Version 2.0 Side 1 af 36

18/11 2010 Version 2.0 Side 1 af 36 Login til DJAS Gå ind på adressen http://www.djas.dk I feltet Brugernavn skrives den e-mail adresse som brugeren er registeret med i systemet. I feltet Password skrives brugerens adgangskode. Ved at sætte

Læs mere

LOGOS CONSULT BOGSHOP. Microsoft Dynamics NAV 2013 TIPS & TRICKS - VIDEN OM DYNAMICS NAV! 1. udgave

LOGOS CONSULT BOGSHOP. Microsoft Dynamics NAV 2013 TIPS & TRICKS - VIDEN OM DYNAMICS NAV! 1. udgave WWW.LOGOSCONSULT.DK Microsoft Dynamics NAV 2013 TIPS & TRICKS LOGOS CONSULT BOGSHOP - VIDEN OM DYNAMICS NAV! 1. udgave Genbrug af tekster Standardtekster I Microsoft Dynamics NAV har du mulighed for at

Læs mere

BRUGERVEJLEDNING TIL BRUG AF MC IKAST HJEMMESIDE.

BRUGERVEJLEDNING TIL BRUG AF MC IKAST HJEMMESIDE. BRUGERVEJLEDNING TIL BRUG AF MC IKAST HJEMMESIDE. www.mcikast.dk På hjemmesiden kan du se alle de kommende ture både i indland og udland. Du kan også se de ture, som er kørt. Alle turene er placeret i

Læs mere

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

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

Læs mere

CapLegal Dokumentfoldere

CapLegal Dokumentfoldere CapLegal Dokumentfoldere Indhold Indledning...3 Oprettelse af dokumentfoldere...3 Oprettelse af mapper tilknyttet sagstyper eller et sagsnummer...9 Index... 14 2 Indledning Denne vejledning kan anvendes

Læs mere

INTRODUKTION TIL FACTORING... 3 DEBITORER...

INTRODUKTION TIL FACTORING... 3 DEBITORER... Side 1 Indholdsfortegnelse INTRODUKTION TIL FACTORING... 3 DEBITORER... 4 OPRETTELSE AF DEBITORER... 4 ÆNDRING AF DEBITORER... 5 OPRETTELSE AF FAKTURAPOSTER TIL MIDT FACTORING... 6 GENVEJSTASTER... 13

Læs mere

Vejledning i integration mellem GolfBox og Microsoft C5

Vejledning i integration mellem GolfBox og Microsoft C5 Vejledning i integration mellem GolfBox og Microsoft C5 Denne vejledning er udarbejdet til brugere, som benytter Microsoft C5 og C5 s PBS modul sammen med GolfBox. Vejledningen gælder for C5 ver. 4.00

Læs mere

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

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

Læs mere

Formular modul. Sitecore Foundry januar Version 1.0

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

Læs mere

Breve Fraser Makroer m.m.

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

Læs mere

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

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

Læs mere

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

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

Læs mere

Basicon Nodepult. Basicon Nodepult er den moderne afløser for det traditionelle nodestativ, men har derudover en lang række fordele:

Basicon Nodepult. Basicon Nodepult er den moderne afløser for det traditionelle nodestativ, men har derudover en lang række fordele: Basicon Nodepult Programmet Basicon Nodepult henvender sig til musikere, som ofte har behov for at medbringe deres forskellige nodesamlinger til forskellige orkestre. Basicon Nodepult er den moderne afløser

Læs mere

Gem dine dokumenter i BON s Content Management System (CMS)

Gem dine dokumenter i BON s Content Management System (CMS) 24. august 2007 Gem dine dokumenter i BON s Content Management System (CMS) INDHOLDSFORTEGNELSE 1. Indledning... 2 2. Se indholdet i dit Content Management System... 3 3. Tilgå dokumenterne i My Content

Læs mere

Word-9: Brevfletning i Word 2003

Word-9: Brevfletning i Word 2003 Word-9: Brevfletning i Word 2003 Nogle gange har man brug for at sende det samme brev til en større gruppe personer, firmaer el.lign. Men man vil gerne have, at det ser lidt personligt ud, så derfor er

Læs mere

Forsendelse. Microsoft Dynamics NAV 2009 Klassisk. Side 1. Copyright: Naddon version 201007

Forsendelse. Microsoft Dynamics NAV 2009 Klassisk. Side 1. Copyright: Naddon version 201007 Forsendelse Danske Fragtmænd Microsoft Dynamics NAV 2009 Klassisk Side 1 Indholdet i dette dokument må på ingen måde gengives helt eller delvist hverken på tryk eller i anden form - uden forudgående skriftlig

Læs mere

Harald Michalsen og Lasse Storr-Hansen. Log på med administrator rettigheder, så du ser ovenstående hovedmenu

Harald Michalsen og Lasse Storr-Hansen. Log på med administrator rettigheder, så du ser ovenstående hovedmenu Importér skemadata fra Lectio 1 af 16 Log på med administrator rettigheder, så du ser ovenstående hovedmenu Vælg Konverter skemadata Klik på Eksporter skemadata Importér skemadata fra Lectio 2 af 16 Vælg

Læs mere

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

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

Læs mere

Muligheden for generering af bogmærkedokumenter i Word slås til på denne måde:

Muligheden for generering af bogmærkedokumenter i Word slås til på denne måde: GENERERING AF WORD-DOKUMENTER I MILJØMODULER Ved behandlingen af miljøsager i GeoEnviron kan I lave dokumenter (til enkeltpersoner), der skrives i Word med udvalgte data fra GeoEnviron. Disse data bliver

Læs mere

Kom godt igang med Inventar registrering

Kom godt igang med Inventar registrering Kom godt igang med Inventar registrering (InventoryDB) (Med stregkodesupport) programmet fra PetriSoft Introduktion... 1 Inventar registrering... 2 Værktøjsudleje... 3 Service database til reperationer

Læs mere

Indledning. Adgang til systemet

Indledning. Adgang til systemet Indledning For at komme i gang med GIAS modulet i programmet skal kirkegården være knyttet sammen med provstiet, således at de varer, der er valgt fra provstiet, vises på kirkegården. Kontakt Skovbo Data

Læs mere

Kort til Husdyrgodkendelse / Excel data og Næsgaard Markkort

Kort til Husdyrgodkendelse / Excel data og Næsgaard Markkort Kort til og Næsgaard Markkort Kun i ADVICER Dette afsnit er kun relevant hvis du arbejder med AD- VICER udgaven af Næsgaard Markkort (rådgiverudgaven). Funktionen findes IKKE i PLUS og OPTI udgaven af

Læs mere

Brug af Discoverer. 1. Start Discoverer ved at klikke på knappen Discoverer på

Brug af Discoverer. 1. Start Discoverer ved at klikke på knappen Discoverer på Oprette projektark med simpel tabel Brug af Discoverer 1. Start Discoverer ved at klikke på knappen Discoverer på www.kirkeportal.dk 2. Angiv kontonummer, brugernavn og password. Det er det samme som anvendes

Læs mere

Manual til Kundekartotek

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

Læs mere

Installationsvejledning

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

Læs mere

How to do in rows and columns 8

How to do in rows and columns 8 INTRODUKTION TIL REGNEARK Denne artikel handler generelt om, hvad regneark egentlig er, og hvordan det bruges på et principielt plan. Indholdet bør derfor kunne anvendes uden hensyn til, hvilken version

Læs mere

Ændringer Masseoprettelse og masseredigering af kontaktlærertilknytninger er ny funktionalitet i EASY-A. Forklaring eller beskrivelse

Ændringer Masseoprettelse og masseredigering af kontaktlærertilknytninger er ny funktionalitet i EASY-A. Forklaring eller beskrivelse Masseoprettelse og masseredigering af kontaktlærertilknytninger 29-10-2007/version 1/mgl Indhold Ændringer Centrale begreber Generelt Arbejdsgange Fremsøgning af elever Opret (nye) kontaktlærertilknytninger

Læs mere

Brugervejledning til E-conomic integration. Version 1.4

Brugervejledning til E-conomic integration. Version 1.4 Brugervejledning til E-conomic integration Version 1.4 Indhold 1. Om E-conomic integrationen... 1 1.1. Inden du går i gang i HostedShop... 2 1.2. Første gang du klikker på E-conomic integration i kontrolpanelet...

Læs mere

09/03 2009 Version 1.4 Side 1 af 37

09/03 2009 Version 1.4 Side 1 af 37 Login til DJAS Gå ind på adressen http://www.djas.dk I feltet Brugernavn skrives den e-mail adresse som brugeren er registeret med i systemet. I feltet Password skrives brugerens adgangskode. Ved at sætte

Læs mere

Klik på denne knap for at komme til FaktaNet live! Forside. Siden der bl.a viser hvor mange nye/opdaterede projekter brugeren har.

Klik på denne knap for at komme til FaktaNet live! Forside. Siden der bl.a viser hvor mange nye/opdaterede projekter brugeren har. FaktaNet live! Hjælp Knap menu. Klik på denne knap for at komme til FaktaNet live! Forside. Siden der bl.a viser hvor mange nye/opdaterede projekter brugeren har. Klik her for at åbne FaktaNet live! Søgemodul.

Læs mere

Vejledning til Jobnet for Arbejdsgiver JobAG. Jobordre

Vejledning til Jobnet for Arbejdsgiver JobAG. Jobordre Vejledning til Jobnet for Arbejdsgiver JobAG Jobordre Version: 1.0 Oprettet den 20. december 2018 INDHOLD 1. INDLEDNING... 3 2. JOBORDRE... 3 3. OPRETTELSE OG VISNING AF JOBORDREOPLYSNINGER... 3 3.1 OPRETTELSE

Læs mere

Weblink. Brugermanual. Hotline: 79 30 01 56

Weblink. Brugermanual. Hotline: 79 30 01 56 Weblink Brugermanual Hotline: 79 30 01 56 Indholdsfortegnelse: Log ind på Gateway/Weblink:...3 Opret Ny ordre:...4 Indtastning af Varer til bestilling:...7 Søg vare:...8 Udskriv ordren....11 Ordrebekræftigelse

Læs mere

Blåt Medlem. Vejledning i kontingentopkrævning med e-mail ved brug af Word eller Open Office

Blåt Medlem. Vejledning i kontingentopkrævning med e-mail ved brug af Word eller Open Office Blåt Medlem Vejledning i kontingentopkrævning med e-mail ved brug af Word eller Open Office Formål... 2 Forskelle... 2 MS Word... 2 Open Office... 2 Kontakt til din mail... 3 Datafilen fra Blåt Medlem...

Læs mere

Indhold. Evalueringsvejledning. En undersøgelse fra start til slut involverer 4 programmer: - SurveyXact - Excel - E-learn - SiteCore

Indhold. Evalueringsvejledning. En undersøgelse fra start til slut involverer 4 programmer: - SurveyXact - Excel - E-learn - SiteCore Evalueringsvejledning En undersøgelse fra start til slut involverer 4 programmer: - SurveyXact - Excel - E-learn - SiteCore Indhold 1 - Respondentgruppe hentes... 2 2 Undersøgelsen oprettes i SX... 4 3.

Læs mere