Posts Tagged: ‘entwicklung’

undokumentierter Lotus-Formula-Befehl “@ExpandNameList”

2. Juli 2013 Posted by Bernd Garrels

Der Lotus-Formula-Befehl @ExpandNameList ist ein nicht dokumentierter Befehl und wird beispielsweise an kritischer Stelle in der Ressourcen-Datenbank verwendet. Leider gibt es einige Einschränkungen bei der Verwendung dieses Befehls. Diese habe ich versucht zu dokumentieren:

@ExpandNameList
Gibt die Liste der Mitglieder einer Gruppe aus dem Domino-Directory zurück. .

Hinweis: Die Mitglieder einer Gruppe vom Typ "Nur Zugriffskontrollliste" oder "Negativliste" werden nicht zurückgegeben. Hier wird nur der Gruppenname zurückgegeben.

Syntax
@ExpandNameList(Servername [: Directory-Name]; Gruppenname[, Parameter ] )

Servername
Name des Servers, in dessen Domino-Directory sich die aufzulösende Gruppe befindet.

Hinweis: Es muss unbedingt der Servername eines existierenden Servers angegeben werden. Wenn der Server nicht festgestellt werden kann, wird nur der Gruppenname zurückgegeben.

Directory-Name
Name des Domino-Directory

Gruppenname
Name der Gruppe, die aufgelöst werden soll.

Parameter
[IGNORE_FWD_ADDRESS]
Ab Version 377 (8.5.2). Verwendet in der Reservierungs-Datenbank, Funktion unbekannt

Beispiel:
@ExpandNameList( @Subset(@DbName;1) ; Gruppenname)

Fehler im PostSave Event bei neuen Dokumenten

18. Juni 2013 Posted by Manuel Nientit

Lotus Notes
Kürzlich hat einer unserer Kunden die Notes-Version von 7.x auf 8.5.3 FP3 aktualisiert, was an sich eine gute Idee ist .
In Folge dessen sind zwei unserer Anwendungen auf die Nase gefallen, da es offenbar mit Notes-Versionen > 8.5.x einen Fehler im PostSave-Event gibt. Da wir in unseren Anwendungen recht selten auf das PostSave-Event überhaupt zurück greifen, ist das auch nicht vorher schon bei anderen Kunden oder Anwendungen aufgefallen.

Das Problem betrifft offenbar NotesDocument-LotusScript-Objekte von Dokumenten, die gerade erst neu angelegt wurden und vor dem PostSave das erste Mal gespeichert wurden. Offenbar ist dieses Objekt zum Zeitpunkt, in dem das PostSave ausgelöst wird, noch nicht vollständig initialisiert, so dass einige Properties oder Funktionen fehlerhafte Werte zurück geben oder gleich Fehler werfen.

Die Reihenfolge ist also folgendermaßen:
  1. Das Dokument wird neu erzeugt. Bei der Erzeugung wird im QueryOpen gemäß "unserem" Model-View-Controller-Konzept das Model mitsamt dem Document-Object erzeugt
  2. Nach einigen Eingaben wird die Speicherung ausgelöst
  3. Im QuerySave wird das Dokument validiert
  4. Das Dokument wird (nach erfolgreicher Validierung) gespeichert
  5. Im PostSave greifen wird auf Eigenschaften und Funktionen des Document-Objects zu, das wir im QueryOpen erzeugt haben. Dabei passieren die besagten Fehler.

Die folgenden zwei Fehler sind dabei konkret (in jeweils einer anderen Anwendung) aufgetreten, aber es mag natürlich noch mehr geben:

NotesDocument.NoteID gibt den Wert "0"


Wir rufen in einer Anwendung einen Agenten aus dem PostSave heraus auf, weil dieser den Out-of-Office-Agenten (oder Service) aktivieren soll. Beim Aufruf wird die NoteID als Kontext übergeben:
agent.runOnServer(source.document.noteID)
Die NoteID wird dann im Agenten selbst wieder aus dem Kontext ausgelesen:
session.currentAgent.ParameterDocNoteID
Aber - oh weh - die NoteID ist "0", so dass der Agent natürlich mit Fehlermeldung aussteigt. Das hat in früheren Notes-Versionen noch funktioniert, aber war auch mit Notes 9 noch reproduzierbar. Dass es sich hier um nicht beabsichtigtes Verhalten handeln muss, zeigt sich auch daran, dass es einen leicht krummen aber einfachen Workaround gibt. Wir holen uns die NoteID einfach mit Formelsprache:
noteID = Evaluate(|@Right(@NoteID;"NT")|, source.document)
und übergeben diese einfach an den Agenten:
agent.runOnServer(noteID(0))

