Tag: Lotusscript

  • HCLSoftware Certified Associate Developer – Notes/Domino 14

    HCLSoftware Certified Associate Developer – Notes/Domino 14

    Vandaag heb ik mijn HCLSoftware Certified Associate Developer – Notes/Domino 14 certificaat behaald.

    HCLSoftware Certified Associate Developer - Notes/Domino 14

    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.

    HCLSoftware U – Domino 14 Associate Developer


  • Nieuw in HCL Domino 14.5: Domino IQ

    Nieuw in HCL Domino 14.5: Domino IQ

    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:

    • Ga naar het tabblad Modellen op de Hugging Face-site: https://huggingface.co/models
    • 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!

    Bronnen:

    HCL Documentatie: Domino IQ

    HCL Designer: NotesLLMRequest (LotusScript) en NotesLLMResponse (LotusScript)

    LLaMA op GitHub: ggml-org/llama.cpp: LLM inference in C/C++

    LLaMa Developer: Overview | Llama API

    Symbio6: 8 stappen om een goede AI-prompt te schrijven

  • Ontwerp van applicaties vergelijken met CompareDBs Reports

    Ontwerp van applicaties vergelijken met CompareDBs Reports

    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.

  • Opties in $Index veld in weergave ontwerp

    Opties in $Index veld in weergave ontwerp

    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

     

     

     

     

  • Excel import via Lotusscript agent op een Windows 2008R2 server

    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….

  • notesDatabase.SetOption

    notesDatabase.SetOption

    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.

  • Nieuw in 8.5: ResetUserPassword

    Voor ontwikkelaars is er in Notes 8.5 een nieuwe functie bijgekomen om wachtwoorden via een applicatie te kunnen resetten: ResetUserPassword.

    In LotusScript:
    Call notesSession.ResetUserPassword( servername, username, password[, downloadcount ] )

    In Java:
    public void resetUserPassword(String servername, String username, String password[, Int downloadcount]) throws NotesException

    ResetUserPassword kan alleen worden gebruikt als ID Vault is ingesteld.

  • Nieuw in 8.5: StampAllMulti – een voorbeeld hoe te gebruiken…

    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

    Set Doc = db.CreateDocument
    Doc.ReplaceItemValue(“Company”,”INECO”).IsSummary = True
    Doc.ReplaceItemValue(“Address”,”Hoge Riem 27″).IsSummary = True
    Doc.ReplaceItemValue(“Zipcode”,”6666JA”).IsSummary = True
    Doc.ReplaceItemValue(“City”,”Heteren”).IsSummary = True
    Doc.ReplaceItemValue(“Country”,”The Netherlands”).IsSummary = True
    Doc.ReplaceItemValue(“Phone”,”+31653353140″).IsSummary = True
    Call vc.StampAllMulti( Doc )

    End Sub

    Uit de Help:

    Replaces the values of specified items in all documents associated with the entries in a view collection.

    Note
    This method is new with Release 8.5.
    Defined in

    NotesViewEntryCollection
    Syntax

    Call notesViewEntryCollection.StampAllMulti( document )

    EN

    Parameters:

    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.

  • Getthreadinfo vervangt Lsi_info

    Getthreadinfo vervangt Lsi_info

    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

    DOEDINGEN foutmelding met GetThreadInfo

    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

    Bronnen:

    Calling the unsupported LotusScript function LSI_Info may cause a server crash

    https://help.hcl-software.com/dom_designer/14.5.0/basic/LSAZ_GETTHREADINFO.html

     

  • LotusScript en Excel import van tekst bestand

    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

    Set workbook = OfficeApplication.Workbooks.Add ()
    Set xlsheet = OfficeApplication.Workbooks(1).Worksheets(1)
    With xlsheet.QueryTables.Add(con,xlsheet.Range(“A1″) )
    .Name = Strright( filenames(0),”\”)
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 1252
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = ar
    .TextFileTrailingMinusNumbers = True
    .Refresh
    End With

    ExcelClose:

    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

    End Sub