The Lotus Code Cookbook

8.559 Aufrufe

Veröffentlicht am

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.

0 Kommentare
2 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

Keine Downloads
Aufrufe
Aufrufe insgesamt
8.559
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
322
Aktionen
Geteilt
0
Downloads
166
Kommentare
0
Gefällt mir
2
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

The Lotus Code Cookbook

  1. 1. The Lotus Code Cookbook<br />Ulrich Krause <br />EntwicklerCamp, 21. – 23.02.2011, <br />Gelsenkirchen, Deutschland<br />
  2. 2. Agenda<br />Allgemeines<br />Optionen des Designers<br />Tools<br />@Formeln<br />LotusScript<br />Bearbeitung von Richtext ( C-Api / LS2CAPI )<br />Javascript (Frameworks)<br />XPages<br />
  3. 3. Warum sollten wir @Formeln verwenden?<br />Alle Sprachen verwenden die gleichen Kernfunktionen<br />Bei gleicher Funktionalität sind Formeln IMMER performanter<br />Formeln sind Performance optimiert<br />Lesenswert: Damien Katz, http://damienkatz.net/2005/01/formula-engine-rewrite.html<br />
  4. 4. Option Declare<br />WichtigsteCodezeile in LotusScript<br />Option Declare “zwingt” zumDeklarierenallerVariablen und erspart das Beseitigen von schwerauffindbarenFehlern<br />AlleFehlersind runtime Fehler<br />
  5. 5. Option Declare<br />OHNE „Option Declare“<br />MIT„OptionDeclare“<br />
  6. 6. Option Declare<br />Der wichtigste Grund, warum wir „Option Declare“ verwenden MÜSSEN, ist … <br />
  7. 7. Option Declare<br />Every time you don‘t<br />use „Option Declare“, <br />God will kill a kitten !!<br />
  8. 8. Option Base<br />Sets the default lower bound for array subscripts to 0 or 1<br />
  9. 9. Dim Statement<br />Erstellt eine Referenz zu einem Objekt, ohne das Objekt zu erstellen<br />Achtung: Dim i, j, k As Integer<br />Dim i As Integer, j As Integer, k As Integer<br />
  10. 10. Dim Statement und Performance<br />Ausführungszeiten messen mit Getthreadinfo<br />Wird z.B. ein Integerwert in einem Variant gespeichert, so muss Notes intern eine Typumwandlung vornehmen. Das kostet Zeit !!<br />DEMO: DIM - Zeitschleife<br />
  11. 11. GetNextDocument vs. GetNthDocument<br />16.260 Dokumente<br />10 Testläufe / Methode<br />Tabelle zeigt die Durchschnittswerte <br />
  12. 12. GetNextDocument vs. GetNthDocument<br />113.610 Dokumente<br />4 Testläufe / Methode<br />Tabelle zeigt die Durchschnittswerte <br />DEMO - GetNextDocument vs. GetNthDocument<br />
  13. 13. Script / Comment Templates<br />Einheitlicher Aufbau von Codesegmenten<br />
  14. 14. Fonts / Colors<br />Individuelle Einstellungen für bessere Lesbarkeit <br />
  15. 15. Zeilennummern einblenden<br />
  16. 16. Sessionempfehlung<br />Anita DungerEinführung in die neue Designer-Umgebung ( Hands On, Dienstag 9:00 – 10:30 )<br />Julian BussVersionskontrolle mit dem Domino Designer( direkt im Anschluss an diese Session )<br />
  17. 17. Soft-Coded Field Names<br />One of the worst traps in LotusScript is using hard-coded field names. <br />LotusScript makes it simple to hard code field names, because of its support for extended attributes of the NotesDocument class. <br />The LotusScript documentation even describes this as a feature, though you should avoid it like the plague.<br />
  18. 18. Logging<br />Kein Code ist absolut fehlerfrei!<br />Auch wenn momentan keine Fehler erkennbar sind, werden Fehler auftauchen.<br />Fehler erkennen, die von Usern nicht immer gemeldet werden.<br />Es gibt Tools, die ein aussagekräftiges Logging mit nur wenigen Codezeilen ermöglichen.<br />Julian Robichaux: OpenLog<br />http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=OpenLog<br />
  19. 19. OpenLog<br />
  20. 20. Source Sniffer<br />Domino Designer extension<br />Sucht in einer oder meheren Anwendungen<br />Unterstützt <br />Java, <br />Javascript, <br />Lotusscript,<br />@Formula,<br />Xpages<br />http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=Source%20Sniffer<br />
  21. 21. NotesHound<br />http://domino-80.prominic.net/A55BE4/NotesHoundWeb.nsf/webpages/index.html<br />
  22. 22. LotusScript.doc<br />Erstellt eine Dokumentationvon LotusScript in einer Datenbank.<br />Syntax wieJavadoc<br />LotusScript.doc API<br />http://blog.lsdoc.org/<br />LSDoc Support to DDE<br />http://blog.mindoo.com/web/blog.nsf/dx/22.07.2010223240KLES4H.htm?opendocument&comments, Karsten Lehmann<br />
  23. 23. Hide Design<br />In kommerziellen Anwendungen<br />Template „Hide Design“<br />Problem: keine Anpassungen von Ansichten durch den Anwender<br />Besser ist es daher, nur Teile der Anwendung zu verbergen.<br />In der Regel enthalten Script Bibliotheken den schützenswerten Code.<br />%Include „xyz.lss“<br />
  24. 24. Hide Design<br />Der lesbare Quelltext befindet sich im item $ScriptLib<br />
  25. 25. Hide Design<br />kann<br />Den Text im item $ScriptLib kann man löschen oder durch ein freundliches „Hello“ ersetzen. Nach dem Speichern ist der Quelltext nicht mehr sichtbar. <br />
  26. 26. NotesView.AutoUpdate = false<br />Performancegewinn, da die Ansicht nicht kontinuierlich aktualisiert wird.<br />Zu den technischen Hintergründen; Bob Balaban, http://bobzblog.com/tuxedoguy.nsf/dx/geek-o-terica-10-autoupdating-in-views<br />http://www-10.lotus.com/ldd/ddwiki.nsf/dx/View.AutoUpdate_<br />Bei der Verwendung von NotesViewNavigator können Fehler auftreten, wenn AutoUpdate = true („Entry not found in Index“)<br />Andre Guirard, http://www-10.lotus.com/ldd/bpmpblog.nsf/dx/autoupdate-false<br />
  27. 27. @WhichFolders<br />Neu ab 8.5.1<br />Nur in Ansichtsspalten zu verwenden<br />Option „Maintainfolderunreadinformation“ muß aktiviert sein<br />Option „ Don'tmaintainUnreadmarks“ darf nicht aktiviert sein“ <br />
  28. 28. @WhichFolders in LotusScript I<br />db.FolderReferencesEnabled = True<br />$FolderInfo und $FolderRefInfo<br />Ansichten können aus der Mailschablone kopiert werden<br />Demo: @WhichFolders in LS I<br />
  29. 29. @WhichFolders in LotusScript II<br />CreateViewNavFrom<br />Keine zusätzlichen Designelemente erforderlich<br />Aber langsam bei einer großen Ordneranzahl <br />Demo: @WhichFolders in LS II<br />
  30. 30. @Command( [DiscoverFolders];title)<br />Wie @WhichFolders mit zusätzlichen Möglichkeiten, um die Ordnereigenschaften eines Dokuments zu ändern.<br />Uncheck „Don‘tmaintainunreadmarks“<br />
  31. 31. @Transform<br />Seit Version 6<br />Entspricht LotusScriptstatementForAll x in Liste <br />Führt eine Formel für jedes Element der Liste aus.<br />@Transform(list ; variableName ; formula )<br />Rückgabewert ist die durch die Formel modifizierte Liste<br />Kann in Ansichtenspalten verwendet werden<br />
  32. 32. @Transform (Sample)<br />Names.nsf - PeopleBy Client Version<br />Unübersichtlich, da alle Versionen dargestellt werden.<br />
  33. 33. PeopleBy Client Version (new)<br />Mit wenigen Handgriffen Ordnung schaffen<br />
  34. 34. @Nothing<br />Seit Version 6<br />Lt. Designer Hilfe nur mit @Transform zu verwendbar ( „not valid in othercontext“ )<br />Funktioniert aber z.B auch in View Selection<br />
  35. 35. @Sort<br />Sortiert eine Liste<br />[ACCENTSENSITIVE]<br />[ACCENTINSENSITIVE]<br />[ASCENDING]<br />[CASESENSITIVE]<br />[CASEINSENSITIVE]<br />[CUSTOMSORT]<br />[DESCENDING]<br />[PITCHSENSITIVE]<br />[PITCHINSENSITiVE]<br />Dies lässt sich auch kombinieren<br />[ASCENDING]:[CASESENSITIVE]<br />
  36. 36. @Sort<br />@Sort kann aber noch mehr – [CustomSort]<br />
  37. 37. @UpdateFormulaContext<br />Ändert den Kontext einer Formel <br />Nachfolgende Befehle werden im neuen Kontext ausgeführt<br />
  38. 38. @Now + [NoCache]<br />[SERVERTIME] ermöglicht die Abfrage von @Now für einen Server oder eine Liste von Servern.<br />Problem: Änderung der Systemzeit<br />@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.<br />[NOCACHE] umgeht dieses Problem<br />Nicht dokumentiert; noch nicht<br />
  39. 39. Get the current location name<br />@LocationGetInfo<br />@LocationGetInfo([HomeServer])<br />@LocationGetInfo([InternetMailAddress])<br />@LocationGetInfo([NamePreference])<br />@LocationGetInfo([BookmarksFilename])<br />@LocationGetInfo([SametimeServer])<br />@LocationGetInfo([UNID])<br />http://www.thenorth.com/apblog4.nsf/0/60C5A5C6540A2D648525719F0012BDED<br />
  40. 40. Get the current location name<br />@LocationGetInfo([FullName])<br />@LocationGetInfo([AbbreviatedName])<br />Damit erhalten wir Zugriff auf JEDES beliebige Feld in der aktuellen Arbeitsumgebung<br />
  41. 41. @GetMachineInfo (8.5.3)<br />New @Function to support MachineSpecificPolicy Settings asof Notes / Domino 8.5.3<br />
  42. 42. @GetMachineInfo vs. @Environment<br />@GetMachineInfo([EnvVariable];"Location");<br />Liefert den gewünschten Wert für alle Variablen in der notes.ini zurück<br />Egal ob mit „$“ oder ohne<br />Kann keine Werte setzen<br />@Environment(„Location“)<br />Liefert nur Variablen mit „$“ zurück ($DDM_SERVER)<br />Kann auch Werte in der notes.ini setzen<br />
  43. 43. @CheckFormulaSyntax<br />Überprüft Formeln <br />Zeigt den Fehler konkret an<br />
  44. 44. @CheckFormulaSyntax (LotusScript) <br />Verwendet LotusScript EVALUATE<br />DEMO - CheckFormula<br />
  45. 45. @BusinessDays<br />Ermittelt die Anzahl von Werktagen in einem Datumsbereich<br />Bestimmte Tage können als Werktage ausgeschlossen werden<br />Ebenso lassen sich Feiertage als Werktage ausschließen<br />Beispiel: Der Wert eines Items soll auf einen Wert @Today + 3 Tage gesetzt werden.<br />Dabei sollen die Wochenenden und bestimmte Datumswerte nicht als Werktage gelten.<br />@BusinessDays wird in XPages nicht unterstützt<br />
  46. 46. @BusinessDays (LS)<br />Evaluate zur Einbindung von @BusinessDays in LS<br />
  47. 47. @DbLookup + [FailSilent]<br />Keine Fehlermeldung, wenn keine Entsprechung in der Ansicht gefunden wird<br />@DbLookup(""; ""; "All"; Source; 2;[FailSilent])<br />
  48. 48. [ReturnDocumentUniqueID]<br />Gibt die DocumentUNID eines @DBLookup Ergebnisses zurück<br />@DbLookup(""; ""; "All"; “test”; 1; [FailSilent]:[ReturnDocumentUniqueID]);<br />Macht eine zusätzlicheAnsichtmit einer Spaltenformel@Text(@DocumentUniqueID) überflüssig<br />
  49. 49. @ConfigFile<br />Wo ist die notes.ini? <br />@Prompt([OK];“notes.ini path“;@configfile)<br />Notes.ini bearbeiten<br />@Command([Execute];"notepad"; @configfile)<br />
  50. 50. Programmatic Use<br />Wozu ist die Eigenschaft „Programmatic Use“ da?<br />Keine Redundanz komplizierterSpaltenformeln. Das Ergebnis einer Berechnung kann in einer anderen Spalte verwendet werden<br />Andre Guirard  http://www-10.lotus.com/ldd/ddwiki.nsf/dx/colprognames.htm<br />
  51. 51. Permutation Comparison In HideFormulas<br />Element nicht anzeigen, wenn User nicht mindestens eine der Rollen hat.<br />@IsNotMember("[GloAdmin]"; @UserRoles) & @IsNotMember("[GloEditor]"; @UserRoles)<br />Läßt sich kürzen auf:<br />@IsNotMember("[GloAdmin]" : "[GloEditor]"; @UserRoles)<br />Noch kürzer<br />!("[GloAdmin]" : "[GloEditor]" *= @UserRoles)<br />
  52. 52. Get Rules From Users Mailfile<br />User mögen Regeln, aber nicht unsere.<br />User erstellen Regel, viele, sehr viele Regeln.<br />Aber welche Regeln haben die User denn erstellt?<br />http://www.eknori.de/2007-02-13/get-rules-from-users-mailfile/<br />
  53. 53. Mail Rules Extended<br />Regelnhabenstarre, vorgegebeneBedingungen<br />
  54. 54. Mail Rules Extended<br />Der Client speichert die Regeln im Kalenderprofil<br />Auf dem Server werden die Regeln in “mailrule” Dokumenten gespeichert<br />
  55. 55. Mail Rules Extended<br />Mehr Möglichkeiten bei der Regelerstellung<br />Erfordert Änderung an names.nsf<br />Kein grosser Aufwand beim Upgrade<br />
  56. 56. Tweak Auto-Populated Groups<br />EinfacheErweiterung in names.nsf<br />Create a new subform<br />Create a new field on the subform ( SelectionCriteria, Text, Editable )<br />Give it the name Custom and an alias starting with $AutoPopulate followed by a number of your choice ( i.e. 9999)<br />Save the subform<br />http://www.eknori.de/2008-06-10/tweak-the-auto-populated-groups-feature-in-domino-85/<br />
  57. 57. How to get rid of $UpdatedBy?<br />Unter Umständen sollen die Bearbeiter eines Dokuments nicht sichtbar sein.<br />
  58. 58. @AdminDelegateMailFile<br />Erstellt Administrationsprocess<br />Unterzeichner muss Owner der Maildatei sein (!)<br />
  59. 59. Custom Administration Process<br />Fehlende Funktionen hinzufügen<br />Z.B. : User aus Gruppe entfernen<br />Verlagerung administrativer Aufgaben in den Servicedesk<br />NotesAdministrationProcessclass<br />Seit Release 6<br />AddGroupMembersmethod<br />aber keine RemoveGroupMembersmethod<br />
  60. 60. Custom Administration Process<br />
  61. 61. Custom Administration Process<br />admin4.nsf anpassen ( neue Maske )<br />
  62. 62. Custom Administration Process<br />admin4.nsf anpassen ( Ansichten )<br />Neue Ansicht erstellen oder<br />Spalte „Action“ anpassen<br />
  63. 63. Zip and Unzip <br />Verwendung von ZIP/UNZIP mitLotusScript<br />Kostenlos <br />http://www.vcode.no/vcode.nsf/downloads/VCZIPSUP<br />
  64. 64. Auto-Zip Mail Attachments<br />Anhänge werden beim Versenden automatisch gepackt<br />Genaue Beschreibung der Anpassungen im Lotus Notes & Domino Wiki<br />http://www-10.lotus.com/ldd/dominowiki.nsf/page.xsp?documentId=7963EB58BAD528FB852577AE0062A72A&action=openDocument&mode=original<br />
  65. 65. XLS ohne Excel erstellen<br />Reports sollen auf einem Server erstellt werden, auf dem kein Excel installiert ist. ( Linux )<br />http://jxls.sourceforge.net/index.html<br />Support for Excel 2007 OOXML (.xlsx) fileformat<br />
  66. 66. XLS ohne Excel erstellen<br />
  67. 67. Lotus SymphonyToolkit<br />%Include"symphonylsx.lss„<br />OpenNTF.org Contacts Experience<br />http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=OpenNTF.org%20Contacts%20Experience<br />MailMerge<br />Letter<br />Export Contacts<br />Symphony<br />MS Office<br />
  68. 68. Wurde das Dokument gelesen?<br />doc.GetRead([username])<br />Ab Release 8.5<br />Gibt „true“ zurück, wenn das Dokument vom aktuellen User gelesen wurde<br />Wird ein Username angegeben, wird der Lesestatus dieses Users zurückgegeben<br />
  69. 69. @Midas Lookups<br />Ben Langhinrichs ( geniisoftware )<br />Auslesen von Daten aus RichText<br />Syntax wie @DBColumn und @DBLookup<br />Free download: http://www.geniisoft.com/showcase.nsf/MidasLookups<br />
  70. 70. @Midas Lookups<br />Erweiterte Möglichkeiten<br />Beispiel: Sortierte Ausgabe aller Listenpunkte <br />
  71. 71. Ist RichText Item leer??<br />@Length(@Text(body))-1<br />@Attachments<br />rtitem.ValueLength<br />rtitem.EmbeddedObjects<br />Attachments OK<br />Aber: Doclinks, Inline Images, Hotspots (Button)<br />
  72. 72. Ist RichText Item leer?<br />DEMO - Is Item empty?<br />
  73. 73. Arbeiten mit RichText<br />C/C++ API oder LS2CAPI<br />NormundsKalbernzin<br />LotusScript to Lotus C API Programming Guide ( ls2capi.com )<br />Lee Powell<br />LotusScriptor'sPlain Simple Guide to the Lotus Notes C++ API <br />Download : http://www.eknori.de/downloads/capibook.pdf<br />EthannCastell<br />Gettingstartedwith the C-API<br />Controlrichtextcontentwithprecisionusing the C-API<br />The View, 09 / 11 , 2007<br />
  74. 74. Einordnung der C-API<br />Lotus Script<br />Visual Basic (COM)<br />JAVA<br />JNI<br />Notes Object Interface (NOI)<br />C++ API<br />Notes Core ( C API )<br />Betriebssystem<br />
  75. 75. Ist RichText Item leer?<br />LS2CAPI to the rescue!<br />Leeres RTI besitzt nur einen CDRecord von Typ Text<br />
  76. 76. Header / Footer<br />Erstellen / Ändern<br />Anwendungseigenschaften ( global )<br />Dokumenteneigenschaften<br />Keine Möglichkeit über @Formel oder LotusScript<br />
  77. 77. Header / Footer<br />Informationen sind in RichText item gespeichert<br />
  78. 78. Header / Footer<br />LotusScript Library / LS2CAPI<br />
  79. 79. Inline Images<br />Auf Inline Images kann nicht über die embedded objects Eigenschaft zugegriffen werden<br />Inline Images werden z.B. nicht bei DAOS berücksichtigt.<br />Es gibt keine Methoden, um Inline Images mit LotusScript so umzuwandeln, daß sie als Anhang im Dokument gespeichert werden.<br />
  80. 80. Inline Images<br />Wie ist ein Inline Image gespeichert ?<br />
  81. 81. Inline Images<br />Andre Guirard<br />http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=LotusScript%20Gold%20Collection<br />
  82. 82. Inline Images<br />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.<br />NormundsKalnberzins<br />http://www.rtlib.com/<br />
  83. 83. ReplaceInline Image <br />Bilder, die aus der Zwischenablage in ein Dokument eingefügt werden, werden bei DAOS nicht berücksichtigt. <br />Methoden zum Umwandeln in ein Attachment gibt es in Lotus Notes nicht.<br />Funktion muss folgende Voraussetzungen erfüllen<br />Umwandeln des inline image in ein Attachment<br />Ersetzen des inline image durch das Attachment<br />Beibehalten der Position<br />
  84. 84. ReplaceInline Image<br />Das Attachment wird an die <br />Position des Inline Image gesetzt.<br />
  85. 85. ReplaceInline Images<br />
  86. 86. Insert RichtextintoRichtext<br />notesRichTextRange.FindAndReplace( target$ , replacement$ , [ options& ] )<br />Damit lässt sich aber nur Text innerhalb von RichText finden und ersetzen<br />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.<br />
  87. 87. Insert RichtextintoRichtext<br />
  88. 88. Insert RichtextintoRichtext<br />
  89. 89. JW Player - Mediaplayer<br />JW Player: Ein paar Zeilen Code für einen Mediaplayer für Flash und HTML5 support<br />Skins, Plugins und Playlists<br />http://www.longtailvideo.com/players/<br />
  90. 90. JW Player - Mediaplayer<br />
  91. 91. jQuery<br />freie, umfangreiche JavaScript-Klassenbibliothek, welche komfortable Funktionen zur DOM-Manipulation und -Navigation zur Verfügung stellt<br />http://www.reizkraft.com/content/die-43-sch%C3%B6nsten-jquery-plugins-f%C3%BCr-webdesign<br />Animatedgifcreatedwith http://picasion.com/<br />
  92. 92. UIZE – JavaScript Framework<br />„You Eyes“ <br />OpenSource, MIT oder GNU GPL<br />Unterstützung von …<br />Widgets, <br />Ajax, <br />DOM, <br />Templates <br />…<br />Mobile Devices<br />http://www.uize.com/<br />
  93. 93. UIZE – JavaScript Framework<br />Sample : Resizer<br />
  94. 94. Xpages und @Formula<br />Nur 97 der 274 @Formeln können in SSJS verwendet werden<br />http://www-10.lotus.com/ldd/ddwiki.nsf/dx/List_of_Formula_Not_Supported_In_XPages<br />Michael Gollmick hat ein paar Formeln umgesetzt<br />@WebDBName<br />http://blog.gollmick.de/mgoblog.nsf/40f2c735481f54dd80256d650047636c/0687660450ad65bdc125754a008357ce?OpenDocument<br />@URLEncode, @URLDecode<br />http://blog.gollmick.de/mgoblog.nsf/dx/some-more-Functions-for-XPages-URLEncode-URLDecode.htm<br />
  95. 95. Q + A<br />Mail: eknori@eknori.de<br />Blog: http://www.eknori.de<br />Sametime: Bleedyellow.com<br />Twitter: Eknori<br />

×