dnug35 ak-dev.071111-cookbook
DESCRIPTION
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/DominoTRANSCRIPT
DNUG Konferenz: Wie werden wir morgen arbeiten? Social Business becomes real.
Wie werden wir morgen arbeiten? The Lotus Code Cookbook
7. bis 9. November 2011 Welcome Kongresshotel Bamberg
Ulrich Krause, is@web, industrial services AG
35. DNUG Konferenz
Mit freundlicher Unterstützung von:
DNUG Konferenz: Wie werden wir morgen arbeiten?
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_solutions4?lang=de
Blog http://www.eknori.de Notes Forum (http://www.atnotes.de)
About: Ulrich Krause
DNUG Konferenz: Wie werden wir morgen arbeiten?
Allgemeines Optionen des Designers Tools @Formeln LotusScript Bearbeitung von Richtext ( C-Api / LS2CAPI ) Javascript (Frameworks) XPages
Agenda
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
Warum @Formeln verwenden ?
LotusScript Java @Formula
ByteCode Interpreter FormulaEngine
Notes Core API
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
DNUG Konferenz: Wie werden wir morgen arbeiten?
Ohne Option Declare
Mit Option Declare
Option Declare
DNUG Konferenz: Wie werden wir morgen arbeiten?
Der wichtigste Grund, warum wir „Option Declare“ verwenden MÜSSEN, ist …
Option Declare
DNUG Konferenz: Wie werden wir morgen arbeiten?
Every time you don‘t use „Option Declare“, God will kill a kitten !!
Option Declare
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
DNUG Konferenz: Wie werden wir morgen arbeiten?
Ausführungszeiten messen mit Getthreadinfo Wird z.B. ein Integerwert in einem Variant gespeichert, so
muss Notes intern eine Typumwandlung vornehmen. Das kostet Zeit !!
Dim Statement und Performance
DNUG Konferenz: Wie werden wir morgen arbeiten?
16.260 Dokumente 10 Testläufe / Methode Tabelle zeigt die Durchschnittswerte
GetNextDocument vs. GetNthDocument
DNUG Konferenz: Wie werden wir morgen arbeiten?
113.610 Dokumente 4 Testläufe / Methode Tabelle zeigt die Durchschnittswerte
GetNextDocument vs. GetNthDocument
DNUG Konferenz: Wie werden wir morgen arbeiten?
Script / Comment Templates
DNUG Konferenz: Wie werden wir morgen arbeiten?
Fonts / Colors
Individuelle Einstellungen für bessere Lesbarkeit
http://web.nickshanks.com/fonts/microsoft-core-web-fonts
DNUG Konferenz: Wie werden wir morgen arbeiten?
Zeilennummern einblenden
DNUG Konferenz: Wie werden wir morgen arbeiten?
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.
Soft-Coded Field Names
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
Logging
DNUG Konferenz: Wie werden wir morgen arbeiten?
OpenLog
DNUG Konferenz: Wie werden wir morgen arbeiten?
Domino Designer extension Sucht in einer oder meheren Anwendungen Unterstützt
• Java, • Javascript, • Lotusscript,• @Formula,• Xpages
Source Sniffer
http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=Source%20Sniffer
DNUG Konferenz: Wie werden wir morgen arbeiten?
NotesHound
http://domino-80.prominic.net/A55BE4/NotesHoundWeb.nsf/webpages/index.html
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
NotesView.AutoUpdate = false
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
DNUG Konferenz: Wie werden wir morgen arbeiten?
db.FolderReferencesEnabled = True $FolderInfo und $FolderRefInfo
– Ansichten können aus der Mailschablone kopiert werden
@WhichFolders in LotusScript I
DNUG Konferenz: Wie werden wir morgen arbeiten?
CreateViewNavFrom Keine zusätzlichen Designelemente erforderlich Aber langsam bei einer großen Ordneranzahl
@WhichFolders in LotusScript II
DNUG Konferenz: Wie werden wir morgen arbeiten?
Wie @WhichFolders mit zusätzlichen Möglichkeiten, um die Ordnereigenschaften eines Dokuments zu ändern.
Uncheck „Don‘t maintain unread marks“
@Command( [DiscoverFolders];title)
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
DNUG Konferenz: Wie werden wir morgen arbeiten?
Names.nsf - People\By Client Version Unübersichtlich, da alle
Versionen dargestellt werden.
@Transform (Sample)
DNUG Konferenz: Wie werden wir morgen arbeiten?
Mit wenigen Handgriffen Ordnung schaffen
People\By Client Version (new)
DNUG Konferenz: Wie werden wir morgen arbeiten?
@Transform + @DocFields
http://www.eknori.de/2011-07-23/formula-magic/
DNUG Konferenz: Wie werden wir morgen arbeiten?
Seit Version 6 Lt. Designer Hilfe nur mit @Transform zu verwendbar ( „not
valid in other context“ ) Funktioniert aber z.B auch in View Selection
@Nothing
DNUG Konferenz: Wie werden wir morgen arbeiten?
Sortiert eine Liste– [ACCENTSENSITIVE]– [ACCENTINSENSITIVE]– [ASCENDING]– [CASESENSITIVE]– [CASEINSENSITIVE]– [CUSTOMSORT]– [DESCENDING]– [PITCHSENSITIVE]– [PITCHINSENSITiVE]
Dies lässt sich auch kombinieren– [ASCENDING]:[CASESENSITIVE]
@Sort
DNUG Konferenz: Wie werden wir morgen arbeiten?
@Sort kann aber noch mehr – [CustomSort]
@Sort
DNUG Konferenz: Wie werden wir morgen arbeiten?
Ändert den Kontext einer Formel Nachfolgende Befehle werden
im neuen Kontext ausgeführt
@UpdateFormulaContext
DNUG Konferenz: Wie werden wir morgen arbeiten?
@LocationGetInfo• @LocationGetInfo([HomeServer])• @LocationGetInfo([InternetMailAddress])• @LocationGetInfo([NamePreference])• @LocationGetInfo([BookmarksFilename])• @LocationGetInfo([SametimeServer])
@LocationGetInfo([UNID])• http://www.thenorth.com/apblog4.nsf/0/60C5A5C6540A2D648525719F0012BDE
Get the current location name
DNUG Konferenz: Wie werden wir morgen arbeiten?
@LocationGetInfo([FullName])• @LocationGetInfo([AbbreviatedName])
Damit erhalten wir Zugriff auf JEDES beliebige Feld in der aktuellen Arbeitsumgebung
Get the current location name
DNUG Konferenz: Wie werden wir morgen arbeiten?
New @Function to support Machine Specific Policy Settings as of Notes / Domino 8.5.3
@GetMachineInfo (8.5.3)
DNUG Konferenz: Wie werden wir morgen arbeiten?
@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
@GetMachineInfo vs. @Environment
DNUG Konferenz: Wie werden wir morgen arbeiten?
Überprüft Formeln
@CheckFormulaSyntax
DNUG Konferenz: Wie werden wir morgen arbeiten?
@CheckFormulaSyntax (LotusScript)
Verwendet LotusScript EVALUATE
DNUG Konferenz: Wie werden wir morgen arbeiten?
Schade
Und was macht IBM?
DNUG Konferenz: Wie werden wir morgen arbeiten?
Ermittelt die Anzahl von Werktagen in einem Datumsbereich• Bestimmte Tage können als Werktage ausgeschlossen werden• Ebenso lassen sich Feiertage als Werktage ausschließen
@BusinessDays
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
DNUG Konferenz: Wie werden wir morgen arbeiten?
Evaluate zur Einbindung von @BusinessDays in LS
@BusinessDays (LS)
DNUG Konferenz: Wie werden wir morgen arbeiten?
Keine Fehlermeldung, wenn keine Entsprechung in der Ansicht gefunden wird
@DbLookup(""; ""; "All"; Source; 2;[FailSilent])
@DbLookup + [FailSilent]
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
[ReturnDocumentUniqueID]
DNUG Konferenz: Wie werden wir morgen arbeiten?
Wo ist die notes.ini? • @Prompt([OK];“notes.ini path“;@configfile)
Notes.ini bearbeiten• @Command([Execute];"
@ConfigFile
DNUG Konferenz: Wie werden wir morgen arbeiten?
Wozu ist die Eigenschaft „Programmatic Use“ da?
Keine Redundanz komplizierterSpaltenformeln. Das Ergebnis einer Berechnung kann in einer anderen Spalte verwendet werden
Programmatic Use
DNUG Konferenz: Wie werden wir morgen arbeiten?
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)
Permutation Comparison In Hide Formulas
DNUG Konferenz: Wie werden wir morgen arbeiten?
Regeln haben starre, vorgegebene Bedingungen
Mail Rules Extended
DNUG Konferenz: Wie werden wir morgen arbeiten?
Der Client speichert die Regeln im Kalenderprofil Auf dem Server werden die Regeln in “mailrule”
Dokumenten gespeichert
Mail Rules Extended
DNUG Konferenz: Wie werden wir morgen arbeiten?
Mehr Möglichkeiten bei der Regelerstellung Erfordert Änderung an names.nsf Kein grosser Aufwand beim Upgrade
Mail Rules Extended
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
Tweak Auto-Populated Groups
UPDATE 8.5.3 :http://bodek.uwindsor.ca/users/b/bodek/bodekblog.nsf/d6plinks/BFRK-8MRPWN
DNUG Konferenz: Wie werden wir morgen arbeiten?
Unter Umständen sollen die Bearbeiter eines Dokuments nicht sichtbar sein.
How to get rid of $UpdatedBy?
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
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
DNUG Konferenz: Wie werden wir morgen arbeiten?
Custom Administration Process
DNUG Konferenz: Wie werden wir morgen arbeiten?
admin4.nsf anpassen
• Neue Ansicht erstellen oder• Spalte „Action“ anpassen
Custom Administration Process
http://www.eknori.de/2007-12-15/delete-group-members-using-the-administration-process/
DNUG Konferenz: Wie werden wir morgen arbeiten?
Verwendung von ZIP/UNZIP mit LotusScript Kostenlos
Zip / UnZip
http://www.vcode.no/vcode.nsf/downloads/VCZIPSUP
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
Auto-Zip Mail Attachments
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
DNUG Konferenz: Wie werden wir morgen arbeiten?
XLS ohne Excel erstellen
DNUG Konferenz: Wie werden wir morgen arbeiten?
%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
Lotus Symphony Toolkit
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
Wurde das Dokument gelesen?
DNUG Konferenz: Wie werden wir morgen arbeiten?
Ben Langhinrichs ( genii software ) Auslesen von Daten aus RichText Syntax wie @DBColumn und @DBLookup
@Midas Lookups
Free download: http://www.geniisoft.com/showcase.nsf/MidasLookups
DNUG Konferenz: Wie werden wir morgen arbeiten?
Erweiterte Möglichkeiten Beispiel: Sortierte Ausgabe aller Listenpunkte
@Midas Lookups
DNUG Konferenz: Wie werden wir morgen arbeiten?
@Length(@Text(body))-1
@Attachments
rtitem.ValueLength
rtitem.EmbeddedObjects• Attachments OK• Aber: Doclinks, Inline Images, Hotspots (Button)
Ist RichText Item leer??
DNUG Konferenz: Wie werden wir morgen arbeiten?
Ist RichText Item leer?
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
Arbeiten mit RichText
DNUG Konferenz: Wie werden wir morgen arbeiten?
Einordnung der C-API
Betriebssystem
Notes Object Interface (NOI)
Lotus Script
C++ API
Notes Core ( C API )
Visual Basic (COM)JAVA
JNI
DNUG Konferenz: Wie werden wir morgen arbeiten?
LS2CAPI to the rescue!• Leeres RTI besitzt nur einen CDRecord von Typ Text
Ist RichText Item leer?
DNUG Konferenz: Wie werden wir morgen arbeiten?
Erstellen / Ändern• Anwendungseigenschaften ( global )• Dokumenteneigenschaften
Keine Möglichkeit über @Formel oder LotusScript
Header / Footer
DNUG Konferenz: Wie werden wir morgen arbeiten?
Informationen sind in RichText item gespeichert
Header / Footer
DNUG Konferenz: Wie werden wir morgen arbeiten?
LotusScript Library / LS2CAPI
Header / Footer
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
DNUG Konferenz: Wie werden wir morgen arbeiten?
Wie ist ein Inline Image gespeichert ?
Inline Images
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%20Collection
DNUG Konferenz: Wie werden wir morgen arbeiten?
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.
Inline Images
Normunds Kalnberzins http://www.rtlib.com/
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
DNUG Konferenz: Wie werden wir morgen arbeiten?
Replace Inline Image
Das Attachment wird an die Position des Inline Image gesetzt.
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
DNUG Konferenz: Wie werden wir morgen arbeiten?
Insert Richtext into Richtext
DNUG Konferenz: Wie werden wir morgen arbeiten?
Insert Richtext into Richtext
DNUG Konferenz: Wie werden wir morgen arbeiten?
JW Player: Ein paar Zeilen Code für einen Mediaplayer für Flash und HTML5 support
Skins
JW Player - Mediaplayer
http://www.longtailvideo.com/players/
DNUG Konferenz: Wie werden wir morgen arbeiten?
JW Player - Mediaplayer
DNUG Konferenz: Wie werden wir morgen arbeiten?
freie, umfangreiche JavaScript-Klassenbibliothek, welche komfortable Funktionen zur DOM-Manipulation und -Navigation zur Verfügung stellt
jQuery
http://www.reizkraft.com/content/die-43-sch%C3%B6nsten-jquery-plugins-f%C3%BCr-webdesignAnimated gif created with http://picasion.com/
DNUG Konferenz: Wie werden wir morgen arbeiten?
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
Xpages und @Formula
• Mail: [email protected]• Blog: http://www.eknori.de• Sametime: bleedyellow.com• Twitter: eknori
Q + A