Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

The Lotus Code Cookbook

8.931 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.

  • Als Erste(r) kommentieren

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 />

×