95
The Lotus Code Cookbook Ulrich Krause EntwicklerCamp, 21. – 23.02.2011, Gelsenkirchen, Deutschland

The Lotus Code Cookbook

Embed Size (px)

DESCRIPTION

The Lotus Code Cookbook - Ulrich KrauseTipps, Tipps, Tipps ... Die Session behandelt kein zentrales Thema. In loser Folge werden Tipps und Tricks aus allen Bereichen der Programmierung in Lotus Notes / Domino vorgestellt. @Formula, LotusScript, Java, JavaScript, LS2CApi.Zielgruppe sind Alle, die sich mit Applikationsentwicklung beschäftigen. Anfänger und "alte Hasen"; es ist für jeden etwas dabei.

Citation preview

Page 1: The Lotus Code Cookbook

The Lotus Code CookbookUlrich Krause EntwicklerCamp, 21. – 23.02.2011,

Gelsenkirchen, Deutschland

Page 2: The Lotus Code Cookbook

Agenda• Allgemeines• Optionen des Designers• Tools• @Formeln• LotusScript• Bearbeitung von Richtext ( C-Api / LS2CAPI )• Javascript (Frameworks)• XPages

Page 3: The Lotus Code Cookbook

Warum sollten wir @Formeln verwenden?• Alle Sprachen verwenden die gleichen

Kernfunktionen• Bei gleicher Funktionalität sind Formeln IMMER

performanter• Formeln sind Performance optimiert

LotusScript Java @FormulaByteCode Interpreter FormulaEngine

Notes Core API

Lesenswert: Damien Katz, http://damienkatz.net/2005/01/formula-engine-rewrite.html

Page 4: The Lotus Code Cookbook

Option Declare• Wichtigste Codezeile in LotusScript• Option Declare “zwingt” zum Deklarieren aller

Variablen und erspart das Beseitigen von schwer auffindbaren Fehlern

• Alle Fehler sind runtime Fehler

Page 5: The Lotus Code Cookbook

Option Declare• OHNE „Option Declare“

• MIT„Option Declare“

Page 6: The Lotus Code Cookbook

Option Declare• Der wichtigste Grund, warum wir „Option

Declare“ verwenden MÜSSEN, ist …

Page 7: The Lotus Code Cookbook

Option Declare

Every time you don‘t use „Option Declare“, God will kill a kitten !!

Page 8: The Lotus Code Cookbook

Option Base• Sets the default lower bound for array subscripts

to 0 or 1

Page 9: The Lotus Code Cookbook

Dim Statement• Erstellt eine Referenz zu einem Objekt, ohne das

Objekt zu erstellen• Achtung : Dim i, j, k As Integer

• Dim i As Integer, j As Integer, k As Integer

Page 10: The Lotus Code Cookbook

Dim Statement und Performance• Ausführungszeiten messen mit Getthreadinfo• Wird z.B. ein Integerwert in einem Variant

gespeichert, so muss Notes intern eine Typumwandlung vornehmen. Das kostet Zeit !!

DEMO: DIM - Zeitschleife

Page 11: The Lotus Code Cookbook

GetNextDocument vs. GetNthDocument• 16.260 Dokumente• 10 Testläufe / Methode• Tabelle zeigt die Durchschnittswerte

Page 12: The Lotus Code Cookbook

GetNextDocument vs. GetNthDocument• 113.610 Dokumente• 4 Testläufe / Methode• Tabelle zeigt die Durchschnittswerte

DEMO - GetNextDocument vs. GetNthDocument

Page 13: The Lotus Code Cookbook

Script / Comment Templates• Einheitlicher Aufbau von Codesegmenten

Page 14: The Lotus Code Cookbook

Fonts / Colors• Individuelle Einstellungen für bessere Lesbarkeit

Page 15: The Lotus Code Cookbook

Zeilennummern einblenden

Page 16: The Lotus Code Cookbook

Sessionempfehlung• Anita Dunger

Einführung in die neue Designer-Umgebung ( Hands On, Dienstag 9:00 – 10:30 )

• Julian BussVersionskontrolle mit dem Domino Designer( direkt im Anschluss an diese Session )

Page 17: The Lotus Code Cookbook

