Grundlæggende integrationskit (API) (hent) - Intoint
Grundlæggende integrationskit (API) (hent) - Intoint
Grundlæggende integrationskit (API) (hent) - Intoint
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