Nun mag man kein Freund davon sein, Formelsprache mit Evaluate in LotusScript auszuführen, aber zumindest funktioniert es.

Fehler mit NotesDocument.CopyToDatabase


In einer anderen Anwendung werden Dokumente im PostSave (auf Nachfrage hin) in eine Archivdatenbank kopiert. Dazu nutzen wir die Funktion:
NotesDocument.copyToDatabase(NotesDatabase)
Diese Funktion wirft allerdings den Fehler "Invalid or nonexistent document". Wenn man nach dieser Fehlermeldung im Kontext mit copyToDatabase bei Gugl sucht, findet man auch. Allerdings funktioniert der vorgeschlagene Lösungsweg, den Code in das PostSave zu verschieben, eben nicht - oder nicht ohne Weiteres.
Und die Lösung dafür ist ähnlich Facepalm-tauglich, wie die Obige.
Man hole sich die UniqueID des aktuellen Dokumentes und erzeuge sich davon ein neues Notesdocument Objekt, um darauf die Operation auszuführen. Das könnte ungefähr so aussehen:
unid = source.Document.Universalid
Set newDocumentObject = notesDatabase.getDocumentByUNID(unid)
Set archiveDoc = newDocumentObject.CopyToDatabase(archiveDB)

Ich bin nicht begeistert, aber es läuft . Dieses zweite Problem war übrigens mit Notes 9 nicht mehr reproduzierbar.

Ergänzungen zu weiteren Fehlern ähnlicher Natur oder Anregungen zu Lösungsstrategien sind immer herzlichst willkommen .

Übersicht der System-Voraussetzungen von Notes, Domino, Domino-Administrator, Domino-Designer und Notes Traveler

26. März 2013 Posted by Thomas Bahn

AdministrationEntwicklungLotus NotesLotus DominoLotus Notes Traveler

Alle System-Voraussetzungen von IBM (Lotus) Notes (inklusive Designer- und Administrator-Client), IBM (Lotus) Domino und IBM (Lotus) Notes Traveler, also z. B. welche Betriebssysteme und Browser offiziell von IBM unterstützt werden, kann man in der folgenden Übersicht sehr schnell und einfach nachsehen - und das für alle Versionen von 7.0 bis 9.0:

Index of system requirements for Notes, Domino, Domino Administrator, Domino Designer & Notes Traveler

Quick-Tipp: Ein Feld namens URL

26. März 2013 Posted by Thomas Bahn

Quick-Tipp
Wenn man hybride Notes-Web-Anwendungen entwickelt, auf die einige Benutzer vielleicht ausschließlich über die Web-Oberfläche zugreifen können, möchte man trotzdem ganz schnell und einfach Verknüpfungen auf die Dokumente erzeugen können, die auch von diesen nur-Browser-Benutzern verwendet werden können.

In eine klassischen Notes-Anwendung kann man über Bearbeiten - Kopieren als... - Dokumentlink (oder über das Kontextmenü via Rechtsklick) sehr leicht eine Verknüpfung in die Zwischenablage kopieren und dann z. B. in eine E-Mail einfügen.


Wenn man das bei einer hybride Notes-Web-Anwendung macht, geht das natürlich auch, die Verknüpfung ist aber für die Benutzer, die nur über die Web-Oberfläche auf diese Anwendung zugreifen sollen oder dürfen, obwohl sie aber sonst vielleicht einen Notes-Client haben, nicht so einfach nutzbar. Auch hat man keine Kontrolle darüber, wie die erzeugte Verknüpfung genau aufgebaut ist.

Aber auch dafür gibt es natürlich bei Notes eine sehr einfache, leicht zu implementierende Lösung:  

