In loser Folge werden Tipps und Tricks aus allen Bereichen der Programmierung in Lotus Notes/Domino vorgestellt. @Formula, LotusScript, XPages, LS2CApi.
Wie konfiguriere ich den Domino Designer?
Welche kostenlosen Tools können mir meine Arbeit erleichtern?
Warum ist es wichtig, richtig zu "dimmen"?
Richtext kann mit LotusScript im Backend nicht in Richtext eingefügt werden. Oder etwa doch? @Transform / @Sort. Was kann man denn damit machen?
8.5.3, was gibt es Neues im Bereich @Formula / LotusScript.
Zielgruppe sind alle, die sich mit Applikationsentwicklung beschäftigen. Anfänger und "alte Hasen"; es ist für jeden etwas dabei.
Kenntnisse: Grundlagen der Entwicklung in Lotus Notes/Domino
1. DNUG Konferenz: Wie werden wir morgen arbeiten? Social Business becomes real.
35. DNUG Konferenz
Wie werden wir morgen arbeiten?
The Lotus Code Cookbook
7. bis 9. November 2011
Welcome Kongresshotel Bamberg
Ulrich Krause, is@web, industrial services AG
Mit freundlicher Unterstützung von:
2. DNUG Konferenz: Wie werden wir morgen arbeiten?
About: Ulrich Krause
Lotus Notes / Domino Administrator & Entwickler seit 1993
Business Application Developer
bei is@web, Niederlassung Ratingen
OpenNTF http://openntf.org
• !!HELP!!, Cebulon, Trigger Happy
• diverse XPages Custom Controls
IBM Champion 2011
• https://www-
304.ibm.com/connections/blogs/socialbusiness/entry/announcing_the_2011_ibm_champions_for_collaboration_sol
utions4?lang=de
Blog http://www.eknori.de
Notes Forum (http://www.atnotes.de)
3. DNUG Konferenz: Wie werden wir morgen arbeiten?
Agenda
Allgemeines
Optionen des Designers
Tools
@Formeln
LotusScript
Bearbeitung von Richtext ( C-Api / LS2CAPI )
Javascript (Frameworks)
XPages
4. DNUG Konferenz: Wie werden wir morgen arbeiten?
Warum @Formeln verwenden ?
Alle Sprachen verwenden die gleichen Kernfunktionen
Bei gleicher Funktionalität sind Formeln performanter
Nicht alle Formeln können in XPages verwendet werden.
• Nur 97 der insgesamt 274 Formeln
• http://www-10.lotus.com/ldd/ddwiki.nsf/dx/List_of_Formula_Not_Supported_In_XPages
LotusScript Java @Formula
ByteCode Interpreter FormulaEngine
Notes Core API
5. DNUG Konferenz: Wie werden wir morgen arbeiten?
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
6. DNUG Konferenz: Wie werden wir morgen arbeiten?
Option Declare
Ohne Option Declare
Mit Option Declare
7. DNUG Konferenz: Wie werden wir morgen arbeiten?
Option Declare
Der wichtigste Grund, warum wir „Option Declare“
verwenden MÜSSEN, ist …
8. DNUG Konferenz: Wie werden wir morgen arbeiten?
Option Declare
Every time you don„t use
„Option Declare“, God will kill
a kitten !!
9. DNUG Konferenz: Wie werden wir morgen arbeiten?
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
10. DNUG Konferenz: Wie werden wir morgen arbeiten?
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 !!
11. DNUG Konferenz: Wie werden wir morgen arbeiten?
GetNextDocument vs. GetNthDocument
16.260 Dokumente
10 Testläufe / Methode
Tabelle zeigt die Durchschnittswerte
12. DNUG Konferenz: Wie werden wir morgen arbeiten?
GetNextDocument vs. GetNthDocument
113.610 Dokumente
4 Testläufe / Methode
Tabelle zeigt die Durchschnittswerte
14. DNUG Konferenz: Wie werden wir morgen arbeiten?
Fonts / Colors
• Individuelle Einstellungen für bessere
Lesbarkeit
http://web.nickshanks.com/fonts/microsoft-
core-web-fonts
16. DNUG Konferenz: Wie werden wir morgen arbeiten?
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.
17. DNUG Konferenz: Wie werden wir morgen arbeiten?
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
19. DNUG Konferenz: Wie werden wir morgen arbeiten?
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
20. DNUG Konferenz: Wie werden wir morgen arbeiten?
NotesHound
http://domino-
80.prominic.net/A55BE4/NotesHoundWeb.nsf/web
pages/index.html
21. DNUG Konferenz: Wie werden wir morgen arbeiten?
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
22. DNUG Konferenz: Wie werden wir morgen arbeiten?
@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“
23. DNUG Konferenz: Wie werden wir morgen arbeiten?
@WhichFolders in LotusScript I
db.FolderReferencesEnabled = True
$FolderInfo und $FolderRefInfo
– Ansichten können aus der Mailschablone kopiert werden
24. DNUG Konferenz: Wie werden wir morgen arbeiten?
@WhichFolders in LotusScript II
CreateViewNavFrom
Keine zusätzlichen Designelemente erforderlich
Aber langsam bei einer großen Ordneranzahl
25. DNUG Konferenz: Wie werden wir morgen arbeiten?
@Command( [DiscoverFolders];title)
Wie @WhichFolders mit zusätzlichen Möglichkeiten, um
die Ordnereigenschaften eines Dokuments zu ändern.
Uncheck „Don„t maintain unread marks“
26. DNUG Konferenz: Wie werden wir morgen arbeiten?
@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
27. DNUG Konferenz: Wie werden wir morgen arbeiten?
@Transform (Sample)
Names.nsf - PeopleBy Client Version
Unübersichtlich, da alle
Versionen dargestellt
werden.
28. DNUG Konferenz: Wie werden wir morgen arbeiten?
PeopleBy Client Version (new)
Mit wenigen Handgriffen Ordnung schaffen
29. DNUG Konferenz: Wie werden wir morgen arbeiten?
@Transform + @DocFields
http://www.eknori.de/2011-07-23/formula-magic/
30. DNUG Konferenz: Wie werden wir morgen arbeiten?
@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
31. DNUG Konferenz: Wie werden wir morgen arbeiten?
@Sort
Sortiert eine Liste
– [ACCENTSENSITIVE]
– [ACCENTINSENSITIVE]
– [ASCENDING]
– [CASESENSITIVE]
– [CASEINSENSITIVE]
– [CUSTOMSORT]
– [DESCENDING]
– [PITCHSENSITIVE]
– [PITCHINSENSITiVE]
Dies lässt sich auch kombinieren
– [ASCENDING]:[CASESENSITIVE]
32. DNUG Konferenz: Wie werden wir morgen arbeiten?
@Sort
@Sort kann aber noch mehr – [CustomSort]
33. DNUG Konferenz: Wie werden wir morgen arbeiten?
@UpdateFormulaContext
Ändert den Kontext einer Formel
Nachfolgende Befehle werden
im neuen Kontext ausgeführt
34. DNUG Konferenz: Wie werden wir morgen arbeiten?
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/60C5A5C6540A2D648525719F0012BDE
35. DNUG Konferenz: Wie werden wir morgen arbeiten?
Get the current location name
@LocationGetInfo([FullName])
• @LocationGetInfo([AbbreviatedName])
Damit erhalten wir Zugriff auf JEDES beliebige Feld in der
aktuellen Arbeitsumgebung
36. DNUG Konferenz: Wie werden wir morgen arbeiten?
@GetMachineInfo (8.5.3)
New @Function to support Machine Specific Policy Settings
as of Notes / Domino 8.5.3
37. DNUG Konferenz: Wie werden wir morgen arbeiten?
@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
38. DNUG Konferenz: Wie werden wir morgen arbeiten?
@CheckFormulaSyntax
Überprüft Formeln
39. DNUG Konferenz: Wie werden wir morgen arbeiten?
@CheckFormulaSyntax (LotusScript)
• Verwendet LotusScript EVALUATE
40. DNUG Konferenz: Wie werden wir morgen arbeiten?
Und was macht IBM?
Schade
41. DNUG Konferenz: Wie werden wir morgen arbeiten?
@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
42. DNUG Konferenz: Wie werden wir morgen arbeiten?
@BusinessDays (LS)
Evaluate zur Einbindung von @BusinessDays in LS
43. DNUG Konferenz: Wie werden wir morgen arbeiten?
@DbLookup + [FailSilent]
Keine Fehlermeldung, wenn keine Entsprechung in der
Ansicht gefunden wird
@DbLookup(""; ""; "All"; Source; 2;[FailSilent])
44. DNUG Konferenz: Wie werden wir morgen arbeiten?
[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
45. DNUG Konferenz: Wie werden wir morgen arbeiten?
@ConfigFile
Wo ist die notes.ini?
• @Prompt([OK];“notes.ini path“;@configfile)
Notes.ini bearbeiten
• @Command([Execute];"
46. DNUG Konferenz: Wie werden wir morgen arbeiten?
Programmatic Use
Wozu ist die Eigenschaft „Programmatic Use“ da?
Keine Redundanz komplizierter
Spaltenformeln.
Das Ergebnis einer Berechnung
kann in einer anderen Spalte verwendet werden
47. DNUG Konferenz: Wie werden wir morgen arbeiten?
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)
48. DNUG Konferenz: Wie werden wir morgen arbeiten?
Mail Rules Extended
Regeln haben starre, vorgegebene Bedingungen
49. DNUG Konferenz: Wie werden wir morgen arbeiten?
Mail Rules Extended
Der Client speichert die Regeln im Kalenderprofil
Auf dem Server werden die Regeln in “mailrule”
Dokumenten gespeichert
50. DNUG Konferenz: Wie werden wir morgen arbeiten?
Mail Rules Extended
Mehr Möglichkeiten bei der Regelerstellung
Erfordert Änderung an names.nsf
Kein grosser Aufwand beim Upgrade
51. DNUG Konferenz: Wie werden wir morgen arbeiten?
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 UPDATE 8.5.3
:http://bodek.uwindsor.ca/users/b/bodek/bodekblog.n
sf/d6plinks/BFRK-8MRPWN
52. DNUG Konferenz: Wie werden wir morgen arbeiten?
How to get rid of $UpdatedBy?
Unter Umständen sollen die
Bearbeiter eines Dokuments nicht
sichtbar sein.
53. DNUG Konferenz: Wie werden wir morgen arbeiten?
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
LotusScript Gold Collection (1.3):
[*] NotesGroupManager: makes it easy to scan and manage group memberships in public
and private address books, including groups with subgroups.
http://www.openntf.org/projects/pmt.nsf/ProjectLookup/LotusScript%20Gold%20Collection
54. DNUG Konferenz: Wie werden wir morgen arbeiten?
Custom Administration Process
55. DNUG Konferenz: Wie werden wir morgen arbeiten?
Custom Administration Process
admin4.nsf anpassen
• Neue Ansicht erstellen oder
• Spalte „Action“ anpassen
http://www.eknori.de/2007-12-15/delete-group-members-using-the-administration-
process/
56. DNUG Konferenz: Wie werden wir morgen arbeiten?
Zip / UnZip
Verwendung von ZIP/UNZIP mit LotusScript
Kostenlos
http://www.vcode.no/vcode.nsf/downloads/VCZIPSUP
57. DNUG Konferenz: Wie werden wir morgen arbeiten?
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=7963EB58BAD528FB852577
AE0062A72A&action=openDocument&mode=original
58. DNUG Konferenz: Wie werden wir morgen arbeiten?
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
60. DNUG Konferenz: Wie werden wir morgen arbeiten?
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
61. DNUG Konferenz: Wie werden wir morgen arbeiten?
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
62. DNUG Konferenz: Wie werden wir morgen arbeiten?
@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
63. DNUG Konferenz: Wie werden wir morgen arbeiten?
@Midas Lookups
Erweiterte Möglichkeiten
Beispiel: Sortierte Ausgabe aller Listenpunkte
64. DNUG Konferenz: Wie werden wir morgen arbeiten?
Ist RichText Item leer??
@Length(@Text(body))-1
@Attachments
rtitem.ValueLength
rtitem.EmbeddedObjects
• Attachments OK
• Aber: Doclinks, Inline Images, Hotspots (Button)
66. DNUG Konferenz: Wie werden wir morgen arbeiten?
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
67. DNUG Konferenz: Wie werden wir morgen arbeiten?
Einordnung der C-API
JAVA Lotus Script Visual Basic (COM)
JNI
Notes Object Interface (NOI)
C++ API
Notes Core ( C API )
Betriebssystem
68. DNUG Konferenz: Wie werden wir morgen arbeiten?
Ist RichText Item leer?
LS2CAPI to the rescue!
• Leeres RTI besitzt nur einen CDRecord von Typ Text
69. DNUG Konferenz: Wie werden wir morgen arbeiten?
Header / Footer
Erstellen / Ändern
• Anwendungseigenschaften ( global )
• Dokumenteneigenschaften
Keine Möglichkeit über @Formel oder LotusScript
70. DNUG Konferenz: Wie werden wir morgen arbeiten?
Header / Footer
Informationen sind in RichText item gespeichert
71. DNUG Konferenz: Wie werden wir morgen arbeiten?
Header / Footer
LotusScript Library / LS2CAPI
72. DNUG Konferenz: Wie werden wir morgen arbeiten?
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.
73. DNUG Konferenz: Wie werden wir morgen arbeiten?
Inline Images
Wie ist ein Inline Image gespeichert ?
74. DNUG Konferenz: Wie werden wir morgen arbeiten?
Inline Images
Andre Guirard
http://www.openntf.org/internal/home.
nsf/project.xsp?action=openDocument
&name=LotusScript%20Gold%20Coll
ection
75. DNUG Konferenz: Wie werden wir morgen arbeiten?
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/
76. DNUG Konferenz: Wie werden wir morgen arbeiten?
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
77. DNUG Konferenz: Wie werden wir morgen arbeiten?
Replace Inline Image
Das Attachment wird an die
Position des Inline Image gesetzt.
78. DNUG Konferenz: Wie werden wir morgen arbeiten?
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.
79. DNUG Konferenz: Wie werden wir morgen arbeiten?
Insert Richtext into Richtext
80. DNUG Konferenz: Wie werden wir morgen arbeiten?
Insert Richtext into Richtext
81. DNUG Konferenz: Wie werden wir morgen arbeiten?
JW Player - Mediaplayer
JW Player: Ein paar Zeilen Code für einen Mediaplayer für
Flash und HTML5 support
Skins
http://www.longtailvideo.com/players/
83. DNUG Konferenz: Wie werden wir morgen arbeiten?
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-webdesign
Animated gif created with http://picasion.com/
84. DNUG Konferenz: Wie werden wir morgen arbeiten?
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/0
687660450ad65bdc125754a008357ce?OpenDocument
• @URLEncode, @URLDecode
– http://blog.gollmick.de/mgoblog.nsf/dx/some-more-Functions-for-XPages-
URLEncode-URLDecode.htm