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