Enthält das Dokument ein Item namens URL, wird bei Bearbeiten - Kopieren als... - Dokumentlink (bzw. dem entsprechenden Kontextmenü-Eintrag) der Inhalt dieses Items in die Zwischenablage kopiert.

So kann man ganz einfach selbst eine URL zusammenbauen, sei es eine notes://- oder eine http://-URL, egal ob man damit das Dokument direkt aufruft, einen Agenten oder gar eine XPage, und ob man das Dokument direkt referenziert oder  z. B. den eindeutigen (fachlichen) Schlüssel des Dokuments als Parameter übergibt.

Wenn man dann doch mal eine "normale" Notes-Verknüpfung braucht, kann man - wie auch sonst immer - einfach den Reiter des Dokuments in das gewünschte Notes-RichText-Feld ziehen.

EntwicklerCamp 2013: Fehlerbehandlung in Notes

13. März 2013 Posted by Bernd Hort

EntwicklerCamp

Das EntwicklerCamp ist leider fast vorbei. Mein zweiter Vortrag zum Thema „Fehlerbehandlung in Formelsprache, LotusScript, Java, JavaScript und XPages“ war heute vormittag.

Das nächste EntwicklerCamp ist vom 17.03. bis zum 19.03.2014. Ich freue mich schon!


EntwicklerCamp 2013: XPages und Java

12. März 2013 Posted by Bernd Hort

EntwicklerCamp

Heute durfte ich den ersten meiner zwei Vorträge auf dem diesjährigen EntwicklerCamp halten.

Im Vortrag „XPages und Java“ ging es primär darum, wie eigene Klassen für XPages in Java geschrieben werden können, was Managed Beans sind und welche Elemente aus dem JSF-Umfeld sinnvoll für eigene Anwendungen eingesetzt werden können. Den Abschluss bildete eine Betrachtung des Model-View-Controller-Patterns und wie wir es in unserem assono XPages-Framework einsetzen.


EntwicklerCamp 2013: Reite den Mustang DIY – Selbst ist der künftige Java-Entwickler

12. März 2013 Posted by Thomas Bahn

EntwicklerCamp
Heute habe ich auf dem EntwicklerCamp 2013 meinen einführenden Vortrag von gestern um eine praktische Übung ergänzen dürfen. Wir sind gemeinsam die ersten Schritte gegangen, haben ein kleines Programm entwickelt, ausgeführt und den Debugger genutzt. Das Beispielprogramm lädt u.a. eine Web-Seite und eine JPEG-Grafik herunter und speichert beides in Dokumenten, wobei die Grafik "nebenbei" in eine PNG-Grafik konvertiert wird.


Die Präsentation und Beispiele zum Hands-On "Reite den Mustang DIY - Selbst ist der künftige Java-Entwickler":

EntwicklerCamp 2013: Reite den Mustang – Java-Entwicklung in Notes und Domino

12. März 2013 Posted by Thomas Bahn

EntwicklerCamp
Gestern durfte ich auf dem EntwicklerCamp 2013 meinen einführenden Vortrag in die Java-Entwicklung für Notes- und Domino-Entwickler halten. Nach einer kurzen Einführung in die Syntax und einige für LotusScript-Entwickler ungewöhnliche Konzepte zeige ich anhand vieler Beispiele die verschiedenen Möglichkeiten, Java in/mit Notes und Domino einzusetzen: Applets, Agents, Standalone-Anwendungen, Servlets usw.


Die Präsentation und Beispiele zum Vortrag Reite den Mustang - Java-Entwicklung in Notes und Domino:

Quick-Tipp: Dynamisches HTML in Notes-Masken

21. Februar 2013 Posted by Thomas Bahn

Quick-Tipp
Ein Punkt in der Wunschliste eines Notes-Entwicklers brachte mich zum Nachdenken: Ist es möglich, in einer Notes-Maske dynamisch HTML, z. B. eine Tabelle, zu berechnen und darzustellen? Gibt es einen Weg, den HTML-Teil zu aktualisieren, während das Dokument offen bleibt?


Das ist, wenn man den letzten Punkt nicht beachtet, ziemlich einfach:
  • Erstelle eine Maske mit ausgewählter Option "Render pass through HTML in Notes"
  • Erstelle einen Berechneten Text, in dessen Formel das HTML berechnet wird, und markiere den Absatz (im Text-Menü) als "Pass-Thru HTML".
