26.07.2013 Views

Grundlæggende integrationskit (API) (hent) - Intoint

Grundlæggende integrationskit (API) (hent) - Intoint

Grundlæggende integrationskit (API) (hent) - Intoint

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

ERP2LN<br />

XAL – Lotus Notes Integration<br />

Version 1.0.1<br />

05-09-2003


0. Introduktion.........................................................................................5<br />

0.1 XAL til Notes <strong>integrationskit</strong>....................................................5<br />

0.2 Målgruppe ...............................................................................6<br />

0.3 Komponenter ..........................................................................6<br />

0.3.1 XAL macrobiblioteket "NOTES" .....................................6<br />

0.3.2 Windows programbiblioteket ERP2LN.DLL...................7<br />

0.4 Systemkrav .............................................................................7<br />

0.4.1 Lotus Notes .....................................................................7<br />

0.4.2 CONCORDE ...................................................................7<br />

0.4.3 Arbejdsplads....................................................................8<br />

0.5 Uddannelse.............................................................................8<br />

1. Programinstallation.............................................................................9<br />

1.1 Klargøring af arbejdsplads .....................................................9<br />

1.1.1 Installation og opsætning af Lotus Notes klient .............9<br />

1.2 Filer..........................................................................................9<br />

1.3 Installation af Integrationskit ...................................................9<br />

1.4 Registrér serienummer...........................................................9<br />

1.5 Installation af XAL macrobibliotek ........................................10<br />

1.6 Globale variable ....................................................................10<br />

2. Kom hurtigt i gang ............................................................................12<br />

2.1 Case: Opdatering - Afdeling.................................................12<br />

2.1.1 Oprettelse af afdelingskartotek i Lotus Notes..............12<br />

2.1.2 XAL-kode.......................................................................13<br />

2.1.3 Initialisering....................................................................13<br />

2.1.4 SEARCH løkke..............................................................14<br />

2.1.5 Opdatere eller oprette?.................................................14<br />

2.1.6 Angivelse af indhold i dokument...................................14<br />

2.1.7 Afslutning.......................................................................14<br />

3. Anvendelse af <strong>integrationskit</strong>...........................................................15<br />

3.1 Kald af XAL-macroer ............................................................15<br />

3.2 Forbindelse til Lotus Notes...................................................15<br />

3.2.1 Initialisering af forbindelse til DLL-fil .............................16<br />

3.2.2 Oprettelse af session til Lotus Notes............................16<br />

3.2.2.1 Valg af Notes server..............................................16<br />

3.2.2.2 Valg af Notes database.........................................16<br />

3.2.2.3 Valg af Notes applikationselementer....................17<br />

3.2.3 Nedlukning af session...................................................17<br />

3.2.4 Skift mellem sessions ...................................................17<br />

3.3 Aktuelle værdier ....................................................................17<br />

3.3.1 Oplysninger om aktuel session ....................................18<br />

3.3.2 Oplysninger om DLL programbibliotek.........................18<br />

3.3.3 Styring af temporære filer .............................................18<br />

3.4 Query og opslag i Lotus Notes.............................................19<br />

3.4.1 Generel query................................................................19<br />

3.4.2 Håndtering af resultat sæt ............................................20<br />

3.4.3 Query på unikt dokument..............................................20<br />

3.4.4 Opslag via view .............................................................20<br />

3.4.5 Opslag på feltværdi.......................................................21<br />

3.4.6 Entydigt opslag..............................................................21<br />

3.4.7 Sammenligning af værdier............................................22<br />

3.5 Datamanipulation..................................................................22<br />

3.5.1 Oprettelse af nyt dokument...........................................23<br />

3.5.2 Tildeling af feltværdier...................................................23<br />

3.5.3 Sletning af dokumenter i Lotus Notes ..........................24<br />

3.5.4 Opdatering af ændringer...............................................24<br />

3.5.5 Oplysninger om aktivt dokument..................................24<br />

3.6 Rich-text ................................................................................25<br />

3.6.1 Opdatering til Notes ......................................................25<br />

3.6.2 Læsning fra Notes.........................................................25<br />

3.6.2.1 Rich-text i separate filer.........................................26<br />

1


3.6.2.2 Valg af metode ......................................................26<br />

3.7 Fil-attachments......................................................................26<br />

3.8 Mail ........................................................................................27<br />

3.8.1 Forberedelse af mail .....................................................27<br />

3.8.2 Udfyldelse af indhold i mail ...........................................28<br />

3.8.3 Afsendelse af mail.........................................................28<br />

3.8.4 M<strong>API</strong> Mail ......................................................................29<br />

3.8.5 Automatiske fejlmeldinger via mail...............................29<br />

3.9 Oplysninger om Notes design..............................................30<br />

3.9.1 Forespørgsel på eksistens af designelement navn.....30<br />

3.9.2 Liste Notes designelementer........................................30<br />

3.9.3 Type på designelement ................................................31<br />

3.10 Fejlsøgning........................................................................32<br />

3.10.1 Fejl-beskeder.................................................................32<br />

3.10.2 Debugning til skærm.....................................................32<br />

3.10.3 Debugning til log-fil........................................................33<br />

4. Reference .........................................................................................34<br />

Macro-navn.......................................................................................34<br />

#NotesAddQueryField......................................................................36<br />

#NotesAppendFieldValue ................................................................37<br />

#NotesAppendMultiValue ................................................................38<br />

#NotesAttachFile ..............................................................................39<br />

#NotesClearLog................................................................................40<br />

#NotesClearQueryFields..................................................................41<br />

#NotesClose .....................................................................................42<br />

#NotesCommit..................................................................................43<br />

#NotesCommitNoRecalc .................................................................44<br />

#NotesCompareField .......................................................................45<br />

#NotesConnect.................................................................................46<br />

#NotesCreateNew............................................................................47<br />

#NotesDatabaseName.....................................................................48<br />

#NotesDatabaseTitle........................................................................49<br />

#NotesDebug....................................................................................50<br />

#NotesDelay .....................................................................................51<br />

#NotesDeleteAttachment.................................................................52<br />

#NotesDeleteCurrent .......................................................................53<br />

#NotesDeleteID ................................................................................54<br />

#NotesDeleteTempFil ......................................................................55<br />

#NotesDetachFile.............................................................................56<br />

#NotesDLLVersion ...........................................................................57<br />

#NotesDocID ....................................................................................58<br />

#NotesExistsAttach ..........................................................................59<br />

#NotesExistsField.............................................................................60<br />

#NotesExistsForm............................................................................61<br />

#NotesExistsView.............................................................................62<br />

#NotesFieldType ..............................................................................63<br />

#NotesFirstField ...............................................................................64<br />

#NotesFirstForm...............................................................................65<br />

#NotesFirstView ...............................................................................66<br />

#NotesForm......................................................................................67<br />

#NotesFormName............................................................................68<br />

#NotesFormType..............................................................................69<br />

#NotesGetDocInfo............................................................................70<br />

#NotesGetFieldLength .....................................................................71<br />

#NotesGetFieldValue .......................................................................72<br />

#NotesGetFoundDocs .....................................................................73<br />

#NotesGetHandle.............................................................................74<br />

#NotesGetItemInfo ...........................................................................75<br />

#NotesGetMessages........................................................................76<br />

#NotesGetRichSepMode .................................................................77<br />

2


#NotesGetTmpFilnavn .....................................................................78<br />

#NotesGetUnique.............................................................................79<br />

#NotesIF ...........................................................................................80<br />

#NotesImportFile ..............................................................................81<br />

#NotesInit..........................................................................................82<br />

#NotesIsDemoVersion .....................................................................83<br />

#NotesDLLLog..................................................................................84<br />

#NotesLogFilnavn ............................................................................85<br />

#NotesLogon ....................................................................................86<br />

#NotesMailAttachFile .......................................................................87<br />

#NotesMailBody ...............................................................................88<br />

#NotesMailBodyFile .........................................................................89<br />

#NotesMailBodyText ........................................................................90<br />

#NotesMailErrorTo ...........................................................................91<br />

#NotesMailGetUsername ................................................................92<br />

#NotesMailM<strong>API</strong>Password ..............................................................93<br />

#NotesMailM<strong>API</strong>Profile ....................................................................94<br />

#NotesMailPrepare...........................................................................95<br />

#NotesMailSend ...............................................................................96<br />

#NotesMailSetM<strong>API</strong> .........................................................................97<br />

#NotesMessages..............................................................................98<br />

#NotesMoveFirst ..............................................................................99<br />

#NotesMoveLast ............................................................................100<br />

#NotesMoveNext............................................................................101<br />

#NotesMovePrev............................................................................102<br />

#NotesNextField.............................................................................103<br />

#NotesNextForm ............................................................................104<br />

#NotesNextView.............................................................................105<br />

#NotesOpenDialog.........................................................................106<br />

#NotesOpenServer.........................................................................107<br />

#NotesPutFieldValue......................................................................108<br />

#NotesQuery...................................................................................109<br />

#NotesQueryField ..........................................................................110<br />

#NotesQueryRichTextField............................................................111<br />

#NotesQueryUnique.......................................................................112<br />

#NotesRemoveItem .......................................................................113<br />

#NotesRunAgent ............................................................................114<br />

#NotesSave ....................................................................................115<br />

#NotesSearchFirst..........................................................................116<br />

#NotesSearchNext .........................................................................117<br />

#NotesSearchView.........................................................................118<br />

#NotesSelectID...............................................................................119<br />

#NotesSelectUNID .........................................................................120<br />

#NotesServerName........................................................................121<br />

#NotesSetDelim..............................................................................122<br />

#NotesSetField ...............................................................................123<br />

#NotesSetFieldValue......................................................................124<br />

#NotesSetHandle ...........................................................................125<br />

#NotesSetKeepUnread..................................................................126<br />

#NotesSetListDelim........................................................................127<br />

#NotesSetRichFieldValue..............................................................128<br />

#NotesSetRichSepMode................................................................129<br />

#NotesTmpFilNavn.........................................................................130<br />

#NotesUNID....................................................................................131<br />

#NotesView.....................................................................................132<br />

#NotesViewName...........................................................................133<br />

Appendix 1. Manuel installation.........................................................134<br />

1.1 Udpakning af filer ................................................................134<br />

1.2 Kopiering af filer ..................................................................134<br />

Appendix 2. Kendte fejl/begrænsninger ............................................135<br />

3


2.1 Manglende oprydning (går ned).........................................135<br />

2.2 Multi-value felter ved NotesQuery......................................135<br />

2.3 Mail-error ved mail-fejl ........................................................136<br />

2.4 Attachments i rich-text felter ...............................................136<br />

2.5 Begrænsning i grafikformater.............................................136<br />

2.6 DocId ved replica ................................................................136<br />

2.7 Max længde af feltværdi .....................................................136<br />

2.8 Feltet ”Form” skal være sat på dokument..........................137<br />

Appendix 3. Designelement typer......................................................138<br />

Appendix 4. Datatype-parametre.......................................................139<br />

Appendix 5. Integrationskit uden 32 bit Windows klienter................140<br />

4


0. Introduktion<br />

0.1 XAL til Notes <strong>integrationskit</strong><br />

Integration mellem CONCORDE og Lotus Notes kan implementeres på mange måder.<br />

Integrationskittet kan anvendes til produkterne CONCORDE XAL og CONCORDE C5 (se afsnit 0.4<br />

for systemkrav). Når der i denne manual refereres til XAL, er det altså udviklingsmiljøet der henvises<br />

til. Begge programmer betegnes i denne manual under samlebetegnelsen "CONCORDE".<br />

Teknologien er baseret på integration til Lotus Notes via et Windows DLL programbibliotek. Al kontrol<br />

og opsætning sker i CONCORDE.<br />

Integrationskittet indeholder bl.a. følgende features:<br />

• Mulighed for on-line integration<br />

Al opdatering i f.eks. Lotus Notes sker i koordinering med opdatering i CONCORDE. Mulighed<br />

for annullering af opdatering ved f.eks. manglende forbindelse.<br />

• Overholdelse af sikkerhedsrutiner i begge systemer<br />

Ingen mulighed for at omgå sikkerhedssystemet i hverken Lotus<br />

Notes eller CONCORDE. Ingen risiko for "bagdøre".<br />

• Indlejring i standard XAL kode<br />

Kodning sker direkte i XAL udviklingsmiljøet via XAL-macroer.<br />

Dette sikrer overholdelse af integritetsregler i CONCORDE.<br />

• Ingen adgang til CONCORDE data fra Lotus Notes<br />

Kittet giver ikke mulighed for at man fra Lotus Notes kan se data i<br />

CONCORDE, som det f.eks. er muligt med ODBC-metoden.<br />

Data flyttes til Notes fra CONCORDE og <strong>hent</strong>es fra Notes af<br />

CONCORDE. CONCORDE har kontrollen 100 %.<br />

• Transparent adgang til Lotus Notes<br />

Adgang til Lotus Notes kan ske uden kodning eller ændring i<br />

Lotus Notes. Dette giver bl.a. mulighed for integration med<br />

Lotus Notes applikationer, hvor brugeren ikke har adgang<br />

til kildekode, men blot kender navnene på kartoteker og felter<br />

i Notes.<br />

• Afsendelse af E-mail fra CONCORDE<br />

Mulighed for integration med E-mail, hvorved bl.a. workflow systemer kan implementeres i<br />

CONCORDE.<br />

5


0.2 Målgru pe<br />

Da <strong>integrationskit</strong>tet indeholder en samling værktøjer til integration med Lotus Notes via<br />

CONCORDE’s udviklingsmiljø, henvender denne manual sig primært til personale der har et vist<br />

kendskab til CONCORDE’s programmeringsfaciliteter. Denne viden kan bl.a. opnås ved deltagelse i<br />

Navision Supervisorkurser.<br />

Kravene til programmeringskendskab afhænger dog i høj grad af, hvor tæt man vil integrere<br />

CONCORDE med Lotus Notes.<br />

For at kunne benytte <strong>integrationskit</strong>tet er et vist kendskab til Lotus Notes en fordel, specielt med<br />

hensyn til navne på<br />

• Databaser<br />

• Views<br />

• Forms<br />

• Felter<br />

Disse oplysninger er et grundlag for selv at kunne programmere integrationsløsninger. Viden om<br />

brug af de værktøjer der kan give disse oplysninger fra Lotus Notes, kan dog erhverves på meget<br />

kort tid. Det tilrådes, at man sikrer sig, at overførsel og manipulation af data i Lotus Notes godkendes<br />

af den eller de personer, der er ansvarlige for Lotus Notes i virksomheden.<br />

0.3 Komponenter<br />

Integrationskittet består af to hovedkomponenter: et XAL macrobibliotek - "NOTES" og et Windows<br />

programbibliotek (DLL) - ERP2LN.DLL.<br />

Desuden kan <strong>integrationskit</strong>tet suppleres med en overbygning der letter opbygning af integrationsapplikationer.<br />

0.3.1 XAL macrobiblioteket "NOTES"<br />

Filosofien bag <strong>integrationskit</strong>tet er, at man skal kunne foretage al integration mellem CONCORDE<br />

og Lotus Notes inde fra CONCORDE.<br />

Da CONCORDE i standardversionerne ikke indeholder faciliteter til direkte kommunikation med<br />

Lotus Notes, har det været nødvendigt at udvide funktionaliteten i XAL. Alle udvidelser er samlet i<br />

macrobiblioteket NOTES. Formålet med macrobiblioteket er primært at gøre brugerfladen ved integration<br />

med Notes så lig de muligheder man har i XAL. Brugeren skal altså ikke operere med f.eks.<br />

direkte kald af DLL.<br />

For at kunne anvende integrationsværktøjerne skal dette macrobibliotek være indlæst i det XAL<br />

programobjekt, hvorfra man ønsker at etablere integration med Lotus Notes.<br />

Kildekoden i macrobiblioteket er dokumenteret. De fleste kald i macrobiblioteket bygger på kald af<br />

Windows DLL, via XAL-kommandoen DLLCALL.<br />

Direkte adgang til DLL-biblioteket uden om macrobiblioteket frarådes på det kraftigste.<br />

6


0.3.2 Windows programbiblioteket ERP2LN.DLL<br />

Da CONCORDE som nævnt ikke har faciliteter til direkte kommunikation med Lotus Notes, sker<br />

den egentlige integration uden for CONCORDE. Dette sker via et Windows programbibliotek, en<br />

såkaldt DLL-fil (Dynamic Link Library), som er en af de væsentlige byggesten i Microsoft<br />

Windows. Formålet med disse filer er bl.a. at danne en fælles reference mellem forskellige<br />

Windows-programmer.<br />

ERP2LN.DLL er hvad man i programmeringsmiljøer kalder et <strong>API</strong> - Applikations Programmerings<br />

Interface.<br />

Altså en programmeringsmæssig indgang til et program. Via ERP2LN.DLL får XAL-programmøren<br />

adgang til en række Notes faciliteter, som altså kan udføres uden for Lotus Notes.<br />

I princippet fungerer ERP2LN.DLL som er man tilkoblet Lotus Notes som "almindelig" bruger.<br />

ERP2LN er specielt designet til CONCORDE.<br />

0.4 Systemkrav<br />

For at kunne afvikle XAL til Notes <strong>integrationskit</strong>tet, skal visse systemmæssige forudsætninger være<br />

opfyldt. Kan disse forudsætninger ikke umiddelbart opfyldes, er der i Appendix 5 angivet nogle<br />

muligheder, således <strong>integrationskit</strong>tet alligevel kan afvikles.<br />

0.4.1 Lotus Notes<br />

Da integrationen tager udgangspunkt i XAL og er transparent for Lotus Notes, er kravene til Lotus<br />

Notes små.<br />

På arbejdspladsen skal Lotus Notes version 4.6X eller nyere være installeret (dansk eller engelsk<br />

version). Visse mail-funktioner, som åbner Lotus Notes klienten fra XAL, kræver dog Lotus Notes<br />

version 5.03 eller nyere.<br />

Det er ikke et krav at Lotus Notes klienten er opstartet, for at kunne foretage integration med Lotus<br />

Notes. Integrationen mellem CONCORDE og Lotus Notes sker direkte mellem CONCORDE og<br />

Lotus Notes serveren eller lokale Lotus Notes filer.<br />

0.4.2 CONCORDE<br />

For at kunne benytte <strong>integrationskit</strong>tet skal CONCORDE understøtte kald af DLL. Dette betyder, at<br />

integration kan benyttes fra Windows-versioner af CONCORDE XAL - kerne-version 2.5 eller nyere<br />

(CONCORDE C5 version 1.5 eller nyere). Ønsker man ikke at benytte GUI-versionen af<br />

CONCORDE XAL, kan 32-bit consol-versionen af CONCORDE XAL benyttes. Denne specielle<br />

version af CONCORDE XAL blev lanceret i version 2.60. Med denne kerne har man, via den tegnbaserede<br />

brugerflade, adgang til samtlige udviklingsværktøjer i XAL og dermed også til <strong>integrationskit</strong>tet.<br />

Udvikling og test af integration med Lotus Notes sker bedst i denne version.<br />

Der eksisterer ikke en consol-version til CONCORDE C5, hvilket besværliggør udvikling, idet integration<br />

med f.eks. forms og rapporter ikke kan testes i udviklingsmiljøet. Udvikling skal ske i den<br />

tegnbaserede version, mens test og brug skal ske i GUI-versionen.<br />

Ved brug af Oracle-versionen af CONCORDE XAL er der visse systemmæssige forskelle på version<br />

2.5X og 2.6X som betyder, at det ikke er muligt at kombinere kerner fra 2.6X med tidligere versioner.<br />

7


For at kunne bruge <strong>integrationskit</strong>tet skal man desuden have adgang til de relevante udviklingselementer<br />

i CONCORDE.<br />

Der kræves ikke ODBC koder til CONCORDE.<br />

0.4.3 Arbejdsplads<br />

Udover at have adgang til Lotus Notes og CONCORDE er der ingen væsentlige krav til arbejdspladsen.<br />

Microsoft Windows 95, Windows XP, Windows NT eller Windows 2000 skal naturligvis<br />

være installeret for at kunne afvikle Windows-versionen (GUI- eller consol-version<br />

(CONCORDE XAL)) af CONCORDE.<br />

Der skal være angivet en path til Lotus Notes programbiblioteket.<br />

Se eventuelt afsnit 1 vedr. installation af <strong>integrationskit</strong>tet.<br />

0.5 U da nelse<br />

Der er ikke de store uddannelseskrav i forbindelse med brug af <strong>integrationskit</strong>tet.<br />

Et kursus omfatter typisk følgende områder:<br />

1. Gennemgang af principperne i integration mellem CONCORDE og Lotus Notes.<br />

2. Gennemgang af kommandoer i <strong>integrationskit</strong>tet.<br />

3. Gennemgang af relevante Lotus Notes værktøjer.<br />

4. Integrationscase, hvor et XAL applikationselement integreres med en Lotus Notes database.<br />

Varigheden af kurset afhænger af deltagernes grundviden om Lotus Notes og CONCORDE’s udviklingsmiljø,<br />

samt hvor dybt man vil dykke ned i integrationscasen.<br />

8


1. Programinstallation<br />

1.1 Klargøring af arbejdsplads<br />

Inden installationen kan gennemføres skal arbejdspladsen være klargjort til installation.<br />

1.1.1 Installation og opsætning af Lotus Notes klient<br />

For at kunne benytte <strong>integrationskit</strong>tet, skal Lotus Notes klienten være installeret på arbejdspladsen.<br />

Lotus Notes skal være i 32-bit version. Følg installationsvejledningen til Lotus Notes vedr. installation<br />

af Lotus Notes klienten.<br />

Installation af Lotus Notes klienten opretter bl.a. de filer som <strong>integrationskit</strong>tet skal bruge for at<br />

komme i kontakt med Lotus Notes. Det er ikke et krav, at Lotus Notes klienten skal være opstartet<br />

på arbejdspladsen for at CONCORDE kan kommunikere med Lotus Notes.<br />

Al integration med Lotus Notes sker fra CONCORDE. Der er ingen særlige krav til modifikationer i<br />

Lotus Notes for at kunne bruge <strong>integrationskit</strong>tet. Integrationskittet kan evt. kombineres med ODBC<br />

adgang fra Lotus Notes til CONCORDE.<br />

1.2 Filer<br />

Integrationskittet består af følgende filer, der automatisk kopieres til arbejdspladsens CONCORDE<br />

bibliotek:<br />

ERP2LN.DLL<br />

BORLNDMM.DLL<br />

1.3 Installation af Integrationskit<br />

Indsæt Cd’en med navnet Lotus Notes Integration Kit. Hvis installationsprogrammet ikke starter<br />

automatisk skal der dobbeltklikkes på setup.exe i roden af Cd’en (Vælg ’Run’ fra Windows Startmenuen<br />

og skriv ”D:\setup.exe”, hvis CD-ROM-drevet er D-drevet).<br />

Følg installationsanvisningerne på skærmen. For en detaljeret gennemgang af installationen, se<br />

manual til Integrationskittet.<br />

Installeres der ikke fra CD’-ROM’en skal filerne fra CD-ROM’en kopieres til enten et lokalt drev eller<br />

et mappet netværksdrev. Installationen kører på nuværende tidspunkt ikke fra et UNC-path.<br />

1.4 Registrér serienummer<br />

Integrationskittet leveres med et kodebrev som indeholder et serienummer der er tilpasset licensnavn<br />