Soft-Coded Field Names• One of the worst traps in LotusScript is using hard-

coded field names.

• LotusScript makes it simple to hard code field names, because of its support for extended attributes of the NotesDocument class.

• The LotusScript documentation even describes this as a feature, though you should avoid it like the plague.

Page 18: The Lotus Code Cookbook

Logging• Kein Code ist absolut fehlerfrei!• Auch wenn momentan keine Fehler erkennbar

sind, werden Fehler auftauchen.• Fehler erkennen, die von Usern nicht immer

gemeldet werden.• Es gibt Tools, die ein aussagekräftiges Logging mit

nur wenigen Codezeilen ermöglichen.• Julian Robichaux: OpenLog

– http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=OpenLog

Page 19: The Lotus Code Cookbook

OpenLog

Page 20: The Lotus Code Cookbook

Source Sniffer• Domino Designer extension• Sucht in einer oder meheren Anwendungen• Unterstützt – Java, – Javascript, – Lotusscript,– @Formula,– Xpages

• http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=Source%20Sniffer

Page 21: The Lotus Code Cookbook

NotesHound

http://domino-80.prominic.net/A55BE4/NotesHoundWeb.nsf/webpages/index.html

Page 22: The Lotus Code Cookbook

LotusScript.doc• Erstellt eine Dokumentation

von LotusScript in einer Datenbank.– Syntax wie Javadoc– LotusScript.doc API– http://blog.lsdoc.org/

• LSDoc Support to DDE– http://blog.mindoo.com/web/blog.nsf/dx/

22.07.2010223240KLES4H.htm?opendocument&comments, Karsten Lehmann

Page 23: The Lotus Code Cookbook

Hide Design• In kommerziellen Anwendungen• Template „Hide Design“• Problem: keine Anpassungen von Ansichten durch

den Anwender• Besser ist es daher, nur Teile der Anwendung zu

verbergen.• In der Regel enthalten Script Bibliotheken den

schützenswerten Code.• %Include „xyz.lss“

Page 24: The Lotus Code Cookbook

Hide Design

Der lesbare Quelltext befindet sich im item $ScriptLib

Page 25: The Lotus Code Cookbook

Hide Design• kann

Den Text im item $ScriptLib kann man löschen oder durch ein freundliches „Hello“ ersetzen. Nach dem Speichern ist der Quelltext nicht mehr sichtbar.

Page 26: The Lotus Code Cookbook

NotesView.AutoUpdate = false• Performancegewinn, da die Ansicht nicht

kontinuierlich aktualisiert wird.• Zu den technischen Hintergründen; Bob Balaban,

http://bobzblog.com/tuxedoguy.nsf/dx/geek-o-terica-10-autoupdating-in-views

• http://www-10.lotus.com/ldd/ddwiki.nsf/dx/View.AutoUpdate_

• Bei der Verwendung von NotesViewNavigator können Fehler auftreten, wenn AutoUpdate = true („Entry not found in Index“)

• Andre Guirard, http://www-10.lotus.com/ldd/bpmpblog.nsf/dx/autoupdate-false

Page 27: The Lotus Code Cookbook

@WhichFolders • Neu ab 8.5.1• Nur in Ansichtsspalten zu verwenden• Option „Maintain folder unread

information“ muß aktiviert sein• Option „ Don't maintain

Unread marks“ darf nicht aktiviert sein“

Page 28: The Lotus Code Cookbook

@WhichFolders in LotusScript I• db.FolderReferencesEnabled = True• $FolderInfo und $FolderRefInfo

– Ansichten können aus der Mailschablone kopiert werden

Demo: @WhichFolders in LS I

Page 29: The Lotus Code Cookbook

@WhichFolders in LotusScript II• CreateViewNavFrom• Keine zusätzlichen Designelemente erforderlich• Aber langsam bei einer großen Ordneranzahl

Demo: @WhichFolders in LS II

Page 30: The Lotus Code Cookbook

@Command( [DiscoverFolders];title)• Wie @WhichFolders mit zusätzlichen

Möglichkeiten, um die Ordnereigenschaften eines Dokuments zu ändern.

• Uncheck „Don‘t maintain unread marks“

Page 31: The Lotus Code Cookbook