Das war's schon.

Wenn du jetzt ein neues Dokument mit dieser Maske erstellst, wird das HTML berechnet und dargestellt. Wenn du ein vorhandenes Dokument öffnest, kann du sogar die Items des Dokuments in der Formel des Berechneten Textes benutzen.

Aber - und das ist jetzt ein großes ABER: Das HTML wird nur neu berechnet und dargestellt, wenn die Maske geöffnet wird; es wird nicht aktualisiert, wenn sich die Feldwerte im Dokument ändern.

Und es gibt eine Lösung für dieses Problem:
Folgende Schritte sind dazu notwendig:
  • Erstelle eine Maske mit gesetzter "Render pass through HTML in Notes"-Eigenschaft:

  • Erstelle ein "Berechnet zur Anzeige"-Textfeld namens "SaveOptions" mit "0" als konstantem Wert:

  • Erstelle ein "Berechnet beim Anlagen"-Textfeld namens "Form" mit dem Namen (oder dem Alias) der Maske als konstantem Wert:

  • Erstelle einige weitere Felder auf der Maske, deren Werte später benutzt werden können. Danach füge einen Berechneten Text hinzu und markiere den Absatz (im Text-Menü) als "Pass-Thru HTML":

  • In seiner Formel berechne das gewünschte HTML, z. B. eine HTML-Tabelle ähnlich dieser:

  • Und jetzt kommt die Magie: Füge eine Schaltfläche, eine Aktion, eine Prozedur (z. B. im Exiting-Ereignis) mit folgendem  LotusScript-Code hinzu:

Ein Verweis auf das aktuelle Backend-Dokument (NotesDocument) wird in der doc-Variable zwischengeparkt (ohne das es richtig in der Datenbank gespeichert wird!), dann wird das geöffnete Frontend-Dokument (NotesUIDocument) geschlossen und das Backend-Dokument doc wieder neu geöffnet.

Das "Form"-Feld ist notwendig, damit der Notes-Client weiß, in welcher Maske das Dokument wieder geöffnet werden soll. Es wird beim Speichern automatisch erstellt, da wir aber das Dokument hier nicht speichern, müssen wir selbst dafür sorgen.

Das "SaveOptions"-Feld ist wichtig, damit der Benutzer beim Schließen des Dokuments nicht gefragt wird, ob der das Dokument speichern möchte.
  • Um das Dokument zu speichen, müssen wir daher das Feld vorher entfernen:


Du kannst eine sehr kleine Beispiel-Datenbank mit der gezeigten HTML-Maske hier herunterladen: DynamicHTMLInNotes.zip.

Social Collaboration in der Softwareentwicklung

25. Oktober 2012 Posted by Rita Lewandowski

In unserer Reihe "Studien-Freitag" befragen wir Experten zu aktuellen Managementaufsätzen des IBM Forschungsinstituts IBM Institute for Business Value. Heute steht Carsten Meinecke, Partner und Leiter IT Advisory bei IBM Global Business Services, Rede und Antwort zum Thema "Social Collaboration in der Softwareentwicklung".
 