og serienummer i CONCORDE.<br />

9


Har man ikke modtaget et serienummer kan <strong>integrationskit</strong>tet stadig benyttes i en demo-version.<br />

Demo-versionen indeholder visse begrænsninger i forhold til den fulde version, bl.a.:<br />

• Tidsbegrænset anvendelse<br />

• Ingen mulighed for afsendelse af mail<br />

Fra Windows Start-menuen åbnes undermenuen ’Programmer\<strong>Intoint</strong>’. Herfra vælges menupunktet<br />

’Enter your serial number’. Dette starter programmet ’WSlize’ (se nedenstående billede).<br />

I feltet ’Filename’ skal den fulde sti til ”ERP2LN.DLL” angives og i ’Serial Number’ skal det serienummer,<br />

du har modtaget fra <strong>Intoint</strong> indtastes. Tryk [OK] for at gemme serienummeret.<br />

Kommer der en fejl skal du kontrollere at stien og filnavnet er korrekt, samt at du har rettigheder til at<br />

skrive til filen og at den ikke er skrivebeskyttet.<br />

1.5 Installation af XAL macrobibliotek<br />

Efter installation og test af systemfilerne i <strong>integrationskit</strong>tet kan XAL-delen af kittet installeres.<br />

XAL macrobiblioteket skal indlæses i CONCORDE.<br />

Dette gøres på følgende måde:<br />

1. Opstart den tegnbaserede version af CONCORDE<br />

2. Vælg udviklingsmenuen via /Generelt/Tilpasning/Udviklingsmenu<br />

3. Vælg import af XAL-macro via /MAC/Import<br />