@Transform• Seit Version 6• Entspricht LotusScript statement ForAll x in Liste • Führt eine Formel für jedes Element der Liste aus.• @Transform( list ; variableName ; formula )• Rückgabewert ist die durch die Formel

modifizierte Liste• Kann in Ansichtenspalten verwendet werden

Page 32: The Lotus Code Cookbook

@Transform (Sample)• Names.nsf - People\By Client Version• Unübersichtlich, da alle

Versionen dargestellt werden.

Page 33: The Lotus Code Cookbook

People\By Client Version (new)• Mit wenigen Handgriffen Ordnung schaffen

Page 34: The Lotus Code Cookbook

@Nothing• Seit Version 6• Lt. Designer Hilfe nur mit @Transform zu

verwendbar ( „not valid in other context“ )• Funktioniert aber z.B auch in View Selection

Page 35: The Lotus Code Cookbook

@Sort• Sortiert eine Liste

– [ACCENTSENSITIVE]– [ACCENTINSENSITIVE]– [ASCENDING]– [CASESENSITIVE]– [CASEINSENSITIVE]– [CUSTOMSORT]– [DESCENDING]– [PITCHSENSITIVE]– [PITCHINSENSITiVE]

• Dies lässt sich auch kombinieren– [ASCENDING]:[CASESENSITIVE]

Page 36: The Lotus Code Cookbook

@Sort• @Sort kann aber noch mehr – [CustomSort]

Page 37: The Lotus Code Cookbook

@UpdateFormulaContext• Ändert den Kontext einer Formel • Nachfolgende Befehle werden im neuen Kontext

ausgeführt

Page 38: The Lotus Code Cookbook

@Now + [NoCache]• [SERVERTIME] ermöglicht die Abfrage von @Now

für einen Server oder eine Liste von Servern.• Problem: Änderung der Systemzeit

• @Now fragt die Zeit beim ersten Aufruf ab und cached diesen Wert. Bei weiteren Aufrufen wird nur die Zeit seit dem ersten Aufruf zum Wert im Cache addiert.• [NOCACHE] umgeht dieses Problem

• Nicht dokumentiert; noch nicht

Page 39: The Lotus Code Cookbook

Get the current location name• @LocationGetInfo

– @LocationGetInfo([HomeServer])– @LocationGetInfo([InternetMailAddress])– @LocationGetInfo([NamePreference])– @LocationGetInfo([BookmarksFilename])– @LocationGetInfo([SametimeServer])

• @LocationGetInfo([UNID])– http://www.thenorth.com/apblog4.nsf/0/60C5A5C6540A2D648525719F0012BDED

Page 40: The Lotus Code Cookbook

Get the current location name• @LocationGetInfo([FullName])

– @LocationGetInfo([AbbreviatedName])

• Damit erhalten wir Zugriff auf JEDES beliebige Feld in der aktuellen Arbeitsumgebung

Page 41: The Lotus Code Cookbook

@GetMachineInfo (8.5.3)• New @Function to support Machine Specific

Policy Settings as of Notes / Domino 8.5.3

Page 42: The Lotus Code Cookbook

@GetMachineInfo vs. @Environment• @GetMachineInfo([EnvVariable];"Location");– Liefert den gewünschten Wert für alle Variablen in der

notes.ini zurück– Egal ob mit „$“ oder ohne– Kann keine Werte setzen

• @Environment(„Location“)– Liefert nur Variablen mit „$“ zurück ($DDM_SERVER)– Kann auch Werte in der notes.ini setzen

Page 43: The Lotus Code Cookbook

@CheckFormulaSyntax • Überprüft Formeln • Zeigt den Fehler konkret an

Page 44: The Lotus Code Cookbook

@CheckFormulaSyntax (LotusScript) • Verwendet LotusScript EVALUATE

DEMO - CheckFormula

Page 45: The Lotus Code Cookbook

@BusinessDays• Ermittelt die Anzahl von Werktagen in einem

Datumsbereich• Bestimmte Tage können als Werktage ausgeschlossen

werden• Ebenso lassen sich Feiertage als Werktage ausschließen