RL: Herr Meinecke, was sind die besonderen Herausforderungen, denen die Softwareentwicklung heute gegenübersteht?
CM: Es hört sich vielleicht etwas platt an, aber Tatsache ist, dass die Anforderungen an die Softwareentwicklung in jüngster Zeit enorm gestiegen sind und noch weiter steigen werden. Wieso das so ist? Insbesondere weil die Kunden immer stärker mit den Unternehmen kommunizieren - und hierfür verschiedenste Software verwenden. Die Unternehmen auf der anderen Seite benötigen immer neue Software, um die Kundeninteraktion zu verbessern oder Produkte innovativer zu gestalten. Eine Folge dieser Trends ist beispielsweise das, was wir in der IBM "Front Office Digitization" nennen und u.a. die zunehmende Flut an mobilen Software Anwendungen (Mobile-Apps) einschliesst. Die Fachbereiche eines Unternehmens verlangen innerhalb
kürzester Zeit neue Mobile-Apps, um ihren Kunden bessere Interaktionsmöglichkeiten zu erföffnen oder besseren Service zu bieten - und zusätzlich sollen die Mobile-Apps in bestehende Systeme nahtlos integriert werden. Wir sehen hier folglich die Herausforderung von extrem kurzen Entwicklungszeiten in einem technischen Umfeld. Das alleine wäre machbar, aber die Anzahl dieser Mobile-Apps "explodiert" regelrecht, Entwicklungen verlaufen parallel und oftmals schlecht abgestimmt. Und jede einzelne App ist sofort für Endkunden verfügbar. Hier die Qualität bei aller Geschwindigkeit zu gewährleisten, die Anwendungen sinnvoll zu integrieren und zu managen - das sind neue Dimensionen in der Softwareentwicklung, die es künftig zu meistern gilt.
 
 
RL: Welche Erfahrungen haben Sie innerhalb der IBM mit dem Einsatz von sozialen Plattformen in der Softwareentwicklung gemacht?
CM: Sehr, sehr positive. Dies ist aus unserer Sicht der nächste grosse Sprung in der Softwareentwicklung. Soziale Plattformen ermöglichen es erst, den besten Entwickler für eine bestimmte Aufgabe zu finden. Früher lief die Identifikation über eine Art Mund-zu-Mund Propaganda "... kennst Du einen guten Entwickler für ...", dies ist im Zeitalter der "Vernetzung 2.0" alles andere als state-of-the-art. Ähnlich lief das früher im privaten Bereich, da hat man z.B. Freunde befragt: "welches Hotel würdest Du in Berlin empfehlen?". Der Freund kannte dann 2 oder 3 - von weit über 1.000 existierenden Hotels - und machte basierend darauf eine gut gemeinte aber nicht die beste Empfehlung. Heute würde jeder sich sofort aus spezialisierten Portalen eine vollständige Übersicht und Empfehlung zu den 1.000 Hotels besorgen. Bei der Softwareentwicklung ist es ähnlich. Es gibt tausende von guten Entwicklern weltweit, aber wer den besten Skill und die richtige Erfahrung hat und dazu noch verfügbar ist, das ist auf die herkömmliche Methode schwer zu finden. Soziale Plattformen machen genau dies möglich. Und die Plattformen sind bi-derectional, d.h. nicht nur Projektleiter suchen Entwickler, sondern auch die Entwickler bewerben sich auf Projekte. Dieses Vorgehen hat bei uns eine Effizienzsteigerung von 30% und mehr gebracht. Wir hatten komplexe Projekte, bei denen der Aufwand enorm und die Ergebnisse enttäuschend waren. Durch den Einsatz solcher Plattformen haben die Projektteams bei zum Teil deutlich höheren Anforderung wesentlich bessere Ergebnisse geliefert.
 
 
RL: Was müssen Unternehmen berücksichtigen, wenn sie sich für soziale Kollaboration öffnen möchten?
CM: Ein solcher Ansatz ändert vollständig die Art und Weise in der wir bisher gearbeitet haben und erfordert eine gesamtheitliche Betrachtung . Wir haben bereits in jüngster Vergangenheit versucht virtuell in Entwicklungsprojekten zu arbeiten und sind zum Teil gescheitert weil die Rahmenbedingungen nicht angepasst waren. In diesem Modell der sozialen Kollaboration ist die Virtualität noch stärker. Das bedeutet zum einen, dass man gezielt im Rahmen eines Cultural-Change Projektes den Mitarbeitern helfen muss, die geänderte Arbeitsweise zu adaptieren und erfolgreich umzusetzen. Zum anderen ist die neue Arbeitsweise mehr als nur die Einführung einer Technologie. Man muss ein konsistentes und konsequentes Gesamtmodell implementieren aus den Dimensionen: 1) Prozess / Methodik, 2) Organisation / Rollen, 3) Technologie / Tools, 4) Skills / Training, 5) Messung des Erfolgs und 6) Kultur-Change (mein erster Punkt). Erst wenn man über alle sechs Dimensionen dieses neue Modell der Zusammenarbeit definiert und einführt - das haben wir in vielen Projekten gelernt - wird man sich der sozialen Kollaboration erfolgreich öffnen.
 
 
Mehr zum Thema in dem Managementaufsatz "Small Worlds: The social approach of software delivery"

