The Lotus Code Cookbook - Ulrich Krause
Tipps, 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.
When Plato Left The Cave - A brief history of Lotus Notes
The Lotus Code Cookbook
1. The Lotus Code Cookbook Ulrich Krause EntwicklerCamp, 21. – 23.02.2011, Gelsenkirchen, Deutschland
2. Agenda Allgemeines Optionen des Designers Tools @Formeln LotusScript Bearbeitung von Richtext ( C-Api / LS2CAPI ) Javascript (Frameworks) XPages
3. Warum sollten wir @Formeln verwenden? Alle Sprachen verwenden die gleichen Kernfunktionen Bei gleicher Funktionalität sind Formeln IMMER performanter Formeln sind Performance optimiert Lesenswert: Damien Katz, http://damienkatz.net/2005/01/formula-engine-rewrite.html
4. Option Declare WichtigsteCodezeile in LotusScript Option Declare “zwingt” zumDeklarierenallerVariablen und erspart das Beseitigen von schwerauffindbarenFehlern AlleFehlersind runtime Fehler
6. Option Declare Der wichtigste Grund, warum wir „Option Declare“ verwenden MÜSSEN, ist …
7. Option Declare Every time you don‘t use „Option Declare“, God will kill a kitten !!
8. Option Base Sets the default lower bound for array subscripts to 0 or 1
9. 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. 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
12. GetNextDocument vs. GetNthDocument 113.610 Dokumente 4 Testläufe / Methode Tabelle zeigt die Durchschnittswerte DEMO - GetNextDocument vs. GetNthDocument
13. Script / Comment Templates Einheitlicher Aufbau von Codesegmenten
14. Fonts / Colors Individuelle Einstellungen für bessere Lesbarkeit
16. Sessionempfehlung Anita DungerEinfü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 )
17. 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.
18. 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
22. LotusScript.doc Erstellt eine Dokumentationvon LotusScript in einer Datenbank. Syntax wieJavadoc 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
23. 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“
24. Hide Design Der lesbare Quelltext befindet sich im item $ScriptLib
25. 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.
26. 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
27. @WhichFolders Neu ab 8.5.1 Nur in Ansichtsspalten zu verwenden Option „Maintainfolderunreadinformation“ muß aktiviert sein Option „ Don'tmaintainUnreadmarks“ darf nicht aktiviert sein“
28. @WhichFolders in LotusScript I db.FolderReferencesEnabled = True $FolderInfo und $FolderRefInfo Ansichten können aus der Mailschablone kopiert werden Demo: @WhichFolders in LS I
29. @WhichFolders in LotusScript II CreateViewNavFrom Keine zusätzlichen Designelemente erforderlich Aber langsam bei einer großen Ordneranzahl Demo: @WhichFolders in LS II
30. @Command( [DiscoverFolders];title) Wie @WhichFolders mit zusätzlichen Möglichkeiten, um die Ordnereigenschaften eines Dokuments zu ändern. Uncheck „Don‘tmaintainunreadmarks“
31. @Transform Seit Version 6 Entspricht LotusScriptstatementForAll 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
34. @Nothing Seit Version 6 Lt. Designer Hilfe nur mit @Transform zu verwendbar ( „not valid in othercontext“ ) Funktioniert aber z.B auch in View Selection
35. @Sort Sortiert eine Liste [ACCENTSENSITIVE] [ACCENTINSENSITIVE] [ASCENDING] [CASESENSITIVE] [CASEINSENSITIVE] [CUSTOMSORT] [DESCENDING] [PITCHSENSITIVE] [PITCHINSENSITiVE] Dies lässt sich auch kombinieren [ASCENDING]:[CASESENSITIVE]
38. @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
39. 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
40. Get the current location name @LocationGetInfo([FullName]) @LocationGetInfo([AbbreviatedName]) Damit erhalten wir Zugriff auf JEDES beliebige Feld in der aktuellen Arbeitsumgebung
41. @GetMachineInfo (8.5.3) New @Function to support MachineSpecificPolicy Settings asof Notes / Domino 8.5.3
42. @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
45. @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
47. @DbLookup + [FailSilent] Keine Fehlermeldung, wenn keine Entsprechung in der Ansicht gefunden wird @DbLookup(""; ""; "All"; Source; 2;[FailSilent])
48. [ReturnDocumentUniqueID] Gibt die DocumentUNID eines @DBLookup Ergebnisses zurück @DbLookup(""; ""; "All"; “test”; 1; [FailSilent]:[ReturnDocumentUniqueID]); Macht eine zusätzlicheAnsichtmit einer Spaltenformel@Text(@DocumentUniqueID) überflüssig
49. @ConfigFile Wo ist die notes.ini? @Prompt([OK];“notes.ini path“;@configfile) Notes.ini bearbeiten @Command([Execute];"notepad"; @configfile)
50. Programmatic Use Wozu ist die Eigenschaft „Programmatic Use“ da? Keine Redundanz komplizierterSpaltenformeln. Das Ergebnis einer Berechnung kann in einer anderen Spalte verwendet werden Andre Guirard http://www-10.lotus.com/ldd/ddwiki.nsf/dx/colprognames.htm
51. Permutation Comparison In HideFormulas 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)
52. 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/
54. Mail Rules Extended Der Client speichert die Regeln im Kalenderprofil Auf dem Server werden die Regeln in “mailrule” Dokumenten gespeichert
55. Mail Rules Extended Mehr Möglichkeiten bei der Regelerstellung Erfordert Änderung an names.nsf Kein grosser Aufwand beim Upgrade
56. Tweak Auto-Populated Groups EinfacheErweiterung 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/
57. How to get rid of $UpdatedBy? Unter Umständen sollen die Bearbeiter eines Dokuments nicht sichtbar sein.
59. Custom Administration Process Fehlende Funktionen hinzufügen Z.B. : User aus Gruppe entfernen Verlagerung administrativer Aufgaben in den Servicedesk NotesAdministrationProcessclass Seit Release 6 AddGroupMembersmethod aber keine RemoveGroupMembersmethod
62. Custom Administration Process admin4.nsf anpassen ( Ansichten ) Neue Ansicht erstellen oder Spalte „Action“ anpassen
63. Zip and Unzip Verwendung von ZIP/UNZIP mitLotusScript Kostenlos http://www.vcode.no/vcode.nsf/downloads/VCZIPSUP
64. 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
65. 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) fileformat
67. Lotus SymphonyToolkit %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
68. 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
69. @Midas Lookups Ben Langhinrichs ( geniisoftware ) Auslesen von Daten aus RichText Syntax wie @DBColumn und @DBLookup Free download: http://www.geniisoft.com/showcase.nsf/MidasLookups
73. Arbeiten mit RichText C/C++ API oder LS2CAPI NormundsKalbernzin LotusScript to Lotus C API Programming Guide ( ls2capi.com ) Lee Powell LotusScriptor'sPlain Simple Guide to the Lotus Notes C++ API Download : http://www.eknori.de/downloads/capibook.pdf EthannCastell Gettingstartedwith the C-API Controlrichtextcontentwithprecisionusing the C-API The View, 09 / 11 , 2007
74. Einordnung der C-API Lotus Script Visual Basic (COM) JAVA JNI Notes Object Interface (NOI) C++ API Notes Core ( C API ) Betriebssystem
75. Ist RichText Item leer? LS2CAPI to the rescue! Leeres RTI besitzt nur einen CDRecord von Typ Text
76. Header / Footer Erstellen / Ändern Anwendungseigenschaften ( global ) Dokumenteneigenschaften Keine Möglichkeit über @Formel oder LotusScript
77. Header / Footer Informationen sind in RichText item gespeichert
79. 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.
81. Inline Images Andre Guirard http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=LotusScript%20Gold%20Collection
82. 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. NormundsKalnberzins http://www.rtlib.com/
83. ReplaceInline 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
86. Insert RichtextintoRichtext 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.
89. 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/
91. 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 Animatedgifcreatedwith http://picasion.com/
92. UIZE – JavaScript Framework „You Eyes“ OpenSource, MIT oder GNU GPL Unterstützung von … Widgets, Ajax, DOM, Templates … Mobile Devices http://www.uize.com/
94. 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