4. Angiv X:\xxxx\intoint\xal\YY\NOTES.MAC som filnavn (hvor X:\xxxx angiver stien til<br />

CONCORDE installationen og YY angiver sprog (DK eller UK).<br />

Hermed er macrobiblioteket indlæst.<br />

1.6 Globale variable<br />

Integrationskittet opererer med en række globale variable, der skal oprettes i XAL. Disse variable er<br />

samlet i macroen NotesVar<br />

Følgende linie skal tilføjes i XAL-macroen "GlobaleVariableUsr":<br />

10


#NotesVar<br />

Variablerne &NotesServer, &NotesDatabase, &NotesForm og &NotesView kan evt. tildeles en<br />

standardværdi, med den opsætning man ønsker skal være default, f.eks.:<br />

STR 40 &NotesServer = "Local"<br />

STR 80 &NotesDatabase = "Medarb.nsf"<br />

STR 40 &NotesForm = "Medarbejder"<br />

STR 40 &NotesView = "All"<br />

Efter tilretning af macroen "GlobaleVariableUsr" skal XAL-kørslen "AUTOEXEC" genoversættes,<br />

hvorefter CONCORDE skal genstartes. Herefter er CONCORDE klar til integration.<br />

11


2. Kom hurtigt i gang<br />

Inden vi går i dybden med faciliteterne i <strong>integrationskit</strong>tet vil der i dette afsnit blive præsenteret en<br />

lille case, som illustrerer hvorledes kittet fungerer og kan anvendes.<br />

2.1 Case: Opdatering - Afdeling<br />

Casen vil illustrere hvorledes man fra CONCORDE kan oprette og opdatere data i Lotus Notes.<br />

Formålet med XAL-kørslen i denne case er at kunne vedligeholde en kopi af afdelingskartoteket i<br />

Lotus Notes. Ved afvikling af XAL-kørslen gennemløbes afdelingskartoteket i CONCORDE og hver<br />

afdelings-record replikeres til Lotus Notes.<br />

2.1.1 Oprettelse af afdelingskartotek i Lotus Notes<br />

På installationsdiskette 1 medfølger en skabelon til at oprette et simpelt afdelingskartotek i Lotus<br />

Notes.<br />

Kartoteket oprettes på følgende måde:<br />

1. Kopiér filen AFDELING.NTF til Lotus Notes’ databibliotek fra disketten.<br />

2. Opstart Lotus Notes klienten<br />

3. Opret nydatabase (Ctrl-N)<br />

4. Udfyld skærmbillede som angivet nedenfor:<br />

Det er vigtigt at "Afdeling" angives som template.<br />

12


5. Vælg OK<br />

2.1.2 XAL-kode<br />

Koden til denne case medfølger i filen CASE2.XAL.<br />

#MACROLOAD(Notes)<br />

#NotesInit<br />

#NotesOpenServer('Local')<br />

#NotesLogon('Afdeling.nsf')<br />

#NotesForm('Afdeling')<br />

SEARCH Afdeling USING NumIdx<br />

END<br />

#NotesGetUnique("Nummer",Nummer)<br />

IF StrLen(&NotesText)


2.1.4 SEARCH løkke<br />

Afdelingskartoteket gennemløbes nu på normal vis med en SEARCH kommando:<br />

SEARCH Afdeling USING NumIdx<br />

2.1.5 Opdatere eller oprette?<br />

Næste skridt er, at checke om den aktuelle afdeling allerede findes i Lotus Notes. Er dette tilfældet<br />

skal Notes dokumentet opdateres, hvis ikke skal der oprettes et nyt dokument:<br />

#NotesGetUnique("Nummer",Nummer)<br />

IF StrLen(&NotesText)


3. Anvendelse af <strong>integrationskit</strong><br />

I dette afsnit gennemgås hvorledes <strong>integrationskit</strong>tet skal anvendes ved kodning i XAL. I afsnit 4 vil<br />

de enkelte kommandoer blive beskrevet nærmere.<br />

3.1 Kald af XAL-macroer<br />

For at kunne tilgå Lotus Notes fra XAL, skal macrobiblioteket NOTES være defineret i starten af<br />

koden. Dette gøres med kommandoen:<br />

#MacroLoad(NOTES)<br />

Placeringen af kommandoen afhænger af hvilket applikationselement man benytter. I XAL-forms er<br />

det f.eks. nødvendigt at placere kaldet i INIT-formlen, da man på denne måde gør integrationskommandoerne<br />

tilgængelige i alle programobjekter på formen.<br />

Integrationskittets macroer er opdelt i to typer. Macroer der returnerer en værdi direkte og macroer<br />

der returnerer en værdi indirekte.<br />

Et eksempel på den første type er macroen #NotesServerName, som returnerer navnet på den<br />

aktuelt valgte Notes server. Et eksempel på brug af denne type macro:<br />

SET &ServerNavn = #NotesServerName<br />

Et eksempel på den anden type er macroen #NotesDeleteCurrent, som ikke returnerer en værdi<br />

direkte. Den returnerer dog en værdi indirekte i variablen &NotesText. Denne værdi indeholder<br />

resultatet af kommandoen. Generelt betyder en tom værdi i &NotesText, at alt gik godt, mens en<br />

ikke tom værdi normalt angiver en fejlkode. I afsnit 4 beskrives disse returværdier nærmere.<br />

I dette hovedafsnit er alle henvisninger til integrationsmacroer angivet med fed og kursiv. Ved<br />

definitionen af de enkelte macroer er benyttede fed, kursiv og understreget skrifttype.<br />

3.2 Forbindelse til Lotus Notes<br />

En del af kommandoerne til <strong>integrationskit</strong>tet vedrører oprettelse og nedlukning af sessions med<br />

Lotus Notes, samt kommandoer der udpeger applikationselementer i Notes:<br />

#NotesInit<br />

#NotesOpenServer<br />

#NotesOpenDialog<br />

#NotesLogon<br />

#NotesForm<br />

15


#NotesView<br />

#NotesClose<br />

3.2.1 Initialisering af forbindelse til DLL-fil<br />

#NotesInit macroen etablerer forbindelse mellem CONCORDE og det DLL bibliotek der indeholder<br />

systemkaldene til Lotus Notes. Denne macro skal kaldes, inden man kan benytte de øvrige integrationsmacroer.<br />

Macroen kan eventuelt placeres i XAL-kørslen AUTOEXEC. Man kan sagtens kalde<br />

denne macro flere gange, når først macroen er kaldt een gang ignoreres efterfølgende kald.<br />

Ved kald af macroen etableres der ikke et link til Lotus Notes. Dette sker først ved kald af macroen<br />

#NotesLogon.<br />

3.2.2 Oprettelse af session til Lotus Notes<br />

For at kunne kommunikere med Lotus Notes, skal der først udvælges en Notes database og der<br />

skal evt. foretages login. Hvis man tilgår en Notes database, som ikke er placeret på den lokale<br />

arbejdsstation ("Local") skal man indtaste password (i visse tilfælde vil password også blive afkrævet<br />

for "lokale" databaser). Dette skal kun foretages een gang. Det password som skal angives,<br />

svarer til det aktuelle Notes user-ID password. Dette kan sættes via Lotus Notes klienten. Angivelse<br />

af aktuel Notes bruger registreres i NOTES.INI filen. Vælger man at skifte aktuel ID i Lotus Notes<br />

(/File/Tools/Switch ID), vil man ved næste login fra CONCORDE skulle bruge dette ID’s password.<br />

Generelt bruger <strong>integrationskit</strong>tet de aktuelle Notes-opsætninger.<br />

Er der f.eks. angivet en aktuel lokation uden forbindelse til en Notes server ("Island"), kan man heller<br />

ikke komme i kontakt med Lotus Notes servere fra CONCORDE. Man skal derfor opstarte sin<br />

Lotus Notes klient og skifte lokation før der er adgang til servere.<br />

Rettighederne fra CONCORDE i Lotus Notes er ligeledes identisk med den aktuelle ID-brugers<br />

rettigheder.<br />

3.2.2.1 Valg af Notes server<br />

Angivelse af Notes server sker med kommandoerne #NotesOpenServer eller #NotesOpenDialog.<br />

I den første metode angives server navnet som parameter. Den anden metode giver mulighed for at<br />

bladre mellem servere og kartoteker - som ved åbning af databaser i Lotus Notes. Da linket mellem<br />

CONCORDE og Lotus Notes oftest er helt fast på kartoteksniveau er den første metode den mest<br />

brugte. Det er ikke hensigtsmæssigt at man f.eks. kan vælge diverse kartoteker i Lotus Notes, hvis<br />

man skal kunne behandle data, som skal udpeges via feltnavne.<br />

Ved brug af macroen #NotesOpenDialog returneres valgte servernavn og database i variablerne<br />

&NotesServer og &NotesDatabase. Metoden kan evt. bruges i kombination med kommandoen<br />

#NotesLogon, hvorved man reelt kun benytter macroen til udvælgelse af server.<br />

Angives "Local" som servernavn bruges de lokale filer på arbejdspladsen. Angives intet servernavn<br />

som parameter, vælges det server-navn der er gemt i den globale variabel &NotesServer.<br />

3.2.2.2 Valg af Notes database<br />

Efter angivelse af server skal den ønskede Notes database udpeges. Dette kan, som nævnt ovenfor,<br />

gøres ved interaktiv udvælgelse med macroen #NotesOpenDialog eller ved direkte angivelse<br />

af databasenavn i macroen #NotesLogon. I sidstnævnte tilfælde angives databasens filnavn som<br />

parameter (incl. ”.nsf”). Husk at benytte to backslash’s ved angivelse af underbiblioteker.<br />

16


Et eksempel:<br />

#NotesLogon("mail\\ejensen.nsf")<br />

Udover at udpege arbejdsdatabase i Lotus Notes foretager macroen også oprettelse af den egentlige<br />

forbindelse med Lotus Notes. Der checkes om server og database er tilgængelig, samt afkræves<br />

evt. password fra brugeren, hvis databasen er placeret på en Notes server og der ikke allerede er<br />

indtastet password tidligere.<br />

Angives ingen parameter vælges det databasenavn der er gemt i den globale variabel<br />

&NotesDatabase.<br />

3.2.2.3 Valg af Notes applikationselementer<br />

For at kunne udveksle data mellem CONCORDE og Lotus Notes skal der angives enten hvilket<br />

Notes view der skal arbejdes med eller hvilken form der skal anvendes.<br />

Notes view bruges i forbindelse med udførelse af Notes forespørgsler, mens Notes forms bruges<br />

ved behandling af felter.<br />

Til udvælgelse af applikationselement bruges macroerne #NotesForm og #NotesView. Angives<br />

ingen parameter bruges værdierne i variablerne &NotesForm og &NotesView som default-værdier.<br />

3.2.3 Nedlukning af session<br />

Ønsker man at have mulighed for skiftende sessions til Lotus Notes fra CONCORDE, skal man<br />

oprette en session pr. element. Ved afslutning af programkoden skal man afslutte den aktuelle session<br />

med kommandoen #NotesClose.<br />

Denne macro afbryder ikke forbindelsen til DLL-biblioteket, som blev etableret med macroen<br />

#NotesInit.<br />

Efter brug af #NotesClose skal man ved næste tilgang til Lotus Notes lave en ny forbindelse med<br />

#NotesLogon.<br />

3.2.4 Skift mellem sessions<br />

Det er muligt at operere med flere samtidige sessions. Hver session har sin egen forbindelse til<br />

Lotus Notes, med angivelse af server, database, form, view, aktuelle dokument med mere. Skift<br />

mellem sessions sker med kommandoen #NotesSetHandle.<br />

Der bør udvises forsigtighed ved brug af flere aktive sessions. Forvirring omkring hvilken session<br />

der er aktiv er en hyppig fejlårsag.<br />

Benyt eventuelt #NotesGetHandle for at få oplyst, hvilken session der er aktiv.<br />

3.3 Aktuelle værdier<br />

Der findes en række macroer, der oplyser om diverse aktuelle værdier. En del af disse værdier<br />

vedrører den aktuelle session med Lotus Notes, som blev beskrevet i foregående afsnit.<br />

Alle macroer returnerer en værdi direkte.<br />

17


3.3.1 Oplysninger om aktuel session<br />

De macroer der returnerer disse oplysninger er listet nedenfor:<br />

#NotesServerName<br />

#NotesDatabaseName<br />

#NotesDatabaseTitle<br />

#NotesFormName<br />

#NotesViewName<br />

Disse macroer modsvarer macroerne der opretter forbindelserne.<br />

Et eksempel:<br />

#NotesOpenServer("Local")<br />

PRINT #NotesServerName<br />

vil udskrive "Local" på skærmen.<br />

Se også nærmere i afsnit 3.9.3.<br />

3.3.2 Oplysninger om DLL programbibliotek<br />

Macroen #NotesIF returnerer aktuel status på forbindelsen til DLL biblioteket. Er værdien 0 (falsk),<br />

er det ikke muligt at etablere forbindelse med Lotus Notes.<br />

Macroen #NotesDLLVersion returnerer versionsnummer og release-dato på DLL biblioteket. Disse<br />

oplysninger er relevante ved support på programmet o.a..<br />

Via kommandoen #NotesIsDemoVersion er det muligt at få oplyst om den aktuelle integration sker<br />

via en begrænset demo-version eller en fuld version.<br />

3.3.3 Styring af temporære filer<br />

Ved modtagelse af flere dokumenter fra Lotus Notes kan temporære filer benyttes som media. Det<br />

sker i form af kommafiler.<br />

Filerne er opbygget på følgende måde:<br />

Linie 1 "DocId", "feltnavn1", "feltnavn2",...,"feltnavn i"<br />

Linie 2, første dokument "DocId 1", "felt1 værdi", "felt2 værdi",..., "felt i værdi"<br />

Linie 3, andet dokument "DocId 2", "felt1 værdi", "felt2 værdi", ..., "felt i værdi"<br />

... ...<br />

Linie n "DocId n", "felt1 værdi", "felt2 værdi", ..., "felt i værdi"<br />

Som det ses, indledes kommafilen med en liste over felter i den valgte form. Alle felter returneres i<br />

kommafilen. Ved indlæsning af kommafilen i CONCORDE, kan overflødige felter så ignoreres.<br />

Udover at indeholde alle felter angives også en unik nøgle til dokumentet. Dette svarer stort set til<br />

feltet "Løbenummer" i XAL. Dette kan bruges ved registrering af dokumenter til senere udpegning<br />

(se afsnit 3.4.6). DocId feltet er første værdi i hver linie.<br />

Tegnsættet der benyttes i den temporære fil svarer til CONCORDE's. Hvis man åbner den temporære<br />

fil i f.eks. NotePad, vil "æ", "ø", "å" og andre specialtegn vises "forkert". Hvis filen åbnes i en<br />

DOS-editor eller CONCORDE's XAL-editor er alle tegn korrekte. Dette skyldes at <strong>integrationskit</strong>tet<br />

"oversætter" fra det Windows tegnsæt der bruges i Lotus Notes til det tegnsæt der benyttes i<br />

CONCORDE.<br />

18


Macroen #NotesTmpFilNavn benyttes til tildeling af navn på temporær fil. Macroen returnerer altid<br />

det aktuelle navn på den temporære fil. Dette sker via variablen &NotesText.<br />

Angives en parameter til macroen benyttes denne som filnavn. Angives ikke en parameter beregnes<br />

automatisk et unikt filnavn. Som parameter skal altid overføres en variabel.<br />

Bemærk at den temporære fil først oprettes i forbindelse med udførelse af macroen #NotesQuery<br />

eller NotesQueryRichTextField..<br />

Husk at slette den temporære fil efter brug - brug f.eks. XAL macroen #NotesDeleteTempFil.<br />

Med kommandoen #NotesGetTmpFilNavn kan man få oplyst navnet på den aktuelle temporære fil<br />

i den aktuelle session.<br />

3.4 Query og opslag i Lotus Notes<br />

Der findes en række macroer der laver opslag i Lotus Notes:<br />

#NotesQuery<br />

#NotesQueryField<br />

#NotesQueryUnique<br />

#NotesGetUnique<br />

#NotesSelectID<br />

#NotesSelectUNID<br />

Disse har dog forskellige anvendelsesområder.<br />

3.4.1 Generel query<br />

Macroen #NotesQuery bruges til udførelse af standard Notes-full-text søgning. Udvælgelseskriteriet<br />

angives som parameter. Parameteren kan sammenlignes med "View selection" i Lotus<br />

Notes. For at kunne bruge denne macro, skal man have et vist kendskab til Lotus Notes. Kommandoen<br />

"SELECT" kan udelades ved kald af macroen.<br />

Her et par eksempler på kald af macroen:<br />

#NotesQuery("Select @ALL")<br />

Returnerer alle dokumenter i database.<br />

#NotesQuery("Antal>100")<br />

Returnerer alle dokumenter, hvor feltet "antal" har en værdi over 100.<br />

Angives ingen afgrænsning returneres alle dokumenter.<br />

Søgeresultater returneres altid i et resultat-sæt i hukommelsen. Desuden kan resultatet returneres i<br />

en kommafil, forudsat at et filnavn til en temporær fil er angivet (se afsnit 3.3.3). Der skal så her<br />

foretages en efterfølgende behandling via XAL’s READ kommando.<br />

Kald af #NotesQuery giver mulighed for kraftfulde søgeudtryk på tværs af views og felter. Men da<br />

der benyttes full-text søgning er metoden relativ langsom i større databaser. Se evt. nærmere under<br />

#NotesSearchView.<br />

19


3.4.2 Håndtering af resultat sæt<br />

Det er også muligt at bearbejde resultatet af søgningen uden at håndtere kommafiler.<br />

Via diverse ”Move-” kommandoer kan man udpege første, næste, forrige og sidste dokument i søgningen.<br />

Macroerne kaldes med:<br />

#NotesMoveFirst<br />

#NotesMoveNext<br />

#NotesMovePrev<br />

#NotesMoveLast.<br />

Antallet af dokumenter i resultatsættet oplyses via kald af macroen #NotesGetFoundDocs.<br />

Denne metode til håndtering af søgninger kan med fordel kombineres med kald af<br />

#NotesTmpFilNavn med tomt filnavn som parameter. Derved udskrives resultatet ikke også til en<br />

kommafil.<br />

3.4.3 Query på unikt dokument<br />

Med macroen #NotesQueryUnique kan man foretage en query svarende til ovenstående<br />

#NotesQuery, som returnerer eet dokument direkte. For at kunne bruge denne metode skal man<br />

dog være sikker på, at der kun findes 0 eller 1 dokument der kan returneres. Dette er dog ofte tilfældet<br />

i integrations-situationer med CONCORDE, som næsten altid har mindst een unik udpegning<br />

af en record.<br />

3.4.4 Opslag via view<br />

Da queries i <strong>integrationskit</strong>tet sker via fuld-tekst søgning, kan denne metode blive relativ langsom<br />

ved større datamængder. Man kan så, med fordel, lave opslag i Lotus Notes via de tilgængelige<br />

views (svarende til index i XAL). For at kunne benytte et view til opslag, skal alle de kolonner der<br />

søges på være af typen text og sorteret. Første søge-værdi forsøges fundet i første kolonne. Eventuel<br />

anden søge-værdi forsøges fundet i anden kolonne og så fremdeles.<br />

Opslag via søge-værdier sker med macroen #NotesSearchView. Søgenøglen skal matches 100%<br />

i viewet – søges f.eks. på ”1000” vil dokument med nøglen ”100” ikke blive fundet.<br />

Ønsker man at angive flere søgenøgler adskilles disse med semikolon, f.eks. #Notes-<br />

SearchView(’Hansen;Jesper’).<br />

Ønsker man at benytte et andet skilletegn, kan dette sættes med macroen #NotesDelim.<br />

Opslag i view kan også ske med macroen #NotesSearchFirst, der udvælger det første (øverste)<br />

dokument i det aktuelle view.<br />

Via #NotesSearchNext kan man så bladre til de næste dokumenter. Dette gælder også efter<br />

#NotesSearchview, dog vil man her kun kunne bladre frem gennem de dokumenter der opfylder<br />

søge-kriteriet i #NotesSearchView.<br />

På denne måde kan et view traverseres som vist i dette eksempel<br />

#NotesSearchFirst<br />

WHILE StrLen(&NotesText)>2<br />

PRINT ”Navn: ”,#NotesQueryField(’Navn’)<br />

20


END<br />

#NotesSearchNext<br />

3.4.5 Opslag på feltværdi<br />

En anden type forespørgsel, er opslag på et aktuelt dokuments feltværdier. Dette gøres med<br />

macroen #NotesQueryField.<br />

For at kunne benytte denne macro, skal man have udpeget et aktuelt dokument, f.eks. med en af<br />

macroerne #NotesSelectID eller #NotesGetUnique.<br />

Som parameter angives feltnavn. Bemærk at Lotus Notes behandler feltnavne case-sensitivt. Det er<br />

derfor vigtigt at angive feltnavne eksakt som i Lotus Notes. Hedder et felt f.eks. "Nummer", kan man<br />

ikke angive "nummer" som gyldigt feltnavn.<br />

Et eksempel:<br />

#NotesGetUnique("Nummer", Nummer)<br />

PRINT Nummer,": ",#NotesQueryField("Navn")<br />

#NotesQueryField returnerer altid en tekstværdi (STR). Det er altså XAL-programmørens opgave,<br />

at konvertere til det rette XAL-format med f.eks. Str2Num eller Str2Date. Dette område kræver naturligvis<br />

en vis viden omkring de aktuelle Lotus Notes formater, f.eks. datoværdier o.lign. Visse formater<br />

kan variere ved ændringer af den enkelte Lotus Notes konfiguration, f.eks. kommaformat (","<br />

eller ".") og datoformat.<br />

Ved opslag på rich-text felter kan man risikere, at teksten er meget lang. XAL kan kun håndtere en<br />

returværdi på 255 tegn. For at håndtere dette problem kan macroen #NotesQueryRichTextField<br />

benyttes. Denne fungerer som #NotesQueryField og returnerer værdi på samme måde, direkte i<br />

kaldet. Men derudover returneres felt-værdi i den aktuelle temporære fil. Derved kan større datamængder,<br />

f.eks. tekst der skal indlæses i et notat felt i XAL, indlæses via READ AS COMMA.<br />

Brug af #NotesQueryField kræver at feltet er defineret på den aktuelle form. I visse situationer<br />

findes felter på Notes dokumenter, som ikke er defineret på formen. I sådanne tilfælde kan man<br />

benytte macroen #NotesGetFieldValue, som ikke checker felt-definitionen.<br />

3.4.6 Entydigt opslag<br />

For at kunne behandle data i en relationsdatabase, skal alle data kunne udpeges entydigt. Dette<br />

gælder også CONCORDE. Men Lotus Notes er ikke en relationsdatabase og Notes er ikke bygget<br />

til at understøtte unikke nøgler, som i f.eks. XAL.<br />

Men for at kunne integrere CONCORDE med Notes, er det nødvendigt at kunne lave entydige opslag.<br />

Til at håndtere dette findes tre macroer i <strong>integrationskit</strong>tet: #NotesSelectID, #NotesSelectUNID og<br />

#NotesGetUnique. Disse macroer udpeger et aktuelt dokument, der så kan behandles med f.eks.<br />

#NotesQueryField eller #NotesSetFieldValue.<br />

#NotesGetUnique benyttes i situationer, hvor man har et nøglefelt i CONCORDE, der entydigt kan<br />

udpege et dokument i Notes. Dette kunne f.eks. være "Kontonummer" i kontoplanen, som vil returnere<br />

een konto. Det kan f.eks. ikke være "Kontonummer" i finansposteringerne, da mange posteringer<br />

har samme kontonummer.<br />

21


#NotesGetUnique har to parametre. Første parameter er feltnavn, anden parameter er feltværdi.<br />

Macroen returnerer enten en fejlværdi eller et DocId. Fejlværdier ligger i intervallet "1" til "99". Er<br />

returværdien (&NotesText) på mere end to karakterer, er det en henvisning til et dokument. Dokumentet<br />

er aktivt med det samme. Der skal ikke efterfølgende foretages opslag via #NotesSelectID.<br />

Bemærk at #NotesSearchView fungerer næsten på samme måde, blot hurtigere, men<br />

#NotesSearchView melder ikke fejl, hvis der er flere dokumenter med samme nøgle.<br />

#NotesSelectID benyttes i situationer, hvor man vil lave et opslag direkte via et kendt DocId. Dette<br />

DocId kunne f.eks. fremkomme som et resultat af en #NotesQuery, der jo returnerer DocId i kommafilen.<br />

DocId er entydig for databasen. Men værdien kan "genbruges" efter sletning i Notes databasen.<br />

Desuden er DocId kun unik for den enkelte instans af databasen. Ved replikering kan DocId ændres.<br />

Brug af opslag med DocId vil derfor ikke give samme resultater på andre replika af databasen -<br />

brug i stedet #NotesGetUniqe (se i øvrigt appendix 2.6).<br />

For at undgå dette problem, kan man lave opslag via Lotus Notes Universal Document ID (UNID)<br />

med macroen #NotesSelectUNID. Anvendelsen er analog med #NotesSelectID, men UNID er<br />

unik på tværs af replikaer af den samme database. Til gengæld fylder et UNID 32 tegn, hvor et<br />

DocId fylder 8 tegn.<br />

3.4.7 Sammenligning af værdier<br />

Ofte har man behov for at kunne sammenligne feltværdier i Notes og CONCORDE. Dette er specielt<br />

nødvendigt ved opdatering af eksisterende dokumenter i Notes, hvor en unødvendig opdatering<br />

af et felt medfører at en evt. "unread"-markering bliver sat. Ved kun at opdatere hvis der er forskelle<br />

mellem Notes og CONCORDE kan dette undgås. Funktionaliteten kan opnås ved at aflæse Notesværdien<br />

med #NotesQueryField og dernæst sammenligne værdierne. Med macroen<br />

#NotesCompareField kan hele sammenligningen foretages med een kommando.<br />

Et eksempel på brug af denne macro er vist nedenfor:<br />

...<br />

IF NOT<br />

#NotesCompareField("Navn",Finkart.KontoNavn)<br />

THEN<br />

#NotesSetFieldValue("Navn",Finkart.KontoNavn)<br />

#NotesCommit<br />

ENDIF<br />

...<br />

Et alternativ er at angive, at der for alle data der overføres til Lotus Notes, skal ske en sammenligning<br />

mellem den ”gamle” værdi og den ”nye” værdi. Og kun hvis der er forskel på disse værdier, vil<br />

den nye værdi blive gemt i Notes. Derved undgår man unødvendige opdateringer, med deraf følgende<br />

sætning af f.eks. unread-markeringer. Metoden er dog naturligvis lidt langsommere.<br />

Med kommandoen #NotesSetKeepUnread(”1”) aktiveres denne feature.<br />

3.5 Datamanipulation<br />

Efter at have etableret en session med Lotus Notes og evt. udvalgt et dokument til behandling, kan<br />

man med forskellige macroer behandle disse data. Macroerne giver mulighed for oprettelse, ændring<br />

og sletning af dokumenter.<br />

22


3.5.1 Oprettelse af nyt dokument<br />

Macroen #NotesCreateNew opretter et nyt tomt dokument i Lotus Notes.<br />

Efter kald af #NotesCreateNew bør man udfylde feltværdierne med macroen<br />

#NotesSetFieldValue.<br />

Det nye dokument gemmes først i Lotus Notes ved kald af macroen #NotesCommit. Kaldes denne<br />

macro ikke, opdateres Notes databasen ikke.<br />

Nemærk, at #NotesCreateNew opretter og gemmer det nye dokument. Efter kald af macroen, vil<br />

der altså eksistere et tomt dokument.<br />

3.5.2 Tildeling af feltværdier<br />

#NotesSetFieldValue er en af de mest essentielle macroer i <strong>integrationskit</strong>tet. Med denne macro<br />

ændres indholdet i Lotus Notes dokumenterne.<br />

Macroen kaldes med mindst to parametre: feltnavn og feltværdi. En tredje parameter, "Commit",<br />

kan angives for at opdatere Lotus Notes umiddelbart. Alternativt skal #NotesCommit kaldes efter<br />

alle felt-tildelingerne.<br />

Feltværdi skal altid være en tekststreng eller tekstvariabel. XAL programmøren skal altså inden<br />

kaldet evt. konvertere andre felttyper til en streng.<br />

Et eksempel:<br />

STR 10 &Dato<br />

...<br />

SET &Dato = Date2Str(Finpost.Dato,123,2,3,2,3,2)<br />

#NotesSetFieldValue("Dato",&Dato)<br />

I visse situationer kan rækkefølgen, hvori felterne udfyldes, være af betydning. Det anbefales at<br />

udfylde felterne i samme rækkefølge, som<br />

det ville blive gjort, hvis man sad og udfyldte felterne via Notes formen.<br />

#NotesSetFieldValue har en variant, #NotesSetRichFieldValue, som kan benyttes ved suggesiv<br />

udfyldning af et rich-text felt. Ved at kalde denne macro flere gange kan flere linier adderes til samme<br />

Rich-text felt.<br />

#NotesSetFieldValue kan også benyttes til rich-text felter, men her udskiftes indholdet af feltet ved<br />

hvert kald. Flere linier kan dog tilføjes med denne macro ved at indsætte et linieskift<br />

(Num2Char(10)) i den text der overføres som parameter.<br />

Ønsker man at indsætte indholdet af en fil i et rich-text felt benyttes macroen #NotesImportFile.<br />

Anvendelsen af denne macro svarer til #NotesMailBodyFile – se afsnit 3.8.2 for en nærmere gennemgang<br />

af hvorledes filer importeres.<br />

I situationer, hvor man har behov for at sætte en feltværdi i et ”item” hvor der ikke er defineret et felt<br />

på formen, kan man benytte macroen #NotesPutFieldValue. Da denne macro er baseret på at<br />

feltet ikke her er defineret på formen, skal man selv angive felttypen.<br />

Dette gøres ved at foranstille feltnavnet efter følgende mønster:<br />

#Datatype#, f.eks. #NotesPutFieldValue(’#DATETIME#Dato,&D)<br />

Angives ikke felttype., vil data blive gemt som text-type.<br />

23


Data der overføres til dato-felter skal altid være af formatet ”dd-mm-åå” eller ”dd-mm-åååå”<br />

– altså med bindestreg mellem talværdier og med dag som første værdi.<br />

3.5.3 Sletning af dokumenter i Lotus Notes<br />

Integrationskittet stiller to macroer til rådighed som muliggør sletning af dokumenter i Lotus Notes.<br />

#NotesDeleteID kan bruges til sletning af et dokument ved angivelse af DocId. Med denne metode<br />

skal man ikke først fremfinde et dokument som aktuelt dokument.<br />

Tilsvarende bruges #NotesDeleteCurrent til sletning af et aktuelt dokument, der er fundet f.eks. via<br />

macroen #NotesGetUnique.<br />

Efter sletning af dokument via #NotesDeleteCurrent skal et nyt aktuelt dokument udvælges, inden<br />

der kan foretages yderligere datamanipulation med macroer, som behandler det aktuelle dokument<br />

(f.eks. #NotesSetFieldValue).<br />

Kald af sletning af samme dokument to gange vil "ophæve" sletningen, medmindre der er udført<br />

#NotesCommit. Det er først ved kald af #NotesCommit en sletning effektueres.<br />

Dette svarer til brugerfladen i Lotus Notes.<br />

3.5.4 Opdatering af ændringer<br />

I XAL opererer man med begrebet TTS. Med TTSBEGIN, TTSABORT og TTSCOMMIT kan man<br />

styre om data opdateres. Integrationskittet stiller en facilitet til rådighed, der svarer til dette system.<br />

Dog kan man kun operere med eet dokument.<br />

For at opdatere ændringer skal man kalde macroen #NotesCommit som afslutning.<br />

Dette skal ske inden et andet aktuelt dokument udvælges og inden den aktuelle session lukkes<br />

ned.<br />

Tilsvarende kan man udnytte dette til evt. at annullere ændringer ved ikke at udføre #NotesCommit.<br />

En variant af #NotesCommit er #NotesCommitNoRecalc, der også gemmer det aktuelle dokument,<br />

men som sørger for ikke at genberegne formler på dokumentet.<br />

3.5.5 Oplysninger om aktivt dokument<br />

Brug af opdateringsmacroerne vil medføre fejlmelding, hvis ikke et Notes dokument er udvalgt. For<br />

at checke om et dokument er aktivt kan macroen #NotesDocID benyttes. Denne macro returnerer<br />

det aktive dokuments DocumentID.<br />

Macroen kan også benyttes efter #NotesQueryUnique og #NotesGetUnique (hvis man ikke aflæser<br />

&NotesText umiddelbart efter kald af disse macroer).<br />

Ønsker man at benytte UNID i stedet kaldes macroen #NotesUNID.<br />

24


Til mere avancerede anvendelser er det muligt at få yderligere information om det aktuelle dokument<br />

og de enkelte felter.<br />

Med kommandoen #NotesGetDocInfo har man mulighed for at få oplyst en række oplysninger om<br />

det aktuelle dokument, herunder f.eks. dato for oprettelse og sidste rettelse, om det er et responsedokument<br />

og i så fald angivelse af reference til ”father-document” m.v.<br />

Tilsvarende kan #NotesGetFieldLength og #NotesGetItemInfo give information om de enkelte<br />

felters værdier.<br />

3.6 Rich-text<br />

CONCORDE understøtter ikke Rich-text felter. Men der kan være en række situationer, hvor man<br />

fra CONCORDE har brug for enten at se oplysninger i Notes, som ligger i Rich-text felter (f.eks.<br />

billeder) eller man har brug for at gemme Rich-text oplysninger i Notes.<br />

3.6.1 Opdatering til Notes<br />

Man kan umiddelbart gemme almindelig text fra CONCORDE i et rich-text felt i Lotus Notes via<br />

<strong>integrationskit</strong>tet. Man skal altså ikke skelne mellem om det felt der opdateres i Notes er af typen<br />

"Text" eller "Rich Text". Macroen #NotesSetFieldValue kan bruges til begge felttyper.<br />

3.6.2 Læsning fra Notes<br />

Tilsvarende gælder også ved læsning af data i Lotus Notes. Her benyttes macroen<br />

#NotesQueryField på normal vis. Integrationskittet vil på bedste vis prøve at returnere data i et<br />

format, som XAL kan "forstå". Rich-text felter i Notes kan indeholde en række informationer, som<br />

ikke er "synlige" i XAL, f.eks. billeder, attachments, formateringskoder, flere linier m.v.<br />

Alle formateringskoder fjernes ved læsning fra Notes. Alle billeder, attachments o.lign. overføres<br />

ikke. Indeholder et rich-text felt flere linier tekst returnerer <strong>integrationskit</strong>tet disse som een streng,<br />

hvor linieskift er markeret med ASCII-værdierne 13 og 10 (CR/LF). Det er herefter op til programmøren<br />

at udskille dette til flere XAL-linier, f.eks. i et notat felt. Alternativt kan<br />

#NotesQueryRichFieldValue kaldes, hvorefter data kan læses fra temporære fil.<br />

Ved brug af #NotesQuery, hvor resultatet returneres i en kommafil, benyttes en lidt anden metode.<br />

Hvis et Notes dokument indholder et eller flere rich-text felter der indeholder flere linier, vil overførsel<br />

af dette felt til en kommafil medføre at kommafilen vil splitte oplysningerne ud på flere linier.<br />

Her et eksempel:<br />

Nummer (Text) 1234<br />

Navn (Text) Erik Jensen<br />

Beskrivelse (Rich Text) En debitor<br />

der er oprettet<br />

med flere linier<br />

Dette dokument ville resultere i følgende linier i kommafilen:<br />

....<br />

"1234","Erik Jensen","En debitor<br />

der er oprettet<br />

med flere linier"<br />

....<br />

25


Ved indlæsning af denne kommafil til CONCORDE vil XAL opfatte dette som tre dokumenter/records.<br />

For at kunne håndtere denne problemstilling, er der to muligheder. Man kan isolere rich-text felter,<br />

så disse ikke indgår direkte i kommafilen, eller man kan nøjes med kun at gemme første linie af<br />

rich-text feltet i kommafilen.<br />

3.6.2.1 Rich-text i separate filer<br />

Ønsker man at bevare hele indholdet i Rich-text felterne vælges en metode, hvor al rich-text information<br />

gemmes i separate kommafiler. Een fil pr. dokument og pr. rich-text felt. For at kunne tilgå<br />

indholdet af disse felter, skal de altså indlæses via en separat indlæsning i XAL.<br />

De separate rich-text filer gemmes i et underbibliotek med navnet "RichText".<br />

Filerne navngives efter følgende syntaks:<br />

.<br />

f.eks. "00002E40.3", hvor "00002E40" er Notes dokumentets ID og "3" angiver at det er det tredje<br />

felt på formen.<br />

3.6.2.2 Valg af metode<br />

Hvis man vælger ikke at gemme indholdet af rich-text felter i separate filer, vil de blive overført som<br />

andre felttyper i kommafilen. Dog vil indholdet evt. blive afkortet til første linie, hvis feltet indeholder<br />

flere linier.<br />

Valg af metode sker med macroen #NotesSetRichSepMode. Aktuel værdi kan aflæses ved kald af<br />

macroen #NotesGetRichSepMode. Værdien "1" angiver separate filer, mens "0" angiver gemning<br />

af rich-textværdier i kommafilen.<br />

Default værdi er, at gemme første linie af rich-text felter i kommafilen.<br />

3.7 Fil-attachments<br />

Integrationskittet indeholder diverse macroer til håndtering af attachments på Notes dokumenter.<br />

Dette kan bl.a. benyttes til at vedhæfte f.eks. en tekstfil fra en CONCORDE rapport til et Notes dokument.<br />

Alle filtyper kan dog vedhæftes.<br />

Attachments tilføjes et Notes dokument med macroen #NotesAttachFile. Som første parameter<br />

angives navnet på filen. En evt. anden parameter angiver det navn attachmentet får på dokumentet.<br />

Eks.: #NotesAttachFile(‘c:\\autoexec.bat’,’AUTOEXEC’). Angives intet attachmentnavn oprettes<br />

attachment med samme navn som filen (eksklusiv foranstillet path - i eksemplet ville navnet blive<br />

"autoexec.bat").<br />

26


Eksisterende attachments kan "detaches" (kopieres til en fil) med macroen #NotesDetachFile.<br />

Også her angives filnavnet som første parameter. Dette filnavn skal ikke nødvendigvis være det<br />

samme som filnavnet på filen som blev attachet oprindeligt. Man kan detache filen med et andet<br />

filnavn. Som ovenfor angives et evt. attachmentnavn som anden parameter.<br />

Eks. #NotesDetachFile("c:\\autoexec.ny","AUTOEXEC").<br />

Her gemmes filen fra det første eksempel som en ny fil, så den originale ikke overskrives.<br />

Om der findes attachements på det aktuelle dokument kan oplyses ved kald af macroen<br />

#NotesExistsAttach.<br />

Der er desuden en macro til fjernelse af attachments. Dette gøres med macroen<br />

#NotesDeleteAttachment. Denne macro kan bruges enten til at slette samtlige attachments eller<br />

blot en enkelt. Angives en parameter slettes kun attachmentet med dette navn. Angives ingen parametre<br />

slettes alle attachments.<br />

Alle operationer på attachments opererer med attachments direkte på dokumentet. Attachments i<br />

Rich-text felter håndteres ikke - og slettes ej heller med macroen #NotesDeleteAttach.<br />

3.8 Mail<br />

Udover at kunne udveksle data med Lotus Notes, giver <strong>integrationskit</strong>tet mulighed for at afsende<br />

mails direkte fra CONCORDE. (Mails kan læses ved normal dataudveksling via f.eks. [$InBox]folderen).<br />

Opbygningen af XAL-kode for at afsende mails fra CONCORDE adskiller sig fra de foregående<br />

metoder, da opsætningen af mail-server, database og forms ikke skal sættes op af brugeren. Integrationskittet<br />

finder selv de nødvendige oplysninger i NOTES.INI. Man skal altså ikke angive server<br />

m.v. med macroerne #NotesServer, #NotesLogon, #NotesForm og #NotesView.<br />

3.8.1 Forberedelse af mail<br />

Mail rutinen i <strong>integrationskit</strong>tet består af 3 tempi:<br />

1. Forberedelse af mail<br />

2. Opbygning af selve indholdet (brødteksten)<br />

3. Afsendelse af mail<br />

Først klargøres mail. Dette indebærer at følgende oplysninger angives:<br />

• "SendTo", modtagers E-mail adresse (SKAL ANGIVES)<br />

• "Subject", overskrift til mail<br />

• evt. "CC", evt. andre modtagere af kopi (Carbon Copy)<br />

• evt. "BCC", evt. andre modtagere af kopi (skjult for modtager) (Blind Carbon Copy)<br />

Klargøring af mail sker med macroen #NotesPrepareMail. Macroen modtager 2-4 parametre i<br />

ovenstående rækkefølge. CC og BCC (3. og 4. parameter) er valgfrie.<br />

Et kald af macroen kunne se ud som følger:<br />

#NotesPrepareMail("Erik Jensen/Acme","Sidste nyt","Ole Olsen/Acme,Jens<br />

Jensen/Acme")<br />

27


I eksemplet her er der også angivet 2 personer, som modtager en kopi af mailen.<br />

3.8.2 Udfyldelse af indhold i mail<br />

Næste skridt er at udfylde brødteksten i mailen - body feltet.<br />

Dette kan gøres på to måder. En simpel metode, hvor man kun udfylder med almindelig tekst, og en<br />

mere avanceret metode, hvor det er muligt at kombinere tekst og indhold af f.eks. ASCII-filer, richtext<br />

filer (RTF) og/eller billeder (BMP, PCX eller TIFF (uncompressed)).<br />

Den simple metode bruges til opbygningen af enkle mails, der består af almindelig brødtekst uden<br />

behov for formatering m.v. Denne metode er hurtigere end den avancerede metode.<br />

Brødteksten opbygges ved kald af macroen #NotesMailBodyText. Macroen kan kaldes et vilkårligt<br />

antal gange, hvor hvert kald tilføjer en linie til mailen. Mails opbygget med denne metode skulle<br />

kunne læses af alle tilgængelige mail-systemer. Dette er specielt interessant når modtagere af mailen<br />

ikke benytter Notes mail (f.eks. Internet mail).<br />

Mange af faciliteterne i den avancerede metode vil ofte ikke kunne læses af andre mail-systemer<br />

(og hvis de kan læses er det oftest uden de formateringskoder der er benyttet).<br />

Den mere avancerede metode benyttes via 2 macroer:<br />

#NotesMailBody, som benyttes analogt med ovennævnte macro (#NotesMailBodyText) og<br />

#NotesMailBodyFile som benyttes til at indflette indholdet af en fil.<br />

Muligheden for f.eks. at indflette rich-text filer (RTF) giver mulighed for at formatere indholdet i mailen,<br />

med f.eks. diverse fonts og effekter. Dette kræver dog at man opbygger sit indhold med richtext<br />

koder. Kontakt evt. <strong>Intoint</strong> for yderligere information om dette.<br />

Begge metoder kan suppleres med muligheden for at attache filer til mails. Dette gøres med<br />

macroen #NotesMailAttachFile. Denne macro svarer til #NotesAttachFile (se afsnit 3.7).<br />

3.8.3 Afsendelse af mail<br />

Efter at mailen er klargjort kan den afsendes. Dette gøres meget simpelt med macroen<br />

#NotesMailSend.<br />

Man kan evt. angive en parameter - et filnavn. Hvis en sådan parameter angives, udfyldes bodyfeltet<br />

med indholdet af filen (forudsat at filen kan konverteres af <strong>integrationskit</strong>tet - se "kendte" filtyper i<br />

foregående afsnit).<br />

Eksisterende indhold, udfyldt med macroerne nævnt i foregående afsnit bibeholdes.<br />

Nedenfor er angivet et eksempel på en XAL-kørsel der afsender en mail:<br />

#MacroLoad(NOTES)<br />

#NotesInit<br />

#NotesMailPrepare("Support@intoint.com","Fejl")<br />

#NotesMailBodyFile("c:\\billeder\\logo.bmp")<br />

#NotesMailBody("")<br />

#NotesMailBody("Jeg har følgende fejlmelding:")<br />

#NotesMailBodyFile("c:\\temp\\scrndump.bmp")<br />

#NotesMailBody("")<br />

#NotesMailBody("Kan i hjælpe???")<br />

28


#NotesMailBodyFile("c:\\billeder\\sign.bmp")<br />

#NotesMailAttachFile("c:\\xal\\bogf.xal")<br />

#NotesMailSend<br />

#NotesClose<br />

3.8.4 M<strong>API</strong> Mail<br />

Benytter man ikke Lotus Notes til mail (men f.eks. kun til Web-server) er det muligt at benytte M<strong>API</strong><br />

protokollen til simple mails (uden attachments m.v.). Microsoft Outlook benytter bl.a. M<strong>API</strong> protokollen.<br />

M<strong>API</strong> mail aktiveres via #NotesMailSetM<strong>API</strong>(”1”).<br />

Har man brug for at angive M<strong>API</strong> profil og password gøres dette med macroerne<br />

#NotesM<strong>API</strong>Profile og #NotesM<strong>API</strong>Password.<br />

Derved kan besked boxe der beder brugeren om disse oplysninger undgås.<br />

Bemærk, at ikke al mail-funktionalitet er tilgængelig i dette <strong>integrationskit</strong> til M<strong>API</strong>.<br />

3.8.5 Automatiske fejlmeldinger via mail<br />

Integrationskittet giver mulighed for, at fejlsituationer ved integration mailes til f.eks. den edbansvarlige.<br />

Dette kan lette den interne support, da de fleste relevante oplysninger indeholdes i mailen.<br />

Denne facilitet er også specielt velegnet, hvis <strong>integrationskit</strong>tet benyttes på en batchserver, hvor<br />

evt. fejlmeldinger ikke nødvendigvis ses umiddelbart.<br />

Aktivering af denne facilitet sker med macroen #NotesMailErrorTo, hvor modtageren angives som<br />

parameter (flere modtagere kan angives adskilt med komma). Angives f.eks. følgende XAL-linier i<br />

XAL-kørslen AUTOEXEC, vil Erik Jensen blive orienteret automatisk om alle fejlsituationer.<br />

#MacroLoad(NOTES)<br />

...<br />

#NotesInit<br />

#NotesMailErrorTo("Erik Jensen/Acme")<br />

Et eksempel på en mail med en fejlbesked er vist nedenfor:<br />

To: Erik Jensen/Acme<br />

cc:<br />

Subject: ERP2LN ERROR: NotesForm (2): Form werjkhewkjr does not exist<br />

Error: NotesForm (2): Form werjkhewkjr does not exist<br />

Date: 19/8/03 13:16:40<br />

DLL Version: 1.0.1.143 - 18.08.2003<br />

Handle: 2<br />

User: CN=Flemming Nielsen/O=<strong>Intoint</strong><br />

Server: dev01<br />

Database: Action\afdeling<br />

Form:<br />

View:<br />

29


DocId: 0<br />

3.9 Oplysninger om Notes design<br />

Man kan komme i situationer, hvor man er interesseret i at kunne forespørge om et felt, form eller et<br />

view findes i en Notes database eller man er interesseret i at få en liste med eksisterende designelementer.<br />

Integrationskittet stiller en række macroer til rådighed, der kan give disse informationer. Der kan<br />

forespørges på navne på felter, forms og views.<br />

Fremgangsmåden er den samme for alle tre designelementtyper. For at kunne forespørge, skal<br />

grundlaget for forespørgslen være forberedt. Ønsker man f.eks. at forespørge på en form, skal man<br />

først være logget på databasen. Ønsker man at forespørge på et felt, skal formen først være udpeget.<br />

3.9.1 Forespørgsel på eksistens af designelement navn<br />

Med følgende macroer er det muligt at forespørge på eksistensen af designelementer:<br />

#NotesExistsField, #NotesExistsForm og #NotesExistsView.<br />

Returneres værdien "1" findes designelementet i Notes. Returneres "0" findes det ikke. Returneres<br />

andre værdier, er dette fejlkoder.<br />

Bemærk at disse macroer er ikke case-sensitive. #NotesExistsFieldName("Body") og<br />

#NotesExistsFieldName("body") vil altså returnere samme svar på mail-formen "Memo".<br />

3.9.2 Liste Notes designelementer<br />

Ønsker man at få listet f.eks. felter på en form eller views i en database findes der 6 macroer til<br />

dette:<br />

#NotesFirstFieldName og #NotesNextFieldName,<br />

#NotesFirstFormName og #NotesNextFormName,<br />

#NotesFirstViewName og #NotesNextViewName.<br />

En udskrift af alle felter på en form kunne f.eks. opbygges på følgende måde:<br />

30


#MacroLoad(NOTES)<br />

STR 40 &F<br />

#NotesInit<br />

#NotesOpenServer('LOCAL')<br />

#NotesLogon('mail\\xxx.nsf')<br />

#NotesForm('Memo')<br />

SET &F = #NotesFirstField<br />

WHILE &F>""<br />

PRINT &F<br />

SET &F = #NotesNextField<br />

END<br />

PAUSE<br />

Tilsvarende kørsel kan laves for forms og views.<br />

3.9.3 Type på designelement<br />

Integrationskittet giver desuden mulighed for at give information om de forskellige designelementers<br />

type.<br />

Macroen #NotesFieldType returnerer typen på et Notes felt, f.eks. "RichText" eller "Number".<br />

Macroen #NotesFormType returnerer typen på den aktuelle Notes form: "Main", "Response to<br />

Main" eller "Response to Response".<br />

Denne macro kræver at formen er valgt med #NotesForm.<br />

Et eksempel på en kørsel der lister forms og deres type i Notes help-database er listet her:<br />

#MacroLoad(NOTES)<br />

STR 40 &F<br />

#NotesInit<br />

#NotesOpenServer('LOCAL')<br />

#NotesLogon('Help4.nsf')<br />

SET &F = #NotesFirstForm<br />

WHILE &F>""<br />

#NotesForm(&F)<br />

PRINT &F," ",#NotesFormType<br />

SET &F = #NotesNextForm<br />

END<br />

PAUSE<br />

Der findes p.t. ingen tilsvarende funktioner til Notes views i <strong>integrationskit</strong>tet.<br />

Derimod findes macroen #NotesDatabaseTitle som returnerer det fulde navn på den aktuelle database<br />

(ikke blot filnavnet (se #NotesDatabaseName) ).<br />

31


3.10 Fejlsøgning<br />

Integrationskittet stiller forskellige faciliteter til rådighed, som kan hjælpe med problemer ved udvikling<br />

af applikationer med integration mellem CONCORDE og Lotus Notes.<br />

De fleste macroer returnerer en returkode i &NotesText. Denne variabel kan så testes efter kaldet<br />

og eventuelle fejl kan behandles.<br />

Her et eksempel:<br />

#NotesInit<br />

#NotesOpenServer(&Server)<br />

IF &NotesText "" THEN<br />

SET BOX(1, "Fejl ved åbning af "+&Server,1)<br />

RETURN 0<br />

ENDIF<br />

3.10.1 Fejl-beskeder<br />

Når man har defineret og testet sin integrationsopgave, vil det kun være i sjældne tilfælde, at der<br />

opstår fejl (som f.eks. hvis Domino serveren er lukket ned). Normalt vil fejlmeldinger fra DLL’en<br />

derfor blive vist i en besked-box.<br />

Ønsker man at afvikle en kørsel uovervåget og er man derfor interesseret i at kørslen IKKE må<br />

afbrydes af fejl-beskeder, kan man med kommandoen #NotesMessages slå fejl-meldinger fra og<br />

til. Hvis fejlmeldinger slås fra, bør man naturligvis være meget omhyggelig med håndtering af eventuelle<br />

fejlmuligheder i sin XAL-kode.<br />

Med kommandoen #NotesGetMessages, kan man få oplyst, om visning af fejlbeskeder er aktiveret.<br />

3.10.2 Debugning til skærm<br />

Da XAL komminikerer med Lotus Notes via en DLL, har man ikke mulighed for at se hvad der sker,<br />

fra XAL laver et kald til Lotus Notes og til kaldet returnerer.<br />

Med macroen #NotesDebug kan man aktivere en funktion, som viser forskellige detaljer kald fra<br />

DLL'en som integrerer med Lotus Notes. Disse oplysninger kommer direkte fra DLL'en og vises<br />

derfor i separate Windows vinduer. Funktionen slås til med #NotesDebug("1") og slås fra med<br />

#NotesDebug("0"). Funktionen kan også deaktiveres ved at vælge "Cancel" i debug-vinduerne.<br />

Aktivering af debug berører alle sessions – ikke kun den aktuelle.<br />

Nedenfor er vist et eksempel på information fra DLL'en:<br />

32


3.10.3 Debugning til log-fil<br />

Ønsker man at få overvåget et system og har man ikke mulighed for løbende at overvåge skærmen<br />

eller indeholder debugningen så mange informationer at det er uoverskueligt at håndtere via dialogboxene,<br />

er det muligt at sende debug-information til en log-fil.<br />

Med kommandoen #NotesLogFilNavn kan man angive navnet på denne logfil. #NotesClearLog<br />

tømmer log-filen. Kaldes NotesLogFilNavn med en tom streng returneres til default logfil-opsætning.<br />

Aktivering af debug-logning til fil sker med #NotesDLLLog(”1”), mens deaktivering sker med<br />

#NotesDLLLog(”0”)<br />

Aktivering af log berører alle sessions.<br />

33


4. Reference<br />

I dette afsnit gennemgås alle macroer.<br />

Beskrivelsen af hver macro følger følgende skabelon<br />

Macro-navn<br />

Syntaks<br />

Beskrivelse af hvorledes macro kaldes.<br />

Parametre angives i parenteser.<br />

Parameterværdier angives i kantede parenteser (). Indholdet imellem<br />

de kantede parenteser, skal erstattes med den aktuelle værdi.<br />

F.eks. kan #NotesDeleteID() i praksis se ud som<br />

#NotesDeleteID("00003A08") eller #NotesDeleteID(&ID)<br />

Parametre skal være konstanter (tekstværdier i "" eller variabler &xx).<br />

Funktioner og beregninger kan ikke overføres (f.eks. er følgende ikke<br />

gyldigt: #NotesForm("Test "+&FormNavn))<br />

Parameterværdier der er optionelle (brug af parameter er valgfri)<br />

angives med firkantede parenteser.<br />

F.eks. kan #NotesForm[()] kaldes både med macroen<br />

#NotesForm("Memo") og blot som #NotesForm<br />

Input<br />

Input-parametre, type angives i parentes (normalt "text")<br />

Output<br />

Evt. output parametre.<br />

Returneres værdi direkte (funktion) angives dette som "direkte" ellers<br />

angives hvilken variabel hvori returværdi returneres, normalt<br />

"&NotesText", ,desuden angives type i parentes (normalt "text").<br />

Funktion<br />

Gennemgang af hvad macroen udfører<br />

34


Eksempel<br />

Evt. eksempel på brug af macroen.<br />

Dette afsnit kan være udeladt, hvis et eksempel er skønnet overflødigt.<br />

Eksemplerne vil ofte kun vise brudstykker af et program. Specielt er<br />

initialiserings- og afslutningsmacroer normalt udeladt.<br />

Fejlkoder<br />

Evt. fejlkoder. Disse kan og bør checkes efter kald af macro, så XALkoden<br />

kan håndtere evt. fejl.<br />

Fejlkoder returneres altid i &NotesText<br />

Er der ingen mulige fejlkoder, er dette afsnit ikke vist.<br />

Afsnit<br />

Afsnit hvor brugen af macro er beskrevet<br />

Se også<br />

Evt. henvisninger til relaterede macroer og afsnit<br />

Macroerne listes alfabetisk.<br />

35


#NotesAddQueryField<br />

Syntaks<br />

#NotesAddQueryField()<br />

Input<br />

(Text)<br />

1. parameter: Feltnavn i Notes, som skal medtages ved næste Query<br />

Output<br />

Ingen<br />

Funktion<br />

Angiver et Notes-felt som skal medtages i kommafil ved næste kald af<br />

#NotesQuery. Kommafil vil dog altid have DocId som første felt. Efterfølgende<br />

felt-værdier listes i den rækkefølge hvori #NotesAddQuery-<br />

Field er kaldt.<br />

Eksempel<br />

#NotesClearQueryFields<br />

#NotesAddQueryField("Nummer")<br />

#NotesAddQueryField("Navn")<br />

#NotesQuery("Nummer>'100'")<br />

Fejlkoder<br />

"1": Felt findes ikke på form<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"3": Intet aktivt dokument<br />

”4”: Maksimum antal søgefelter oversteget.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

Se også<br />

#NotesClearFields<br />

#NotesQuery<br />

36


#NotesAppendFieldValue<br />

Syntaks<br />

#NotesAppendFieldValue(,[,"COMMIT"])<br />

Input<br />

(Text,Text[,Text])<br />

1. Parameter: Navn på felt i Notes, hvortil værdi skal appendes<br />

2. Parameter: Værdi<br />

3. Parameter: Evt. angivelse af umiddelbar commit<br />

Output<br />

Ingen<br />

Funktion<br />

Denne macro tilføjer værdien angivet i anden parameter til feltet angivet<br />

i første parameter. Husk Notes’ feltnavn er case-sensitive. Værdi<br />

(2. parameter) skal altid være at typen text. Konvertér evt. andre formater<br />

til text, inden kald af macro. Eksisterende indhold i feltet overskrives<br />

ikke med denne macro.<br />

Angives "COMMIT" som tredje parameter gemmes værdien i Notes<br />

umiddelbart. Dette er anvendeligt ved en enkelt opdatering.<br />

#NotesAppendFieldValue benyttes oftest ved multivalue-felter. Husk i<br />

det tilfælde at angive skille-tegn (f.eks. ";" - se #NotesSetListDelim(.<br />

Alternativt kan funktionen #NotesAppendMultiValue benyttes – hvis<br />

der er tale om tekst-værdier i Lotus Notes<br />

Eksempel<br />

#NotesSelectID(F.NotesDocID)<br />

#NotesSetFieldValue("Number","Værdi<br />

1")<br />

#NotesAppendFieldValue("Number","Værdi 2","Commit")<br />

Fejlkoder<br />

"1": Felt kendes ikke på form.<br />

"2": Form ikke angivet, brug #NotesForm<br />

"3": Ingen felter på form.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

Se også<br />

#NotesSetFieldValue<br />

#NotesAppendMultiValue<br />

#NotesSetListDelim<br />

37


#NotesAppendMultiValue<br />

Syntaks<br />

#NotesAppendMultiValue(,[,"COMMIT"])<br />

Input<br />

(Text,Text[,Text])<br />

4. Parameter: Navn på felt i Notes, hvortil værdi skal appendes<br />

5. Parameter: Værdi<br />

6. Parameter: Evt. angivelse af umiddelbar commit<br />

Output<br />

Ingen<br />

Funktion<br />

Denne macro tilføjer værdien angivet i anden parameter til feltet angivet<br />

i første parameter. Værdi (2. parameter) skal altid være at typen<br />

text. Konvertér evt. andre formater til text, inden kald af macro. Eksi<br />

sterende indhold i feltet overskrives ikke med denne macro.<br />

Benyt denne macro til at tilføje en værdi til et multivalue felt i Lotus<br />

Notes. Værdien vil altid blive tilføjet som ny multivalue i Lotus Notes.<br />

Angives "COMMIT" som tredje parameter gemmes værdien i Notes<br />

umiddelbart. Dette er anvendeligt ved en enkelt opdatering.<br />

Eksempel<br />

#NotesSelectID(F.NotesDocID)<br />

#NotesSetFieldValue("Number","Værdi 1")<br />

#NotesAppendMultiValueValue("Number","Værdi 2","Commit")<br />

Fejlkoder<br />

"1": Felt kendes ikke på form.<br />

"2": Form ikke angivet, brug #NotesForm<br />

"4": Ingen aktiv dokument.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

Se også<br />

#NotesAppendFieldValue<br />

#NotesSetFieldValue<br />

#NotesSetListDelim<br />

38


#NotesAttachFile<br />

Syntaks<br />

#NotesAttachFile([,])<br />

Input<br />

(Text, Text)<br />

1. parameter: Filnavn på fil der skal attaches.<br />

2. parameter: Evt. navn på attachment, udelades denne parameter<br />

får attachment samme navn som filnavn (excl. foranstillet<br />

path).<br />

Output<br />

Ingen<br />

Funktion<br />

Attacher fil angivet i første parameter på det aktuelle dokument (bemærk<br />

at det ikke attaches til et specifikt rich-text felt, kun til selve<br />

dokumentet). Attachment vil fremgå nederst på Notes dokumentet<br />

med filnavnet. Hvis anden parameter angives, får attachmentet dette<br />

navn i Notes dokumentet. Dette kan f.eks. bruges til et mere beskrivende<br />

navn.<br />

Eksempel<br />

#NotesGetUnique("Nummer","123")<br />

#NotesAttachFile("c:\\autoexec.bat","Opstart")<br />

Fejlkoder<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"3": Intet aktivt dokument.<br />

"98": Filen angivet i 1. parameter findes ikke eller kan ikke<br />

læses.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.7<br />

Se også<br />

#NotesDetachFile<br />

#NotesDeleteAttachment<br />

#NotesMailAttachFile<br />

39


#NotesClearLog<br />

Syntaks<br />

#NotesClearLog<br />

Input<br />

Ingen<br />

Output<br />

Ingen<br />

Funktion<br />

Nulstiller og tømmer aktuel log-fil.<br />

Eksempel<br />

#NotesLogFilNavn(‘debug.log’)<br />

#NotesClearLog<br />

#NotesDLLLog(‘1’)<br />

#NotesDebug(‘1’)<br />

#NotesSearchView(‘1234’)<br />

Afsnit<br />

3.10.3<br />

Se også<br />

#NotesDLLLog<br />

#NotesLogFilNavn<br />

#NotesDebug<br />

40


#NotesClearQueryFields<br />

Syntaks<br />

#NotesClearQueryFields<br />

Input<br />

Ingen<br />

Output<br />

Ingen<br />

Funktion<br />

Nulstiller liste med felter der skal medtages i næste #NotesQuery.<br />

Eksempel<br />

#NotesClearQueryFields<br />

#NotesAddQueryField("Nummer")<br />

#NotesAddQueryField("Navn")<br />

#NotesQuery("Nummer>'100'")<br />

Se også<br />

#NotesAddQueryField<br />

#NotesQuery<br />

41


#NotesClose<br />

Syntaks<br />

#NotesClose<br />

Input<br />

Ingen<br />

Output<br />

Ingen<br />

Funktion<br />

Afslutter session med Lotus Notes. Efter udførelse af macro, skal<br />

man udføre #NotesLogon igen for at kommunikere med Notes.<br />

Fejlkoder<br />

Ingen til behandling i XAL<br />

Kontakt Deres forhandler, hvis fejlværdi returneres i &NotesText.<br />

Afsnit<br />

3.2.3<br />

Se også<br />

#NotesLogon<br />

42


#NotesCommit<br />

Syntaks<br />

#NotesCommit<br />

Input<br />

Ingen<br />

Output<br />

(Text)<br />

Hvis &NotesText > "99" indeholdes heri det DocId det opdaterede<br />

dokument har i Notes.<br />

Er &NotesText mindre eller lig "99" indeholdes en fejlkode.<br />

Funktion<br />

Opdatering af ændringer i Lotus Notes. Først når denne macro udføres<br />

gemmes data i Lotus Notes. Man kan kun operere med eet aktivt<br />

dokument. Skift til nyt aktuelt dokument vil medføre, at ændringer ikke<br />

opdateres, med mindre #NotesCommit kaldes.<br />

Eksempel<br />

#NotesGetUnique("Nummer","123")<br />

#NotesSetFieldValue("Navn","Regneark")<br />

#NotesSetFieldValue("Ansvarlig","HKR")<br />

#NotesCommit<br />

#NotesGetUnique("Nummer","124")<br />

Fejlkoder<br />

"1": Ingen data at gemme - mangler f.eks. at angive<br />

feltværdier eller kald af commit uden aktuelt dokument<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.5.4<br />

Se også<br />

#NotesCreateNew<br />

#NotesSetFieldValue<br />

#NotesDeleteCurrent<br />

#NotesDeleteID<br />

43


#NotesCommitNoRecalc<br />

Syntaks<br />

#NotesCommitNoRecalc<br />

Input<br />

Ingen<br />

Output<br />

(Text)<br />

Hvis &NotesText > "99" indeholder &NotestText det opdaterede dokuments<br />

Notes DocId.<br />

Er &NotesText mindre eller lig "99" indeholdes en fejlkode.<br />

Funktion<br />

Svarer til #NotesCommit (se denne). Dog vil formler på formen ikke<br />

gen-beregnes ved skrivning af dokument.<br />

Fejlkoder<br />

"1": Ingen data at gemme - mangler f.eks. at angive<br />

feltværdier eller kald af commit uden aktuelt dokument.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.5.4<br />

Se også<br />

#NotesCommit<br />

44


#NotesCompareField<br />

Syntaks<br />

#NotesCompareField(,)<br />

Input<br />

(Text, Text)<br />

1. parameter: Feltnavn i Notes der skal sammenlignes med<br />

2. parameter: Værdi fra XAL der skal sammenlignes med<br />

Output<br />

(Boolean: Direkte)<br />

0: Feltværdi i Notes er forskellig fra 2. parameter<br />

1: Feltværdien i Notes er den samme som 2. parameter<br />

Funktion<br />

Sammenligner værdien af Notes-feltet udpeget med 1. parameter<br />

med værdien af 2. parameter. Returnerer 1 (TRUE) hvis de er ens.<br />

Nyttig ved minimering af opdateringer og for at undgå at opdatere<br />

unødvendigt og dermed fjerne "read"-marks.<br />

Bemærk at værdien aflæses direkte og ikke i &NotesText<br />

Eksempel<br />

Introduce Afdeling[NumIdx,&Nummer]<br />

#NotesGetUnique("AfdNummer",Nummer)<br />

IF StrLen(&NotesText)>2 THEN<br />

IF #NotesCompareField("AfdNavn",Navn] THEN<br />

PRINT "Afdeling ",Nummer," er OK i Notes"<br />

ENDIF<br />

ENDIF<br />

Fejlkoder<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"3": Felt findes ikke på Notes-form<br />

”99”: Fejl i parametre.<br />

Afsnit<br />

3.3<br />

Se også<br />

#NotesQueryField<br />

45


#NotesConnect<br />

Syntaks<br />

#NotesConnect<br />

Input<br />

Ingen<br />

Output<br />

Ingen<br />

Funktion<br />

Samlet etablering af forbindelse til Lotus Notes med standardværdier.<br />

Disse værdier er gemt i de globale variable:<br />

&NotesServer, &NotesDatabase, &NotesForm og &NotesView<br />

Macroen udfører et kald af følgende macroer (uden parametre):<br />

#NotesOpenServer, #NotesLogon, #NotesForm og #NotesView<br />

Fejlkoder<br />

Returnerer fejlkode fra fejl i de kaldte macroer.<br />

Afsnit<br />

Fejl! Henvisningskilde ikke fundet.<br />

Se også<br />

#NotesOpenServer<br />

#NotesLogon<br />

#NotesForm<br />

#NotesView<br />

46


#NotesCreateNew<br />

Syntaks<br />

#NotesCreateNew([“NoCommit”])<br />

Input<br />

(Text)<br />

1. parameter: NOCOMMIT - Evt. angivelse at tomt dokument ikke<br />

skal gemmes ved oprettelse<br />

Output<br />

(Text: &NotesText)<br />

Hvis &NotesText > "99" indeholdes heri DocId på det nye dokument.<br />

Er &NotesText mindre eller lig "99" indeholdes en fejlkode.<br />

Funktion<br />

Opretter et nyt tomt dokument. Udfyld værdier med #NotesSetField-<br />

Value og gem dokumentet med #NotesCommit.<br />

Dokumentet oprettes i den aktuelle form (#NotesForm). Hvis formtypen<br />

i Notes er et "response-to-response document", vil den nye<br />

form blive oprettet som et response-dokument til det aktuelle dokument.<br />

Tilsvarende bliver et "response-document" oprettet som response-document<br />

til hoveddokumentet.<br />

Bemærk at det nye dokument committes automatisk med denne kommando,<br />

der gemmes altså et tomt Notes-dokument.<br />

Eksempel<br />

#NotesCreateNew<br />

#NotesSetFieldValue("Nummer","125")<br />

#NotesCommit<br />

Fejlkoder<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.5.1<br />

Se også<br />

#NotesForm<br />

#NotesFormName<br />

#NotesSetFieldValue<br />

#NotesCommit<br />

47


#NotesDatabaseName<br />

Syntaks<br />

#NotesDatabaseName<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

Filnavn på aktuelle Notes database<br />

Funktion<br />

Returnerer aktuel database-filnavn, som er sat med #NotesLogon<br />

eller #NotesOpenDialog.<br />

Eksempel<br />

PRINT "Aktuel database: ",#NotesDatabaseName<br />

PAUSE<br />

Afsnit<br />

3.3.1<br />

Se også<br />

#NotesLogon<br />

#NotesOpenDialog<br />

48


#NotesDatabaseTitle<br />

Syntaks<br />

#NotesDatabaseTitle<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

Titel på aktuelle Notes database<br />

Funktion<br />

Returnerer aktuelt database titel, ikke at forveksle med database<br />

navn som angiver databasens filnavn.<br />

Kan først udføres efter brug af #NotesLogon.<br />

Eksempel<br />

#NotesLogon(‘help4.nsf’)<br />

PRINT "Databasefil...: ",#NotesDatabase<br />

PRINT "Databasetitel.: ",#NotesDatabaseTitle<br />

PAUSE<br />

Fejlkoder<br />

"2": Der er ikke valgt en database<br />

Afsnit<br />

3.3.1<br />

Se også<br />

#NotesDatabaseName<br />

49


#NotesDebug<br />

Syntaks<br />

#NotesDebug({"0"|"1"})<br />

Input<br />

(Text)<br />

Angivelse af om debug skal aktiveres ("1") eller deaktiveres ("0").<br />

Output<br />

Ingen<br />

Funktion<br />

Aktiverer funktion, så alle kald til DLL'en vises i Windows. Desuden vil<br />

yderligere oplysninger ofte vises, hvis DLL-funktionen er kompleks.<br />

Eksempel<br />

#NotesDebug("1")<br />

#NotesQuery('Form="Memo"')<br />

#NotesDebug("0")<br />

Afsnit<br />

3.10.2<br />

Se også<br />

#NotesDLLLog<br />

50


#NotesDelay<br />

Syntaks<br />

#NotesDelay()<br />

Input<br />

(Text)<br />

Angivelse af forsinkelse i millisekunder mellem hvert DLL Notes-kald.<br />

Output<br />

Ingen<br />

Funktion<br />

For at undgå at belaste Lotus Domino servere ved opdatering kan<br />

man, med #NotesDelay angive en pause mellem hvert DLL kald til<br />

Lotus Notes/Domino. Pausen angives i millisekunder. Typisk 10-100<br />

ms. Opdateringen bliver herved lidt langsommere, men man kan<br />

undgå at serveren bliver meget langsom.<br />

Angivelse af ”0” som parameter slår forsinkelse fra.<br />

Eksempel<br />

#NotesDelay("100")<br />

#NotesSearchFirst<br />

WHILE StrLen(&NotesText) > 2<br />

#NotesSetFieldValue("Name",DebTable.Name)<br />

#NotesCommit<br />

#NotesSearchNext<br />

END<br />

#NotesDelay("0")<br />

51


#NotesDeleteAttachment<br />

Syntaks<br />

#NotesDeleteAttachment[()]<br />

Input<br />

(Text)<br />

1. parameter: Evt. navn på attachment, udelades denne parameter<br />

slettes alle attachment på dokumentet (ekskl. attachments i<br />

rich-text felter)<br />

Output<br />

Ingen<br />

Funktion<br />

Fjerner et eller alle attachments på aktuelle Notes dokument. Bemærk<br />

at det er attachment-navnet der angives. Angives ingen parametre<br />

fjernes alle attachments.<br />

Hvis et attachment er gemt af brugeren direkte på et rich-text felt, vil<br />

ikonet på attachmentet ikke blive slettet. Selve attachmentet bliver<br />

slettet.<br />

Eksempel<br />

#NotesGetUnique("Nummer","123")<br />

#NotesDeleteAttachment("Opstart") {Fjern gl.}<br />

#NotesAttachFile("c:\\autoexec.bat","Opstart")<br />

Fejlkoder<br />

"1": Der findes ikke attachment med det angivne navn på<br />

det<br />

aktuelle dokument.<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"3": Intet aktivt dokument.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.7<br />

Se også<br />

#NotesDetachFile<br />

#NotesAttachFile<br />

52


#NotesDeleteCurrent<br />

Syntaks<br />

#NotesDeleteCurrent<br />

Input<br />

Ingen<br />

Output<br />

Ingen<br />

Funktion<br />

Sletter aktuelle dokument. Slettes først endeligt ved kald af #NotesCommit.<br />

Eksempel<br />

#NotesForm("Afdeling")<br />

#NotesgetUnique("Nummer","125")<br />

#NotesDeleteCurrent<br />

#NotesCommit<br />

Fejlkoder<br />

"1": Intet aktivt dokument at slette, brug f.eks. #NotesGetUnique<br />

"2": Form ikke angivet, brug #NotesForm<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.5.3<br />

Se også<br />

#NotesDeleteID<br />

#NotesCommit<br />

53


#NotesDeleteID<br />

Syntaks<br />

#NotesDeleteID()<br />

Input<br />

(Text)<br />

Entydigt DocId på dokument der skal slettes.<br />

Output<br />

Ingen<br />

Funktion<br />

Sletter et dokument ved udpegning af dokument-ID. DocId kan f.eks.<br />

<strong>hent</strong>es ved #NotesQuery eller ved at gemme DocId i et felt på XALkartotek.<br />

Eksempel<br />

SEARCH Afdeling WHERE Nummer < "1000"<br />

#NotesDeleteID(Afdeling.NotesDocID)<br />

DELETE Afdeling<br />

END<br />

Fejlkoder<br />

"1": DocId er forkert.<br />

"2": Form er ikke angivet, brug #NotesForm<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.5.3<br />

Se også<br />

#NotesSelectID<br />

#NotesDeleteCurrent<br />

#NotesCommit<br />

54


#NotesDeleteTempFil<br />

Syntaks<br />

# NotesDeleteTempFil<br />

Input<br />

Ingen<br />

Output<br />

Ingen<br />

Funktion<br />

Sletter en temporær fil der benyttes ved f.eks. #NotesQuery.<br />

Eksempel<br />

...<br />

#NotesTmpFilNavn(&FileName)<br />

#NotesQuery(&Qstr)<br />

READ &FileName AS TEXT INTO<br />

...<br />

END<br />

#NotesDeleteTempFil<br />

Fejlkoder<br />

Afsnit<br />

3.3.3<br />

Se også<br />

#NotesTmpFilNavn<br />

#NotesGetTmpFilNavn<br />

55


#NotesDetachFile<br />

Syntaks<br />

#NotesDetachFile([,])<br />

Input<br />

(Text, Text)<br />

1. parameter: Filnavn på fil der skal detaches til.<br />

2. parameter: Evt. navn på attachment der skal detaches. Udelades<br />

denne parameter detaches attachment med samme<br />

navn som 1. parameter (excl. foranstillet path).<br />

Output<br />

Ingen<br />

Funktion<br />

Detacher attachment angivet i evt. anden parameter på aktuelle dokument.<br />

Hvis anden parameter ikke angives, udvælges attachment<br />

med samme navn som filnavnet angivet i første parameter. Attachment<br />

detaches til fil angivet i første parameter.<br />

Eksempel<br />

#NotesAttachFile("c:\\original","Temp")<br />

#NotesDetachFile("c:\\kopi","Temp")<br />

#NotesDeleteAttachment("Temp")<br />

Fejlkoder<br />

"1": Der findes ikke attachment med det angivne navn på<br />

det<br />

aktuelle dokument.<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"98": Filnavn ikke angivet.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.7<br />

Se også<br />

#NotesAttachFile<br />

#NotesDeleteAttachment<br />

56


#NotesDLLVersion<br />

Syntaks<br />

#NotesDLLVersion<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

Versionsnummer og dato - f.eks. "1.0.1.34 - 01.05.2003"<br />

Funktion<br />

Returnerer aktuel version og frigivelsesdato på det Windows programbibliotek<br />

(ERP2LN.DLL), som varetager kommunikationen med<br />

Lotus Notes.<br />

Eksempel<br />

PRINT "DLL version: ",#NotesDLLVersion<br />

PAUSE<br />

Afsnit<br />

3.3.2<br />

57


#NotesDocID<br />

Syntaks<br />

#NotesDocID<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

DocId på aktivt dokument i Notes.<br />

Funktion<br />

Returnerer DocId på det aktive dokument i Notes. Et dokument kan<br />

gøres aktivt med #NotesGetUnique, #NotesSelectID, og #NotesQueryUnique.<br />

Kan benyttes til check af om et dokument er aktivt, inden der opereres<br />

på dokumentet.<br />

Eksempel<br />

IF #NotesDocID>"" THEN<br />

#NotesSetFieldValue("Nummer","1234")<br />

ENDIF<br />

Afsnit<br />

3.5.5<br />

58


#NotesExistsAttach<br />

Syntaks<br />

#NotesExistsAttach ()<br />

Input<br />

(Text)<br />

Navn på det attachment man ønsker at checke, om eksisterer på det<br />

aktuelle dokument.<br />

Output<br />

Ingen<br />

Funktion<br />

Bruges til at checke om der findes et attachment med det angivne<br />

navn på det udvalgte dokument.<br />

Eksempel<br />

#NotesSearchFirst<br />

IF #NotesExistsAttachment(&AttName) THEN<br />

#NotesDetachFile(&AttName)<br />

ENDIF<br />

Fejlkoder<br />

"0": Attachment findes IKKE på det aktuelle dokument.<br />

"1": Attachment FINDES på det aktuelle dokument.<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"3": Dokument ikke udpeget.<br />

"98": Attachmentnavn ikke angivet.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.7<br />

Se også<br />

#NotesAttachFile<br />

#NotesDetachFile<br />

#NotesDeleteAttachment<br />

59


#NotesExistsField<br />

Syntaks<br />

#NotesExistsField ()<br />

Input<br />

(Text)<br />

Navn på det felt man ønsker at checke, om eksisterer på den aktuelle<br />

form.<br />

Output<br />

(Text: Direkte)<br />

"0": Der findes ikke et felt med dette navn på formen<br />

"1": Feltet eksisterer<br />

>"1": Fejlværdi<br />

Funktion<br />

Bruges til at checke om der findes et felt med det angivne navn på<br />

den aktuelle form. Feltet behøves ikke nødvendigvis at findes på det<br />

aktuelle dokument, blot på designet af formen. Man skal ikke nødvendigvis<br />

have udpeget et aktuelt dokument for at benytte macroen. Man<br />

skal dog have udpeget hvilken form man bruger (#NotesForm)<br />

Eksempel<br />

#NotesSelectID("000013E0")<br />

IF #NotesExistsField("Nummer")=="1" THEN<br />

#NotesSetFieldValue("Nummer","22")<br />

ENDIF<br />

Fejlkoder<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.9.1<br />

Se også<br />

#NotesExistsForm<br />

#NotesExistsView<br />

#NotesFirstField<br />

60


#NotesExistsForm<br />

Syntaks<br />

#NotesExistsForm()<br />

Input<br />

(Text)<br />

Navn på den form man ønsker at checke, om eksisterer i den aktuelle<br />

database. Man kan også benytte en af formens aliaser.<br />

Output<br />

(Text: Direkte)<br />

"0": Der findes ikke en form med dette navn i databasen<br />

"1": Formen findes i databasen<br />

>"1": Fejlværdi<br />

Funktion<br />

Bruges til at checke om der findes en form med det angivne navn i<br />

den aktuelle database. Man skal have udpeget databasen inden<br />

macroen kaldes (brug #NotesLogon).<br />

Eksempel<br />

IF #NotesExistsForm("Demo")=="1" THEN<br />

#NotesForm("Demo")<br />

ELSE<br />

PRINT "Formen ‘Demo’ er ikke oprettet"<br />

ENDIF<br />

PAUSE<br />

Fejlkoder<br />

"2": Mangler at logge på database<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.9.1<br />

Se også<br />

#NotesExistsField<br />

#NotesExistsView<br />

#NotesFirstForm<br />

61


#NotesExistsView<br />

Syntaks<br />

#NotesExistsView()<br />

Input<br />

(Text)<br />

Navn på det view man ønsker at checke, om eksisterer i den aktuelle<br />

database. Man kan også benytte et af viewets aliaser.<br />

Output<br />

(Text: Direkte)<br />

"0": Der findes ikke et view med dette navn i databasen<br />

"1": Viewet findes i databasen<br />

>"1": Fejlværdi<br />

Funktion<br />

Bruges til at checke om der findes et view med det angivne navn i<br />

den aktuelle database. Man skal have udpeget databasen inden<br />

macroen kaldes (brug #NotesLogon).<br />

Eksempel<br />

IF #NotesExistsView("All")=="1" THEN<br />

#NotesView("All")<br />

ELSE<br />

PRINT "Viewet ‘All’ skal defineres i Notes"<br />

ENDIF<br />

PAUSE<br />

Fejlkoder<br />

"2": Mangler at logge på database<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.9.1<br />

Se også<br />

#NotesExistsField<br />

#NotesExistsForm<br />

#NotesFirstView<br />

62


#NotesFieldType<br />

Syntaks<br />

#NotesFieldType([])<br />

Input<br />

(Text)<br />

Evt. angivelse af Notes feltnavn.<br />

Output<br />

(Text: Direkte)<br />

Notes felttype for feltet. Evt. fejlkode.<br />

Funktion<br />

Benyttes til at aflæse hvilken type feltet har i Notes, f.eks. Rich-text<br />

eller Number. En komplet liste over felttyper der kan returneres er<br />

listet i Appendix 3.<br />

Angives ingen parametre bruges aktuelt felt (#NotesSetField).<br />

Form skal være valgt med #NotesForm inden brug af macro.<br />

Eksempel<br />

#NotesForm("Test")<br />

#NotesGetUnique("Nummer","SALG")<br />

IF #NotesFieldType("Dato")=="DateTime" THEN<br />

SET &D = Date2Str(Today(),123,2,3,2,3,2)<br />

#NotesSetFieldValue("Dato",&D)<br />

ENDIF<br />

Fejlkoder<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.9.3<br />

Se også<br />

#NotesFormType<br />

63


#NotesFirstField<br />

Syntaks<br />

#NotesFirstField<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

Navn på første felt på den aktuelle forms design<br />

Funktion<br />

Udpeger det første felt defineret på formen (ikke den aktuelle form<br />

men på designet) og returnerer navnet på feltet.<br />

Denne macro er, i kombination med #NotesNextField, velegnet ved<br />

indlæsning fra kommafil efter brug af #NotesQuery.<br />

Eksempel<br />

SET &F = #NotesFirstField<br />

WHILE &F’’<br />

PRINT &F<br />

SET &F = #NotesNextField<br />

END<br />

Fejlkoder<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.9.2<br />

Se også<br />

#NotesNextField<br />

#NotesFirstForm<br />

#NotesFirstView<br />

64


#NotesFirstForm<br />

Syntaks<br />

#NotesFirstForm<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

Navn på første form i den aktuelle database.<br />

Funktion<br />

Udpeger den første form i den aktuelle database og returnerer navnet<br />

på formen.<br />

Der returneres både navne på almindelige forms, subforms og billeder<br />

(images).<br />

Der skal være foretaget valg af database med #NotesLogon forinden.<br />

Eksempel<br />

SET &F = #NotesFirstForm<br />

WHILE &F’’<br />

PRINT &F<br />

SET &F = #NotesNextForm<br />

END<br />

Fejlkoder<br />

"2": Mangler at logge på database.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.9.2<br />

Se også<br />

#NotesNextForm<br />

#NotesFirstField<br />

#NotesFirstView<br />

65


#NotesFirstView<br />

Syntaks<br />

#NotesFirstView<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

Navn på første view i den aktuelle database<br />

Funktion<br />

Udpeger det første view i den aktuelle database og returnerer navnet<br />

på dette view.<br />

Der skal være foretaget valg af database med #NotesLogon forinden.<br />

Eksempel<br />

SET &F = #NotesFirstView<br />

WHILE &F’’<br />

PRINT &F<br />

SET &F = #NotesNextView<br />

END<br />

Fejlkoder<br />

"2": Mangler at logge på database.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.9.2<br />

Se også<br />

#NotesNextView<br />

#NotesFirstField<br />

#NotesFirstForm<br />

66


#NotesForm<br />

Syntaks<br />

#NotesForm()<br />

Input<br />

(Text)<br />

Navn på form i Lotus Notes<br />

Output<br />

Ingen<br />

Funktion<br />

Angivelse af form i Notes, som skal bruges ved operationer af Notes.<br />

Der er også mulighed for at angive et alias på formen.<br />

Eksempel<br />

#NotesForm("Person")<br />

#NotesGetUnique("Navn=’Erik Jensen’")<br />

Fejlkoder<br />

"1": Form findes ikke i Notes database. Husk at også form-<br />

navne er case-sensitive.<br />

"9": Der er ikke foretaget logon på Notes server. Brug<br />

#NotesOpenServer<br />

Afsnit<br />

3.2.2.3<br />

Se også<br />

#NotesFormName<br />

67


#NotesFormName<br />

Syntaks<br />

#NotesFormName<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

Navn på aktuel form i Lotus Notes<br />

Funktion<br />

Benyttes til at aflæse hvilken form den aktuelle session har åben i<br />

Lotus Notes.<br />

Eksempel<br />

IF #NotesFormName "Afdeling" THEN<br />

PRINT "Form ikke klargjort"<br />

ENDIF<br />

Afsnit<br />

3.3.1<br />

Se også<br />

#NotesFormName<br />

68


#NotesFormType<br />

Syntaks<br />

#NotesFormType<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

Notes formtype for aktuel form. Evt. fejlkode.<br />

Funktion<br />

Benyttes til at aflæse hvilken type den aktuelle form har i Notes.<br />

Der kan returneres følgende typer<br />

• "Main"<br />

• "Response to Main"<br />

• "Response to Response"<br />

Form skal være valgt med #NotesForm inden brug af macro.<br />

Bemærk at evt. fejlkode evt. kan returneres. Test evt. længde på<br />

returværdi.<br />

Eksempel<br />

#NotesForm("Test")<br />

PRINT "Formtype: ",#NotesFormType<br />

Fejlkoder<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.9.3<br />

Se også<br />

#NotesFormType<br />

69


#NotesGetDocInfo<br />

Syntaks<br />

#NotesGetDocInfo()<br />

Input<br />

(Text)<br />

Type af information (property) der ønskes<br />

Output<br />

(String: Direkte)<br />

Property værdi<br />

Funktion<br />

Benyttes til forespørgsel på oplysninger om aktuelle dokument. Følgende<br />

informationer kan <strong>hent</strong>es:<br />

"DOCID" DocId på aktuelt dokument<br />

"UNID" UNID<br />

"ATTACH_COUNT" Antal attachments<br />

"CREATED" Oprettelsesdato<br />

"LAST_MODIFIED" Sidste rettelse<br />

"LAST_ACCESSED" Sidste tilgang til dokument<br />

"ADDED" Tilføjet til denne replica<br />

"IS_RESPONSE" Response dokument ("0": Nej,"1": Ja)<br />

"PARENT_ID" Henvisning til Parent (ved response)<br />

Eksempel<br />

#NotesSearchFirst<br />

PRINT "Sidst rettet: ",#NotesGetDocInfo(’LAST_MODIFIED’)<br />

PAUSE<br />

Afsnit<br />

3.5.5<br />

Se også<br />

#NotesGetItemInfo<br />

70


#NotesGetFieldLength<br />

Syntaks<br />

#NotesGetFieldLength()<br />

Input<br />

(Text)<br />

Angivelse af Notes feltnavn.<br />

Output<br />

(Int: Direkte)<br />

>=0: Antal tegn i felt<br />

4000 eller anden intern fejl<br />

Afsnit<br />

3.5.5<br />

Se også<br />

#NotesGetItemInfo<br />

71


#NotesGetFieldValue<br />

Syntaks<br />

#NotesGetFieldValue()<br />

Input<br />

(Text)<br />

Angivelse af navn på felt i Notes, som man skal have værdien af.<br />

Output<br />

(Text: direkte)<br />

Feltets værdi<br />

Funktion<br />

Opslag på aktuelle dokument efter feltværdi. Dokument skal være<br />

udvalgt inden forespørgsel. Til forskel fra NotesQueryField laves intet<br />

check på om feltet findes på den aktuelle form.<br />

Eksempel<br />

#NotesGetUnique("Nummer","123")<br />

PRINT "Navn : ",#NotesGetFieldValue("Navn")<br />

PRINT "Ref : ",#NotesGetFieldValue("Ref")<br />

Afsnit<br />

3.4.5<br />

Se også<br />

#NotesPutFieldValue<br />

#NotesQueryField<br />

72


#NotesGetFoundDocs<br />

Syntaks<br />

#NotesGetFoundDocs<br />

Input<br />

Ingen<br />

Output<br />

(Int: Direkte)<br />

Antal af dokumenter fundet ved sidste søgning<br />

Funktion<br />

Returnerer antallet af fundne dokumenter ved sidste NotesQuery.<br />

Eksempel<br />

#NotesQuery("@all")<br />

PRINT "Antal dokumenter ialt:: ", #NotesGetFoundDocs<br />

PAUSE<br />

Fejlkoder<br />

-2: Form ikke aktiv, husk #NotesForm<br />

Afsnit<br />

3.4.2<br />

Se også<br />

#NotesQuery<br />

73


#NotesGetHandle<br />

Syntaks<br />

#NotesGetHandle<br />

Input<br />

Ingen<br />

Output<br />

(Number)<br />

Aktuel sessions handle nummer<br />

Funktion<br />

Returnerer den aktuelle sessions handle nummer. Relevant hvis der<br />

skiftes mellem sessions med #NotesSetHandle<br />

Eksempel<br />

IF #NotesGetHandle 2 THEN<br />

#NotesSetHandle(2)<br />

#NotesOpenServer("Local")<br />

#NotesLogon("MyDB.nsf")<br />

#NotesForm("Form 2")<br />

#NotesView("View 2")<br />

ENDIF<br />

Afsnit<br />

3.2.4<br />

Se også<br />

#NotesSetHandle<br />

74


#NotesGetItemInfo<br />

Syntaks<br />

#NotesGetItemInfo<br />

Input<br />

(Text, Text)<br />

1. parameter: Navn på felt i Notes hvorpå der skal søges<br />

2. parameter: Property der forespørges på<br />

Output<br />

(String: Direkte)<br />

Property værdi<br />

Funktion<br />

Benyttes til forespørgsel på oplysninger om et specifikt item (data) på<br />

det aktuelle dokument. Følgende informationer kan <strong>hent</strong>es:<br />

"TYPE" Datatype (TEXT, NUMBER, DATETIME...)<br />

"LENGTH" Længde af data i bytes<br />

Fejlkoder<br />

”1” Felt ikke fundet på form.<br />

”2”: Form ikke aktiv, husk #NotesForm<br />

Afsnit<br />

3.5.5<br />

Se også<br />

#NotesGetDocInfo<br />

75


#NotesGetMessages<br />

Syntaks<br />

#NotesGetMessages<br />

Input<br />

Ingen<br />

Output<br />

(String: Direkte)<br />

"0": Fejlbeskeder vises ikke.<br />

"1": Fejlbeskeder vises.<br />

Funktion<br />

Returnerer status på om fejlbeskeder vises i Windows, når der er fejl<br />

ved integrationen mellem XAL og Notes.<br />

Se nærmere beskrivelse i #NotesMessages.<br />

Afsnit<br />

3.10<br />

Se også<br />

#NotesMessages<br />

76


#NotesGetRichSepMode<br />

Syntaks<br />

#NotesGetRichSepMode<br />

Input<br />

Ingen<br />

Output<br />

(String: Direkte)<br />

"0": Rich-text felter gemmes i hoved kommafil ved #NotesQuery<br />

"1": Rich-text felter gemmes i separate kommafiler<br />

Funktion<br />

Returnerer status på hvorledes rich-text filer returneres ved #NotesQuery.<br />

Se under #NotesRichSepMode og i afsnit 3.6.2.1<br />

Afsnit<br />

3.6.2.1<br />

Se også<br />

#NotesRichSepMode<br />

77


#NotesGetTmpFilnavn<br />

Syntaks<br />

#NotesGetTmpFilnavn<br />

Input<br />

Ingen<br />

Output<br />

(String: Direkte)<br />

Navn på aktuelle temporære fil<br />

Funktion<br />

Returnerer navnet på den aktuelle temporære fil.<br />

Afsnit<br />

3.3.3<br />

Se også<br />

#NotesTmpFilNavn<br />

78


#NotesGetUnique<br />

Syntaks<br />

#NotesGetUnique(,)<br />

Input<br />

(Text, Text)<br />

1. parameter: Navn på felt i Notes hvorpå der skal søges.<br />

2. parameter: Værdi der skal bruges til opslag.<br />

Output<br />

(Text: &NotesText)<br />

Hvis &NotesText > "99" indeholdes heri DocId på det fundne dokument<br />

i Notes.<br />

Er &NotesText mindre eller lig "99" indeholdes en fejlkode.<br />

Funktion<br />

Denne macro bruges til at fremfinde et dokument i Notes via en nøgle.<br />

Nøglefeltet angives som første parameter. Der laves et opslag i<br />

Lotus Notes efter et dokument der har anden parameters værdi i<br />

feltet. Macroen returnerer en fejl, hvis opslaget finder flere dokumenter.<br />

Er der mulighed for at opslaget kan resultere i at flere dokumenter<br />

fremfindes, skal macroen #NotesQuery anvendes.<br />

Husk at Notes er case-sensitiv på feltnavne.<br />

Eksempel<br />

#Prompt "Indtast afdelingsnummer " GET(&Input)<br />

INPUT AT 10,10<br />

#PromptAbort<br />

#NotesGetUnique("Nummer",&Input)<br />

IF &NotesText>"99" THEN<br />

PRINT "Notes Ref: ", #NotesQueryField("Ref")<br />

ENDIF<br />

Fejlkoder<br />

"0": Intet dokument fundet<br />

"1": Felt findes ikke på Notes-form<br />

"2": Form ikke aktiv, husk #NotesForm<br />

"3": Ingen felter fundet på form eller mere end eet dokument<br />

fundet, Brug #NotesQuery<br />

"4": Forkert antal argumenter, der skal være 2<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.4.6<br />

Se også<br />

#NotesSelectID<br />

#NotesQuery<br />

79


#NotesIF<br />

Syntaks<br />

#NotesIF<br />

Input<br />

Ingen<br />

Output<br />

(Integer (Boolean): Direkte)<br />

0: Der er ikke etableret forbindelse til DLL-fil (endnu).<br />

1: Der er etableret forbindelse til DLL-fil.<br />

Funktion<br />

Returnerer status på forbindelse til Windows DLL programbiblioteket<br />

(ERP2LN.DLL). #NotesIF returnerer TRUE (1) efter succesfuld kald<br />

af #NotesInit.<br />

Eksempel<br />

IF #NotesIF THEN<br />

PRINT "Notes Interface er etableret"<br />

ENDIF<br />

Afsnit<br />

3.3.2<br />

Se også<br />

#NotesInit<br />

#NotesDLLVersion<br />

80


#NotesImportFile<br />

Syntaks<br />

#NotesImportFile(,)<br />

Input<br />

(Text,Text)<br />

1. parameter: Navn på rich-text felt<br />

2. parameter: Navn på fil der skal importeres<br />

Output<br />

Ingen<br />

Funktion<br />

Importerer filen angivet i 2. parameter til rich-text feltet angivet i første<br />

parameter. Benyttes til indlejring af grafik og rich-text. Kombineres<br />

med #NotesSetRichFieldValue for "almindelig" brødtekst.<br />

Den angivne fil adderes til eksisterende indhold i rich-text feltet.<br />

Bemærk at visse af de understøttede grafikformater findes i en række<br />

varianter, som ikke alle er understøttet af <strong>integrationskit</strong>tet. Det anbefales<br />

at teste eksisterende grafikprogrammers kompatibilitet (sende<br />

mail til sig selv).<br />

Eksempel<br />

#NotesSetRichFieldValue("Body","Rich text fil:")<br />

#NotesImportFile("Body","c:\\temp\\fil.rtf")<br />

#NotesSetRichFieldValue("------------")<br />

#NotesCommit<br />

Fejlkoder<br />

"1": Felt findes ikke på Notes-form<br />

"2": Form ikke aktiv, husk #NotesForm<br />

"3": Angivne felt er ikke et rich-text felt<br />

”4”: Der er ikke noget aktivt dokument.<br />

"98": Angivne fil findes ikke eller kan ikke læses.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.5.2<br />

Se også<br />

#NotesSetRichFieldValue<br />

#NotesMailBodyFile<br />

81


#NotesInit<br />

Syntaks<br />

#NotesInit[()]<br />

Input<br />

(Text)<br />

Evt. angivelse af navn på DLL-fil (optionel)<br />

Output<br />

Ingen<br />

Funktion<br />

Etablere forbindelse til det Windows programbibliotek, der varetager<br />

kommunikationen til Lotus Notes. Kald af denne macro er påkrævet<br />

for at kunne bruge integrationsmacroerne.<br />

Der er mulighed for at angive et andet navn på DLL programbiblioteket.<br />

Angives ingen parameter, bruges defaultværdien "ERP2LN".<br />

Fejlkoder<br />

"1": Fejl ved initialisering af DLL, check at DLL-filen er<br />

tilgængelig. Geninstaller evt. filen.<br />

"2": Fejl ved check-kald i DLL fil<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.2.1<br />

Se også<br />

#NotesIF<br />

#NotesDLLVersion<br />

82


#NotesIsDemoVersion<br />

Syntaks<br />

# NotesIsDemoVersion<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

”0”: IKKE en demo version af DLL<br />

”1”: DLL ER en demo version<br />

Funktion<br />

Angiver om aktuelle integrations-DLL er en demo-version (ikke slizet<br />

med korrekt kode).<br />

Afsnit<br />

3.3.2<br />

Se også<br />

#NotesDLLVersion<br />

83


#NotesDLLLog<br />

Syntaks<br />

#NotesDLLLog({"0"|"1"})<br />

Input<br />

(Text)<br />

Angivelse af om log af debuginfo skal ske til fil<br />

Output<br />

Ingen<br />

Funktion<br />

I visse situationer kan det være relevant at spore debug-information<br />

uden at skulle overvåge computeren. Med #NotesDLLLog kan man<br />

aktivere skrivning af log til fil istedet for skærm.<br />

Husk at angive navn på logfil og at deaktivere fil-log, når debug er<br />

overstået, da alle beskeder skrives til fil og altså ikke vises.<br />

Eksempel<br />

#NotesLogFilNavn(‘debug.log’)<br />

#NotesClearLog<br />

#NotesDLLLog(‘1’)<br />

#NotesDebug(‘1’)<br />

#NotesSearchView(‘1234’)<br />

#NotesDLLLog(‘0’)<br />

Afsnit<br />

3.10.3<br />

Se også<br />

#NotesClearLog<br />

#NotesLogFilNavn<br />

84


#NotesLogFilnavn<br />

Syntaks<br />

#NotesLogFilnavn[()]<br />

Input<br />

(Text)<br />

Angivelse af fil debug-logning skal ske til<br />

Output<br />

Ingen<br />

Funktion<br />

Ved brug af #NotesDLLLog benyttes denne funktion til at angive filnavn<br />

på fil hvortil log-information skal skrives.<br />

Kaldes macroen med en tom streng som filnavn anvendes default<br />

log-filnavnet (kan defineres i erp2ln.ini).<br />

Eksempel<br />

#NotesLogFileName(‘debug.log’)<br />

#NotesClearLog<br />

#NotesDLLLog(‘1’)<br />

#NotesDebug(‘1’)<br />

#NotesSearchView(‘1234’)<br />

#NotesDebug(‘0’)<br />

#NotesDLLLog(‘0’)<br />

#NotesLogFileName(‘’)<br />

Afsnit<br />

3.10.3<br />

Se også<br />

#NotesDLLLog<br />

#NotesClearLog<br />

#NotesDebug<br />

85


#NotesLogon<br />

Syntaks<br />

#NotesLogon[()]<br />

Input<br />

(Text)<br />

Evt. angivelse af databasenavn i Lotus Notes<br />

Output<br />

Ingen<br />

Funktion<br />

Åbner en session med Lotus Notes, ved angivelse af databasenavn.<br />

Ved login checker Lotus Notes brugerens rettigheder. Arbejdspladsens<br />

aktuelle opsætning (User ID, Location m.v.) bruges ved etablering<br />

af forbindelse. Er det første kontakt med Notes serveren afkræves<br />

brugerens password.<br />

Angives intet databasenavn, bruges værdien gemt i<br />

&NotesDatabase.<br />

Eksempel<br />

#NotesInit<br />

#NotesServer("Local")<br />

#NotesLogon("Afdeling")<br />

IF &NotesText>"" THEN<br />

PRINT "Fejl ved tilkobling til Afdeling på<br />

Notes server Local"<br />

ENDIF<br />

Fejlkoder<br />

"9": Logon ikke fuldført da servernavnet ikke er angivet.<br />

Benyt NotesOpenServer til at sætte servernavnet.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.2.2.2<br />

Se også<br />

#NotesDatabaseName<br />

86


#NotesMailAttachFile<br />

Syntaks<br />

#NotesMailAttachFile([,])<br />

Input<br />

(Text, Text)<br />

1. parameter: Filnavn på fil der skal attaches til aktuel mail<br />

2. parameter: Evt. navn på attachment. Udelades denne parameter<br />

får attachment samme navn som filnavn.<br />

Output<br />

Ingen<br />

Funktion<br />

Attacher fil angivet i første parameter på aktuelle mail (bemærk at<br />

filen ikke attaches til et specifikt rich-text felt, kun til selve dokumentet).<br />

Attachment vil fremgå nederst på Notes mail med filnavnet. Hvis<br />

anden parameter angives, får attachmentet dette navn i Notes mailen.<br />

Dette kan f.eks. bruges til et mere beskrivende navn.<br />

Eksempel<br />

#NotesPrepareMail("nn@acme.com","Testmail")<br />

#NotesMailBodyText(" Se denne attachment")<br />

#NotesMailAttachFile("c:\\sjov.bmp","Se her")<br />

#NotesSendMail<br />

Fejlkoder<br />

"2": Form ikke aktiv, husk #NotesForm<br />

”3”: Der er ikke noget aktivt dokument.<br />

"98": Filen angivet i 1. parameter findes ikke eller kan ikke<br />

læses.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.8.2<br />

Se også<br />

#NotesAttachFile<br />

#NotesMailBodyFile<br />

87


#NotesMailBody<br />

Syntaks<br />

#NotesMailBody()<br />

Input<br />

(Text)<br />

Brødtekst til mail<br />

Output<br />

Ingen<br />

Funktion<br />

Tilføjer tekst til mail i body-feltet. Ved gentagne kald af macroen opbygges<br />

flere linier.<br />

Denne macro skal benyttes, når man vil importere andre filformater<br />

med macroen #NotesMailBodyFile!<br />

Svarer funktionsmæssigt til #NotesMailBodyText, men er en smule<br />

langsommere, da al tekst overføres via temporær fil.<br />

Eksempel<br />

#NotesPrepareMail("nn@acme.com","Testmail")<br />

#NotesMailBody("Første linie")<br />

#NotesMailBody("Anden linie")<br />

#NotesSendMail<br />

Fejlkoder<br />

”1”: Der opstod en fejl ved åbning af mailserver og database.<br />

"98": Fejl ved skrivning til temporær fil.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.8.2<br />

Se også<br />

#NotesMailBodyText<br />

#NotesMailBodyFile<br />

88


#NotesMailBodyFile<br />

Syntaks<br />

#NotesMailBodyFile()<br />

Input<br />

(Text)<br />

Navn på fil der skal importeres i mail<br />

Output<br />

Ingen<br />

Funktion<br />

Importerer fil i aktuel mail. Benyttes til indlejring af grafik og rich-text.<br />

Kombineres med #NotesMailBody for "almindelig" brødtekst.<br />

Se nærmere i afsnit 3.8.2 for en nærmere diskussion af brugen af<br />

denne macro.<br />

Bemærk at visse af de understøttede grafikformater findes i en række<br />

varianter, som ikke alle er understøttet af <strong>integrationskit</strong>tet. Det anbefales<br />

at teste eksisterende grafikprogrammers kompatibilitet (sende<br />

mail til sig selv).<br />

Eksempel<br />

#NotesPrepareMail("nn@acme.com","Testmail")<br />

#NotesMailBody("Rich text fil:")<br />

#NotesMailBodyFile("c:\\temp\\fil.rtf")<br />

#NotesMailBodyFile("c:\\temp\\underskrift.pcx")<br />

#NotesSendMail<br />

Fejlkoder<br />

"98": Filen angivet i 1. parameter findes ikke eller kan ikke<br />

læses.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.8.2<br />

Se også<br />

#NotesMailBody<br />

#NotesMailSend<br />

89


#NotesMailBodyText<br />

Syntaks<br />

#NotesMailBodyText()<br />

Input<br />

(Text)<br />

Brødtekst til mail<br />

Output<br />

Ingen<br />

Funktion<br />

Tilføjer tekst til mail i body-feltet. Ved gentagne kald af macroen opbygges<br />

flere linier.<br />

Denne macro benyttes, når man IKKE vil importere andre filformater<br />

med macroen #NotesMailBodyFile!<br />

Svarer funktionsmæssigt til #NotesMailBody, men er hurtigere, da al<br />

udveksling til Notes sker direkte.<br />

Eksempel<br />

#NotesPrepareMail( "nn@acme.com","Testmail")<br />

#NotesMailBodyText("Første linie")<br />

#NotesMailBodyText("Anden linie")<br />

#NotesSendMail<br />

Fejlkoder<br />

"1": Forsøgt brugt i samtidigt med #NotesMailBody eller<br />

#NotesMailBodyFile. Dette kan ikke gøres i samme<br />

mail (se dog #NotesMailSend)<br />

Afsnit<br />

3.8.2<br />

Se også<br />

#NotesMailBodyText<br />

#NotesMailBodyFile<br />

#NotesMailSend<br />

90


#NotesMailErrorTo<br />

Syntaks<br />

#NotesMailBody()<br />

Input<br />

(Text)<br />

E-mail adresse på den person, som skal tilsendes alle fejlmeldinger.<br />

Output<br />

Ingen<br />

Funktion<br />

Man har mulighed for at tilsende en eller flere personer en kopi af alle<br />

fejlmeldinger fra <strong>integrationskit</strong>tet. Ved at kalde denne macro, vil alle<br />

efterfølgende fejlmeldinger på denne arbejdsstation blive e-mailet til<br />

den eller de angivne personer. Dette kan lette supporten væsentligt<br />

og samtidigt lette overvågning af f.eks. batchserver.<br />

Eksempel<br />

#NotesInit<br />

#NotesMailErrorTo("Erik Jensen/Acme")<br />

Afsnit<br />

3.8.5<br />

91


#NotesMailGetUsername<br />

Syntaks<br />

#NotesMailGetUsername<br />

Input<br />

Ingen<br />

Output<br />

(Text, Direkte)<br />

Lotus Notes brugernavn på aktuelle bruger.<br />

Funktion<br />

Returnerer fuldt kvalificeret Lotus Notes brugernavn, f.eks.:<br />

”CN=Niels Nielsen/O=<strong>Intoint</strong>”.<br />

Eksempel<br />

SET &UserName = #NotesMailGetUsername<br />

#NotesSetFieldValue("Principal",&UserName)<br />

#NotesCommit<br />

92


#NotesMailM<strong>API</strong>Password<br />

Syntaks<br />

#NotesMailM<strong>API</strong>Password()<br />

Input<br />

(Text)<br />

Password til brug ved login til M<strong>API</strong>.<br />

Output<br />

Ingen<br />

Funktion<br />

Hvis der skal benyttes password ved etablering af forbindelse til M<strong>API</strong><br />

mail system (f.eks. MS Outlook) kan dette angives med denne kommando.<br />

Eksempel<br />

#NotesMailSetM<strong>API</strong><br />

#NotesMailM<strong>API</strong>Profile("MS Exchange Settings")<br />

#NotesMailM<strong>API</strong>Password("MyPassword")<br />

Afsnit<br />

3.8.4<br />

Se også<br />

#NotesMailSetM<strong>API</strong><br />

#NotesMailM<strong>API</strong>Profile<br />

93


#NotesMailM<strong>API</strong>Profile<br />

Syntaks<br />

#NotesMailM<strong>API</strong>Profile()<br />

Input<br />

(Text)<br />

Profil til brug ved login til M<strong>API</strong>.<br />

Output<br />

Ingen<br />

Funktion<br />

For at undgå, at der manuelt skal vælges profil ved opstart af f.eks.<br />

MS Outlook, kan profilen angives med #NotesMailM<strong>API</strong>Profile.<br />

Eksempel<br />

#NotesMailSetM<strong>API</strong><br />

#NotesMailM<strong>API</strong>Profile("MS Exchange Settings")<br />

#NotesMailM<strong>API</strong>Password("MyPassword")<br />

Afsnit<br />

3.8.4<br />

Se også<br />

#NotesMailSetM<strong>API</strong><br />

#NotesMailM<strong>API</strong>Password<br />

94


#NotesMailPrepare<br />

Syntaks<br />

#NotesMailPrepare(,<br />

[,)[,]])<br />

Input<br />

(Text,Text,[Text,[Text]])<br />

1. parameter: E-mail adresse på modtager(e) af mail.<br />

2. parameter: Overskrift til mail ("Subject").<br />

3. parameter: Evt. CC på mail.<br />

4. parameter: Evt. BCC på mail.<br />

Output<br />

Ingen<br />

Funktion<br />

Klargør mail til afsendelse. Denne macro initialiserer mailen, hvor<br />

indholdet udfyldes efterfølgende med #NotesMailBodyXXX macroerne.<br />

Bemærk at 3. og 4. parameter er optionelle.<br />

E-mail adresser (også CC og BCC) kan adskilles med kommaer, så<br />

flere modtagere kan angives.<br />

Eksempel<br />

#NotesMailPrepare ("nn@acme.com,xx@acme.com",<br />

"Test","","Erik Jensen/Acme")<br />

#NotesMailBodyText("Hva så?")<br />

#NotesSendMail<br />

Afsnit<br />

3.8.1, 3.8.2<br />

Se også<br />

#NotesMailBody<br />

#NotesMailBodyText<br />

#NotesMailBodyFile<br />

#NotesMailSend<br />

95


#NotesMailSend<br />

Syntaks<br />

#NotesMailSend([])<br />

Input<br />

(Text)<br />

Evt. Navn på fil der skal importeres i mail<br />

Output<br />

Ingen<br />

Funktion<br />

Afsender klargjort mail. Angives et filnavn importeres denne i slutningen<br />

af mailens brødtekstfelt, også selvom dette er opbygget med<br />

macroen #NotesMailBodyText.<br />

Eksempel<br />

#NotesPrepareMail("nn@acme.com","Min<br />

config.sys")<br />

#NotesSendMail(‘c:\\config.sys’)<br />

Fejlkoder<br />

"1": Mail ikke klargjort (SendTo mangler)<br />

"98": Filen angivet i 1. parameter findes ikke eller kan ikke<br />

læses.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.8.3<br />

Se også<br />

#NotesMailPrepare<br />

#NotesMailBodyFile<br />

96


#NotesMailSetM<strong>API</strong><br />

Syntaks<br />

#NotesMailSetM<strong>API</strong>("0"|"1")<br />

Input<br />

(Text)<br />

Markering af om M<strong>API</strong> skal benyttes til mails.<br />

Output<br />

Ingen<br />

Funktion<br />

Angivelse af, at M<strong>API</strong> mail protokollen (benyttes bl.a. af Microsoft<br />

Outlook), skal benyttes i stedet for Lotus Notes mail.<br />

Eksempel<br />

#NotesMailSetM<strong>API</strong>("1")<br />

Afsnit<br />

3.8.4<br />

Se også<br />

#NotesMailM<strong>API</strong>Password<br />

#NotesMailM<strong>API</strong>Profile<br />

97


#NotesMessages<br />

Syntaks<br />

#NotesMessages({"0"|"1"})<br />

Input<br />

(Text)<br />

Angivelse af om fejlmeldinger skal vises på skærmen<br />

Output<br />

Ingen<br />

Funktion<br />

Denne macro muliggør at "skjule" fejlmeldinger. Dette kan være nyttigt<br />

i forbindelse med f.eks. batchopdatering og andet. Det kræver dog<br />

at man indbygger gode testfunktioner i sin XAL-kode, som aflæser<br />

&NotesText efter hver macro og reagerer på fejlsituationer.<br />

Parameter "0" frakobler fejlmeldinger. Parameter "1" tilkobler igen.<br />

Bemærk at disse "settings" er globale for hele XAL-sessionen. Brug<br />

evt. #NotesGetMessages til at aflæse aktuel værdi og sæt værdien<br />

tilbage til den oprindelige værdi efter brug.<br />

Eksempel<br />

SET &Husk = #NotesGetMessages<br />

#NotesMessages("0")<br />

#NotesSetFieldValue("Felt","eee")<br />

IF &NotesText=’’ THEN<br />

...<br />

ENDIF<br />

#NotesMessages(&Husk)<br />

Afsnit<br />

3.10.1<br />

Se også<br />

#NotesGetMessages<br />

98


#NotesMoveFirst<br />

Syntaks<br />

#NotesMoveFirst<br />

Input<br />

Ingen<br />

Output<br />

(Text)<br />

Notes Document ID på fundet dokument eller fejlkode.<br />

Funktion<br />

Udpeger og vælger det første dokument i resultatet fra sidste søgning<br />

(#NotesQuery). Returnerer dokumentets DocId i &NotesText eller<br />

alternativt en fejlkode.<br />

Eksempel<br />

#NotesQuery('Name="A*"')<br />

#NotesMoveFirst<br />

WHILE StrLen(&NotesText)>2<br />

PRINT "Antal: ",#NotesQueryField('Antal')<br />

#NotesMoveNext<br />

END<br />

Fejlkoder<br />

"0": Ingen data i resultat-sæt<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.4.2<br />

Se også<br />

#NotesQuery<br />

#NotesMoveNext<br />

#NotesMovePrev<br />

#NotesMoveLast<br />

99


#NotesMoveLast<br />

Syntaks<br />

#NotesMoveLast<br />

Input<br />

Ingen<br />

Output<br />

(Text)<br />

Notes Document ID på fundet dokument eller fejlkode.<br />

Funktion<br />

Udpeger og vælger det sidste dokument i resultatet fra sidste søgning<br />

(#NotesQuery). Returnerer dokumentets DocId i &NotesText eller<br />

alternativt en fejlkode.<br />

Eksempel<br />

#NotesQuery('Name="A*"')<br />

#NotesMoveLast<br />

WHILE StrLen(&NotesText)>2<br />

PRINT "Antal: ",#NotesQueryField('Antal')<br />

#NotesMovePrev<br />

END<br />

Fejlkoder<br />

"0": Ingen data i resultat-sæt<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.4.2<br />

Se også<br />

#NotesQuery<br />

#NotesMoveNext<br />

#NotesMovePrev<br />

#NotesMoveFirst<br />

100


#NotesMoveNext<br />

Syntaks<br />

#NotesMoveNext<br />

Input<br />

Ingen<br />

Output<br />

(Text)<br />

Notes Document ID på fundet dokument eller fejlkode.<br />

Funktion<br />

Udpeger og vælger det næste dokument i resultatet fra sidste søgning<br />

(#NotesQuery). Returnerer dokumentets DocId i &NotesText<br />

eller alternativt en fejlkode (f.eks. hvis der ikke er flere, returneres '').<br />

Eksempel<br />

#NotesQuery('Name="A*"')<br />

#NotesMoveFirst<br />

WHILE StrLen(&NotesText)>2<br />

PRINT "Antal: " ,#NotesQueryField('Antal')<br />

#NotesMoveNext<br />

END<br />

Fejlkoder<br />

"": Ikke flere data i resultat-sæt<br />

"0": Ingen data i resultat-sæt<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.4.2<br />

Se også<br />

#NotesQuery<br />

#NotesMoveFirst<br />

#NotesMovePrev<br />

#NotesMoveLast<br />

101


#NotesMovePrev<br />

Syntaks<br />

#NotesMovePrev<br />

Input<br />

Ingen<br />

Output<br />

(Text)<br />

Notes Document ID på fundet dokument eller fejlkode.<br />

Funktion<br />

Udpeger og vælger det forrige dokument i resultatet fra sidste søgning<br />

(#NotesQuery). Returnerer dokumentets DocId i &NotesText<br />

eller alternativt en fejlkode (f.eks. hvis der ikke er flere, returneres '').<br />

Eksempel<br />

#NotesQuery('Name="A*"')<br />

#NotesMoveLast<br />

WHILE StrLen(&NotesText)>2<br />

PRINT "Antal: ",#NotesQueryField('Antal')<br />

#NotesMovePrev<br />

END<br />

Fejlkoder<br />

"": Ikke flere data i resultat-sæt<br />

"0": Ingen data i resultat-sæt<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.4.2<br />

Se også<br />

#NotesQuery<br />

#NotesMoveNext<br />

#NotesMoveFirst<br />

#NotesMoveLast<br />

102


#NotesNextField<br />

Syntaks<br />

#NotesNextField<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

Navn på næste felt på den aktuelle forms design.<br />

Funktion<br />

Udpeger det næste felt defineret på formen (ikke den aktuelle form<br />

men på designet) og returnerer navnet på feltet. Kræver at #Notes-<br />

FirstField er kaldt forinden. Bruges typisk i løkke, hvor alle feltnavne<br />

aflæses.<br />

Eksempel<br />

SET &F = #NotesFirstField<br />

WHILE &F’’<br />

PRINT &F<br />

SET &F = #NotesNextField<br />

END<br />

Fejlkoder<br />

"2": Aktuel form ikke angivet, brug #NotesForm<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.9.2<br />

Se også<br />

#NotesFirstField<br />

#NotesNextForm<br />

#NotesNextView<br />

103


#NotesNextForm<br />

Syntaks<br />

#NotesNextForm<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

Navn på næste form i den aktuelle databases design.<br />

Funktion<br />

Udpeger den næste form defineret i databasen og returnerer navnet<br />

på formen. Kræver at #NotesFirstForm er kaldt forinden.<br />

Der returneres både navne på almindelige forms og på subforms.<br />

Eksempel<br />

SET &F = #NotesFirstForm<br />

WHILE &F’’<br />

PRINT &F<br />

SET &F = #NotesNextForm<br />

END<br />

Fejlkoder<br />

"2": Mangler at logge på database<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.9.2<br />

Se også<br />

#NotesFirstForm<br />

#NotesNextField<br />

#NotesNextView<br />

104


#NotesNextView<br />

Syntaks<br />

#NotesNextView<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

Navn på næste view i den aktuelle database.<br />

Funktion<br />

Udpeger det næste view i den aktuelle database og returnerer navnet<br />

på dette view.<br />

Kræver at #NotesFirstView er kaldt forinden.<br />

Eksempel<br />

SET &F = #NotesFirstView<br />

WHILE &F’’<br />

PRINT &F<br />

SET &F = #NotesNextView<br />

END<br />

Fejlkoder<br />

"2": Mangler at logge på database<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.9.2<br />

Se også<br />

#NotesFirstView<br />

#NotesNextField<br />

#NotesNextForm<br />

105


#NotesOpenDialog<br />

Syntaks<br />

#NotesOpenDialog[("OPEN")]<br />

Input<br />

(Text)<br />

Evt. angivelse af, om der skal foretages logon. Dette angives med<br />

parameteren "OPEN"<br />

Output<br />

Ingen<br />

Funktion<br />

Denne makro kan både benyttes til at "browse" mellem Notes servere<br />

og databaser. Ved at angive tillægsparameteren "OPEN", vil man<br />

desuden få etableret en session med den valgte server og det valgte<br />

kartotek. I dette tilfælde gemmes værdierne i variablerne<br />

&NotesServer og &NotesDatabase. Vær forsigtig ved valg af andre<br />

databaser, hvis XAL-koden forudsætter, at et bestemt kartotek er<br />

valgt. Brug af DocId er ikke pålideligt ved opslag i samme database<br />

på forskellige servere, da samme dokument næsten altid vil have<br />

forskellig placering i databasen. Brug i stedet #NotesGetUnique.<br />

Eksempel<br />

#NotesOpenDialog("OPEN") { Frit valg af server }<br />

#NotesLogon("Afdeling") { Men kartotek er låst }<br />

Afsnit<br />

3.2.2.1 og 3.2.2.2<br />

Se også<br />

#NotesServer<br />

#NotesLogon<br />

106


#NotesOpenServer<br />

Syntaks<br />

#NotesOpenServer[()]<br />

Input<br />

(Text)<br />

Evt. angivelse af servernavn<br />

Output<br />

Ingen<br />

Funktion<br />

Angivelse af hvilken server der skal etableres forbindelse til.<br />

Angives intet servernavn som parameter, vælges servernavn gemt i<br />

variablen &NotesServer.<br />

Servernavnet "Local" angiver, at databaserne skal findes på den lokale<br />

arbejdsplads.<br />

Fejlkoder<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.2.2.1<br />

Se også<br />

#NotesOpenDialog<br />

#NotesServerName<br />

107


#NotesPutFieldValue<br />

Syntaks<br />

#NotesPutFieldValue(,)<br />

Input<br />

(Text,Text)<br />

1. Parameter: Navn på felt i Notes, hvis værdi skal sættes<br />

2. Parameter: Værdi<br />

Output<br />

Ingen<br />

Funktion<br />

Denne macro sætter feltet angivet i første parameter til værdien angivet<br />

i anden parameter. Til forskel fra #NotesSetFieldValue, skal feltet<br />

ikke være defineret på designet af den aktuelle form.<br />

Værdi (2. parameter) skal altid være at typen text. Konvertér evt. andre<br />

formater til text, inden kald af macro.<br />

Det er muligt at angive, at feltet skal gemmes med en anden type i<br />

Notes (da feltet jo ikke nødvendigvis er defineret på formen). Dette<br />

gøres ved at foranstille feltnavn med #, datatype, efterfulgt af ### (se<br />

eksempel).<br />

Data der overføres til dato-felter skal altid være af formatet ”dd-mmåå”<br />

eller ”dd-mm-åååå” – altså med bindestreg mellem talværdier og<br />

med dag som første værdi.<br />

Eksempel<br />

#NotesSelectID(F.NotesDocID)<br />

SET &S = Date2Str(F.Dato,123,2,3,2,3,2)<br />

#NotesPutFieldValue("#DATETIME#Dato",&S)<br />

#NotesCommit<br />

Fejlkoder<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.5.2<br />

Se også<br />

#NotesSetFieldValue<br />

108


#NotesQuery<br />

Syntaks<br />

#NotesQuery()<br />

Input<br />

(Text)<br />

Angivelse af Notes SELECT kommando, der bruges til selektion af<br />

dokumenter. Angives blank ("") udvælges alle dokumenter i view.<br />

Parameter skal angives. Ordet "SELECT" er valgfri.<br />

Output<br />

(eventuel Kommafil)<br />

Resultatet af forespørgslen returneres i en kommafil og internt i hukommelsen<br />

i et resultat-sæt.<br />

Funktion<br />

Denne makro bruges til generelle opslag efter Notes dokumenter.<br />

Angives ingen parametre, returneres alle dokumenter i det aktuelle<br />

view. Dette kan f.eks. anvendes, når man har views i Notes, der foretager<br />

den nødvendige selektion.<br />

Angives en parameter, skal denne være en gyldig Notes selektion.<br />

Der kan anvendes Notes formula’s (f.eks. "SELECT @All" eller blot<br />

"@All").<br />

Hvis temporær fil er defineret gemmes data i kommafil. Husk at slette<br />

kommafilen efter brug (#NotesDeleteTempFil).<br />

Der kan ”bladres” i data med #NotesMoveFirst, og #NotesMoveNext.<br />

Eksempel<br />

#NotesQuery(‘@contains(Nummer;"1")’)<br />

Fejlkoder<br />

"0": Ingen data fundet<br />

"1": Filfejl ved dannelse af kommafil<br />

"9": Form eller view ikke defineret, brug #NotesForm eller<br />

#NotesView<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.4.1<br />

109


#NotesQueryField<br />

Syntaks<br />

#NotesQueryField()<br />

Input<br />

(Text)<br />

Angivelse af navn på felt i Notes, som man skal have værdien af.<br />

Output<br />

(Text: direkte)<br />

Feltets værdi<br />

Funktion<br />

Opslag på aktuelle dokument efter feltværdi. Dokument skal være<br />

udvalgt inden forespørgsel. Husk at angivelse af feltnavn skal være<br />

eksakt (Notes er case-sensitiv).<br />

Returværdi er altid i text. Hentes en anden værditype, f.eks. dato eller<br />

numerisk værdi, skal denne efterfølgende konverteres.<br />

Eksempel<br />

#NotesGetUnique("Nummer","123")<br />

PRINT "Afdelingsnavn: ",#NotesQueryField("Navn")<br />

PRINT "Notes Ref : ",#NotesQueryField("Ref")<br />

Fejlkoder<br />

"1": Felt ikke fundet på form<br />

"2": Form ikke angivet. Brug #NotesForm først<br />

"3": Intet aktivt dokument<br />

Afsnit<br />

3.4.5<br />

Se også<br />

#NotesSetFieldValue<br />

110


#NotesQueryRichTextField<br />

Syntaks<br />

#NotesQueryRichTextField()<br />

Input<br />

(Text)<br />

Angivelse af navn på felt i Notes, som man skal have værdien af.<br />

Output<br />

(Text: direkte)<br />

Feltets værdi<br />

Funktion<br />

Opslag på aktuelle dokument efter feltværdi. Dokument skal være<br />

udvalgt inden forespørgsel. Husk at angivelse af feltnavn skal være<br />

eksakt (Notes er case-sensitiv).<br />

Returværdi er altid i text.<br />

Til forskel fra #NotesQueryField returneres værdien ligeledes i den<br />

temporære fil (Se #NotesTmpFilnavn). Derved er det muligt at læse<br />

indhold af richtext felter der strækker sig over flere linier.<br />

Eksempel<br />

#NotesGetUnique("Nummer","123")<br />

IF StrLen(#NotesQueryRichTextField('RT'))>2 THEN<br />

READ &Filnavn1 AS COMMA INTO (&S)<br />

PRINT &S<br />

END<br />

ENDIF<br />

Fejlkoder<br />

"1": Felt ikke fundet på form<br />

"2": Form ikke angivet. Brug #NotesForm først<br />

"3": Intet aktivt dokument<br />

Afsnit<br />

3.4.5<br />

Se også<br />

#NotesQueryField<br />

111


#NotesQueryUnique<br />

Syntaks<br />

#NotesQueryUnique()<br />

Input<br />

(Text)<br />

Angivelse af Notes SELECT kommando, der bruges til selektion af<br />

eet Notes dokument.<br />

Output<br />

(Text)<br />

Notes Document ID på fundet dokument eller fejlkode.<br />

Funktion<br />

Denne makro bruges til opslag efter eet specifikt Notes dokument,<br />

der kan udpeges via et gyldigt SELECT statement.<br />

Angives en parameter, skal denne være en gyldig Notes selektion.<br />

Det anses som en fejl, hvis der returneres mere end eet dokument.<br />

Macroen er handy til opslag via et eller flere XAL-nøglefelter (se eksempel).<br />

Udvidet funktionalitet:<br />

Foranstil ’ ANY@@@’ i første parameter for at tillade flere dokumenter<br />

i resultatet. Fejlkoden ”3” vil ikke forekomme.<br />

Foranstil ’ MANUAL @@@’ i første parameter for at slå den automatiske<br />

tilføjelse af ’Form=’ til søgningen.<br />

Eksempel<br />

SET &S = ‘Sag="’+Sag+’" & Afsnit="’+Afsnit+’"’<br />

{Husk " omkring}<br />

#NotesQueryUnique(&S)<br />

IF StrLen(&NotesText)>2 THEN<br />

...<br />

Fejlkoder<br />

"0": Ingen data fundet<br />

"1": Aktuel form ikke angivet, brug #NotesForm<br />

"3": Mere end eet dokument fundet<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.4.3<br />

Se også<br />

#NotesQuery<br />

112


#NotesRemoveItem<br />

Syntaks<br />

#NotesRemoveItem()<br />

Input<br />

(Text)<br />

Angivelse af feltnavn der skal slettes fra det aktive dokument.<br />

Output<br />

Ingen<br />

Funktion<br />

Denne makro bruges til at slettet et felt på det aktive dokument. Feltet<br />

behøver ikke at findes på den aktive form.<br />

Hvis det angivet felt er af typen multivalue, så vil alle værdier blive<br />

slettet.<br />

Hvis det angivet feltnavn findes på formen, vil det automatisk blive<br />

gen-oprettet med en tom streng næste gang dokumentet gemmes.<br />

Dette kan undgås ved at benytte #NotesCommitNoCalc i stedet for<br />

#NotesCommit.<br />

Eksempel<br />

#NotesRemoveItem(‘Nummer’)<br />

Fejlkoder<br />

"2": Ingen dokument aktivt.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

Se også<br />

#NotesQuery<br />

113


#NotesRunAgent<br />

Syntaks<br />

#NotesRunAgent[]<br />

Input<br />

(Text)<br />

Navn på Notes agent der skal afvikles<br />

Output<br />

Ingen<br />

Funktion<br />

Eksekverer Notes macro i Lotus Notes.<br />

Eksempel<br />

#NotesLogon('Database.nsf')<br />

#NotesRunAgent("ProcessFields")<br />

114


#NotesSave<br />

Syntaks<br />

#NotesSave<br />

Input<br />

(Text)<br />

Eventuelle special-flags<br />

Output<br />

Ingen<br />

Funktion<br />

Denne funktion er erstattatet af #NotesCommitRecalc. Et kald til denne<br />

funktion vil automatisk kalde #NotesCommitRecalc.<br />

Eksempel<br />

#NotesSetFieldValue('Number',&s)<br />

#NotesCommitNoRecalc<br />

Afsnit<br />

3.5.4<br />

Se også<br />

#NotesCommitNoRecalc<br />

115


#NotesSearchFirst<br />

Syntaks<br />

# NotesSearchFirst<br />

Input<br />

-<br />

Output<br />

(Text)<br />

Notes Document ID på fundet dokument eller fejlkode.<br />

Funktion<br />

Returnerer første dokument i aktuelle view. Ved at benytte opslag via<br />

view bliver opslag meget hurtigere end ved Query.<br />

View skal være åbnet.<br />

View skal være designet til at være sorteret i alle kolonner der<br />

benyttes til opslag, kolonner SKAL være af typen text og må ikke<br />

indeholde en feltformel der er defineret som en ”konstant”.<br />

Eksempel<br />

#NotesSearchFirst<br />

WHILE StrLen(&NotesText)>2<br />

Print "Navn: ",#NotesQueryField('Navn')<br />

#NotesSearchNext<br />

END<br />

Fejlkoder<br />

"0": Ingen data fundet<br />

"1": View ikke angivet. Brug #NotesView først<br />

"2": Form ikke angivet. Brug #NotesForm først<br />

”99": Diverse interne DLL fejl<br />

Afsnit<br />

3.4.4<br />

Se også<br />

#NotesSearchNext<br />

#NotesSearchView<br />

116


#NotesSearchNext<br />

Syntaks<br />

# NotesSearchNext<br />

Input<br />

-<br />

Output<br />

(Text)<br />

Notes Document ID på fundet dokument eller fejlkode.<br />

Funktion<br />

Returnerer næste dokument i aktuelle view. Ved at benytte opslag via<br />

view bliver opslag meget hurtigere end ved Query.<br />

Kan kun benyttes efter NotesSearchFirst eller NotesSearchView.<br />

View skal være åbnet.<br />

Bemærk, at der efter kald af #NotesSearchView kun kan bladres frem<br />

blandt de documenter I viewet, der opfylder søge-kriteriet I #Notes-<br />

SeachView.<br />

Eksempel<br />

#NotesSearchFirst<br />

WHILE StrLen(&NotesText)>2<br />

Print "Navn: ",#NotesQueryField('Navn')<br />

#NotesSearchNext<br />

END<br />

Fejlkoder<br />

"0": Ikke flere dokumenter<br />

"1": View ikke angivet. Brug #NotesView først<br />

"2": Form ikke angivet. Brug #NotesForm først<br />

”99": Diverse interne DLL fejl<br />

Afsnit<br />

3.4.4<br />

Se også<br />

#NotesSearchFirst<br />

#NotesSearchView<br />

117


#NotesSearchView<br />

Syntaks<br />

# NotesSearchView()<br />

Input<br />

(Text)<br />

Angivelse af værdi der skal bruges ved opslag i view<br />

Output<br />

(Text)<br />

Notes Document ID på fundet dokument eller fejlkode.<br />

Funktion<br />

Returnerer første dokument i aktuelle view som matcher søgeværdi.<br />

Svarer til ”Type-ahead” i view i Notes.<br />

Ved at benytte opslag via view bliver opslag meget hurtigere end ved<br />

Query. Bør altid benyttes ved større datamængder.<br />

View skal være åbnet.<br />

View skal være designet til at være sorteret i alle kolonner der<br />

benyttes til opslag, kolonner SKAL være af typen text og må ikke<br />

indeholde en feltformel der er defineret som en ”konstant”.<br />

Er der flere søgenøgler, skal søgeværdierne været adskilt med et<br />

skilletegn (default semikolon (”;”)). Desuden skal kolonner i view i<br />

Notes matche parameter rækkefølge.<br />

Eksempel<br />

#NotesSearchView('Jensen;Ole')<br />

WHILE StrLen(&NotesText)>2<br />

Print "Navn: ",#NotesQueryField('Navn')<br />

#NotesSearchNext<br />

END<br />

Fejlkoder<br />

"0": Ingen data fundet<br />

"1": View ikke angivet. Brug #NotesView først<br />

"9": Form ikke angivet. Brug #NotesForm først<br />

”99": Diverse interne DLL fejl<br />

Afsnit<br />

3.4.4<br />

Se også<br />

#NotesSearchNext<br />

#NotesSearchView<br />

#NotesSetDelim<br />

118


#NotesSelectID<br />

Syntaks<br />

#NotesSelectID()<br />

Input<br />

(Text)<br />

Notes Document ID på dokument der skal <strong>hent</strong>es.<br />

Output<br />

Ingen<br />

Funktion<br />

Direkte opslag af Notes dokument via kendt DocId. Dette DocId kan<br />

f.eks. være fundet via #NotesQuery, hvor DocId indeholdes som første<br />

felt i hver linie i kommafilen.<br />

Denne macro er meget anvendelig, hvor man har gemt en henvisning<br />

til et specifikt Notes dokument i et felt i et XAL-kartotek.<br />

Eksempel<br />

SET &ID = Afdeling.NotesDocID<br />

#NotesSelectID(&ID)<br />

Fejlkoder<br />

"1": Forkert angivelse af DocId (f.eks. invalid ID-nummer)<br />

"2": Form ikke angivet. Brug #NotesForm først<br />

"3": Dokument ikke fundet<br />

”4” Dokumentet der blev fundet har ikke et formnavn angivet.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.4.6<br />

Se også<br />

#NotesDeleteID<br />

#NotesQuery<br />

119


#NotesSelectUNID<br />

Syntaks<br />

#NotesSelectUNID()<br />

Input<br />

(Text)<br />

Notes Universal Document ID på dokument der skal <strong>hent</strong>es.<br />

Output<br />

Ingen<br />

Funktion<br />

Direkte opslag af Notes dokument via kendt 32 byte Universal Document<br />

ID. Dette UNID kan f.eks. være fundet via #NotesUNID.<br />

UNID bør benyttes i stedet for DocID hvis der arbejdes på tværs af<br />

replicaer.<br />

Husk at reservere 32 tegn til UNID’s i XAL-strenge.<br />

Fejlkoder<br />

"2": Form ikke angivet. Brug #NotesForm først<br />

"3": Dokument ikke fundet via angivet UNID<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.4.6<br />

Se også<br />

#NotesUNID<br />

#NotesSelectID<br />

120


#NotesServerName<br />

Syntaks<br />

#NotesServerName<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

Navn på valgte server i Lotus Notes.<br />

Funktion<br />

Returnerer navnet på den aktuelt valgte server.<br />

Eksempel<br />

PRINT "Aktuelle server: ", #NotesServerName<br />

PAUSE<br />

Afsnit<br />

3.3.1<br />

Se også<br />

#NotesOpenServer<br />

121


#NotesSetDelim<br />

Syntaks<br />

#NotesSetDelim()<br />

Input<br />

(Text)<br />

Tegn der skal benyttes som skilletegn mellem søgenøgler<br />

Output<br />

Ingen<br />

Funktion<br />

Hvis ikke semikolon, som er default skilletegn ved overførsel af flere<br />

opslagsværdier til #NotesSearchView, kan benyttes, kan man med<br />

#NotesSetDelim angive et alternativt skilletegn.<br />

Afsnit<br />

3.4.4<br />

Eksempel<br />

SET QStr=DebTable.Adresse1+’@’+Debtable.Adresse2<br />

#NotesDelim(’@’)<br />

#NotesSearchView(&QStr)<br />

122


#NotesSetField<br />

Syntaks<br />

#NotesSetField()<br />

Input<br />

(Text)<br />

Feltnavn på Notes felt der skal have "fokus"<br />

Output<br />

Ingen<br />

Funktion<br />

Denne macro er primært til intern brug i <strong>integrationskit</strong>tet.<br />

Udpeger det felt der efterfølgende skal opdateres eller forespørges<br />

på.<br />

Denne macro skal normalt ikke anvendes, da funktionaliteten er indbygget<br />

i andre macroer.<br />

Fejlkoder<br />

"1": Felt kendes ikke på form.<br />

"2": Form ikke angivet, brug #NotesForm<br />

"3": Ingen felter på form<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

123


#NotesSetFieldValue<br />

Syntaks<br />

#NotesSetFieldValue(,[,"COMMIT"])<br />

Input<br />

(Text,Text[,Text])<br />

1. Parameter: Navn på felt i Notes, hvis værdi skal sættes<br />

2. Parameter: Værdi<br />

3. Parameter: Evt. angivelse af umiddelbar commit<br />

Output<br />

Ingen<br />

Funktion<br />

Denne macro sætter feltet angivet i første parameter til værdien angivet<br />

i anden parameter. Husk Notes’ feltnavn er case-sensitive. Værdi<br />

(2. parameter) skal altid være at typen text. Konvertér evt. andre formater<br />

til text, inden kald af macro. Eksisterende indhold i feltet overskrives<br />

med denne macro.<br />

Data der overføres til dato-felter skal altid være af formatet ”dd-mmåå”<br />

eller ”dd-mm-åååå” – altså med bindestreg mellem talværdier og<br />

med dag som første værdi.<br />

Angives "COMMIT" som tredje parameter gemmes værdien i Notes<br />

umiddelbart. Dette er anvendeligt ved en enkelt opdatering. Skal flere<br />

felter opdateres efterfølgende, bør #NotesCommit kaldes som separat<br />

sidste kommando.<br />

Eksempel<br />

#NotesSelectID(F.NotesDocID)<br />

SET &S = Date2Str(F.Dato,123,2,3,2,3,2)<br />

#NotesSetFieldValue("Dato",&S)<br />

Fejlkoder<br />

"1": Felt kendes ikke på form.<br />

"2": Form ikke angivet, brug #NotesForm<br />

"3": Ingen felter på form<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.5.2<br />

Se også<br />

#NotesAppendFieldValue<br />

#NotesSetRichFieldValue<br />

#NotesQueryField<br />

124


#NotesSetHandle<br />

Syntaks<br />

#NotesSetHandle([])<br />

Input<br />

(Text)<br />

Eventuel angivelse af handle til Lotus Notes<br />

Output<br />

Ingen<br />

Funktion<br />

Har man brug for at operere med flere samtidige åbne sessions til<br />

Lotus Notes, kan dette gøres ved at operere med flere handles. Integratiosnkittet<br />

understøtter op til 15 samtidige handles.<br />

Skift mellem handles sker med #NotesSetHandle.<br />

Hver session har sin connection til Lotus Notes.<br />

Eksempel<br />

#NotesSetHandle(2)<br />

#NotesOpenServer("Local")<br />

#NotesLogon("MyDB.nsf")<br />

#NotesForm("Form 2")<br />

#NotesView("View 2")<br />

{Return to previous session}<br />

#NotesSetHandle(1)<br />

Afsnit<br />

3.2.4<br />

Se også<br />

#NotesGetHandle<br />

125


#NotesSetKeepUnread<br />

Syntaks<br />

#NotesSetKeepUnread("0"|"1")<br />

Input<br />

(Text)<br />

Markering af om der skal checkes inden overskrivning.<br />

Output<br />

Ingen<br />

Funktion<br />

Normalt vil <strong>integrationskit</strong>tet overskrive eksisterende data uanset om<br />

der er forskel på den nye felt-værdi og den gamle. Derved markeres<br />

dokumentet som unread og LAST_MODIFIED ændres. I visse situationer<br />

må data kun overskrives hvis der er forskelle. #NotesSetKeepUnread<br />

håndterer dette. Hvis dette er aktiveret læses feltværdi før<br />

hver skrivning og der skrives kun til Notes hvis nye feltværdi er forskellig.<br />

Eksempel<br />

#NotesSetKeepUnread("1")<br />

Afsnit<br />

3.4.7<br />

Se også<br />

#NotesCompareField<br />

126


#NotesSetListDelim<br />

Syntaks<br />

#NotesSetListDelim()<br />

Input<br />

(Text)<br />

Tegn der skal benyttes som skilletegn ved multi-values<br />

Output<br />

Ingen<br />

Funktion<br />

XAL indeholder ikke, som Lotus Notes, multi-value værdier. Ved overførsel<br />

af værdier til et multi-value felt i Lotus Notes, kan en række<br />

værdier overføres f.eks. via #NotesSetFieldValue, ved at adskille<br />

værdierne med et skilletegn (delimiter). Default delimiter i <strong>integrationskit</strong>tet<br />

er semikolon (;). Med #NotesSetListDelim kan skilletegnet<br />

ændres til et andet tegn. Dette kan være anvendeligt hvis tekster der<br />

skal overføres selv indeholder semikolon.<br />

Afsnit<br />

Eksempel<br />

SET &S = ’’<br />

#NotesSetListDelim(’@’)<br />

SEARCH SagAktivitet WHERE Sag == &ActProj<br />

#ADD(&S,’@’+Aktivitet)<br />

END<br />

#NotesSetFieldValue(’Aktiviteter’,&S)<br />

Se også<br />

#NotesSetFieldValue<br />

#NotesAppendValue<br />

#NotesAppendMultiValue<br />

127


#NotesSetRichFieldValue<br />

Syntaks<br />

#NotesSetRichFieldValue(,[,"COMMIT"])<br />

Input<br />

(Text,Text[,Text])<br />

1. Parameter: Navn på rich-text felt i Notes<br />

2. Parameter: Værdi<br />

3. Parameter: Evt. angivelse af umiddelbar commit<br />

Output<br />

Ingen<br />

Funktion<br />

Macroen anvendes på samme måde som #NotesSetFieldValue.<br />

Macroen giver mulighed for, ved gentagne kald, løbende at udfylde et<br />

rich-text felt med flere linier. Macroen adderer altså til feltet. Brug evt.<br />

#NotesSetFieldValue til at initialisere feltet.<br />

Desuden bruges macroen i forbindelse med #NotesImportFile.<br />

#NotesSetFieldValue på et rich-text felt overskriver tidligere input.<br />

#NotesSetRichFieldValue er lidt langsommere, da overførsel af værdier<br />

sker via temporære filer.<br />

Eksempel<br />

#NotesSelectID(FinPost. NotesDocID)<br />

#NotesSetRichFieldValue("Body","Richtext linie 1")<br />

#NotesSetRichFieldValue("Body","Richtext linie 2")<br />

#NotesCommit<br />

Fejlkoder<br />

"1": Felt kendes ikke på form.<br />

"2": Form ikke angivet, brug #NotesForm<br />

"3": Felt er ikke et rich-text felt<br />

"98": Fejl ved oprettelse af temporær fil.<br />

"99": "Exception error": Anden fejl fra <strong>integrationskit</strong>.<br />

Aflæs fejlbesked på skærm.<br />

Afsnit<br />

3.5.2<br />

Se også<br />

#NotesSetFieldValue<br />

128


#NotesSetRichSepMode<br />

Syntaks<br />

#NotesSetRichSepMode({"0"|"1"})<br />

Input<br />

(Text)<br />

Angivelse af om rich-text felter skal lægges i separate kommafiler ved<br />

#NotesQuery eller direkte i kommafilen.<br />

Output<br />

Ingen<br />

Funktion<br />

Hvis parameter er "0" gemmes første linie af rich-text felter i den primære<br />

kommafil i forbindelse med #NotesQuery.<br />

Hvis parameter er "1" medfører det at rich-text felter ikke indeholdes i<br />

den primære resultat kommafil ved kald af #NotesQuery, men i stedet<br />

placeres i separate kommafiler i underbiblioteket "RichText". Een fil<br />

pr. rich-text felt pr. dokument.<br />

Se fyldig gennemgang i afsnit 3.6.2.2<br />

Afsnit<br />

3.6.2.2<br />

Se også<br />

#NotesGetRichSepMode<br />

129


#NotesTmpFilNavn<br />

Syntaks<br />

#NotesTmpFilnavn[()]<br />

Input<br />

(Text)<br />

Evt. angivelse af tvunget filnavn<br />

Output<br />

(Text)<br />

Navnet på temporær fil returneres i &NotesText<br />

Funktion<br />

Denne macro bruges inden kald af #NotesQuery, til angivelse af filnavn<br />

på den temporære kommafil, hvori forespørgselsresultatet returneres.<br />

Angives en parameter, bruges denne som filnavn. Normalt<br />

angives ingen parameter, hvorved <strong>integrationskit</strong>tet "beregner" et<br />

unikt filnavn. Efter kald af #NotesTmpFilnavn kan filnavnet aflæses i<br />

variablen &NotesText. Husk at slette den temporære fil efter brug,<br />

med XAL-macroen #FileDelete.<br />

Eksempel<br />

STR 60 &Filnavn<br />

...<br />

#NotesTmpFilnavn<br />

SET &FilNavn = &NotesText<br />

#NotesQuery("SELECT @All")<br />

...<br />

#FileDelete(&Filnavn)<br />

Afsnit<br />

3.3.3<br />

Se også<br />

#NotesQuery<br />

130


#NotesUNID<br />

Syntaks<br />

#NotesUNID<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

Notes Universal Document Id på aktivt dokument i Notes.<br />

Funktion<br />

Returnerer Notes Universal Document Id på det aktive dokument i<br />

Notes. Notes Universal Document Id er en 32 karakter lang streng,<br />

der er unik på en database på tværs af replica’s.<br />

Eksempel<br />

#NotesSetHandle(2)<br />

#NotesOpenServer('Serv1/Dom01')<br />

#NotesLogon('db.nsf')<br />

#NotesForm('Person')<br />

#NotesQueryUnique(('2343')<br />

SET &UNID1 = #NotesUNID<br />

#NotesSetHandle(3)<br />

#NotesOpenServer('Serv2/Dom01')<br />

#NotesLogon('db.nsf')<br />

#NotesForm('Person')<br />

#NotesQueryUnique(('2343')<br />

SET &UNID2 = #NotesUNID<br />

IF &UNID1&UNID2 THEN<br />

PRINT "Forskel på databaser"<br />

ENDIF<br />

Afsnit<br />

3.5.5<br />

Se også<br />

#NotesSelectUNID<br />

#NotesDocID<br />

131


#NotesView<br />

Syntaks<br />

#NotesView()<br />

Input<br />

(Text)<br />

Navn på view i Lotus Notes<br />

Output<br />

Ingen<br />

Funktion<br />

Angivelse af view i Notes, som skal bruges ved opslag med #NotesQuery<br />

uden parametre.<br />

For skjulte views (navn i parantes) skal paranteserne IKKE angives i<br />

view-navn.<br />

Eksempel<br />

#NotesView("All")<br />

PRINT "Aktuelle view: ",#NotesViewName<br />

#NotesQuery<br />

Fejlkoder<br />

"1": View findes ikke i Notes database. Husk at også view-<br />

navne er case-sensitive.<br />

"9": Der er ikke foretaget logon på Notes server. Brug<br />

#NotesOpenServer<br />

Afsnit<br />

3.2.2.3<br />

Se også<br />

#NotesViewName<br />

132


#NotesViewName<br />

Syntaks<br />

#NotesViewName<br />

Input<br />

Ingen<br />

Output<br />

(Text: Direkte)<br />

Navn på aktuelle view i Notes.<br />

Funktion<br />

Returnerer det aktuelle valgte view i Lotus Notes, defineret via #NotesView.<br />

Eksempel<br />

PRINT "Aktuelle view: ",#NotesViewName<br />

Afsnit<br />

3.3.1<br />

Se også<br />

#NotesView<br />

133


A pendix 1. Manuel installation<br />

Det er muligt at installere <strong>integrationskit</strong>tet uden brug af installationsprogrammet. Dette kan f.eks.<br />

være en fordel, ved installation af mange arbejdspladser på et netværk, hvor alle relevante filer<br />

distribueres fra en fil-server.<br />

1.1 Udpakning af filer<br />

Inden manuel installation kan udføres, skal filerne pakkes ud fra installationsmedia (f.eks. disketter).<br />

Eksekver filerne disk1.exe og disk2.exe. I hvert program vælges Setup, hvorefter filerne udpakkes.<br />

Alle filer placeres i "TEMP" biblioteket i et underbibliotek ved navn ERP2LN.$$$, f.eks.<br />

C:\WINDOWS\TEMP\ERP2LN.$$$.<br />

Er man i tvivl om placeringen af det temporære bibliotek, kan dette findes ved at taste "SET" i en<br />

dos prompt. Her findes placeringen ud for ordet "TMP=".<br />

1.2 Kopiering af filer<br />

Efter udpakning af alle filer skal disse fordeles i de relevante biblioteker.<br />

Følgende filer kopieres til XAL-biblioteket:<br />

NOTES.MAC<br />

ERP2LN.DLL<br />

BORLNDMM.DLL<br />

134


A pendix 2. Kendte fejl/begrænsninger<br />

2.1 Manglende oprydning (går ned)<br />

En meget stor del af de eventuelle fejl der kan opstå ved integration mellem CONCORDE og Lotus<br />

Notes fanges af <strong>integrationskit</strong>tet. Disse returneres som fejlkoder i variablen &NotesText. Af og til vil<br />

der dog opstå fejl ved integrationen som ikke "fanges" af <strong>integrationskit</strong>tet. Disse fejl opstår uden for<br />

CONCORDE, i forbindelsen mellem DLL'en og Lotus Notes. Hvis muligt vises en Windows fejlmeddelelse<br />

og fejlkode "99" returneres. Der kan opstå situationer, hvor det ikke er muligt for <strong>integrationskit</strong>tet<br />

at håndtere fejlen. Her er eneste udvej at lukke Windows-processen ned (enten ERP2LN<br />

eller selve CONCORDE processen). I Windows-95 slår man processen ned med Ctrl-Alt-Del og<br />

"End Task" – i Windows NT afsluttes processen via Task-manager.<br />

Når CONCORDE er blevet afbrudt på denne måde sker der ikke nogen efterfølgende oprydning i<br />

Windows memory.<br />

Ved genopstart af CONCORDE og efterfølgende kald af #NotesInit kan CONCORDE processen<br />

"hænge". Eneste mulighed er at slå processen ned og genstarte CONCORDE igen. Herefter skulle<br />

der ikke være problemer.<br />

Dette fænomen kan også ske ved gentagne aktiveringer af CONCORDE uden genstart af Windows.<br />

2.2 Multi-value felter ved NotesQuery<br />

I Lotus Notes har man mulighed for at et felt kan indeholde flere værdier. En funktionalitet der ikke<br />

eksisterer i CONCORDE. Når man forespørger på et sådant felt returneres den værdi man ville se<br />

som Notes-bruger. Hvis f.eks. de forskellige værdier adskilles med semikolon, vil feltværdierne tilsvarende<br />

returneres som een returværdi med værdierne adskilt med semikolon. Dette gælder både<br />

ved #NotesQueryField og ved #NotesQuery.<br />

Hvis man i Lotus Notes har angivet, at de enkelte værdier skal adskilles med "New Line"<br />

eller "Blank Line" vil kun den første værdi blive returneret!<br />

Generelt skal man være forsigtig ved håndtering af Notes-dokumenter der indeholder multi-value<br />

felter. Programlogikken i XAL skal håndtere opsplitningen af returværdien til f.eks. separate felter/records<br />

i CONCORDE.<br />

Ved opdatering af felter i Lotus Notes fra CONCORDE kan multi-value felter udfyldes med angivelse<br />

af det tegn der er anført som value-separator i Notes.<br />

Er f.eks. komma angivet som gyldig separator i Notes formdefinitionen, kan de tre værdier "rød",<br />

"gul" og "blå" overføres til Notes på følgende måde:<br />

#NotesSetFieldValue("Farver","rød, gul, blå")<br />

CONCORDE kan kun håndtere tekststrenge på op til 255 karakterer. Dette kan være et problem<br />

ved returnering af multi-value værdier. Indeholder f.eks. et Notes-felt 20 værdier med 20 karakterer i<br />

hver værdi, vil returværdien til CONCORDE indeholde 400 tegn (+ skilletegn). Kun de første 255<br />

tegn vil være tilgængelige.<br />

Macroen #NotesAppendMultivalue understøtter kun text-lister.<br />

135


2.3 Mail-error ved mail-fejl<br />

Fejl i mail-macroerne kan medføre at indholdet i fejlmeldinger som sendes efter aktivering af #NotesMailErrorTo<br />

kan have forkert indhold.<br />

2.4 Attachments i rich-text felter<br />

Ved sletning af et attachment på et rich-tekstfelt vil ikonet ikke blive slettet. Selve filen vil blive slettet,<br />

2.5 Begrænsning i grafikformater<br />

Ikke alle grafikformater kan importeres i Lotus Notes dokumenter med macroerne #NotesMailBodyFile<br />

og #NotesImportFile. Følgende formater understøttes:<br />

• ASCII, standard ASCII-filer (TXT, PRN,ASC...)<br />

• Rich-text filer (RTF). ASCII-fil med formateringskommandoer der bl.a. kan oprettes i Microsoft<br />

Word.<br />

• PCX-filer, grafikformat der benyttes i bl.a. Lotus Notes<br />

• BMP-filer, Windows grafik<br />

• TIFF-filer, high-end grafik (Uncompressed TIFF5)<br />

Alle disse formater kan optræde i forskellige varianter. Ikke alle varianter understøttes. Det anbefales<br />

at teste sig frem til et egnet format og derefter benytte dette konstant.<br />

2.6 DocId ved replica<br />

Man skal være opmærksom på at DocId kun er unik indenfor een database og indenfor een replica<br />

af denne database. Bruger man DocId til udpegning af dokumenter kan dette medføre fejl, hvis<br />

samme applikation bruges på flere servere med samme database.<br />

Det anbefales at benytte #NotesGetUnique eller #NotesQueryUnique i stedet.<br />

Brug af f.eks. #NotesSelectID eller #NotesDeleteID er dog helt i orden i forbindelse med f.eks. #NotesQuery,<br />

hvor det er de aktuelle DocId's der opereres på.<br />

Denne begrænsning kan omgås ved at benytte UNID’s i stedet.<br />

2.7 Max længde af feltværdi<br />

Ved brug af #NotesSetFieldValue og #NotesAppendFieldValue kan den værdi der overføres maksimalt<br />

indeholde 255 tegn.<br />

Ønskes længere tekster overført, kan dette gøres efterfølgende ved at kalde #NotesAppendField-<br />

Value.<br />

Eks.:<br />

SET &S=SubStr(&LongText,1,255)<br />

136


#NotesSetFieldValue("Felt",&S)<br />

SET &S=SubStr(&LongText,256,255)<br />

#NotesAppendFieldValue("Felt",&S)<br />

SET &S=SubStr(&LongText,512,255)<br />

#NotesAppendFieldValue("Felt",&S)<br />

Den maksimale feltlængde <strong>integrationskit</strong>tet understøtter i Notes er 32.000 tegn (dog undtaget<br />

RichText felter)<br />

2.8 Feltet ”Form” skal være sat på dokument<br />

Da <strong>integrationskit</strong>tet <strong>hent</strong>er en række oplysninger fra form-design på aktuelle dokument, er det ikke<br />

muligt at behandle Lotus Notes dokumenter, hvor dette felt ikke er sat.<br />

137


A pendix 3. Designelement typer<br />

Med macroerne #NotesFieldType og #NotesFormType er det muligt at få returneret oplysninger om<br />

henholdsvis felter og forms.<br />

Følgende felttyper kan returneres af #NotesFieldType:<br />

• Unknown<br />

• Error<br />

• Text<br />

• Number<br />

• DateTime<br />

• RichText<br />

• TextList<br />

• NumberList<br />

• DateTimeList<br />

Følgende formtyper kan returneres af #NotesFormType:<br />

• Main<br />

• Response to Main<br />

• Response to Response<br />

138


A pendix 4. Datatype-parametre<br />

Følgende makroer, som opererer på ”items” og altså ikke <strong>hent</strong>er information om felt-typer fra forms,<br />

kan kaldes med datatype foranstillet feltnavn:<br />

• #NotesPutFieldValue<br />

• #NotesAppendFieldValue<br />

• #NotesGetFieldLength<br />

• #NotesGetFieldValue<br />

Følgende datatyper kan foranstilles:<br />

• TEXT #TEXT#<br />

• NUMBER #NUMBER#<br />

• DATETIME #DATETIME#<br />

• TEXT_LIST #TEXT_LIST#<br />

• NUMBER_LIST #NUMBER_LIST#<br />

• DATETIME_LIST #DATETIME_LIST#<br />

Eksempler:<br />

#NotesPutFieldValue(’#NUMBER#Beløb”,”123,45”)<br />

#NotesAppendFieldValue(’#DATETIME_LIST#Dates’,&IdagStr)<br />

Husk at data der overføres til dato-felter skal altid være af formatet ”dd-mm-åå” eller ”dd-mm-åååå”.<br />

139


A pendix 5. Integrationskit uden 32 bit Windows klienter<br />

Integrationskittet er designet til 32 bit Windows klienter. Ikke alle CONCORDE installationer er baseret<br />

på denne platform. UNIX-versionen af CONCORDE er et eksempel på dette.<br />

Integrationskittet kan dog stadig benyttes til at integrere CONCORDE med Lotus Notes. For at kunne<br />

gøre dette skal man installere en dedikeret "gateway"-PC, som fungerer som bindeled mellem<br />

CONCORDE og Lotus Notes. Denne PC er konfigureret med 32-bit Windows (95 eller NT) og 32-bit<br />

CONCORDE klient som beskrevet i afsnit 0.4.<br />

Gateway-PC'en har adgang til samme CONCORDE applikation som resten af installationen (f.eks.<br />

via NFS på UNIX). Er dette ikke muligt, skal applikationen kopieres til gateway-PC'en. Hver ændring<br />

i hoved-CONCORDE installationen skal kopieres til gateway-PC'en. Dette er specielt vigtigt på databasedelen<br />

(og essentiel for Oracle installationer).<br />

Gateway-PC'en sættes op som batchserver, hvor al integration sker med faste intervaller. På denne<br />

måde kan man opbygge opdateringskørsler i XAL som periodisk opdaterer Lotus Notes. Som alternativ<br />

til batchafvikling kan Timer-funktionen i CONCORDE benyttes.<br />

140<br />

Gateway PC 16 bit klient<br />

32 bit Windows<br />

Unix klient

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

Saved successfully!

Ooh no, something went wrong!