Vorprogramm zur 37. DNUG Konferenz: Workshops, Arbeitskreise und Unternehmenspräsentationen am 7. November 2012

15. Oktober 2012 Posted by Roswitha Boldt

 

Für den Vortag der 37. DNUG Konferenz haben die DNUG Arbeitskreisleiter interessante Themen vorbereitet. Das Spektrum reicht von XPages, über Lotus Notes & SAP, Integration von De-Mail in Lotus Notes/Domino, BlackBerry Portfolio Update & Ausblick, IBM Sametime + Telefonie, neue Single SignOn-Funktionen in Lotus Notes/Domino bis hin zum Workshop betreffend die Einführung von Social Software im Unternehmen unter aktiver Einbeziehung der Teilnehmer.

In einem weiteren Social Media Workshop erhalten die Teilnehmer Handwerkszeug und Tipps, wie man einen Podcast erstellt.

Die Unternehmen harmon.ie und panagenda GmbH bieten Vorträge zu ihren Produkten und Services an.

Nach den Tagesveranstaltungen findet die diesjährige DNUG Mitgliederversammlung statt.

Alle Teilnehmer des Tages und die Gäste der 37. DNUG Konferenz sind anschließend sehr herzlich zu abendlichen Welcome Reception eingeladen.

 

Mehrsprachige Anwendungen unter XPages

25. September 2012 Posted by Jörg Fengler

Laut IBM braucht man nur die Lokalisations-Option (bei den XPage Optionen) aktivieren, angeben in welchen Sprachen die Anwendung zur Verfügung stellen soll und erhält nach einem Clean für alle XPages und Customer Controls Elemente Properties Dateien, die man dann einem Übersetzer in die Hand drücke ...

XPages Einmal das Datum ohne Zeit bitte

10. Juli 2012 Posted by Jörg Fengler

Manchmal sind es die kleinen Dinge, die einen aufhalten. Zum Beispiel der Wunsch nur das Datum ohne Zeitangabe in einem Feld abzuspeichern. Glaubt man anfangs noch, dass es ausreicht dem Datepicker zu sagen, dass man nur am Datum interessiert ist, stellte man fest, dass die Option den Datepicker ...

XPages und die Validierung

3. Juli 2012 Posted by Jörg Fengler

XPages bietet von Hause aus eine ganze Reihe von Validierungsmöglichkeiten an. Neben den üblichen Prüfungen ob ein Feld gefüllt wurde oder ob es einer regular expression genügt, kann man auch eigene Javascript-Routinen einbinden, die sich komplexere Prüfungen annehmen. Hierzu kann man über die Ei ...

XPages: Unterschiedliche Java-Versionen auf unterschiedlichen Betriebssystemen

12. Juni 2012 Posted by Bernd Hort

java_logo.gif

Wie ich heute schmerzlich erfahren musste, sind die JVMs (Java Virtuell Maschine) auf den unterschiedlichen Lotus Domino Serverplattformen bei gleicher Versionsnummer nicht identisch und verhalten sich leider auch nicht identisch.

Entwickelt und getestet hatte ich die XPage-Anwendung auf einem Linux-System mit den folgenden Werten.

  • java.version 1.6.0
  • java.vendor IBM Corporation
  • java.vm.version 2.4
  • java.vm.vendor IBM Corporation

Der Kunde betreibt seinen Server auf SunOS.

  • java.version 1.6.0_17
  • java.vendor Sun Microsystems Inc.
  • java.vm.version 14.3-b01
  • java.vm.vendor Sun Microsystems Inc.

Normallerweise dürfte es keinen Unterschied machen. In meinem Fall hat sich die Implementierung von java.util.TreeSet. aber doch erheblich im Verhalten unterschieden.


Konkret ging es darum, ein bestehendes TreeSet umzusortieren. Der allgemein verwendete Weg besteht darin, ein neues TreeSet mit einem anderen Comparator zu erstellen und mit Hilfe der Methode TreeSet.addAll(Collection c) die Einträge aus dem alten TreeSet zu übernehmen.