CONCORDE XAL/C5 Overbygningsmodul til XAL2LN - Intoint
CONCORDE XAL/C5 Overbygningsmodul til XAL2LN - Intoint
CONCORDE XAL/C5 Overbygningsmodul til XAL2LN - Intoint
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
0. Introduktion.................................................................................................3<br />
Overbygnings modul.................................................................................3<br />
0.1 Målgruppe.......................................................................................4<br />
0.2 Komponenter..................................................................................4<br />
0.3 Systemkrav......................................................................................5<br />
0.4 Uddannelse .....................................................................................5<br />
1. Programinstallation....................................................................................6<br />
1.1 Indlæsning af filer..........................................................................6<br />
1.2 Installation af Integrationskit.......................................................7<br />
1.2.1 Import MAC+DBD ...............................................................7<br />
1.2.2 Tilføj nye globale variable....................................................8<br />
1.2.3 Importer de resterende designelementer..........................8<br />
1.2.4 Indlæggelse i menusystem ..................................................9<br />
2. Kom hurtigt i gang ...................................................................................11<br />
2.1 Sammenkædning af kartoteker.................................................11<br />
2.2 Definition af feltsammenhænge................................................15<br />
2.3 Opdatering af Lotus Notes.........................................................17<br />
3. Systemfaciliteter ........................................................................................19<br />
3.1 Menu side 1...................................................................................19<br />
3.1.1 Defined Tables .....................................................................20<br />
3.1.2 Update ...................................................................................20<br />
3.1.3 Edit <strong>XAL</strong>................................................................................21<br />
3.1.4 Formulas ...............................................................................21<br />
3.1.4.1 Init formula.......................................................................22<br />
3.1.4.2 Pre Integration Formula.................................................22<br />
3.1.4.3 Pre Query Formula .........................................................22<br />
3.1.4.4 Pre Record Formula........................................................23<br />
3.1.4.5 Post Record Formula ......................................................23<br />
3.1.4.6 Post Integration Formula...............................................23<br />
3.1.4.7 Exit Formula.....................................................................23<br />
3.1.5 <strong>XAL</strong>-Selection.......................................................................23<br />
3.1.6 Export definition..................................................................24<br />
3.1.7 Import definition .................................................................24<br />
3.2 Felter side 1 ...................................................................................24<br />
3.3 Menu side 2...................................................................................27<br />
3.3.1 Pre Field Formula................................................................27<br />
3.3.2 Post field formula................................................................28<br />
3.3.3 Notes Keywords ..................................................................28<br />
3.3.4 Auto fill-in.............................................................................29<br />
3.3.5 Delete all lines ......................................................................29<br />
3.4 Felter side 2 ...................................................................................29<br />
3.5 Udvekslingstyper pr. felt............................................................31<br />
1
2<br />
3.5.1 DB...........................................................................................31<br />
3.5.2 LOOKUP...............................................................................31<br />
3.5.3 NUMBER ..............................................................................32<br />
3.5.4 STR .........................................................................................32<br />
3.5.5 FUNCTION..........................................................................32<br />
3.6 Tastefunktioner ............................................................................32<br />
3.6.1 Check definition (Alt-C).....................................................32<br />
3.6.2 Skift Side ...............................................................................33<br />
4. Avancerede funktioner............................................................................34<br />
4.1 Benyttelse af triggere...................................................................34<br />
4.1.1 Variabler og lokalmacroer.................................................34<br />
4.1.2 Afgrænsning.........................................................................35<br />
4.1.3 Debug ....................................................................................35<br />
4.1.4 Forbehandling af data ........................................................35<br />
4.1.5 Efterbehandling af data......................................................36<br />
4.1.6 Beregning af feltværdi........................................................36<br />
4.2 Fejlsøgning via ”Edit <strong>XAL</strong>” .......................................................37<br />
4.3 Manual Query ..............................................................................38<br />
4.4 DocId som Notes KeyField........................................................39<br />
4.5 Feltnavn beregning......................................................................39<br />
4.6 Agent-afvikling ............................................................................40<br />
4.7 Tips .................................................................................................40<br />
4.8 Typiske fejlkilder .........................................................................40<br />
5. Logsystem ..................................................................................................41<br />
5.1 Overførsel via log.........................................................................41<br />
5.1.1 Manuel overførsel ...............................................................42<br />
5.1.2 Automatisk overførsel........................................................42<br />
5.2 Overvågning af log......................................................................42<br />
5.3 Sletning af logposter....................................................................44<br />
5.4 Aktivering af logsystem .............................................................44<br />
5.4.1 Syntax ....................................................................................44<br />
5.4.2 Afgrænsning af log .............................................................45<br />
Appendix 1. <strong>XAL</strong> designelementer i applikation...................................47<br />
Appendix 2. Opbygning af <strong>XAL</strong> kørsel....................................................49
⎡ ⎤<br />
0. Introduktion<br />
Overbygnings modul<br />
Denne manual beskriver de værktøjer der muliggør integration mellem<br />
<strong>CONCORDE</strong> og Lotus Notes, uden at skulle benytte<br />
<strong>CONCORDE</strong>’s udviklingsværktøjer.<br />
Mange udvekslingsopgaver mellem <strong>CONCORDE</strong> og Lotus Notes<br />
kan klares med simple definitioner. Opsætning af disse definitioner<br />
vedligeholdes i et enkelt skærmbillede, som svarer <strong>til</strong> datamanipulation<br />
og rapportgenerator i <strong>CONCORDE</strong>.<br />
Værktøjet giver mulighed for, at man på under 5 minutter kan kreere<br />
en opsætning der muliggør opdatering af en Lotus Notes database<br />
med data fra <strong>CONCORDE</strong>.<br />
Udvekslingen kan ske med alle poster fra <strong>CONCORDE</strong> eller kun en<br />
delmængde, f.eks. alle debitorer i en bestemt kundegruppe.<br />
Hvilke felter fra <strong>CONCORDE</strong> der overføres <strong>til</strong> Lotus Notes defineres<br />
ligeledes i værktøjet, ligesom der findes en række faciliteter <strong>til</strong> at finjustere<br />
udvekslingen.<br />
For mere erfarne <strong>XAL</strong>-udviklere er der mulighed for at programmere<br />
triggere, så der kan laves selv meget avancerede udvekslinger.<br />
Desuden kan definitioner opsat i applikationen eksporteres <strong>til</strong> <strong>XAL</strong>kørsler.<br />
På denne måde kan man lynhurtigt danne fundamentet for<br />
avancerede udvekslingskørsler, som programmeres i <strong>XAL</strong>.<br />
Overbygningen giver ikke kun mulighed for at definere hvorledes<br />
data skal overføres <strong>til</strong> Lotus Notes. Applikationen indeholder også en<br />
funktion der muliggør løbende opdatering af Lotus Notes med ændringer<br />
i data fra <strong>CONCORDE</strong>.<br />
Har man f.eks. et lagerkartotek, der skal afspejles i Lotus Notes, som<br />
indeholder 10.000 varenumre, er det ikke praktisk at overføre alle<br />
disse varenumre ved en opdateringskørsel. Den eneste praktiske<br />
mulighed for at holde en Lotus Notes database med så mange dokumenter<br />
ajour, er ved kun at overføre de data der er ændret. Dette<br />
håndteres af applikationens logfunktion.<br />
3
4<br />
0.1 Målgruppe<br />
Hvor det grundlæggende integrationskit primært retter sig mod programmører,<br />
er hensigten med overbygningen, at man skal kunne<br />
udveksle med Lotus Notes, uden at skulle kunne programmere.<br />
For at kunne få det fulde udbytte af værktøjet, skal man have en god<br />
indsigt i datastrukturen i <strong>CONCORDE</strong>. En sådan viden erhverves<br />
typisk på et SUPERVISOR II kursus.<br />
Desuden skal man have et vist kendskab <strong>til</strong> Lotus Notes, gerne svarende<br />
<strong>til</strong> AD1 (Application Designer 1).<br />
Det skal understreges, at værktøjet er et <strong>CONCORDE</strong> værktøj. Al<br />
definition af integration sker udelukkende i <strong>CONCORDE</strong>.<br />
0.2 Komponenter<br />
Som nævnt indeholder applikationen 2 hovedkomponenter:<br />
• Opsætning af udveksling<br />
• Log af ændringer.<br />
Opsætning af udvekslingskørsler sker via 2 skærmbilleder – et <strong>til</strong><br />
opsætning af relationen mellem <strong>CONCORDE</strong> kartotek og Lotus Notes<br />
database og et <strong>til</strong> opsætning af relationen mellem felter i<br />
<strong>CONCORDE</strong> og Lotus Notes.<br />
Princippet i opsætningen er, at man via opsætningsbillederne definerer<br />
en række oplysninger, som så danner grundlag for en <strong>XAL</strong>-kørsel.<br />
Applikationen danner altså en <strong>XAL</strong>-kørsel der afvikler selve udvekslingen<br />
med Lotus Notes. Kørslen dannes dynamisk, så det altid er de<br />
aktuelle parametre der benyttes.<br />
Logsystemet, sikrer, at det kun er <strong>til</strong>føjelser, ændringer og sletninger<br />
der udveksles med Lotus Notes.<br />
Logsystemet registrerer hvilke poster i <strong>CONCORDE</strong> der ændres (nye,<br />
ændringer og sletninger). Logsystemet registrerer ikke nøjagtig hvilke<br />
felter der berøres og hvilke værdier felterne indeholder, kun hvilke<br />
poster der berøres.
⎡ ⎤<br />
Fra opsætningsdefinitionen hentes oplysninger om, hvilke data der<br />
skal udveksles.<br />
Logsystemet aktiveres pr. kartotek der ønskes opdateret løbende i<br />
Lotus Notes.<br />
Tilgang <strong>til</strong> både opsætningsskærmbilleder og logsystem sker via en<br />
speciel menu.<br />
0.3 Systemkrav<br />
For at kunne benytte overbygningen <strong>til</strong> Integrationskittet mellem<br />
<strong>CONCORDE</strong> og Lotus Notes, skal Integrationskittet være installeret<br />
på PC’en.<br />
Det er nok at én PC er opsat med integrationskittet. Denne PC kan så<br />
fungere som ”gateway” mellem <strong>CONCORDE</strong> og Lotus Notes. PC’en<br />
vil her være sat op som batchserver – enten via batchmodulet <strong>til</strong><br />
<strong>CONCORDE</strong> eller via timer-kørsler.<br />
Via logsystemet, som logger ændringer på alle arbejdspladser, centraliseres<br />
udvekslingen på denne måde <strong>til</strong> én PC.<br />
0.4 Uddannelse<br />
Som nævnt tidligere, vil en forudgående uddannelse på et Supervisor-kursus<br />
II være en fordel.<br />
Da brugen af overbygningsmodulet <strong>til</strong> integrationskittet er relativ<br />
enkel, vil der normalt ikke være behov for et større kursusforløb.<br />
Normalt vil en gennemgang af systemet, udformet som en workshop,<br />
hvor en eller flere udvekslingsdefinitioner opsættes være <strong>til</strong>strækkelig.<br />
5
6<br />
1. Programinstallation<br />
Overbygningen <strong>til</strong> Integrationskittet består udelukkende af standard<br />
<strong>XAL</strong> designelementer. Håndtering af disse sker derfor med standardværktøjer<br />
i <strong>CONCORDE</strong>.<br />
I Appendix 1 er alle designelementer listet.<br />
Overbygningen findes både <strong>til</strong> engelsk og dansk bund i<br />
<strong>CONCORDE</strong>. I denne manual er der taget udgangspunkt i versionen<br />
<strong>til</strong> dansk bund. Versionen <strong>til</strong> den engelske bund er identisk funktionsmæssigt.<br />
Alle skærmbilleder og anden brugerdialog er engelsk i begge versioner.<br />
OBS: Indlæsning af applikationen skal ske i den tegnbaserede<br />
version af <strong>CONCORDE</strong>!<br />
Efterfølgende benyttelse af værktøjerne kan ske i både GUI og<br />
tegnbaserede versioner.<br />
1.1 Indlæsning af filer<br />
Inden indlæsning af filer <strong>til</strong> <strong>CONCORDE</strong>, skal der oprettes et bibliotek<br />
<strong>til</strong> filerne. Dette bibliotek (directory) kaldes ”INTKIT”.<br />
Biblioteket oprettes på følgende måde:<br />
1. Start <strong>CONCORDE</strong> som normalt<br />
2. Hop <strong>til</strong> operativsystemet (/Generelt /Tilpasning/Hop <strong>til</strong> operativsystem)<br />
3. Skriv ”MD INTKIT”<br />
4. Alle filer fra disketten kopieres herefter <strong>til</strong> det nye bibliotek med<br />
kommandoen: ”COPY A:*.* INTKIT”<br />
5. Returnér <strong>til</strong> <strong>CONCORDE</strong> med kommandoen ”EXIT”
⎡ ⎤<br />
1.2 Installation af<br />
Integrationskit<br />
Indlæsning af <strong>XAL</strong> applikationselementerne følger stort set standardmetoden,<br />
med brug af MULTI import.<br />
1.2.1 Import MAC+DBD<br />
• Vælg udviklingsmenuen via /Generelt/Tilpasning/Udviklingsmenu.<br />
• Vælg /Multi/Import<br />
• Indtast ”intkit\import.def” som importdefinition som vist nedenfor:<br />
7
8<br />
Tast F3 og fravælg alle designelementer undtagen Macro og Database,<br />
som vist nedenfor:<br />
• Igangsæt indlæsning med F3.<br />
1.2.2 Tilføj nye globale variable<br />
Efter indlæsning af 4 nye kartoteker og 4 macroer, skal macroen<br />
”GlobaleVariableUsr” <strong>til</strong>rettes, så nye globale variable får virkefelt,<br />
inden yderligere <strong>til</strong>retninger indlæses.<br />
• Vælg /Mac/Ret og udpeg øverste version af ”Globale-<br />
VariableUsr” (der er muligvis kun én version).<br />
• Tilføj følgende linie i bunden af macroen ”#NotesVar”.<br />
• Gem og forlad macroen ved at taste F3<br />
• Herefter skal system-triggeren ”Autoexec” re-compileres.<br />
• Vælg /SXL/Oversæt. Udpeg ”Autoexec” og tast ENTER.<br />
• Afslut <strong>CONCORDE</strong> og start programmet op igen. Herefter er de<br />
nye globale variable defineret, så de resterende <strong>XAL</strong>designelementer<br />
kan indlæses.<br />
1.2.3 Importer de resterende designelementer<br />
• Vælg igen udviklingsmenuen via<br />
• /Generelt/Tilpasning/Udviklingsmenu.<br />
• Vælg /Multi/Import
⎡ ⎤<br />
• Indtast ”intkit\import.def” som importdefinition som beskrevet i<br />
afsnit 1.2.1.<br />
• Denne gang fravælges Macro og Database, mens alle øvrige elementer<br />
vælges med ”Ja”, som vist nedenfor:<br />
• Indlæs filer ved at taste F3.<br />
Herefter er alle nødvendige filer indlæst.<br />
1.2.4 Indlæggelse i menusystem<br />
Som det sidste punkt i installationen, skal overbygningen gøres <strong>til</strong>gængelig<br />
for brugerne via menusystemet.<br />
Dette gøres via udviklingsmenuen, hvor /MNX/Ret vælges. Typisk<br />
vil man lægge menupunktet i menuen DAT.<br />
Udvælg hvor integrationsmenuen skal placeres og taste INSERT.<br />
Skærmbilledet kan udfyldes som vist nedenfor (kun de to første linier<br />
skal udfyldes som vist, resten er valgfrit):<br />
9
10<br />
Herefter er overbygningen klar <strong>til</strong> brug.<br />
Ønskes logsystemet aktiveret skal der ske yderligere ændringer i<br />
databasedefinitionerne på de kartoteker der skal integreres. Se nærmere<br />
i afsnit Fejl! Henvisningskilde ikke fundet.
2. Kom hurtigt i gang<br />
I dette afsnit vil der blive gennemgået et scenario, hvor der defineres<br />
en simpel udvekslingskørsel mellem <strong>CONCORDE</strong>’s afdelingskartotek<br />
og en Lotus Notes database.<br />
Som Lotus Notes database benyttes den database der blev oprettet i<br />
forbindelse med case 2 i manualen <strong>til</strong> Integrationskittet. Hvis denne<br />
database ikke er oprettet, henvises <strong>til</strong> afsnit 2.2 i denne manual.<br />
Dette afsnit forudsætter at Lotus Notes databasen er oprettet.<br />
Opsætning af en udvekslingskørsel mellem <strong>CONCORDE</strong> og Lotus<br />
Notes sker via to skærmbilleder. Et billede benyttes <strong>til</strong> opsætning af<br />
integrationen på kartoteksniveau, mens det andet billede benyttes <strong>til</strong><br />
definition af hvilke felter der skal udveksles.<br />
Alle skærmbilleder der benyttes i dette afsnit, er fra den tegnbaserede<br />
version af <strong>CONCORDE</strong> <strong>XAL</strong> (Consol-versionen). Windowsversionen<br />
(GUI) kan alternativt benyttes.<br />
Det kan være en fordel at skifte <strong>til</strong> et testregnskab (f.eks. DMO) i det<br />
efterfølgende eksempel.<br />
2.1 Sammenkædning af<br />
kartoteker<br />
Vælg først det nye menupunkt med Lotus Notes integrationen, som<br />
blev oprettet i afsnit 1.2.4.<br />
Her vælges ”Table setup”.<br />
Følgende skærmbillede fremkommer:<br />
11<br />
⎤
12<br />
Først vælges hvilket <strong>CONCORDE</strong> kartotek der skal integreres med<br />
Lotus Notes. Dette gøres ved enten at indtaste navnet på kartoteket<br />
eller udpege kartoteket via Alt-H funktionen.<br />
Vælg ”Afdeling”.<br />
Herefter udpeges det Lotus Notes kartotek der skal integreres med.<br />
Dette gøres ved at indtaste eller udpege navnet på Lotus Notes serveren<br />
og Lotus Notes databasen.<br />
Også her kan Alt-H funktionen benyttes.<br />
Bemærk at brugerfladen ved Alt-H er windows-baseret. Hvis ikke man<br />
umiddelbart kan se dette vindue, kan man skifte <strong>til</strong> vinduet med Alt-Tab.<br />
Det anbefales at benytte Alt-H funktionen, idet man herved undgår<br />
stavefejl. Nedenfor er vist et eksempel på udvælgelse af server og<br />
database via Alt-H:
Efter at have udvalgt server og database angives hvilken form, der<br />
skal benyttes i Lotus Notes.<br />
Kartoteksstrukturen i Lotus Notes afviger en del fra strukturen i<br />
<strong>CONCORDE</strong>. I Lotus Notes kan et kartotek indeholde en række forskellige<br />
typer oplysninger, f.eks. kan både debitorer og debitorposter<br />
ligge i samme database. Normalt benytter man dog forskellige<br />
”forms” i Lotus Notes, <strong>til</strong> at adskille de forskellige typer information.<br />
Derfor skal et <strong>CONCORDE</strong> kartotek linkes <strong>til</strong> både en database og en<br />
form.<br />
Efter udvælgelse af form, angives hvilket view man ønsker at benytte<br />
i Lotus Notes. I den nuværende version af applikationen benyttes<br />
denne oplysning dog ikke funktionelt, så hvilket view der vælges, er<br />
ikke vigtigt. I forbindelse med mere avancerede søgninger (manuel<br />
søgeopbygning), kan det være en fordel at udvælge et view, der er<br />
afgrænset <strong>til</strong> kun at vise dokumenter i Lotus Notes databasen som er<br />
relevante i forbindelse med udveksling <strong>til</strong> dette <strong>CONCORDE</strong> kartotek<br />
(f.eks. hvor man i Notes har ”select” på den valgte form).<br />
Også form og view kan udvælges med Alt-H eller indtastes manuelt.<br />
Da Lotus Notes er case-sensitiv, er det vigtigt, ved manuel indtastning,<br />
at indtaste navne på akkurat samme måde, som de er angivet i<br />
Lotus Notes.<br />
13<br />
⎤
14<br />
Nedenfor er vist et eksempel på oplysninger der definerer en relarion<br />
mellem afdelingskartoteket i <strong>CONCORDE</strong> og et <strong>til</strong>svarende kartotek i<br />
Lotus Notes:<br />
Herefter skal relationen mellem <strong>CONCORDE</strong> kartoteket og Lotus<br />
Notes kartoteket defineres.<br />
Her<strong>til</strong> udvælges hvilket efter hvilket index <strong>XAL</strong> skal udvælge sine<br />
poster. Hvilket index der vælges her, har normalt ikke den store betydning.<br />
Ved brug af triggere (se afsnit 3.1.4) kan indexvalg dog have<br />
en vis betydning.<br />
I denne omgang benyttes indexet kun <strong>til</strong> at bestemme i hvilken rækkefølge<br />
de udvekslede poster vises, efterhånden som udvekslingen<br />
skrider frem.<br />
Her er ”NumIdx” valgt som index.<br />
For at kunne opdatere eksisterende dokumenter i Lotus Notes, er det<br />
nødvendigt at angive hvordan man udpeger et Lotus Notes dokument,<br />
med udgangspunkt i en post i <strong>CONCORDE</strong>. Her<strong>til</strong> benyttes<br />
nøglefelter. Eksempler på typiske nøglefelter i <strong>CONCORDE</strong> er ”Kontonummer”<br />
og ”Varenummer”.<br />
Ved valg af nøglefelt er det vigtigt at nøglefeltet er entydigt. I visse<br />
<strong>til</strong>fælde er det ikke muligt at angive en entydig udpegning af en post<br />
i <strong>CONCORDE</strong> med blot eet felt. Et eksempel herpå er ”SagAktivitet”<br />
i <strong>CONCORDE</strong> <strong>XAL</strong>’s Time/Sags system. For at udpege en aktivitetspost<br />
entydigt skal man kende både sagsnummer, afsnitsnummer og<br />
aktivitetsnummer.<br />
I overbygningen er der mulighed for angivelse af op <strong>til</strong> 5 nøglefelter.<br />
For hvert nøglefelt i <strong>CONCORDE</strong> udpeges det modsvarende felt i<br />
Lotus Notes.<br />
I dette <strong>til</strong>fælde hedder nøglefeltet i begge systemer ”Nummer”. Dette<br />
angives både i Lotus Notes kolonnen og i <strong>XAL</strong> kolonnen.
Herefter er al nødvendig information på overordnet kartoteksniveau<br />
angivet.<br />
2.2 Definition af<br />
feltsammenhænge<br />
Efter definering af sammenhængen mellem <strong>CONCORDE</strong> kartoteket<br />
og Lotus Notes databasen skal felterne, som indeholder den information<br />
der skal udveksles, sættes op.<br />
Dette gøres på skærmside 2, som vælges med PgDn<br />
Herefter fremkommer et skærmbillede som vist nedenfor:<br />
15<br />
⎤
16<br />
Alle felter der skal udveksles defineres i venstre side af skærmen.<br />
Felterne nederst og <strong>til</strong> højre benyttes <strong>til</strong>, pr. felt, at angive detaljer om<br />
de enkelte felter.<br />
For hvert Lotus Notes felt, der skal opdateres og som vises i den venstre<br />
kolonne, angives det <strong>til</strong>svarende felt i <strong>CONCORDE</strong> databasen.<br />
Der er flere muligheder for at overføre andet en feltværdier, f.eks.<br />
konstanter, beregninger eller opslag i andre kartoteker. Se herom i<br />
afsnit 3.<br />
Applikationen indeholder en funktion, der sammenligner feltnavne i<br />
Lotus Notes med feltnavne i <strong>CONCORDE</strong>. Har de samme navn,<br />
antager applikationen, at de skal udveksle data. Afdelings-databasen<br />
i Lotus Notes har netop samme feltnavne som i <strong>CONCORDE</strong>.<br />
Derfor vælges nu lokalmenuen (F10 eller Alt-L i GUI versionen). I<br />
menuen vælges punktet ”Auto fill-in”.<br />
Nu er alle linier sat op, så vi er klar <strong>til</strong> opdatering af Lotus Notes:<br />
Som det ses af skærmbilledet, vil 3 felter i Lotus Notes, Ansvarlig,<br />
Navn og Nummer, blive opdateret med data for afdelingsposter i<br />
<strong>CONCORDE</strong>.<br />
Ved at vælge funktionen ”Check Notes opsætning” (Alt-C), kan man<br />
lave et check af, om alle de indtastede Notes-oplysninger (Servernavn,<br />
form, view og feltnavne) er korrekt udfyldt. Dette er naturligvis<br />
mest interessant, hvis man har udfyldt disse værdier manuelt. Ved<br />
brug af ”Auto fill-in” og Alt-H vil oplysningerne altid være OK.
2.3 Opdatering af Lotus Notes<br />
Så er den komplette definition færdig.<br />
Selve opdateringskørslen sker fra skærmside-1 (brug evt. PgUp).<br />
Gem evt. definitionen (Ctrl-F2) inden opdatering af Lotus Notes<br />
igangsættes.<br />
I lokalmenuen vælges ”Update”, hvorefter opdateringen af Lotus<br />
Notes starter. Da der ikke, i dette eksempel, er lavet nogen afgrænsning<br />
af hvilke poster fra <strong>CONCORDE</strong> der skal overføres, udveksles<br />
data fra alle poster i afdelingskartoteket.<br />
Under udvekslingen vises hvilken post der aktuelt udveksles. Indholdet<br />
af den primære nøgle i <strong>CONCORDE</strong> (i dette <strong>til</strong>fælde afdelingskoden)<br />
vises. Rækkefølgen af poster er bestemt af det valgte<br />
<strong>XAL</strong>-index, som i dette <strong>til</strong>fælde er NumIdx.<br />
Efter endt opdatering vises hvor mange dokumenter der er opdateret<br />
i Lotus Notes, fordelt efter nye, opdaterede og slettede.<br />
Nedenfor er vist et skærmbillede, hvor der er oprettet 6 nye dokumenter<br />
i Lotus Notes.<br />
Afvikles opdateringskørslen endnu en gang, vil man se at der nu er<br />
opdateret 6 dokumenter, mens der ikke er oprettet nye.<br />
Dette skyldes naturligvis, at data allerede er overført én gang, hvorfor<br />
applikationen vil finde de nyoprettede dokumenter i Lotus Notes og<br />
17<br />
⎤
18<br />
opdatere disse. Afvikles kørslen endnu en gang, vil der efterfølgende<br />
stå, at der nu er opdateret 6 poster.<br />
Kommer man i en situation, hvor applikationen ikke opdaterer<br />
eksisterende dokumenter, men i stedet opretter nye, skyldes det<br />
oftest en fejl i definitionen af nøglerne mellem Lotus Notes og<br />
<strong>CONCORDE</strong>. Det er vigtigt at nøglerne <strong>til</strong> sammen kan danne en<br />
entydig udpegning af dokumenter i Lotus Notes. Naturligvis er det<br />
også afgørende, at de felter, der indgår i nøglen eller nøglerne, over-<br />
f øres <strong>til</strong> Notes.<br />
Bemærk ligeledes, at applikationen vil melde fejl, hvis opslaget i Lotus<br />
Notes fremfinder mere end ét matchende dokument.
⎡ ⎤<br />
3. Systemfaciliteter<br />
I dette afsnit gennemgås de enkelte elementer i overbygningen. Alle<br />
menupunkter og funktioner beskrives.<br />
Overbygningen indeholder to menuer. Den ene menu benyttes på<br />
skærmside 1, hvor funktioner der vedrører den generelle definition<br />
og udveksling kan kaldes.<br />
Menuen på side 2 indeholder funktioner <strong>til</strong> feltdefinitioner.<br />
3.1 Menu side 1<br />
Lokalmenuen (F10 eller Alt-L i GUI versionen) på første side indeholder<br />
de overordnede funktioner <strong>til</strong> håndtering af definitionen på de<br />
enkelte kartoteker, herunder udveksling af data.<br />
19
20<br />
3.1.1 Defined Tables<br />
Via menupunktet ”Defined tables” kan man få vist en liste over alle<br />
kartoteker hvor der er defineret en udveksling.<br />
Ved at taste kan man skifte <strong>til</strong> den udpegede definition.<br />
3.1.2 Update<br />
Update igangsætter den egentlige udveksling fra <strong>CONCORDE</strong> <strong>XAL</strong><br />
<strong>til</strong> Lotus Notes. Alle data, evt. afgrænset via <strong>XAL</strong>-Selection (se afsnit<br />
3.1.5), overføres fra kartoteket <strong>til</strong> Lotus Notes.<br />
Teknisk set foregår overførslen ved, at der automatisk dannes en<br />
<strong>XAL</strong>-kørsel der afvikles (se evt. Appendix 2). Denne <strong>XAL</strong>-kørsel<br />
dannes dynamisk med udgangspunkt i de forskellige oplysninger<br />
der er indtastet. Normalt vil denne <strong>XAL</strong>-kørsel kunne oversættes og<br />
afvikles uden problemer. Men da overbygningen giver mulighed for<br />
at man selv kan indsætte <strong>XAL</strong>-kode i funktioner og triggere (se afsnit<br />
3.1.4) er der mulighed for, at den dannede <strong>XAL</strong>-fil kan indeholde fejl.<br />
For at spore fejlkilder kan den generede <strong>XAL</strong>-kode editeres – se afsnit<br />
3.1.3.<br />
En anden fejlkilde kan være fejl i definition af elementer i Lotus Notes,<br />
f.eks. stavefejl eller forkert brug af store/små bogstaver. Check<br />
evt. definitioner med Alt-C. Ved generelt at bruge Alt-H minimeres<br />
denne fejlkilde. Fejl i forbindelsen <strong>til</strong> Lotus Notes vises normalt i<br />
Windows-dialog boxe.
⎡ ⎤<br />
Efter opdatering af Lotus Notes databasen viser en meddelelsesbox<br />
oplysninger om hvor mange poster der er oprettet, oprettet og evt.<br />
slettet. Denne box lukker selv efter 5 sek. (så <strong>XAL</strong>-kørsel kan afvikles<br />
fra <strong>XAL</strong>’s batchafvikling).<br />
3.1.3 Edit <strong>XAL</strong><br />
Som beskrevet i forrige afsnit, danner de indtastede oplysninger<br />
grundlaget for en færdig <strong>XAL</strong>-kørsel. Den genererede <strong>XAL</strong> kode kan<br />
editeres og evt. gemmes inden opdatering af Lotus Notes. Denne<br />
funktion bruges primært <strong>til</strong> fejlsøgning efter syntaxfejl i <strong>XAL</strong>-koden.<br />
For en nærmere gennemgang af, hvorledes denne <strong>XAL</strong>-kode er opbygget<br />
henvises <strong>til</strong> Appendix 2.<br />
Inden <strong>XAL</strong>-koden vises, får man mulighed for at gemme <strong>XAL</strong>-koden<br />
som en isoleret <strong>XAL</strong>-kørsel. Dette giver mulighed for, at man efterfølgende<br />
kan arbejde videre på koden på ”gammeldags” vis. Metoden<br />
kan også bruges, hvis man har brug for at debugge koden eller<br />
hvis man ønsker at gemme flere udvekslingsopsætninger på eet kartotek.<br />
Når man har afsluttet editering af <strong>XAL</strong>-koden kan man igangsætte<br />
opdateringen af Lotus Notes, ved at vælge JA <strong>til</strong> at kørslen skal<br />
igangsættes.<br />
3.1.4 Formulas<br />
Dette menupunkt indeholder en række undermenu punkter:<br />
21
22<br />
Fælles for disse funktioner er, at man her har mulighed for at kode<br />
specialfunktioner direkte i <strong>XAL</strong>. Typisk vil man bruge disse ”triggere”<br />
<strong>til</strong> at definere mere avanceret behandling af de data der skal overføres<br />
<strong>til</strong> <strong>XAL</strong>.<br />
Menupunkterne er sorteret i den rækkefølge, hvorefter <strong>XAL</strong> programstumperne<br />
indføjes i den genererede <strong>XAL</strong>-koden.<br />
Der skal her pointeres, at der ikke sker syntax-check ved indtastning<br />
af <strong>XAL</strong>-kode. Den endelige syntax check sker først ved opdatering af<br />
Notes eller editering af <strong>XAL</strong>-koden som beskrevet i ovenstående<br />
afsnit.<br />
3.1.4.1 Init formula<br />
Den <strong>XAL</strong> kode der indtastes her, placeres som den første del af <strong>XAL</strong>koden.<br />
Her defineres alle variable der evt. skal benyttes i de øvrige triggere.<br />
Desuden er det her muligt at definere evt. macroer, som skal kaldes<br />
fra andre triggere.<br />
Også anden kode der ønskes udført inden forbindelsen <strong>til</strong> Lotus Notes<br />
etableres, angives her.<br />
3.1.4.2 Pre Integration Formula<br />
I denne trigger defineres evt. kode der skal udføres umiddelbart inden<br />
man påbegynder udveksling af alle poster. Her kan evt. promptboxe<br />
med afgrænsninger o. lign. defineres.<br />
3.1.4.3 Pre Query Formula
⎡ ⎤<br />
Dette punkt giver mulighed for manuelt at definere, hvorledes data<br />
<strong>til</strong> hver <strong>XAL</strong>-post skal findes i Lotus Notes. Brug af denne trigger<br />
kræver en del kendskab <strong>til</strong> Lotus Notes kode.<br />
Normalt benyttes denne funktion ikke og der henvises <strong>til</strong> afsnit 4.3<br />
for en nærmere gennemgang.<br />
3.1.4.4 Pre Record Formula<br />
Her defineres kode som afvikles før udveksling af hver enkelt post.<br />
Her kan man f.eks. programmere en beregning af en total via en<br />
”SEARCH” på et relateret kartotek, f.eks. et posteringskartotek.<br />
3.1.4.5 Post Record Formula<br />
Kode der skal afvikles umiddelbart efter at en post er overført <strong>til</strong> Lotus<br />
Notes lægges her. Et anvendelsesområde kan være en opdatering<br />
af <strong>CONCORDE</strong> med oplysninger fra Lotus Notes. F.eks. kan det ofte<br />
være en god idé at ”stemple” <strong>XAL</strong> posten med DocId fra Lotus Notes<br />
(ligger i variable &ID). På denne måde har man en entydig reference<br />
fra <strong>XAL</strong> posten <strong>til</strong> Lotus Notes dokumentet.<br />
3.1.4.6 Post Integration Formula<br />
Her kan lægges kode som skal eksekveres umiddelbart efter opdatering<br />
af alle poster fra <strong>CONCORDE</strong>.<br />
Det kunne f.eks. indeholde et kald <strong>til</strong> en agent i Lotus Notes der udfører<br />
efterfølgende databehandling i Lotus Notes.<br />
3.1.4.7 Exit Formula<br />
Denne kode afslutter <strong>XAL</strong>-koden.<br />
3.1.5 <strong>XAL</strong>-Selection<br />
Ønsker man at afgrænse hvilke data der skal overføres, kan dette<br />
indtastes via dette menupunkt.<br />
23
24<br />
Den indtastede kode efters<strong>til</strong>les en SEARCH-sætning, ved generering<br />
af <strong>XAL</strong>-kode med ”SEARCH USING <br />
WHERE”. I ovenstående eksempel altså med koden:<br />
SEARCH Afdeling USING NumIdx WHERE (Nummer > “Adm”) AND (Ansvarlig”NN”)<br />
3.1.6 Export definition<br />
Via dette menupunkt, kan man gemme sin definition i en ekstern fil.<br />
Denne definition kan senere indlæses igen, evt. <strong>til</strong> et andet regnskab i<br />
<strong>XAL</strong> (definition gemmes kun for det regnskab man har aktivt).<br />
Når definitionen gemmes, skal man angive et filnavn.<br />
3.1.7 Import definition<br />
Dette menupunkt benyttes, når man skal indlæse oplysninger fra en<br />
tidligere udlæst definitionsfil. Se forrige afsnit.<br />
Bemærk at man ved indlæsning af definitionsfil overskriver den eksisterende<br />
definition.<br />
3.2 Felter side 1<br />
På side 1 indtastes oplysninger om, hvorledes det enkelte<br />
<strong>CONCORDE</strong> kartotek skal hægtes på en Lotus Notes database<br />
Feltnavn Beskrivelse
⎡ ⎤<br />
<strong>XAL</strong> Table Navn på det kartotek i <strong>CONCORDE</strong> som skal<br />
udveksles med Lotus Notes.<br />
Indtast kartoteksnavn, brug Alt-H, F4 eller brug<br />
F7/F8 <strong>til</strong> bladring.<br />
Til højre for feltet vises kartoteksnummeret og<br />
ledetekst.<br />
Notes Server Navn på Notes Server, hvor Lotus Notes database<br />
er placeret. Brug LOCAL hvis databasen er placeret<br />
på arbejdsstationen. Brug evt. Alt-H.<br />
Notes Database Filnavn på database i Lotus Notes hvor<strong>til</strong> data<br />
skal overføres. Brug evt. Alt-H <strong>til</strong> opslag.<br />
Til højre for feltet vises databasens visningsnavn.<br />
Notes Form Form i Lotus Notes som indeholder definition på<br />
felter der skal overføres <strong>til</strong>. Brug evt. Alt-H<br />
Til højre for feltet vises hvilke type formen har i<br />
Notes (f.eks. main eller response)<br />
Notes View View i Notes. Benyttes ikke ved standardudveksling,<br />
men kan evt. benyttes ved kodning<br />
på f.eks. triggere. Felt skal udfyldes. Brug evt. Alt-<br />
H.<br />
<strong>XAL</strong> Index Overførsel af data <strong>til</strong> Lotus Notes sker via dette<br />
index. Valg af index kan have stor betydning på<br />
hastigheden hvormed data overføres <strong>til</strong> Notes.<br />
Specielt ved brug af ”<strong>XAL</strong> Selection” formel.<br />
Notes Keyfield Angivelse af felt i Lotus Notes som skal samholdes<br />
med korresponderende felt i <strong>CONCORDE</strong>.<br />
Alle Notes nøglefelter skal matche med korresponderende<br />
felt i <strong>XAL</strong> for at data opdateres.<br />
Findes ikke dokument i Lotus Notes, hvor alle<br />
definerede felter matcher, indsættes et nyt dokument<br />
i Lotus Notes.<br />
<strong>XAL</strong> Keyfield Felt i <strong>XAL</strong>, hvis indhold skal findes via Notes<br />
nøglefelt. Se beskrivelse ovenfor.<br />
Husk at angive at disse felter skal overføres <strong>til</strong><br />
Notes på skærmside 2.<br />
I visse <strong>til</strong>fælde kan det være nødvendigt at angive<br />
flere nøglefelter på underkartoteker.<br />
Ved stamkartoteker er f.eks. ”Kontonummer”<br />
eller ”Varenummer” nok <strong>til</strong> entydig udpegning af<br />
<strong>XAL</strong> post.<br />
<strong>XAL</strong> Selection Visning af selektionsformel. Se afsnit 3.1.5.<br />
25
26<br />
Insert Angivelse af, om det er <strong>til</strong>ladt at oprette nye dokumenter<br />
i Notes.<br />
Nye dokumenter oprettes, hvis ikke dokument<br />
kan findes via nøgleoplysningerne og hvis dette<br />
felt er angivet <strong>til</strong> JA (default).<br />
Modify Angivelse af, om det skal være muligt at overføre<br />
data <strong>til</strong> dokumenter der allerede findes i Lotus<br />
Notes.<br />
Delete Angivelse af, om det skal være muligt at slette<br />
data i Lotus Notes.<br />
Denne funktion har kun betydning for logopdatering<br />
(se afsnit Fejl! Henvisningskilde ikke fundet.)<br />
Del. not updated Denne funktion sikrer, at dokumenter der kun<br />
findes i Lotus Notes og altså ikke i <strong>CONCORDE</strong><br />
slettes ved en totalopdatering. Man sikrer altså, at<br />
databaserne indeholder samme antal poster.<br />
Denne funktion kan dog være relativ langsom,<br />
hvis det er større datamængder der overføres.<br />
Vær forsigtig med denne funktion, hvis man samtidig<br />
benytter <strong>XAL</strong>-selection <strong>til</strong> afgrænsning af<br />
hvilke data der skal overføres.<br />
Update newer Hvis denne funktion deaktiveres (NEJ), vil opdatering<br />
i Notes ikke ske på dokumenter, som er<br />
ændret senere (datomæssigt) end ændringen er<br />
sket i <strong>XAL</strong>.<br />
Denne funktion er sjældent benyttet, da man normalt<br />
benytter <strong>CONCORDE</strong> som ”master” – hvor<br />
data altså primært vedligeholdes her.<br />
Compare Ved en opdatering af Lotus Notes med integrationskittet,<br />
vil alle udvalgte poster overføres. Dette<br />
sker også selvom der ikke er forskel på data i<br />
<strong>CONCORDE</strong> og Lotus Notes.<br />
Ved at aktivere denne funktion, sammenlignes<br />
data inden opdatering udføres. Dette kan naturligvis<br />
tage lidt længere tid. Da læsning fra Lotus<br />
Notes er hurtigere end skrivning, kan denne metode<br />
dog være noget hurtigere, hvis der kun er<br />
relativt få dokumenter i Notes der skal opdateres.<br />
Denne funktion har desuden stor anvendelighed<br />
på Lotus Notes databaser der benytter ”unread”
⎡ ⎤<br />
markeringer (som det kendes fra mail-programmer).<br />
Her angiver Lotus Notes hvilke dokumenter<br />
der er nye eller ændrede siden man<br />
sidst havde databasen åbnet. Hvis alle dokumenter<br />
opdateres ukritisk, vil alle dokumenter fremstå<br />
som ”unread”, hvorved idéen med ”unread”<br />
markeringer er væk.<br />
Ved at vælge ”Compare” bevares ”unread” markeringer.<br />
Manual Query Denne funktion angiver, at man selv koder hvordan<br />
udvælgelsen af dokumenter i Lotus Notes<br />
skal ske. Se nærmere i afsnit 3.1.4.3 og 4.3.<br />
Decimaltype Ved overførsel af kommatal <strong>til</strong> Lotus Notes, er det<br />
afgørende at man angiver talformatet korrekt.<br />
Visse Notes servere benytter komma og visse<br />
punktum (100,00 eller 100.00). Her angiver man<br />
hvilken decimal-seperator der skal anvendes.<br />
Ser man, at overførsel af et tal, f.eks. 123,45 overføres<br />
som heltal (altså <strong>til</strong> 123,00) er det sandsynligvis<br />
begrundet i en forkert decimalseparator.<br />
3.3 Menu side 2<br />
På side 2 defineres detaljer omkring hvilke felter der skal udveksles<br />
og hvordan.<br />
Menuen på side 2 indeholder diverse funktioner der er knyttet <strong>til</strong> det<br />
enkelte felt, samt et par generelle funktioner der berører alle felter.<br />
3.3.1 Pre Field Formula<br />
I visse situationer, kan man ikke, via en simpel felthenvisning eller<br />
formel, definere hvilke data der skal overføres <strong>til</strong> et Lotus Notes felt.<br />
Værdien der skal overføres er måske afhængig af andre felter på<br />
posten eller også skal værdien beregnes via gennemløb af andre kartoteker.<br />
I en sådan situation kan denne trigger benyttes. Den <strong>XAL</strong>-kode der<br />
indtastes her udføres lige inden overførsel <strong>til</strong> feltet i Lotus Notes.<br />
27
28<br />
Et eksempel på brug af triggeren er vist nedenfor. Her overføres notater<br />
fra posten <strong>til</strong> et felt i Lotus Notes. Overførselstypen er defineret<br />
som funktion, hvor værdien der overføres <strong>til</strong> feltet ”Notat” er defineret<br />
i variablen &S, som opbygges i Pre Field triggeren. Bemærk brugen<br />
af Num2Char(10), som angiver linieskift i Lotus Notes.<br />
3.3.2 Post field formula<br />
Samme funktion som Pre Field Formula. Denne trigger udføres dog<br />
umiddelbart efter feltet er opdateret i Lotus Notes.<br />
Denne mulighed har ikke samme kraftfulde anvendelsesmuligheder.<br />
3.3.3 Notes Keywords<br />
ENUM’s i <strong>XAL</strong> lagres internt i <strong>CONCORDE</strong> som heltalsværdier –<br />
f.eks. har ENUM-typen ”NejJa” værdierne 0 (Nej) og 1 (Ja). Ved overførsel<br />
af ENUM’s <strong>til</strong> Lotus Notes overfører overbygningen ikke talværdierne<br />
med derimod feltværdierne (f.eks. ”Nej” og ”Ja”).<br />
I visse situationer er det ønskeligt at afvige fra denne metode. Det kan<br />
f.eks. skyldes, at man overfører data <strong>til</strong> en eksisterende Lotus Notes<br />
applikation, hvor sproget er engelsk og værdierne skal overføres<br />
<strong>til</strong>svarende (”No” og ”Yes”). En anden situation kan være hvor flere<br />
valgmuligheder i en <strong>XAL</strong> ENUM skal overføres <strong>til</strong> færre muligheder i<br />
Lotus Notes.<br />
Med menupunktet ”Notes Keywords” har man mulighed for at styre<br />
hvorledes ENUM felter ”oversættes”.
⎡ ⎤<br />
Nedenfor er vist et eksempel, hvor man overfører oplysninger om<br />
kontoplantypen fra finanskartoteket <strong>til</strong> en engelsk Notes applikation,<br />
som ikke indeholder så mange typer af konti.<br />
3.3.4 Auto fill-in<br />
Denne lille funktion kan benyttes som opstart af definition af felter<br />
der skal udveksles. Funktionen gennemløber alle felter i Lotus Notes<br />
databasen og undersøger, om der findes et felt med samme navn i<br />
<strong>CONCORDE</strong>. Felter, som på denne måde matcher, udvælges så automatisk<br />
<strong>til</strong> udveksling. Øvrige felter skal manuelt defineres.<br />
3.3.5 Delete all lines<br />
Ønsker man at nuls<strong>til</strong>le sin feltdefinitioner på et kartotek kan denne<br />
funktion kaldes. Herved slettes alle definitionslinier.<br />
3.4 Felter side 2<br />
På side 1 defineredes den generelle sammenhæng mellem<br />
<strong>CONCORDE</strong> kartoteket og Lotus Notes databasen.<br />
På side 2 indtastes en linie for hvert felt der skal opdateres i Lotus<br />
Notes. Bemærk at et felt der skal opdateres i Notes ikke nødvendigvis<br />
skal modsvares af et <strong>til</strong>svarende felt i <strong>CONCORDE</strong>.<br />
Eks.:<br />
29
30<br />
Feltnavn Beskrivelse<br />
Notes Field Name Navn på felt i Lotus Notes der skal overføres data<br />
<strong>til</strong>. Husk at feltnavn er case-sensitiv. Benyt evt.<br />
Alt-H.<br />
Int Type Angivelse af hvordan data beregnes. Se nedenfor<br />
i afsnit 3.5.<br />
<strong>XAL</strong> Fieldname Navn på felt i <strong>XAL</strong> der skal overføres <strong>til</strong> Lotus<br />
Notes (DB) eller nøgle ved opslag i andet kartotek<br />
(LOOKUP).<br />
Type Angivelse af felttype i <strong>CONCORDE</strong><br />
Exc Angivelse af, om dette felt indgår i udvekslingen<br />
<strong>til</strong> Lotus Notes.<br />
V Angivelse af, om feltnavn i Lotus Notes beregnes<br />
som ”Value” i Pre-field trigger.<br />
Se nærmere i afsnit 4.5.<br />
< Markering af, at der findes en pre-field trigger<br />
> Markering af, at der findes en post-field trigger<br />
String Angivelse af enten fast tekstværdi <strong>til</strong> felt (STR)<br />
eller angivelse af <strong>XAL</strong>-funktion (FUNCTION)<br />
Lookup file Angivelse af, i hvilket kartotek afledt feltværdi<br />
skal findes (LOOKUP).<br />
Lookup Index Angivelse af index der skal benyttes ved opslag<br />
efter feltværdi i andet kartotek. Nøgleværdi er<br />
angivet i feltet ”<strong>XAL</strong> Fieldname”.<br />
Lookup field Felt i andet kartotek, som indeholder den ønskede<br />
værdi.<br />
Decimals Antal decimaler der skal benyttes ved talværdi.
⎡ ⎤<br />
Number Konstant talværdi der skal overføres (NUMBER)<br />
Case Evt. formatering af tekstværdier, f.eks. konvertering<br />
<strong>til</strong> små eller store bogstaver. CapsFirst angiver<br />
at første bogstav i hvert ord er ”stort”.<br />
3.5 Udvekslingstyper pr. felt<br />
Der findes 5 forskellige måder at angive hvordan data <strong>til</strong> Lotus Notes<br />
beregnes.<br />
3.5.1 DB<br />
Dette er den basale metode. Her angiver man et felt i <strong>CONCORDE</strong><br />
der skal overøres <strong>til</strong> et <strong>til</strong>svarende felt i Lotus Notes. Overbygningen<br />
konverterer automatisk <strong>til</strong> rette datatype i Lotus Notes.<br />
3.5.2 LOOKUP<br />
I visse situationer har man brug for at hente enkelte feltoplysninger i<br />
et andet kartotek end det man udveksler aktuelt. Et eksempel herpå<br />
er opslag efter medarbejders fulde navn på basis af medarbejderens<br />
initialer. Her udfyldes Lookup felterne med opslagskartotek, index<br />
og feltnavn i andet kartotek der indeholder værdien. Den nøgle som<br />
bruges er feltet i <strong>XAL</strong> fieldname.<br />
Nedenfor er vist et eksempel på udfyldelse af Lotus Notes feltet AnsvarligNavn<br />
via opslag i medarbejderkartotek:<br />
31
32<br />
3.5.3 NUMBER<br />
Ved denne type overføres en fast talværdi <strong>til</strong> Lotus Notes for hver<br />
eneste post. Feltværdien indtastes i feltet ”Number”<br />
3.5.4 STR<br />
Denne type har samme funktion som beskrevet ovenfor. Dog er det<br />
her en fast tekstværdi der overføres. Tekstværdien skal ikke omkranses<br />
af anførselstegn.<br />
3.5.5 FUNCTION<br />
Denne udvekslingstype er den mest fleksible. Metoden kan benyttes<br />
<strong>til</strong> alle de øvrige typers funktioner. Værdien i feltet ”String” overføres<br />
<strong>til</strong> Lotus Notes.<br />
Angiver man et feltnavn i feltet overføres værdien af dette felt. Angives<br />
et tal eller en tekst (begge skal omkranses af anførselstegn) overføres<br />
en fast tal eller tekstværdi.<br />
Men det primære anvendelsesområde er dog muligheden for at indtaste<br />
<strong>XAL</strong>-funktioner. Et par eksempler på funktioner er angivet her:<br />
• PostNummer >= ”6000” ? ”Jylland” : ”Øerne”<br />
• ””+Navn+””<br />
• Date2Str(Today(),123,2,3,2,3,4)<br />
• &S<br />
I sidste linie overføres værdien af variablen &S, som kunne være<br />
beregnet via <strong>XAL</strong>-kode i Pre Field triggeren.<br />
3.6 Tastefunktioner<br />
Overbygningen indeholder enkelte funktionstaster, som kan anvendes<br />
på både skærmside 1 og 2.<br />
3.6.1 Check definition (Alt-C)<br />
Med Alt-C kan man bede overbygningen om at verificere, at alle<br />
Notes designelementer findes i Lotus Notes. Funktionen er specielt<br />
relevant efter manuel indtastning af f.eks. feltnavne eller efter indlæsning<br />
af definitionsfil (se afsnit 3.1.7).
⎡ ⎤<br />
Funktionen stopper ved første fejl og angiver hvilket designelement,<br />
der ikke kan findes i Lotus Notes. Efter rettelse af evt. første fejl, skal<br />
Alt-C kaldes igen for at finde evt. næste fejl.<br />
Når alle felter, form og view er fundet i Lotus Notes får man beskeden<br />
”Opsætning OK”.<br />
3.6.2 Skift Side<br />
Normalt benyttes Alt-F7 og Alt-F8 for at skifte mellem skærmside 1<br />
og 2 i <strong>CONCORDE</strong>.<br />
For at lave brugerfladen mere intuitiv benyttes i overbygningen<br />
PgDn og PgUp. Brug derfor ikke Alt-F7 og Alt-F8.<br />
33
34<br />
4. Avancerede funktioner<br />
I dette afsnit beskrives forskellige måde at opbygge mere avancerede<br />
udvekslinger med Lotus Notes. For at få det fulde udbytte af dette<br />
afsnit, kræves et rimeligt kendskab <strong>til</strong> kodning i <strong>XAL</strong> og evt. kendskab<br />
<strong>til</strong> integrationskittets programmeringsmæssige muligheder.<br />
Visse af funktionerne kræver desuden et større kendskab <strong>til</strong> Lotus<br />
Notes.<br />
4.1 Benyttelse af triggere<br />
Normalt vil man kunne udføre de fleste integrationsopgaver uden at<br />
skulle programmere. Men der kan opstå situationer, hvor parameteropsætning<br />
ikke er nok. Ved at benytte funktioner ved udveksling kan<br />
man udføre lidt mere avancerede opgaver.<br />
Til endnu mere komplekse kørsler kan man programmere <strong>XAL</strong>-kode<br />
i triggere.<br />
Som eksempler på områder hvor dette kan være nødvendigt kan<br />
nævnes:<br />
• Opslag i andre kartoteker, som involverer flere poster. F.eks.<br />
sammentælling af transaktioner.<br />
• Opsætning af integration med flere forms eller databaser i Lotus<br />
Notes.<br />
• Opdatering af data i <strong>CONCORDE</strong>.<br />
• Benyttelse af mere avancerede integrationsfunktioner, som f.eks.<br />
afsendelse af mail, håndtering af attachments, low-level kald <strong>til</strong><br />
Lotus Notes m.v.<br />
I dette afsnit beskrives forskellige anvendelsesområder for triggere.<br />
4.1.1 Variabler og lokalmacroer<br />
Som nævnt i afsnit 3.1.2 sker selve udvekslingen med Lotus Notes<br />
ved afvikling af en <strong>XAL</strong>-kørsel, der dannes dynamisk ud fra de parametre<br />
som er indtastet.<br />
Ønsker man at benytte variabler eller localmacroer i sin <strong>XAL</strong>-kode,<br />
kan man ikke blot definere disse i den trigger, hvori man skal benytte
⎡ ⎤<br />
dem. Dette skyldes, at triggerne egentligt blot er forskellige kodestumper,<br />
der placeres forskellige steder i den endelige <strong>XAL</strong>-kørsel.<br />
Så ønsker man at benytte egen variabler og lokalmacroer, skal disse<br />
defineres, som den første del af koden.<br />
Dette opnår man ved at benytte ”INIT” triggeren.<br />
4.1.2 Afgrænsning<br />
Normalt sker afgrænsning af, hvilke poster der overføres <strong>til</strong> Lotus<br />
Notes, via menupunktet ”<strong>XAL</strong>-selection” (se afsnit 3.1.5).<br />
Hvis man ønsker at afgrænsningen skal kunne bestemmes ved afviklingen<br />
af kørslen, kan man f.eks. benytte en #Prompt kommando i<br />
”Pre Integration Formula”. Husk at afgrænsningsvariablerne skal<br />
defineres i ”Init” triggeren. Benyt e.v.t. afgrænsningsvariabler i<br />
”<strong>XAL</strong>-selection” afgrænsningen.<br />
4.1.3 Debug<br />
Ønsker man at følge lidt bedre med i, hvad der sker under selve integrationen,<br />
kan man aktivere debug funktionen i integrationskittet<br />
(#NotesDebug(”1”)). Dette gøres normalt i ”Pre Integration Formula”.<br />
Debug vinduerne vil vises ind<strong>til</strong> man enten vælger ”Cancel” eller<br />
programmet møder funktionen #NotesDebug(”0”).<br />
Glemmer man at kalde denne kommando, f.eks. i ”Post Integration<br />
Formula”, vil debug vedblive med at være aktiv.<br />
4.1.4 Forbehandling af data<br />
Skal der ske indledende beregninger eller søgning efter data lægges<br />
den nødvendige kode her<strong>til</strong> i triggerne ”Pre Integration Formula”<br />
og/eller ”Pre Record Formula”.<br />
<strong>XAL</strong>-kørsel i ”Pre Integration Formula” udføres kun een gang, umiddelbart<br />
inden gennemlæsning af udvekslingskartoteket starter. Her<br />
kan f.eks. indlægges en afgrænsnings prompt-box, som afgrænser<br />
hvilke data der skal overføres (brug ikke prompt-boxe, hvis logopdatering<br />
er aktiveret).<br />
Skal <strong>XAL</strong>-kørslen afvikles for hver post der overføres, lægges <strong>XAL</strong>koden<br />
i ”Pre Record Formula”.<br />
35
36<br />
Her lægges typisk også mere avancerede Notes-funktioner, som opdaterer<br />
Notes-dokumenter på en måde, der ikke håndteres af den<br />
normale feltopdatering. Dette kan f.eks. være benyttelse af funktionen<br />
#NotesPutFieldValue, som gemmer data i et felt, som ikke er<br />
defineret på Notes’ formdesign.<br />
4.1.5 Efterbehandling af data<br />
Ønsker man at opdatere data i <strong>CONCORDE</strong> med data fra Lotus Notes,<br />
anbringes koden her<strong>til</strong> i ”Post Record Formula”. En typisk anvendelse<br />
af dette, er opdatering af <strong>XAL</strong>-post med DocId fra Lotus<br />
Notes dokumentet.<br />
Et eksempel herpå:<br />
SET LagerKart.NotesDocID = #NotesDocId<br />
UPDATE Lagerkart<br />
4.1.6 Beregning af feltværdi<br />
En meget stærk funktion ved overbygningsmodulet er muligheden<br />
for at få beregnet en Notes feltværdi via en <strong>XAL</strong>-kørsel.<br />
Dette gøres via ”Pre Field Formula” på feltniveau (se afsnit 3.3.1)<br />
Nedenfor er angivet et eksempel på en lille kørsel, der overfører Notatoplysninger<br />
fra <strong>CONCORDE</strong> <strong>til</strong> feltet ”Note” i Lotus Notes<br />
SET &S = ””<br />
SEARCH Notat USING NotatIdx<br />
WHERE Notat.NotatFileId == LagerKart.FileId<br />
AND Notat.NotatRecId == LagerKart.RecId<br />
SET &S = &S+Notat.Tekst+Num2Char(10) {Linieskift i Notes}<br />
END<br />
Bemærk, at for at benytte denne funktion, skal IntType være angivet<br />
<strong>til</strong> ”Function” (se afsnit 3.5.5) og værdien af feltet skal angives med<br />
den beregnede variabels navn (&S i dette <strong>til</strong>fælde).<br />
Husk at data der overføres <strong>til</strong> Lotus Notes skal konverteres <strong>til</strong> en<br />
streng. Benyttes således en numerisk variabel, skal man benytte<br />
Num2Str.<br />
Her et andet eksempel, der overfører en saldo for alle debitortransaktioner<br />
inden for den sidste måned:<br />
SET &Saldo = 0
⎡ ⎤<br />
SEARCH DebPost USING KtoDatoIdx<br />
WHERE DebPost.KontoNummer == DebKart.KontoNummer<br />
AND DebPost.Dato >= &SystemDato - 30<br />
#ADD(&Saldo,BeløbDkr)<br />
END<br />
Her vil man skulle angive Num2Str(&Saldo,0,2,1) som feltværdi.<br />
4.2 Fejlsøgning via ”Edit <strong>XAL</strong>”<br />
Idet der er mulighed for, via triggere, at angive stumper af <strong>XAL</strong>-kode<br />
mange steder i integrationsdefinitionen, kan det være svært at overskue<br />
hvor eventuelle fejl er placeret.<br />
Integrationsmetoden er, som beskrevet i 3.1.2, baseret på, at der dynamisk<br />
dannes en <strong>XAL</strong>-kørsel der efterfølgende afvikles. Denne<br />
<strong>XAL</strong>-kørsel sammenstykkes af følgende elementer:<br />
• Grundlæggende standardkode defineret i overbygningen selv<br />
• Indhold i selektion (se afsnit 3.1.5)<br />
• <strong>XAL</strong>-kode fra triggere (fra skærmside 1 og 2)<br />
• Indhold i feltværdi felt, herunder specielt funktioner<br />
Da indhold i selektion, triggere og funktioner ikke syntaxcheckes ved<br />
indtastning, kan der opstå situationer, hvor opdateringskørslen ikke<br />
kan afvikles.<br />
Ved at vælge ”Edit <strong>XAL</strong>” (afsnit 3.1.3) kan man få vist den samlede<br />
kode. Ved at taste F3 syntaxcheckes den samlede kode (opbygningen<br />
er beskrevet i Appendix 2)<br />
Typisk vil fejl opstå i macroen #Update. For at finde den nøjagtige<br />
placering af en fejl i denne makro kan man benytte følgende metode:<br />
• Lav en blokmarkering (Alt-A) af indholdet mellem #Local-<br />
Macro.Update og #EndMacro (eksklusiv disse to macrodefinitions<br />
linier) og kopiér teksten (Shift-F5)<br />
• Gå <strong>til</strong> kald af #Update nederst i koden<br />
• Indsæt tom linie inden denne linie<br />
• Placer cursor på denne tomme linie<br />
• Indsæt den kopierede tekst (Alt-I)<br />
• Genoversæt koden (F3)<br />
• Cursoren vil nu s<strong>til</strong>le sig på linien som indeholder fejlen.<br />
37
38<br />
4.3 Manual Query<br />
Ved opdatering af data i Lotus Notes, via Update funktionen (afsnit<br />
3.1.2), vil overbygningsmodulet søge efter et Lotus Notes dokument,<br />
der matcher <strong>CONCORDE</strong> dokumentet. Dette gøres via nøglefelterne<br />
(Notes KeyField og <strong>XAL</strong> Keyfield).<br />
Dette resulterer typisk i en kode, der kan se ud nogenlunde som i<br />
dette eksempel:<br />
SET &S2 = NotesKart.NotesKeyField + ’=”’ + VareNummer + ’”’<br />
#NotesQueryUnique(&S2)<br />
Hvis nøglefeltet i Notes hed f.eks. ”ItemId” og vi er kommet <strong>til</strong> varen<br />
”1.44” ville kaldet altså svare <strong>til</strong>:<br />
#NotesQueryUnique(’ ItemId = ”1.44” ’).<br />
Hvis der er flere nøglefelter adskilles de enkelte felter med ”&”.<br />
F.eks. resulterende i:<br />
#NotesQueryUnique(’Sag=”100” & Afsnit =”10” & Aktivitet=”3” ’)<br />
Se e.v.t. selv, via ”Edit <strong>XAL</strong>” og evt. debug funktion (afsnit 4.1.3),<br />
hvorledes søgefelterne indgår i søgningen.<br />
Men der kan være situationer, hvor denne søgemetode ikke er fyldestgørende.<br />
F.eks. kan der være situationer, hvor et søgefelt i Lotus<br />
Notes ikke er unikt. Normalt vil dette medføre en fejl, da #NotesQueryUniqe<br />
vil returnere en fejl, hvis der findes mere end eet dokument i<br />
søgningen.<br />
Med ”Manual Query” funktionen kan man opbygge sit eget opslag<br />
efter data i Lotus Notes.<br />
I ”Pre Query” kunne man f.eks. kalde den specielle funktion<br />
#NotesQueryUnique(”ANY@@@… (f.eks. #NotesQueryUnique(’ANY@’+<br />
NotesKart.NotesKeyField + ’=”’ + VareNummer + ’”’)<br />
Der er visse regler for hvorledes ”Pre Query” skal returnere resultatet<br />
af søgningen. Dette gøres ved at returnere resultatet af søgning i variablen<br />
&NotesText. Denne skal sættes <strong>til</strong> en af følgende værdier:<br />
”0”: Dokument ikke fundet i Notes (medfører oprettelse af nyt)<br />
”3”: Fejl (medfører fejlmelding)<br />
DocId: DocId på det fundne dokument
⎡ ⎤<br />
4.4 DocId som Notes KeyField<br />
I Lotus Notes har hvert dokument en entydig nøgle – her kaldet<br />
DocId. Denne nøgle svarer stort set <strong>til</strong> RecID i <strong>XAL</strong>.<br />
Ofte vil man vælge at benytte denne nøgle som nøglefelt ved<br />
sammenkædning med <strong>CONCORDE</strong>. Dette kræver naturligvis at hver<br />
post, der er overført fra <strong>CONCORDE</strong>, har stemplet dette DocId ind i<br />
et felt (se eksempel afsnit 4.1.5).<br />
Problemet med DocId er blot, at dette ikke er et traditionelt felt som<br />
man kan henvise <strong>til</strong> på normal vis.<br />
Systemet er derfor opbygget således, at hvis man indtaster ”DocId”<br />
som NotesKeyValue, benyttes en speciel opdatering, der søger efter<br />
det DocId som er angivet i <strong>XAL</strong>-feltet specificeret i ”<strong>XAL</strong> KeyField”.<br />
4.5 Feltnavn beregning<br />
I visse situationer kan feltnavnet i Lotus Notes, hvor<strong>til</strong> data skal overføres,<br />
variere efter hvilke data man har på hånden.<br />
Dette ses typisk i situationer, hvor flere felter i Lotus Notes kan indeholde<br />
samme slags oplysning som eet felt i <strong>CONCORDE</strong> <strong>XAL</strong>. F.eks.<br />
kan et felt ”Varenummer” optræde 10 gange på en form. Felterne vil<br />
så f.eks. være navngivet ”Vnr1”, ”Vnr2” op <strong>til</strong> Vnr10. På denne måde<br />
kan 10 ”linier” vises i Lotus Notes på een form.<br />
Ved afvikling af opdateringskørslen i dette eksempel, skal der beregnes<br />
hvilket af felterne der skal <strong>til</strong>gås. Her<strong>til</strong> benyttes feltnavnberegning.<br />
Her beregnes navnet på det felt, hvor<strong>til</strong> data skal overføres, i ”Pre<br />
Field Formula”. I det her nævnte eksempel, hvor data skal overføres<br />
fra ordrelinier <strong>til</strong> Lotus Domino (max 10 linier), kunne ”Pre Field<br />
Formula” koden se sådan ud:<br />
#Add(&Counter,1)<br />
SET &Vnr = "Vnr"+Num2Str(&Counter,0,0,0,0)<br />
Variablerne &Vnr og &Counter er defineret i ”Init Formula”. Variablen<br />
&Counter nuls<strong>til</strong>les i ”Pre Record Formula” hver gang en ny post<br />
fra en anden ordre fremkommer.<br />
På definitionen for varenummer feltet angives &Vnr som ”Notes<br />
Field Name”.<br />
39
40<br />
4.6 Agent-afvikling<br />
Ønsker man at efterbehandle data i Lotus Notes kan man anbringe et<br />
kald af en Lotus Notes Agent i triggeren ”Post Integration Formula”.<br />
Dette kan være nyttigt, hvis data i Notes skal flyttes <strong>til</strong> forskellige<br />
views, alt efter dokumentindhold.<br />
Benyt her funktionen #NotesRunAgent.<br />
4.7 Tips<br />
4.8 Typiske fejlkilder<br />
• Dokumenter oprettes i stedet for at blive opdateret. Dette skyldes<br />
typisk, at en eller flere af de felter der indgår i nøgler, ikke er<br />
indeholdt i feltdefinitionerne på skærmside 2.<br />
• Syntaxfejl ved afvikling af opdateringskørsel. Skyldes fejl i brugerindtastet<br />
<strong>XAL</strong>-kode eller funktioner (se afsnit 4.2). En typisk<br />
fejlkilde er manglende konvertering <strong>til</strong> strengværdi – benyt<br />
Num2Str.<br />
• EN anden kilde <strong>til</strong> syntaxfejl kan være manglende definition af<br />
variabler. Benyt ”Init Formula” <strong>til</strong> definition.<br />
• Data overføres ikke. Check opsætning af ”Insert”, ”Modify” og<br />
”Delete” <strong>til</strong> højre på skærmside 2.
⎡ ⎤<br />
5. Logsystem<br />
I en driftssituation er det ønskeligt at kunne overføre data fra<br />
<strong>CONCORDE</strong> <strong>til</strong> Lotus Notes efter behov. Typisk ønsker man kun at<br />
ajourføre Lotus Notes databasen. Ofte <strong>til</strong>lader datamængden, der skal<br />
overføres, ikke at man overfører alle data jævnligt.<br />
<strong>Overbygningsmodul</strong>et indeholder derfor et logmodul, der registrerer<br />
hvilke poster der oprettes, ændres eller slettes. Denne ændringslog<br />
indeholder en liste over hvilke transaktioner, der skal ajourføres i<br />
Lotus Notes.<br />
Ændringsloggen indeholder kun oplysninger om hvilken post der<br />
skal ajourføres – ikke hvilke data der er ændret.<br />
Ved opdatering via ændringsloggen overføres alle oplysninger, defineret<br />
i overbygningsmodulet, fra posten, ikke kun de ændrede oplysninger.<br />
Læg mærke <strong>til</strong>, at oplysninger om hvilke felter der skal<br />
ajourføres i Lotus Notes, aflæses fra kartoteksdefinitionen. Denne<br />
aflæsning af definitionen sker på overførselstidspunktet.<br />
5.1 Overførsel via log<br />
Typisk har man initialiseret Lotus Notes databaserne med en total<br />
opdateringskørsel (afsnit 3.1.2). Herefter er det kun nødvendigt at<br />
overføre via ændringsloggen.<br />
Overførsel af data, via ændringsloggen kan ske manuelt eller automatisk<br />
via <strong>CONCORDE</strong>’s batchafviklingssystem eller Timerfunktion.<br />
41
42<br />
5.1.1 Manuel overførsel<br />
Ønsker man at overføre alle ændringer siden sidste overførsel, kan<br />
man vælge ”Update from logfile”.<br />
Ved overførslen markeres de logposter der overføres, så data kun<br />
overføres een gang. Ved næste afvikling af kørslen vil de oplysninger<br />
man har overført tidligere altså ikke blive overført igen (med mindre<br />
der er blevet modificeret siden sidste kørsel.).<br />
5.1.2 Automatisk overførsel<br />
Log-opdateringskørslen er forberedt for afvikling i <strong>CONCORDE</strong>’s<br />
batchafviklingssystem. Man kan her definere, at log-opdatering skal<br />
ske automatisk f.eks. hvert 15. minut. For en nærmere beskrivelse af<br />
batchfunktionen henvises <strong>til</strong> brugerdokumentationen <strong>til</strong> CONCOR-<br />
DE. Husk at integrationskittet skal være installeret på batch-PC’en.<br />
Ønskes opdateringen foretaget hyppigere kan man indlægge afvikling<br />
af logopdateringen i timer-funktionen i <strong>CONCORDE</strong>. Nedenfor<br />
er vist et eksempel, der bevirker en opdatering hvert 30. sekund:<br />
5.2 Overvågning af log<br />
Med menupunktet ”Show LogFile” kan man se en liste med alle de<br />
logposter, der er registreret. Posterne er sorteret således, at de ikke-
⎡ ⎤<br />
opdaterede poster vises først. Herunder vises posterne i kronologisk<br />
orden pr. kartotek.<br />
Her et eksempel på denne oversigt:<br />
Oversigten indeholder følgende felter:<br />
Overskrift Indhold<br />
Overf Er denne ændring overført <strong>til</strong> Lotus Notes?<br />
Dato Dato for transaktion i <strong>CONCORDE</strong><br />
Tid <strong>XAL</strong>-tidspunkt (sekunder siden midnat)<br />
User UserId på bruger i <strong>XAL</strong> som har foretaget rettelsen<br />
DBF FileId i <strong>CONCORDE</strong> <strong>XAL</strong><br />
DBRecID Unik henvisning <strong>til</strong> record i <strong>CONCORDE</strong><br />
NotesLog NotesLogType:<br />
Insert: Nyoprettet post i <strong>CONCORDE</strong><br />
Modify: Ændret post<br />
Delete: Slettet post<br />
NotesKeyField Nøglefelt i Lotus Notes<br />
NotesKeyValue Nøgleværdi i <strong>CONCORDE</strong><br />
I ovennævnte skærmbillede er der altså 4 poster den endnu ikke er<br />
synkroniseret med Lotus Notes. De omfatter 2 nye poster <strong>til</strong> lagerkartoteket<br />
(FileId = 11) og 2 sletninger i afdelingskartoteket (FileId =<br />
66). De to nye varer har varenumrene ’12” rør” og ’0,1” Rør”, mens<br />
de to slettede afdelinger havde numrene ”NY2” og ”NY3”.<br />
Desuden kan man se, at der allerede er overført oplysninger om en<br />
rettet debitoroplysningen (kontonummer ”45999300”), en sletning af<br />
43
44<br />
en medarbejder–post (nummer ”OWW”) og en oprettelse af medarbejder<br />
”OOQ”.<br />
5.3 Sletning af logposter<br />
Ønsker man at tømme sit logkartotek enten helt eller kun for oplysninger<br />
der allerede er overført, aktiveres menupunktet ”Clear Logfile”.<br />
Inden sletning igangsættes skal det bekræftes at man ønsker at slette<br />
data. Hvis dette bekræftes, kan man vælge om man vil slette alle<br />
data, inklusiv oplysninger om poster der ikke er ajourført, eller man<br />
blot vil slette poster med oplysninger, der er udvekslet.<br />
Man kan ligeledes begrænse sletningen <strong>til</strong> kun at omfatter logoplysninger<br />
om et enkelt kartotek.<br />
5.4 Aktivering af logsystem<br />
Definition af, hvilke kartoteker der skal logges, indlægges via formelsystemet<br />
på <strong>XAL</strong>’s database-definition.<br />
• Åben udviklingsmenuen (/Generelt/Tilpasning/Udvikling)<br />
• Vælg kartotek (Dbd/Ret/Kerne – udpeg kartotek)<br />
• Gå <strong>til</strong> ”Formler for kartoteket”<br />
Indlæggelse af logfunktion sker normalt i følgende triggere:<br />
• Post-delete<br />
• Post-update<br />
• Post-insert (OK)<br />
Ønsker man ikke at logge f.eks. sletninger, indlægges logfunktionen<br />
så ikke i Post-delete. Men oftest anbringes logfunktionen i alle tre<br />
triggere.<br />
5.4.1 Syntax<br />
Aktivering af log er relativt simpel. Følgende kodestump skal indlægges<br />
i den relevante trigger (typisk i bunden af <strong>XAL</strong>-koden):<br />
#NotesLog(,,)
⎡ ⎤<br />
angiver hvilken logfunktion der ønskes. Der opereres<br />
med tre typer:<br />
0: Insert – angiver at der skal oprettes et <strong>til</strong>svarende<br />
dokument i Lotus Notes<br />
1: Modify – angiver at dokument skal opdateres i Notes<br />
2: Delete – angiver at dokument skal slettes i Notes<br />
Typisk benyttes typen 0 i Post-insert, 1 benyttes i Post-update og 2<br />
benyttes i Post-delete.<br />
angiver kartoteksnavn<br />
angiver fuldt kvalificeret navn på feltet – altså med forans<strong>til</strong>let<br />
kartoteksnavn, f.eks. LagerKart.VareNummer<br />
Er der flere nøglefelter angives disse adskilt med komma.<br />
Her et par eksempler:<br />
#NotesLog(0, LagerKart, LagerKart.VareNummer)<br />
#NotesLog(1,SagAfsnit,SagAfsnit.Sag,SagAfsnit.Afsnit)<br />
#NotesLog(2,DebKart,DebKart.Kontonummer)<br />
Ovennævnte eksempler vil medføre registrering af nye varenumre<br />
(anbringes i Post-insert (OK)), ændringer i SagAfsnit (anbringes i<br />
Post-update) og sletninger af debitorer (anbringes i Post-delete).<br />
5.4.2 Afgrænsning af log<br />
Opdatering fra logsystemet tager ikke hensyn <strong>til</strong> selektionen på kartoteksdefinitionen<br />
(afsnit 3.1.5).<br />
Ønsker man at afgrænse hvilke ændringer, der skal afspejles i Lotus<br />
Notes, skal dette gøres i kartoteks formlerne. Dette gøres via standard<br />
<strong>XAL</strong> kode.<br />
Nedenfor er vist et eksempel, der viser hvordan man kun logger ændringer<br />
på en vare, hvis varens pris er ændret og kun hvis varen ligger<br />
i varegruppe ”20”. Eksemplet er fra Post-update triggeren på<br />
LagerKart:<br />
IF LagerKart.VareGruppe == "20" AND<br />
LagerKart_ORIG.SalgsPris LagerKart.SalgsPris THEN<br />
#NotesLog(1,LagerKart,LagerKart.VareNummer)<br />
ENDIF<br />
45
46<br />
Fordelen ved at lægge afgrænsningen på dette sted, frem for at benytte<br />
selektionen på kartoteksdefintionen er, at man kun logger nødvendige<br />
oplysninger.
⎡ ⎤<br />
Appendix 1. <strong>XAL</strong> designelementer i<br />
applikation<br />
Overbygningen består af følgende designelementer:<br />
DBD — kartoteker<br />
Filnavn <strong>XAL</strong>-navn Beskrivelse<br />
nlog.dbd NotesLog Oplysninger om ændringer i <strong>XAL</strong> records<br />
nkart.dbd NotesKart Definition af integration på kartoteksniveau<br />
Skærmside 1<br />
nfield.dnd NotesField Definition af integration på feltniveau<br />
(skærmside 2)<br />
nkeyw.dbd NotesKeywords Oversættelse af enums<br />
enum.dbd NotesLogType<br />
NotesUdvType<br />
<strong>XAL</strong>Notes<br />
NotesCase<br />
Diverse fasttekst typer<br />
LST — Listbilleder<br />
Filnavn <strong>XAL</strong>-navn Beskrivelse<br />
fliste.lst Liste Til NotesField<br />
fmacro.lst Macro Til NotesField<br />
kliste.lst Liste Til NotesKeywords<br />
log.lst Log Til NotesLog<br />
liste.lst Liste Til NotesLog<br />
macro.lst Macro Til NotesKart<br />
FRM — Forms<br />
Filnavn <strong>XAL</strong>-navn Beskrivelse<br />
felter.frm NotesFelter Opslag efter Notes-felter (Alt-H)<br />
forms.frm NotesForms Opslag efter Notes-forms (Alt-H)<br />
keyw.frm NotesKeywords Oversættelse af Enums <strong>til</strong> keywords<br />
nkart.frm NotesKart Definitions skærmbillede<br />
ovs.frm NotesKartOversigt Oversigt over kartoteker med definition<br />
views.frm NotesViews Opslag efter Notes-views (Alt-H)<br />
47
48<br />
<strong>XAL</strong> — <strong>XAL</strong> kørsler<br />
Filnavn <strong>XAL</strong>-navn Beskrivelse<br />
editkart.xal NotesEditKart Editering og af opdateringskørsel<br />
ncheck.xal NotesCheck Check af forbindelse <strong>til</strong> Lotus Notes<br />
nuls<strong>til</strong>.xal NotesNuls<strong>til</strong>Log Nuls<strong>til</strong>ling af NotesLog<br />
opdkart.xal NotesOpdaterKart Afvikling af opdateringskørsel<br />
opdlog.xal NotesOpdaterLog Kørsel <strong>til</strong> opdatering af log<br />
MAC — Macroer<br />
Filnavn <strong>XAL</strong>-navn Beskrivelse<br />
notes.mac Notes Macro med alle kommandoer <strong>til</strong> integrationskit<br />
log.mac NotesLog Macro <strong>til</strong> logning af kartoteksændringer<br />
opdkart.mac NotesOpdaterKart Macro der opbygger <strong>XAL</strong>-kørsel <strong>til</strong> integration<br />
var.mac NotesVar Globale variabler <strong>til</strong> integrationskit<br />
MNU — Menuer<br />
Filnavn <strong>XAL</strong>-navn Beskrivelse<br />
notes.mnu Notes Hovedmenu <strong>til</strong> overbygning<br />
ntrigg.mnu NotesKartTriggere Menu med kartotekstriggere
⎡ ⎤<br />
Appendix 2. Opbygning af <strong>XAL</strong> kørsel<br />
Som angivet tidligere, danner overbygningsmodulet en <strong>XAL</strong>-kørsel<br />
udfra de angivne parametre. I dette appendix beskrives opbygningen<br />
af denne <strong>XAL</strong>-kørsel.<br />
Nedenfor er vist et eksempel på en integrationskørsel der foretager<br />
en overførsel af data fra afdelingskartoteket I <strong>CONCORDE</strong>.<br />
<strong>XAL</strong>-kørslen er her opbygget med linienumre.<br />
1 #MacroLoad(NOTES)<br />
2 #MacroLoad(TMP_FILE)<br />
3<br />
4 STR 255 &S<br />
5 STR 255 &S2<br />
6 STR 255 &ID<br />
7 INT &Inserted<br />
8 INT &Updated<br />
9 INT &Deleted<br />
10 INT &StartTid<br />
11 INT &Action<br />
12 INT &OK<br />
13<br />
14<br />
15 #LocalMacro.Update<br />
16 SET &S = Nummer<br />
17 #NotesSetFieldValue('Nummer',&S)<br />
18 SET &S = Navn<br />
19 #NotesSetFieldValue('Navn',&S)<br />
20 { Pre Field Code for Ansvarlig }<br />
21 SET &S = Ansvarlig<br />
22 #NotesSetFieldValue('Ansvarlig',&S)<br />
23 { Post Field Code for Ansvarlig }<br />
24<br />
25 #EndMacro<br />
26<br />
27 #LocalMacro.PrepareQuery<br />
28 SET &S2=NotesKart.NotesKeyField+'="'+Nummer+'"'<br />
29 #EndMacro<br />
30<br />
31 #LocalMacro.Query<br />
32 { Returns doc-ID in &NotesTxt, … }<br />
33 { Pre Query Code }<br />
34<br />
35 #PrepareQuery<br />
36 #NotesQueryUnique(&S2)<br />
37 #EndMacro<br />
38<br />
39 #LocalMacro.Newer<br />
40 #PrepareQuery<br />
41 SET &S2 = &S2 + ' &<br />
@Modified>@TextToTime("'+<br />
Date2Str(SidstRettet,123,2,3,2,3,2)+'"))'<br />
49
50<br />
42 #NotesQueryUnique(&S2)<br />
43 #EndMacro<br />
44<br />
45<br />
46 { Init Formula Code goes here }<br />
47 FLUSH Afdeling<br />
48 #NotesInit<br />
49 INTRODUCE NotesKart[FileIDIdx,66]<br />
50 #NotesOpenServer(NotesKart.NotesServer)<br />
51 #NotesLogon(NotesKart.NotesDatabase)<br />
52 #NotesForm(NotesKart.NotesForm)<br />
53 #NotesView(NotesKart.NotesView)<br />
54<br />
55 IF &NotesText>'' THEN<br />
56 RETURN 0<br />
57 ENDIF<br />
58<br />
59 WINDOW 30,2 AT 8,8<br />
60<br />
61<br />
62 { Pre Integration Code goes here }<br />
63<br />
64 SEARCH Afdeling<br />
65 USING NumIdx<br />
66<br />
67 { Returns doc-ID in … }<br />
68 { Pre Query Code }<br />
69<br />
70 PRINT Nummer,' ' AT 1,1<br />
71 SET &S=NotesKart.NotesKeyField+'=\''+Nummer+'\''<br />
72 #NotesQueryUnique(&S)<br />
73 SET &ID = &NotesText<br />
74 IF &ID == '0' THEN SET &Action=1 {New} ELSE<br />
75 IF StrLen(&ID)>2 THEN SET &Action=2 {Update}ELSE<br />
76 SET &Action = 0<br />
77 ENDIF ENDIF<br />
78 { Pre Record Code }<br />
79 IF &Action == 1 THEN {Ny}<br />
80 #NotesCreateNew<br />
81 #Update<br />
82 #NotesCommit<br />
83 #ADD(&Inserted,1)<br />
84 ENDIF<br />
85 IF &Action == 2 THEN {Opdater}<br />
86 SET &OK = 1<br />
87 IF &ID=='0' THEN {Opret først}<br />
88 #NotesCreateNew<br />
89 SET &ID=&NotesText<br />
90 ENDIF<br />
91 #NotesSelectID(&ID)<br />
92 IF &OK THEN<br />
93 #Update<br />
94 #NotesCommit<br />
95 #ADD(&Updated,1)<br />
96 ENDIF<br />
97 ENDIF<br />
98 { Post Record Code }<br />
99
⎡ ⎤<br />
100 IF &Action == 0 THEN<br />
101 IF &NotesText == '3' THEN<br />
102 SET BOX(1,'Error: More than one document<br />
found in Notes',1)<br />
103 ELSE<br />
104 SET BOX(1,'Error '+&NotesText,1)<br />
105 ENDIF<br />
106 ENDIF<br />
107 END<br />
108 #NotesClose<br />
109<br />
110 { Post Integration Code goes here }<br />
111<br />
112 WINDOW 40,6 AT 15,15<br />
113 PRINT 'Inserted..: ',&Inserted AT 1,2<br />
114 PRINT 'Updated...: ',&Updated AT 1,3<br />
115 PRINT 'Deleted...: ',&Deleted AT 1,4<br />
116 SET &StartTid = TimeNow()<br />
117 WHILE (TimeNow()>=&StartTid) AND<br />
(TimeNow()-&StartTid
52<br />
Macroloads (1-2)<br />
1 #MacroLoad(NOTES)<br />
2 #MacroLoad(TMP_FILE)<br />
Først indlæses macrobibliotekerne Notes og TMP_FILE.<br />
Notes biblioteket indeholde alle de grundlæggende programmeringskommandoer<br />
i integrationskittet.<br />
TMP_FILE loades for at muliggøre brugen af visse integrationskit<br />
kommandoer. Denne linie vil som regel kunne slettes.<br />
Variabler (4-13)<br />
4 STR 255 &S<br />
5 STR 255 &S2<br />
6 STR 255 &ID<br />
7 INT &Inserted<br />
8 INT &Updated<br />
9 INT &Deleted<br />
10 INT &StartTid<br />
11 INT &Action<br />
12 INT &OK<br />
Her defineres de variabler der benyttes <strong>til</strong> en standarddefinition.<br />
&S er en generel strengvariabel der benyttes ved kald af #NotesPut-<br />
FieldValue. &S2 benyttes som ekstra strengvariabel ved forskellige<br />
kombinationer ( ”Update newer” og ”Compare”).<br />
&ID indeholder DocId på det Notes dokument der skal opdateres.<br />
&Inserted, &Updated og &Deleted benyttes <strong>til</strong> at optælle antallet af<br />
de respektive opdateringstyper.<br />
&Starttid benyttes ved nedtælling i slutningen af koden.<br />
&Action indeholder typen af opdateringen:<br />
• 1 => Opret nyt dokument<br />
• 2 => Opdater eksisterende dokument<br />
• 0 => Fejl<br />
&OK benyttes <strong>til</strong> at bestemme om et dokument må opdateres i Lotus<br />
Notes.<br />
Opdatering (15-25)<br />
15 #LocalMacro.Update<br />
16 SET &S = Nummer
⎡ ⎤<br />
17 #NotesSetFieldValue('Nummer',&S)<br />
18 SET &S = Navn<br />
19 #NotesSetFieldValue('Navn',&S)<br />
20 { Pre Field Code for Ansvarlig }<br />
21 SET &S = Ansvarlig<br />
22 #NotesSetFieldValue('Ansvarlig',&S)<br />
23 { Post Field Code for Ansvarlig }<br />
24<br />
25 #EndMacro<br />
Lokalmacroen ”Update” indeholder selve overførslen af data. Denne<br />
macro opbygges via feltdefinitionerne på skærmside 2.<br />
Læg mærke <strong>til</strong> placeringen af ”Pre Field formula” og ”Post Field<br />
Formula” – i dette <strong>til</strong>fælde uden egentlig kode, defineret for feltet<br />
”Ansvarlig”.<br />
Query (27-37)<br />
27 #LocalMacro.PrepareQuery<br />
28 SET &S2=NotesKart.NotesKeyField+'="'+Nummer+'"'<br />
29 #EndMacro<br />
30<br />
31 #LocalMacro.Query<br />
32 { Returns doc-ID in &NotesTxt, … }<br />
33 { Pre Query Code }<br />
34<br />
35 #PrepareQuery<br />
36 #NotesQueryUnique(&S2)<br />
37 #EndMacro<br />
Ved brug af log-opdatering sker opslag i Lotus Notes efter dokument<br />
der matcher <strong>CONCORDE</strong> dokument via lokalmakroen #Query. Her<br />
indsættes også e.v.t. brugerdefineret kode i ”Pre Query Formula”<br />
Specialfunktioner (39-43)<br />
39 #LocalMacro.Newer<br />
40 #PrepareQuery<br />
41 SET &S2 = &S2 + ' &<br />
@Modified>@TextToTime("'+<br />
Date2Str(SidstRettet,123,2,3,2,3,2)+'"))'<br />
42 #NotesQueryUnique(&S2)<br />
43 #EndMacro<br />
Valg af visse funktioner på skærmside 1 , f.eks. ”Update newer” og<br />
”Compare”, kan medføre diverse ekstra kode. I dette <strong>til</strong>fælde er det<br />
koden <strong>til</strong> check af om data i Notes dokumentet er nyere end data i<br />
<strong>CONCORDE</strong><br />
53
54<br />
Initialisering (46-62)<br />
46 { Init Formula Code goes here }<br />
47 FLUSH Afdeling<br />
48 #NotesInit<br />
49 INTRODUCE NotesKart[FileIDIdx,66]<br />
50 #NotesOpenServer(NotesKart.NotesServer)<br />
51 #NotesLogon(NotesKart.NotesDatabase)<br />
52 #NotesForm(NotesKart.NotesForm)<br />
53 #NotesView(NotesKart.NotesView)<br />
54<br />
55 IF &NotesText>'' THEN<br />
56 RETURN 0<br />
57 ENDIF<br />
58<br />
59 WINDOW 30,2 AT 8,8<br />
60<br />
61<br />
62 { Pre Integration Code goes here }<br />
I denne sektion, som indleder den egentlige kode, etableres forbindelsen<br />
<strong>til</strong> Lotus Notes.<br />
Gennemløb og opslag (64-78)<br />
64 SEARCH Afdeling<br />
65 USING NumIdx<br />
66<br />
67 { Returns doc-ID in … }<br />
68 { Pre Query Code }<br />
69<br />
70 PRINT Nummer,' ' AT 1,1<br />
71 SET &S=NotesKart.NotesKeyField+'=\''+Nummer+'\''<br />
72 #NotesQueryUnique(&S)<br />
73 SET &ID = &NotesText<br />
74 IF &ID == '0' THEN SET &Action=1 {New} ELSE<br />
75 IF StrLen(&ID)>2 THEN SET &Action=2 {Update}ELSE<br />
76 SET &Action = 0<br />
77 ENDIF ENDIF<br />
78 { Pre Record Code }<br />
Efter initialisering gennemløbes alle selekterede records i<br />
<strong>CONCORDE</strong>. I dette <strong>til</strong>fælde er der ikke angivet nogen selektionsformel.<br />
Denne ville have været placeret umiddelbart efter linie 65.<br />
I linie 71 og 72 laves et opslag i Lotus Notes efter et matchende dokument.<br />
Returkoden fra dette opslag overføres <strong>til</strong> variablen &ID. Er<br />
returkoden ”0” betyder det, at dokumentet ikke findes i Lotus Notes.
⎡ ⎤<br />
&Action sættes derfor <strong>til</strong> 1, som betyder at et nyt dokument skal oprettes.<br />
Hvis et dokument er fundet indeholder &ID DocId på dette dokument.<br />
Et DocId i Lotus Notes er altid mere end 2 tegn langt. Derfor<br />
testes på, om returkoden er større end 2. Er dette <strong>til</strong>fældet er dokumentet<br />
fundet og det skal opdateres (&Action = 2). Alle andre returkoder<br />
opfattes som indikation af en fejlsituation.<br />
Læg mærke <strong>til</strong> placering af e.v.t. ”Pre Integration Formula” kode og<br />
”Pre Record Formula” kode.<br />
Opret nyt dokument (79-84)<br />
79 IF &Action == 1 THEN {Ny}<br />
80 #NotesCreateNew<br />
81 #Update<br />
82 #NotesCommit<br />
83 #ADD(&Inserted,1)<br />
84 ENDIF<br />
Hvis &action er sat <strong>til</strong> 1, skal der oprettes et nyt dokument i Lotus<br />
Notes.<br />
Dette gøres i linie 80 og i linie 81 overføres data fra de udvalgte felter.<br />
Herefter gemmes oplysninger med #NotesCommit.<br />
Opret nyt dokument (85-97)<br />
85 IF &Action == 2 THEN {Opdater}<br />
86 SET &OK = 1<br />
87 IF &ID=='0' THEN {Opret først}<br />
88 #NotesCreateNew<br />
89 SET &ID=&NotesText<br />
90 ENDIF<br />
91 #NotesSelectID(&ID)<br />
92 IF &OK THEN<br />
93 #Update<br />
94 #NotesCommit<br />
95 #ADD(&Updated,1)<br />
96 ENDIF<br />
97 ENDIF<br />
Denne kode opdaterer et eksisterende dokument. Koden er forberedt<br />
for de diverse kombinationer de forskellige opdateringsvalg kan<br />
medføre. Derfor kan koden se lidt omstændelig ud i dette eksempel.<br />
Her er det linierne 91 <strong>til</strong> 94 der foretager den egentlige opdatering.<br />
55
56<br />
Slutning af løkke og fejlhåndtering<br />
(98-107)<br />
98 { Post Record Code }<br />
99<br />
100 IF &Action == 0 THEN<br />
101 IF &NotesText == '3' THEN<br />
102 SET BOX(1,'Error: More than one document<br />
found in Notes',1)<br />
103 ELSE<br />
104 SET BOX(1,'Error '+&NotesText,1)<br />
105 ENDIF<br />
106 ENDIF<br />
107 END<br />
Efter oprettelse eller opdatering kaldes e.v.t. ”Post Record Formula”<br />
kode.<br />
E.v.t. fejl ved opslag vises i en fejl-box.<br />
Afslutning (108-120)<br />
108 #NotesClose<br />
109<br />
110 { Post Integration Code goes here }<br />
111<br />
112 WINDOW 40,6 AT 15,15<br />
113 PRINT 'Inserted..: ',&Inserted AT 1,2<br />
114 PRINT 'Updated...: ',&Updated AT 1,3<br />
115 PRINT 'Deleted...: ',&Deleted AT 1,4<br />
116 SET &StartTid = TimeNow()<br />
118 WHILE (TimeNow()>=&StartTid) AND<br />
(TimeNow()-&StartTid