16.07.2013 Views

CONCORDE XAL/C5 Overbygningsmodul til XAL2LN - Intoint

CONCORDE XAL/C5 Overbygningsmodul til XAL2LN - Intoint

CONCORDE XAL/C5 Overbygningsmodul til XAL2LN - Intoint

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!