Beispiel: Der Wert eines Items soll auf einen Wert @Today + 3 Tage gesetzt werden.Dabei sollen die Wochenenden und bestimmte Datumswerte nicht als Werktage gelten.

@BusinessDays wird in XPages nicht unterstützt

Page 46: The Lotus Code Cookbook

@BusinessDays (LS)• Evaluate zur Einbindung von @BusinessDays in LS

Page 47: The Lotus Code Cookbook

@DbLookup + [FailSilent]• Keine Fehlermeldung, wenn keine Entsprechung

in der Ansicht gefunden wird

• @DbLookup(""; ""; "All"; Source; 2;[FailSilent])

Page 48: The Lotus Code Cookbook

[ReturnDocumentUniqueID]• Gibt die DocumentUNID eines @DBLookup

Ergebnisses zurück

• @DbLookup(""; ""; "All"; “test”; 1; [FailSilent]:[ReturnDocumentUniqueID]);

• Macht eine zusätzliche Ansicht mit einer Spaltenformel @Text(@DocumentUniqueID) überflüssig

Page 49: The Lotus Code Cookbook

@ConfigFile• Wo ist die notes.ini?

• @Prompt([OK];“notes.ini path“;@configfile)

• Notes.ini bearbeiten• @Command([Execute];"notepad"; @configfile)

Page 50: The Lotus Code Cookbook

Programmatic Use• Wozu ist die Eigenschaft „Programmatic Use“ da?• Keine Redundanz komplizierter

Spaltenformeln. Das Ergebnis einer Berechnung kann in einer anderen Spalte verwendet werden

Andre Guirard http://www-10.lotus.com/ldd/ddwiki.nsf/dx/colprognames.htm

Page 51: The Lotus Code Cookbook

Permutation Comparison In Hide Formulas• Element nicht anzeigen, wenn User nicht

mindestens eine der Rollen hat.• @IsNotMember("[GloAdmin]"; @UserRoles) &

@IsNotMember("[GloEditor]"; @UserRoles)

• Läßt sich kürzen auf:• @IsNotMember("[GloAdmin]" : "[GloEditor]"; @UserRoles)

• Noch kürzer

• !("[GloAdmin]" : "[GloEditor]" *= @UserRoles)

Page 52: The Lotus Code Cookbook

Get Rules From Users Mailfile• User mögen Regeln, aber nicht unsere.• User erstellen Regel, viele, sehr viele Regeln.• Aber welche Regeln haben die User denn erstellt?

– http://www.eknori.de/2007-02-13/get-rules-from-users-mailfile/

Page 53: The Lotus Code Cookbook

Mail Rules Extended• Regeln haben starre, vorgegebene Bedingungen

Page 54: The Lotus Code Cookbook

Mail Rules Extended• Der Client speichert die Regeln im Kalenderprofil• Auf dem Server werden die Regeln in “mailrule”

Dokumenten gespeichert

Page 55: The Lotus Code Cookbook

Mail Rules Extended• Mehr Möglichkeiten bei der Regelerstellung• Erfordert Änderung an names.nsf• Kein grosser Aufwand beim Upgrade

Page 56: The Lotus Code Cookbook

Tweak Auto-Populated Groups• Einfache Erweiterung in names.nsf– Create a new subform– Create a new field on the subform ( SelectionCriteria, Text,

Editable )

– Give it the name Custom and an alias starting with $AutoPopulate followed by a number of your choice ( i.e. 9999)

– Save the subform

• http://www.eknori.de/2008-06-10/tweak-the-auto-populated-groups-feature-in-domino-85/

Page 57: The Lotus Code Cookbook

How to get rid of $UpdatedBy?• Unter Umständen sollen die Bearbeiter eines

Dokuments nicht sichtbar sein.

Page 58: The Lotus Code Cookbook

@AdminDelegateMailFile• Erstellt Administrationsprocess

– Unterzeichner muss Owner der Maildatei sein (!)

Page 59: The Lotus Code Cookbook

Custom Administration Process• Fehlende Funktionen hinzufügen– Z.B. : User aus Gruppe entfernen

• Verlagerung administrativer Aufgaben in den Servicedesk

• NotesAdministrationProcess class• Seit Release 6• AddGroupMembers method • aber keine RemoveGroupMembers method

