Vandaag heb ik mijn HCLSoftware Certified Associate Developer – Notes/Domino 14 certificaat behaald.
Mijn vorige IBM Notes / Domino certificering hoogtepunt was in 2004, waar ik na het behalen van het laatste examen Dual Principal Domino gecertificeerd werd, inclusief een mooi speldje van IBM. Waarbij Dual dan inhield zowel IBM Domino beheerder en ontwikkelaar. Daarna was er lange tijd voor mij geen reden om voor een nieuwe Notes versie een examen te doen. Nu onze klanten ook langzaam over gaan op versie 14.5 van HCL Notes en Domino leek het mij een goed moment om de kennis wat op te frissen en dit ook te kunnen bewijzen door een badge te behalen. Helaas kent HCL geen pad om een antiek principal certificaat op te waarderen, dus was de enige mogelijkheid om weer onderaan te beginnen.
Dit is een basiscertificeringsexamen voor HCL Domino Developers die veilige applicaties ontwerpen en ontwikkelen die de workflow automatiseren met behulp van Domino Designer. Badge-verdieners kunnen vaardigheden demonstreren die verband houden met Domino Application Design Elements, programmeren met behulp van Formula Language, Database Management, Database Security en Workflow. Ze zullen Domino Designer Tool gebruiken om veilige Domino-applicaties te maken.
HCL heeft met Domino 14.5 ondersteuning toegevoegd voor het uitvoeren van een AI-inferentie engine in de Domino backend: Domino IQ. Met deze functie kunnen nieuwe LotusScript klassen AI-query’s voor het genereren van tekst naar een Domino server sturen en antwoorden terughalen van de server, veilig binnen een Domino-omgeving.
Deze functie wordt ondersteund op Windows- en Linux Domino servers. De Domino IQ server kan een lokale inferentie engine uitvoeren op NVIDIA GPU-hardware of verbinding maken met OpenAI V1-compatibele externe eindpunten.
Domino IQ installeren
De Domino IQ installatie staat los van Domino. Er moet een .zip-bestand gedownload worden van het HCL Software portaal en worden uitgepakt in de Domino programmamap. De software is op het portaal te vinden onder de knop HCL Domino en dan Tools, Connectors and Integrators en vervolgens Llama Server for Domino IQ 14.5. Na het plaatsen van de bestanden op de Domino is een herstart nodig.
Notitie:
Deze software is alleen beschikbaar voor Windows- en Linux 64-bit Domino-servers waarop hardwarematige NVIDIA GPU-kaarten zijn geïnstalleerd. HCL raadt NVIDIA GPU-hardware aan met een rekencapaciteit van 8.0 of hoger.
Domino IQ activeren
Om de Domino IQ server te activeren is het nodig om in de Domino Directory het profiel document aan te passen. Op het tabblad Domino IQ kan hier aangegeven worden of de instellingen voor een Server of een Groep zijn, de servers(s) of groep kan gekozen worden en wat de beheerserver is.
Domino IQ instellen
Instellingen aan Domino IQ worden gemaakt in de Domino IQ database (dominoiq.nsf) die automatisch wordt aangemaakt wanneer IQ ingeschakeld is.
Als eerste is het nodig om een LLM Model te kiezen. Een LLM (Large Language Model) is een geavanceerd type kunstmatige intelligentie dat getraind is op enorme hoeveelheden tekstdata om menselijke taal te begrijpen, te verwerken en te genereren. Domino IQ kan alleen omgaan met GGUF type bestanden. Het model dat u kiest hangt af onder andere af van het doel en de taal. Zorg ervoor dat de server meer systeem geheugen heeft dan de grootte van het model omdat dit model in het geheugen ingelezen wordt.
Hugging Face
HCL heeft in de documentatie een website, https://huggingface.co staan waar modellen gezocht kunnen worden en raad de volgende stappen aan:
Filter de downloadbare GGUF-modellen door Tekst genereren te selecteren onder taken, GGUF onder Bibliotheken, een specifieke taal en specifieke licentietypen onder Licenties. Hier is een voorbeeld van de resultaten als u TextGeneration GGUF-bestanden in het Engels filtert met een MIT-licentie.
Selecteer een model dat past bij jouw toepassingsbehoeften. Als je de licentie llama.3.x hebt geselecteerd, kan je bijvoorbeeld het model llmstudio-community/Llama-3.2-1B-Instruct-GGUFf kiezen.
Selecteer op dezelfde pagina een van de beschikbare bit-gekwantiseerde modellen. HCL raad aan om 3b- of 7b llama3.x-modellen te gebruiken met 3-bits of 4-bits kwantisering niveaus, die veel kleiner zijn om te laden met een acceptabele tekst generatie kwaliteit. Dit voorbeeld toont de metadata op de modellen.
In ons voorbeeld hebben wij gezocht naar een Nederlandstalig model en vonden Llama-3-8B-dutch.i1-Q4_K_M.gguf. Bewaar het internet adres van het bestand om dit in de volgende stap te gebruiken, of download het bestand zelf en sla het op in de sub map “llm_models” in de Domino data map op de server.
Open de Domino IQ-database op de Domino IQ beheerserver.
Klik in de weergave Models op Model toevoegen.
Voeg de naam en beschrijving toe voor het model dat je wil gebruiken.
Selecteer Ingeschakeld in het veld Model downloaden wanneer je dit niet al handmatig hebt gedaan.
(Optioneel) Geef in het veld Download URL het internet adres op waarvandaan je het model wil downloaden.
(Optioneel) In het veld SHA 256 Hash kun je de hash opgeven om die van het downloadmodelbestand te verifiëren.
Sla het Model configuratie document op.
Het downloaden van LLM-modellen via HTTPS kan optioneel ook worden geconfigureerd met behulp van een geverifieerde HTTPS-proxy zoals squid of NGINX-proxy. Gebruik daarvoor de knop Algemene instellingen in de DominoIQ-database
Wanneer het bestand handmatig in de llm_models is geplaatst en het Model document geeft niet de status “Model available” aan is het mogelijk dit met de knop “Modify model status” aan te passen.
Configurations document
De volgende stap is een configuratie document in te stellen. Er zijn twee keuzes, Local en Remote. Voor de verschillende opties staat alles goed beschreven in de documentatie van HCL, daar gaan we hier niet verder op in. Wij kiezen hier voor Local, kiezen de naam van onze demo server, het Model dat in de vorige stap is gekozen, zetten de status op Enabled en laten voor nu de poort op 8080 staan.
Op het tabblad Advanced kiezen we voor een Temperature van 0.3. Voor het special paramameters veld ontbreekt iedere uitleg. Wel is het het e.a. te vinden op Overview | Llama API
Notitie:
Een temperatuur van 0 of dicht bij 0 resulteert in zeer voorspelbare, consistente en deterministische antwoorden (het model kiest altijd de meest waarschijnlijke woorden). Dit is geschikt voor taken die feitelijke of nauwkeurige resultaten vereisen. Een temperatuur van 1 of hoger leidt tot meer willekeurige, diverse en creatieve resultaten, omdat het model een bredere selectie van minder waarschijnlijke woorden in overweging neemt.
Een LLM System Prompt document toevoegen
Het LLM System Prompt document bevat een ‘systeemprompt’, een type opdracht dat wordt gebruikt om de AI Inferencing-engine die een specifiek model uitvoert, te begeleiden om een juist antwoord op de vraag terug te geven. Domino IQ heeft een ingebouwd systeempromptdocument met de naam “StdSummarizeEmailThread” dat wordt gebruikt door de Mail-sjabloon. Omdat wij een Nederlandstalige set testen hebben we de Prompt in zowel Nederlands als Engelse getest. Dit maakte geen verschil in de antwoorden. Google AI gaf op de vraag of een systeem prompt in de taal van het Model ingevoerd moet worden het antwoord “U kunt de system prompt in de gewenste taal schrijven, en het model zal waarschijnlijk goed presteren, zeker voor algemene taken. Voor optimale prestaties en consistentie (vooral bij complexe taken) wordt vaak aangeraden om de system prompt in het Engels te schrijven”
Wij hebben de Prompt dan ook standaard gehouden voor nu.
LLM Command document
In de Domino IQ database staat al een LLM Command document voor StdSummarizeEmailThread. Wij hebben hier alles standaard gelaten. Wel is er wat getest met Maximum tokens omdat in onze test het antwoord steeds wordt afgebroken en de Temperature om de verschillen in antwoorden te zien. Voor deze demo staan de tokens op 2048 en de temperatuur op 0.3.
Nieuwe klassen in de HCL Domino Designer voor IQ
Vanaf 14.5 introduceert HCL Domino Designer twee nieuwe klassen, NotesLLMRequest en NotesLLMResponse voor LotusScript, LLMReq en LLMRes voor Java. Deze klassen zijn speciaal bedoeld om generatieve AI query’s naar een Domino-server te verzenden en antwoorden terug te halen.
Voorbeeld toepassing
Om een indruk te krijgen van de toepassing hebben wij een stukje voorbeeld code uit de documentatie van HCL gebruikt om in een nieuwe knop op het Memo formulier van de mail te plaatsen.
Sub Click(Source As Button)
On Error Goto processError
Dim nSession As NotesSession
Dim nLlmreq As NotesLLMRequest
Dim nLlmres As NotesLLMResponse
Dim vAvailCmds As Variant
Dim nWorkspace As NotesUIWorkspace
Dim nMailDoc As NotesUIDocument
Dim sMailThread As String
Set nWorkspace = New NotesUIWorkspace
Set nSession = New NotesSession
Set nMailDoc = nWorkspace.CurrentDocument
Set nLlmreq = nSession.CreateLLMRequest()
vAvailCmds = nLlmreq.GetAvailableCommands("MRPOWERZBOOK/INECO")
If (Isempty(vAvailCmds) And Len(vAvailCmds(0)) > 0) Then
Msgbox "No commands available.", 16, "Error"
End If
nMailDoc.Editmode = True
sMailThread = nMailDoc.Fieldgettext("Body")
Set nLlmreq = nSession.CreateLLMRequest()
Set nLlmres = nLlmreq.Completion("MRPOWERZBOOK/INECO", "StdSummarizeEmailThread", sMailThread)
If (nLlmres.FinishReason = LLM_FINISH_REASON_STOP) Then
Msgbox nLlmres.Content, 64, nMailDoc.FieldGetText("Subject")
End If
Exit Sub
processError:
Msgbox Error$ & " on line " & Erl, 16, " Error"
Exit Sub
End Sub
In de Memo hebben wij een willekeurige tekst geplaatst over Arnhems dialect en door de nieuwe knop te gebruiken vragen wij aan de Domino IQ server om een samenvatting te maken van deze tekst. De samenvatting blijkt een aantal keren best redelijk te kloppen met een deel van de tekst en richt zich voornamelijk op het echte onderwerp zonder het verhaal er om heen.
Echter herhaaldelijk de samenvatting vragen resulteert in bijzondere antwoorden. Van een antwoord waarin gemeld wordt wat de opdracht is, tot een compleet uit de lucht gegrepen tekst over niet bestaande familieleden, of plaatsen in België waar ook een dialect gesproken wordt.
Daarbij valt op dat het antwoord steeds wordt afgebroken. Er zijn waarschijnlijk parameters die dit kunnen beïnvloeden, maar de documentatie is in dat opzicht veel te beperkt. Het is ons nog onduidelijk of dit nu aan het gekozen Model ligt of aan de IQ server instellingen.
Standaard functie in mail sjabloon StdR145Mail
In het standaard mail sjabloon StdR145Mail met de titel “Mail (R14.5)” en bestandsnaam “mail145.ntf”, zitten twee knoppen die Domino IQ gebruiken, “Summarize” en “Domino IQ Reply with History only”.
De “Summarize” knop roept een Notes agent op waar de LotusScript code in de agent zelf zit. De code doet in basis het zelfde als in ons voorbeeld. De knop is te vinden boven een mailbericht in het actieknoppen menu onder de drie puntjes rechts, “more”.
Gelukkig voor ons geeft deze code het zelfde resultaat als het voorbeeld.
De “Domino IQ Reply with History only” knop is ook alleen te vinden in het mailbericht, in het actieknoppen menu onder “Reply”. De code achter de knop roept ook een LotusScript Agent aan, hier zit de code echter in een Script bibliotheek, waar eigenlijk ook de code van de “Summarize” functie verwacht zou worden. Maar dat is een technisch detail.
Hier is de antwoord tekst duidelijk beter en ook niet afgekapt. Wellicht niet direct als antwoord te gebruiken, maar met minimale aanpassingen is er toch snel een antwoord beschikbaar.
Voorlopige conclusie
HCL Domino IQ is nog een prille ontwikkeling binnen Domino bijvoorbeeld doordat het nog niet opgenomen is in de Domino server installatie en zowel de configuratie en de ontwikkel methodes nog wat verdieping nodig hebben. Het is echter een hele mooie toevoeging aan de Domino server met veel mogelijke toepassingen! Wij hebben in ieder geval genoeg inspiratie om hier verder mee aan de slag te gaan!
Nieuw vanaf HCL Domino Designer 12.0.1 is de mogelijkheid om het ontwerp van applicaties te vergelijken zonder hiervoor software te moeten kopen, namelijk met behulp van een nieuw sjabloon CompareDBs Reports (comparedbs.ntf).
CompareDBs Reports kan worden gebruikt om twee databaseontwerpen en/of documentinhoud te vergelijken of om het ontwerp van één database te analyseren.
Databasevergelijking
Je kunt het ontwerp van twee Notes databases of sjablonen vergelijken en een rapport genereren dat in de database wordt opgeslagen. Enkele van de opties omvatten de mogelijkheid om:
Documenten uit te sluiten van de vergelijking.
Rapporten te integreren die worden gegenereerd met broncode beheerapplicaties zoals Git of Jira.
Een vergelijking tool naar keuze in te stellen in plaats van het ingebouwde tabelrapport dat de verschillen tussen bron en doel laat zien.
Database ontwerpsynopsis
Om een ontwerpsynopsis te genereren van een database kan je deze tool gebruiken en dit naar een andere database exporteren. De doeldatabase bevat documenten die elk ontwerpelement beschrijven. Een tweede sjabloon, designsynopsis.ntf, wordt gebruikt om de uitvoer van de ontwerpsynopsis te organiseren en weer te geven als een doorzoekbare Notes toepassing.
Meer informatie
Voor volledige informatie over alle opties en hoe je aan de slag kunt gaan, gebruik je het sjabloon om een nieuwe Notes toepassing te maken. Open vervolgens de applicatie en selecteer Help > Over deze applicatie en Help > Deze applicatie gebruiken.
Niet zo spannend maar wellicht toch handig om te weten is dat het veld $Index in een weergave ontwerp, als je deze bekijkt via de Designer of door middel van script, de opties voor de index van de weergave bevat.
Elke optie heeft een eigen letter met een notatie als /O enz.
Vernieuwen van de index (Refresh):
Als er geen /M, /O, of / R in het veld $Index staat, dan is de instelling “Auto, after first use”. Dit is de standaard waarde.
/O wil zeggen dat de Index “Automatic” dus automatisch wordt bijgewerkt wanneer dat nodig is.
/M staat voor de keuze “Manual” dus handmatig indexeren.
/R=3600 Dit staat voor “Auto, at most every x hours”, automatisch maar niet meer dan 1 keer per x uren waarbij de uren in ms opgegeven worden. In dit geval dus 1 keer per uur.
Verwijderen van de index na (Discard):
Wanneer er geen /P of /T in het veld $Index staat betekend dit de index na 45 dagen van inactiviteit wordt verwijderd, “If inactive for 45 days”. Dit is de standaard instelling.
/T wil zeggen dat de index na elk gebruik weer verwijderd wordt, “After each use”.
/P=24 De /P= is de parameter om de index te verwijderen (purge) in uren. /P=24 is dus na een dag van inactiviteit, instelling “If inactive for x days”.
Alleen een ontwerper of beheerder mag de index aanmaken:
/B zal in het veld staan wanneer “Restrict initial index build to designer or manager” is aangevinkt.
Deze opties samen in het veld $Index van een view object maken de Index opties. Zo kan het veld $Index bijvoorbeeld de waarde “/T/O/B” hebben of “/P=168/R=43200/B” enzovoort.
Ja en?
Ik had deze gegevens nodig om te bepalen of een onderhoudstaak geschreven in Visual Basic bepaalde weergaven moest vernieuwen of niet.
Met de NotesNoteCollection Class kun je eenvoudig de weergaven in een database te zien krijgen en de eigenschappen uitlezen.
Dim nc As NotesNoteCollection Set nc = db.CreateNoteCollection(False) nc.SelectViews = True Call nc.BuildCollection
Een klant wou een nieuwe server met Windows 2008R2 64b, Microsoft Excel en Domino 8.5.1FP5. Doel van deze server is het importeren van Excel bestanden die via uploads en mail aan diverse applicaties worden aangeboden.
Via een Lotusscript agent wordt een Microsoft.Excel object gemaakt en de bijlage ingelezen.
Op de oude server werkte dit prima, op de 2008 server niet.
Na eerst de gebruikelijke dingen als rechten e.d. gecontroleerd te hebben las ik op een forum een tip van iemand die beweerde dat een geplande Windows taak bij hem alleen werkte nadat hij de een map Desktop had aangemaakt in de map C:\Windows\SysWow64\config\systemprofile\.
En inderdaad dit was de oplossing, de agent werkte hierna ook als normaal!
Je moet het maar weten….
Hoewel de functie notesDatabase.SetOption wel beschreven wordt in de Designer Help staan enkele waarden voor versie 8.5.1 er nog niet bij, daarom even in dit onderwerp.
Om de geavanceerde database eigenschappen met Lotusscript aan te passen bestaat de volgende functie:
Call notesDatabase.SetOption( optionName% , flag )
Waarbij optionName% een waarde van het type Integer is.
Voor flag gebruik je True om de eigenschap aan te vinken, en False om het uit te zetten.
De volgende waarden zijn toegestaan:
12 = Geen idee wat dit doet?
36 = Vrije ruimte niet overschrijven (Don’t overwrite free space)
37 = Leesmarkeringen niet behouden (Don’t maintain unread marks)
38 = Speciale antwoordhierarchie niet ondersteunen ( Don’t support specialized response hierarchy)
41 = Documententabel optimaliseren (Optimize document table map)
44 = Eigenschap LastAccessed behouden (Maintain LastAccessed property)
45 = Transactielog uitschakelen (Disable transaction logging)
46 = Controleren op nieuws niet toestaan (Don’t allow headline monitoring)
49 = Voorlopig verwijderen toestaan (Allow soft deletions)
54 = Meer velden in database toestaan (Allow more fields in database)
65 = LZ1-compressie gebruiken voor bijlagen (Use LZ1 compression for attachments)
70 = Leesmarkeringen repliceren: Alleen clusterservers (Replicates unread marks: Clustered servers only)
71 = Leesmarkeringen repliceren: Alle servers (Replicates unread marks: All servers)
74 = Markeer de database als niet beschikbaar. (Out of service enabled)
75 = Threadhistorie ondersteunen (Support Response Thread History)
76 = Eenvoudig zoeken niet toestaan (Don’t allow simple search)
81 = Domino service voor bijlagen en objecten gebruiken (Use Domino Attachment and Object Service)
82 = Documentgegevens comprimeren (Compress document data)
85 = Export van viewgegevens uitschakelen (Disable export of view data)
Onbekende opties
Ik mis nog een aantal opties zoals de optie om “Weergaven automatisch bijwerken uitschakelen” (Disable automatic updating of views) en “Database-ontwerp comprimeren” (Compress database design) aan of uit te zetten.
De nieuwe methode StampAllMulti voor de NotesDocumentCollection en NotesViewEntryCollection classes is een waardevolle aanvulling!
Nu kunnen we zeer snel meerdere velden in een documentenreeks van een nieuwe waarde voorzien.
Omdat er in de Lotus 8.5 Designer Help geen voorbeeld staat voor het gebruik post ik het even hier.
In dit geval maken we een document collectie door alle documenten in een view te selecteren, maken een nieuw (tijdelijk) document, vullen het document met een paar velden en roepen
de methode StampAllMulti aan om de velden uit het tijdelijke document te kopieren naar alle documenten in de collectie. Snel en effectief!
Voorbeeld:
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim vc As NotesViewEntryCollection
Dim doc As NotesDocument
Set db = session.CurrentDatabase
Set view = db.GetView(“StampMulti”)
Set vc = view.AllEntries
document
NotesDocument. The document contains multiple items, each with values appropriate for the item type.
Usage
If an item does not exist, it is created. If the item is of a different data type, the existing item will be deleted and a new item of the new data type created.
The item values are immediately written to the documents on the server. You do not have to use the Save method of NotesDocument after StampAllMulti. However, any documents modified by your script must be saved before calling StampAllMulti.
This method does not modify existing NotesDocument objects. Documents must be retrieved again to see the changes.
If you do not have the proper access to modify one or more of the documents in the view entry collection, this method will return ERR_NOTES_STAMP_FAILED. Only those documents you are able to modify will be stamped.
Een van de dingen die ik mij zelf heb aangeleerd bij het maken van een applicatie is altijd gebruik te maken van een duidelijke foutafhandeling waarbij Lsi_info vaak werd gebruikt.
Meestal zag die code er ongeveer uit als:
Function doeDingen() As Boolean On Error Goto ErrorHandler ‘Hier komt de code ….
Exit Function ErrorHandler: MsgBox Lsi_info(2) & ” : Error ” & Error & ” (” & Err & “) on line ” & Erl & “.” Exit Function Resume Next End Function
Lsi_info
Lsi_info was in de vroegere versies van Lotus Notes eigenlijk de enige methode om informatie te krijgen over de huidige thread.
Een aantal regelmatig gebruikte gegevens waren:
Lsi_info(1) ‘Huidige regel in de Lotusscript Source Code Lsi_info(2) ‘Huidige functie of sub Lsi_info(3) ‘Huidige module Lsi_info(6) ‘LotusScript versie Lsi_info(9) ‘ Taal code Lsi_info(11) ‘Totaal aantal code regels van de huidige module Lsi_info(12) ‘Naam van de aanroepende functie of sub Lsi_info(13) ‘Naam van de aanroepende module Lsi_info(14) ‘Lijst van alle modules die aangeroepen zijn tot dit moment Lsi_info(50) ‘ LotusScript Geheugen gealloceerd Lsi_info(51) ‘LotusScript Geheugen gealloceerd van het besturingssysteem Lsi_info(52) ‘LotusScript geheugen blokken in gebruik
IBM beweerd echter dat Lsi_info niet gebruikt mag worden omdat dit alleen bedoeld is voor intern gebruik en mogelijk voor een instabiel systeem kan zorgen, met name op 64Bit systemen. Daarom heeft men in de meer recentere versies van Notes een nieuwe methode ter beschikking gesteld: GetThreadInfo.
GetThreadInfo
De aanbevolen schrijfwijze zou dan ook worden:
Function doeDingen() As Boolean On Error GoTo ErrorLabel ‘En hier komt de code weer …. Dim i As integer i = Evaluate(“@Error”,Nothing) ExitLabel: Exit Function
ErrorLabel: MsgBox GetThreadInfo(1) & ” : Error ” & Error & ” (” & Err & “) On Line ” & Erl & “.”, 16 , “Error” Resume ExitLabel End Function
De aanroepen die ondersteund worden zijn:
Getthreadinfo(0) ‘LSI_THREAD_LINE: Huidige regel in de Lotusscript Source Code Getthreadinfo(1) ‘LSI_THREAD_PROC: Huidige functie of sub Getthreadinfo(2) ‘LSI_THREAD_MODULE: Huidige module Getthreadinfo(3) ‘LSI_THREAD_VERSION: LotusScript versie Getthreadinfo(4) ‘LSI_THREAD_LANGUAGE: Taal code Getthreadinfo(5) ‘LSI_THREAD_COUNTRY: Regionale instelling Getthreadinfo(6) ‘LSI_THREAD_TICKS:Krijg actuele kloktikken Getthreadinfo(7) ‘LSI_THREAD_TICKS_PER_SEC: Krijg kloktikken per seconde (alleen ondersteund op platforms die parallelle verwerking van primitieven ondersteunen) Getthreadinfo(8) ‘LSI_THREAD_PROCESS_ID: Huidige proces-ID ophalen (alleen ondersteund op platforms die primitieven voor parallelle verwerking ondersteunen) Getthreadinfo(9) ‘LSI_THREAD_TASK_ID: Huidige taak-id ophalen (alleen ondersteund op platforms die primitieven voor parallelle verwerking ondersteunen) Getthreadinfo(10) ‘LSI_THREAD_CALLPROC: Naam van de aanroepende functie of sub Getthreadinfo(11) ‘LSI_THREAD_CALLMODULE: Naam van de aanroepende module
Om 12000 documenten te exporteren naar Excel was een LotusScript agent te lang bezig met het vullen van de cellen.
Daarom is er gekozen om het bestand naar een comma gescheiden bestand weg te schrijven.
De klant vond het echter lastig om dit weer te openen in Excel, vandaar dat er een stukje code moest komen om dit te automatiseren.
Een stukje van de code:
Sub Initialize
Dim OfficeApplication As Variant
Dim workbook As Variant
Dim xlsheet As Variant
Dim ar() As Integer
Const xlNone = -4142
Const xlAutomatic = -4105
Const xlUnderlineStyleNone = -4142
Const xlThemeFontNone = -4142
Const xlInsertDeleteCells = 1
Const xlDelimited = 1
Const xlTextQualifierDoubleQuote = 1
Const xlTextFormat = 2
….. declareer dingen …
fList(“Form”) = “Form”
…. etc…
Set ws = New NotesUIWorkspace
filenames = ws.SaveFileDialog(False,”File name”,, “c:\”, “export” & Format(Today,”ddmmyyyy”) & “.txt”)
If (Isempty(filenames)) Then
Exit Sub
End If
Set curDB = Session.CurrentDatabase
Set View = curDB.GetView(“myView”)
View.AutoUpdate = False
fileNum% = Freefile()
Open filenames(0) For Output As fileNum%
Forall i In fList
mString$ = mString$ & “,” & i
End Forall
Print #fileNum%, Strright(mString$,”,”)
Set Doc = View.GetFirstDocument
Do Until Doc Is Nothing
mString$ = “”
Forall i In fList
If Doc.HasItem(Listtag(i)) Then
Set item = Doc.GetFirstItem(Listtag(i))
Select Case item.Type
Case 768
mString$ = mString$ & “,” & Replace(Doc.GetFirstItem(Listtag(i)).Text,”,”,”.”)
Case 1024
mString$ = mString$ & “,” & Replace(Format(item.Values(0),”dd-mm-yyyy”),”-“,”/”)
Case Else
mString$ = mString$ & “,” & Replace(Doc.GetFirstItem(Listtag(i)).Text,”,”,”;”)
End Select
Else
mString$ = mString$ & “,”
End If
End Forall
Print #fileNum%, Strright(mString$,”,”)
Set Doc = View.GetNextDocument(Doc)
Loop
Close fileNum%
con = “TEXT;” & filenames(0)
If Not (setOfficeApplication(“Excel.application”)) Then Exit Sub ‘ start Excel met een functie
rgbColor& = xlNone
x = 0
Forall i In fList
Redim Preserve ar(x) As Integer
ar(x) = xlTextFormat
x = x + 1
End Forall
On Error Resume Next
OfficeApplication.Cells.EntireColumn.Autofit
OfficeApplication.Rows(“1:1″).Select
OfficeApplication.Selection.AutoFilter
OfficeApplication.Visible = True
Exit Sub
ErrorHandler:
Msgbox Lsi_info(2) & ” ” & Error & ” (” & Err & “) on line ” & Erl
Resume ExcelClose