The Lotus Code Cookbook

Transcription

The Lotus Code Cookbook
The Lotus Code Cookbook
Ulrich Krause
EntwicklerCamp, 21. – 23.02.2011,
Gelsenkirchen, Deutschland
Agenda
•
•
•
•
•
•
•
•
Allgemeines
Optionen des Designers
Tools
@Formeln
LotusScript
Bearbeitung von Richtext ( C-Api / LS2CAPI )
Javascript (Frameworks)
XPages
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
ByteCode Interpreter
@Formula
FormulaEngine
Notes Core API
Lesenswert: Damien Katz, http://damienkatz.net/2005/01/formula-engine-rewrite.html
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
Option Declare
• OHNE „Option Declare“
• MIT„Option Declare“
Option Declare
• Der wichtigste Grund, warum wir „Option
Declare“ verwenden MÜSSEN, ist …
Option Declare
Every time you don‘t
use „Option Declare“,
God will kill a kitten !!
Option Base
• Sets the default lower bound for array subscripts
to 0 or 1
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
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 !!
GetNextDocument vs. GetNthDocument
• 16.260 Dokumente
• 10 Testläufe / Methode
• Tabelle zeigt die Durchschnittswerte
GetNextDocument vs. GetNthDocument
• 113.610 Dokumente
• 4 Testläufe / Methode
• Tabelle zeigt die Durchschnittswerte
Script / Comment Templates
• Einheitlicher Aufbau von Codesegmenten
Fonts / Colors
• Individuelle Einstellungen für bessere Lesbarkeit
Zeilennummern einblenden
Sessionempfehlung
• Anita Dunger
Einführung in die neue Designer-Umgebung
( Hands On, Dienstag 9:00 – 10:30 )
• Julian Buss
Versionskontrolle mit dem Domino Designer
( direkt im Anschluss an diese Session )
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.
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
OpenLog
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
NotesHound
http://domino-80.prominic.net/A55BE4/
NotesHoundWeb.nsf/webpages/index.html
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
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“
Hide Design
Der lesbare Quelltext
befindet sich im item
$ScriptLib
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.
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-10autoupdating-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
@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“
@WhichFolders in LotusScript I
• db.FolderReferencesEnabled = True
• $FolderInfo und $FolderRefInfo
– Ansichten können aus der Mailschablone kopiert werden
@WhichFolders in LotusScript II
• CreateViewNavFrom
• Keine zusätzlichen Designelemente erforderlich
• Aber langsam bei einer großen Ordneranzahl
@Command( [DiscoverFolders];title)
• Wie @WhichFolders mit zusätzlichen
Möglichkeiten, um die Ordnereigenschaften eines
Dokuments zu ändern.
• Uncheck „Don‘t maintain unread marks“
@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
•
•
•
•
•
@Transform (Sample)
• Names.nsf - People\By Client Version
• Unübersichtlich, da alle
Versionen dargestellt
werden.
People\By Client Version (new)
• Mit wenigen Handgriffen Ordnung schaffen
@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
@Sort
• Sortiert eine Liste
– [ACCENTSENSITIVE]
– [ACCENTINSENSITIVE]
– [ASCENDING]
– [CASESENSITIVE]
– [CASEINSENSITIVE]
– [CUSTOMSORT]
– [DESCENDING]
– [PITCHSENSITIVE]
– [PITCHINSENSITiVE]
• Dies lässt sich auch kombinieren
– [ASCENDING]:[CASESENSITIVE]
@Sort
• @Sort kann aber noch mehr – [CustomSort]
@UpdateFormulaContext
• Ändert den Kontext einer Formel
• Nachfolgende Befehle werden im neuen Kontext
ausgeführt
@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
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
Get the current location name
• @LocationGetInfo([FullName])
–
@LocationGetInfo([AbbreviatedName])
• Damit erhalten wir Zugriff auf JEDES beliebige
Feld in der aktuellen Arbeitsumgebung
@GetMachineInfo (8.5.3)
• New @Function to support Machine Specific
Policy Settings as of Notes / Domino 8.5.3
@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
@CheckFormulaSyntax
• Überprüft Formeln
• Zeigt den Fehler konkret an
@CheckFormulaSyntax (LotusScript)
• Verwendet LotusScript EVALUATE
DEMO - CheckFormula
@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 wir in XPages nicht unterstützt
@BusinessDays (LS)
• Evaluate zur Einbindung von @BusinessDays in LS
@DbLookup + [FailSilent]
• Keine Fehlermeldung, wenn keine Entsprechung
in der Ansicht gefunden wird
• @DbLookup(""; ""; "All"; Source; 2;[FailSilent])
[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
@ConfigFile
• Wo ist die notes.ini?
• @Prompt([OK];“notes.ini path“;@configfile)
• Notes.ini bearbeiten
• @Command([Execute];"notepad"; @configfile)
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
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)
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-fromusers-mailfile/
Mail Rules Extended
• Regeln haben starre, vorgegebene Bedingungen
Mail Rules Extended
• Der Client speichert die Regeln im Kalenderprofil
• Auf dem Server werden die Regeln in “mailrule”
Dokumenten gespeichert
Mail Rules Extended
• Mehr Möglichkeiten bei der Regelerstellung
• Erfordert Änderung an names.nsf
• Kein grosser Aufwand beim Upgrade
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-populatedgroups-feature-in-domino-85/
How to get rid of $UpdatedBy?
• Unter Umständen sollen die Bearbeiter eines
Dokuments nicht sichtbar sein.
@AdminDelegateMailFile
• Erstellt Administrationsprocess
– Unterzeichner muss Owner der Maildatei sein (!)
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
Custom Administration Process
Custom Administration Process
• admin4.nsf anpassen ( neue Maske )
Custom Administration Process
• admin4.nsf anpassen ( Ansichten )
• Neue Ansicht erstellen oder
• Spalte „Action“ anpassen
Zip and Unzip
• Verwendung von ZIP/UNZIP mit LotusScript
• Kostenlos
http://www.vcode.no/vcode.nsf/downloads/VCZIPSUP
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=openDocu
ment&mode=original
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
XLS ohne Excel erstellen
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
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
@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
@Midas Lookups
• Erweiterte Möglichkeiten
• Beispiel: Sortierte Ausgabe aller Listenpunkte
Ist RichText Item leer??
• @Length(@Text(body))-1
• @Attachments
• rtitem.ValueLength
• rtitem.EmbeddedObjects
• Attachments OK
• Aber: Doclinks, Inline Images, Hotspots (Button)
Ist RichText Item leer?
DEMO - Is Item empty?
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
Einordnung der C-API
JAVA
Lotus Script
Visual Basic
(COM)
JNI
Notes Object Interface (NOI)
C++ API
Notes Core ( C API )
Betriebssystem
Ist RichText Item leer?
• LS2CAPI to the rescue!
– Leeres RTI besitzt nur einen CDRecord von Typ Text
Header / Footer
• Erstellen / Ändern
– Anwendungseigenschaften ( global )
– Dokumenteneigenschaften
• Keine Möglichkeit über @Formel oder LotusScript
Header / Footer
• Informationen sind in RichText item gespeichert
Header / Footer
• LotusScript Library / LS2CAPI
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.
Inline Images
• Wie ist ein Inline Image gespeichert ?
Inline Images
Andre Guirard
http://www.openntf.org/internal/
home.nsf/project.xsp?
action=openDocument&name=Lotus
Script%20Gold%20Collection
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 Kalnberzins
http://www.rtlib.com/
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
Replace Inline Image
Das Attachment wird an die
Position des Inline Image gesetzt.
Replace Inline Images
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.
Insert Richtext into Richtext
Insert Richtext into Richtext
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/
JW Player - Mediaplayer
jQuery
• freie, umfangreiche JavaScript-Klassenbibliothek,
welche komfortable Funktionen zur DOMManipulation und -Navigation zur Verfügung
stellt
http://www.reizkraft.com/content/die-43-sch%C3%B6nsten-jquery-plugins-f%C3%
BCr-webdesign
Animated gif created with http://picasion.com/
UIZE – JavaScript Framework
• „You Eyes“
• OpenSource, MIT oder GNU GPL
• Unterstützung von …
–
–
–
–
–
Widgets,
Ajax,
DOM,
Templates
…
• Mobile Devices
• http://www.uize.com/
UIZE – JavaScript Framework
• Sample : Resizer
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-forXPages-URLEncode-URLDecode.htm
Q+A
•
•
•
•
Mail: [email protected]
Blog: http://www.eknori.de
Sametime: Bleedyellow.com
Twitter: Eknori