Page 60: The Lotus Code Cookbook

Custom Administration Process

Page 61: The Lotus Code Cookbook

Custom Administration Process• admin4.nsf anpassen ( neue Maske )

Page 62: The Lotus Code Cookbook

Custom Administration Process• admin4.nsf anpassen ( Ansichten )

• Neue Ansicht erstellen oder• Spalte „Action“ anpassen

Page 63: The Lotus Code Cookbook

Zip and Unzip

• Verwendung von ZIP/UNZIP mit LotusScript• Kostenlos

http://www.vcode.no/vcode.nsf/downloads/VCZIPSUP

Page 64: The Lotus Code Cookbook

Auto-Zip Mail Attachments• Anhänge werden beim Versenden automatisch

gepackt• Genaue Beschreibung der Anpassungen

im Lotus Notes & Domino Wiki– http://www-10.lotus.com/ldd/dominowiki.nsf/page.xsp?

documentId=7963EB58BAD528FB852577AE0062A72A&action=openDocument&mode=original

Page 65: The Lotus Code Cookbook

XLS ohne Excel erstellen• Reports sollen auf einem Server erstellt werden,

auf dem kein Excel installiert ist. ( Linux )• http://jxls.sourceforge.net/index.html

• Support for Excel 2007 OOXML (.xlsx) file format

Page 66: The Lotus Code Cookbook

XLS ohne Excel erstellen

Page 67: The Lotus Code Cookbook

Lotus Symphony Toolkit• %Include "symphonylsx.lss„• OpenNTF.org Contacts Experience

– http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=OpenNTF.org%20Contacts%20Experience

• MailMerge• Letter• Export Contacts– Symphony– MS Office

Page 68: The Lotus Code Cookbook

Wurde das Dokument gelesen?• doc.GetRead([username])– Ab Release 8.5– Gibt „true“ zurück, wenn das Dokument vom aktuellen

User gelesen wurde– Wird ein Username angegeben, wird der Lesestatus

dieses Users zurückgegeben

Page 69: The Lotus Code Cookbook

@Midas Lookups• Ben Langhinrichs ( genii software )• Auslesen von Daten aus RichText• Syntax wie @DBColumn und @DBLookup

Free download: http://www.geniisoft.com/showcase.nsf/MidasLookups

Page 70: The Lotus Code Cookbook

@Midas Lookups• Erweiterte Möglichkeiten• Beispiel: Sortierte Ausgabe aller Listenpunkte

Page 71: The Lotus Code Cookbook

Ist RichText Item leer??• @Length(@Text(body))-1

• @Attachments

• rtitem.ValueLength

• rtitem.EmbeddedObjects• Attachments OK• Aber: Doclinks, Inline Images, Hotspots (Button)

Page 72: The Lotus Code Cookbook

Ist RichText Item leer?

DEMO - Is Item empty?

Page 73: The Lotus Code Cookbook

Arbeiten mit RichText• C/C++ API oder LS2CAPI

• Normunds Kalbernzin • LotusScript to Lotus

C API Programming Guide ( ls2capi.com )

• Lee Powell• LotusScriptor's Plain Simple Guide to the

Lotus Notes C++ API • Download :

http://www.eknori.de/downloads/capibook.pdf

• Ethann Castell• Getting started with the C-API• Control rich text content with precision using the C-API• The View, 09 / 11 , 2007

Page 74: The Lotus Code Cookbook

Einordnung der C-API

Betriebssystem

Notes Object Interface (NOI)

Lotus Script

C++ API

Notes Core ( C API )

Visual Basic (COM)JAVA

JNI

Page 75: The Lotus Code Cookbook

Ist RichText Item leer?• LS2CAPI to the rescue!– Leeres RTI besitzt nur einen CDRecord von Typ Text

Page 76: The Lotus Code Cookbook

Header / Footer• Erstellen / Ändern– Anwendungseigenschaften ( global )– Dokumenteneigenschaften

• Keine Möglichkeit über @Formel oder LotusScript

Page 77: The Lotus Code Cookbook

Header / Footer• Informationen sind in RichText item gespeichert

Page 78: The Lotus Code Cookbook

Header / Footer• LotusScript Library / LS2CAPI

Page 79: The Lotus Code Cookbook

Inline Images• Auf Inline Images kann nicht über die embedded

objects Eigenschaft zugegriffen werden• Inline Images werden z.B. nicht bei DAOS

berücksichtigt.• Es gibt keine Methoden, um Inline Images mit

LotusScript so umzuwandeln, daß sie als Anhang im Dokument gespeichert werden.

Page 80: The Lotus Code Cookbook

Inline Images• Wie ist ein Inline Image gespeichert ?

Page 81: The Lotus Code Cookbook

Inline Images

Andre Guirard

http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=LotusScript%20Gold%20Collection

Page 82: The Lotus Code Cookbook

Inline Images

• rtLib: framework of LotusScript classes to work with Notes Rich Text on 32-bit versions of Domino on AIX, Solaris (SPARC), Linux, MacOS, OS X (currently PowerPC only) and Windows.

Normunds Kalnberzinshttp://www.rtlib.com/

Page 83: The Lotus Code Cookbook

Replace Inline Image • Bilder, die aus der Zwischenablage in ein

Dokument eingefügt werden, werden bei DAOS nicht berücksichtigt.

• Methoden zum Umwandeln in ein Attachment gibt es in Lotus Notes nicht.

• Funktion muss folgende Voraussetzungen erfüllen• Umwandeln des inline image in ein Attachment• Ersetzen des inline image durch das Attachment• Beibehalten der Position

Page 84: The Lotus Code Cookbook

Replace Inline Image

Das Attachment wird an die Position des Inline Image gesetzt.

Page 85: The Lotus Code Cookbook

Replace Inline Images

Page 86: The Lotus Code Cookbook

Insert Richtext into Richtext• notesRichTextRange.FindAndReplace( target$ ,

replacement$ , [ options& ] )• Damit lässt sich aber nur Text innerhalb von

RichText finden und ersetzen• Für das Einfügen eines kompletten RichText Items

oder Teile davon an eine definierte Stelle in einem anderen RichText Item gibt es keine Methode.

Page 87: The Lotus Code Cookbook

Insert Richtext into Richtext

Page 88: The Lotus Code Cookbook

Insert Richtext into Richtext

Page 89: The Lotus Code Cookbook

JW Player - Mediaplayer• JW Player: Ein paar Zeilen Code für einen

Mediaplayer für Flash und HTML5 support• Skins, Plugins und Playlists

http://www.longtailvideo.com/players/

Page 90: The Lotus Code Cookbook

JW Player - Mediaplayer

Page 91: The Lotus Code Cookbook

jQuery• freie, umfangreiche JavaScript-Klassenbibliothek,

welche komfortable Funktionen zur DOM-Manipulation und -Navigation zur Verfügung stellt

http://www.reizkraft.com/content/die-43-sch%C3%B6nsten-jquery-plugins-f%C3%BCr-webdesignAnimated gif created with http://picasion.com/

Page 92: The Lotus Code Cookbook

UIZE – JavaScript Framework• „You Eyes“ • OpenSource, MIT oder GNU GPL• Unterstützung von …– Widgets, – Ajax, – DOM, – Templates – …

• Mobile Devices

• http://www.uize.com/

Page 93: The Lotus Code Cookbook

UIZE – JavaScript Framework• Sample : Resizer

Page 94: The Lotus Code Cookbook

Xpages und @Formula• Nur 97 der 274 @Formeln können in SSJS

verwendet werden– http://www-10.lotus.com/ldd/ddwiki.nsf/dx/

List_of_Formula_Not_Supported_In_XPages

• Michael Gollmick hat ein paar Formeln umgesetzt– @WebDBName

– http://blog.gollmick.de/mgoblog.nsf/40f2c735481f54dd80256d650047636c/0687660450ad65bdc125754a008357ce?OpenDocument

– @URLEncode, @URLDecode– http://blog.gollmick.de/mgoblog.nsf/dx/some-more-Functions-for-

XPages-URLEncode-URLDecode.htm

Page 95: The Lotus Code Cookbook

Q + A• Mail: [email protected]• Blog: http://www.eknori.de• Sametime: Bleedyellow.com• Twitter: Eknori