FSS.social
10Jul 120

XPages Einmal das Datum ohne Zeit bitte

am Dienstag, den 10. Juli 2012

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 nicht daran hindert noch eine Zeitangabe anzuhängen.

Im Internet fand ich ein Stück Code mit dem man beim Speichern der XPage dafür sorgen kann, dass der Code wieder rausfliegt.



// kleine Korrektur bei den Datumsfeldern Datum + Zeit => Zeit

if (currentDocument.getDocument().hasItem("Beginn")) {

var dtb:NotesDateTime = currentDocument.getItemValueDateTime("Beginn");

dtb.setAnyTime();

currentDocument.getDocument().replaceItemValue("Beginn",dtb)

}

3Jul 120

XPages und die Validierung

am Dienstag, den 3. Juli 2012

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 Eigenschaften einen neuen Validator namens validateExpression hinzufügen.
Der (serverseitige) Javascriptcode wird bei Expression hinzugefügt.
Wenn der Javascriptcode ein "false" zurückliefert wird die Fehlermeldung zurückgegeben die man unter "message" eingetragen hat.

XPages Validierung

Man kann zudem auch eigene ("Fehler-") Mitteilungen ins <font color="blue"> Display-Errors Control <font color="black"> schmuggeln.
Dazu gibt es bei Tommy Valand ein kleinen Code-Schnippsel (Link zur Orginalseite)
<font color="blue"><blockquote><htmlblock>
function addFacesMessage( message, component ){
try {
if( typeof component === 'string' ){
component = getComponent( component );
}

var clientId = null;
if( component ){
clientId = component.getClientId( facesContext );
}

facesContext.addMessage( clientId, new javax.faces.application.FacesMessage( message ) );
} catch(e){
/*Debug.logException(e);*/
}
} }
</htmlblock></blockquote><font color="black">

Ruft man mit serverseitigem Javascript die obige Funktion wie folgt auf <font color="blue">
addFacesMessage("Die Datenbank xyz wurde nicht gefunden,","IDEinesFeldes")
<font color="black"> wird die Meldung im Display-Error Control angezeigt.

Anbei noch ein paar interessante Links rund um das Thema::
Hier findet man eine Beschreibung der Validierungsmöglichkeiten Link zu www-10.lotus.com
Hier ist noch eine Alternative von Tommy Valand zum Display Control. Link zu Tommy Valands Blog
Hier findet man eine größere Liste mit regularen Expressions Link zu regexlib.com

 

10Mai 120

XPages: Readonly Combobox mit Aliasnamen

am Donnerstag, den 10. Mai 2012

Content-Type: multipart/related; boundary="=_related 002E3FC9C12579FA_=" This is a multipart message in MIME format.

23Apr 120

XPages: runWithDocumentContext – wie man Lotus Script Funktionen in XPages nutzen kann

am Montag, den 23. April 2012

Wenn eine Lotus Notes Datenbank webfähig gemacht werden soll,
stellt sich die Frage, ob sich nicht zumindest ein Teil der Lotus Script-Codes weiter verwenden lässt.

Bzw. ob wirklich alles noch einmal in Java Script programmiert werden muss.

Ab 8.5.2 gibt es die Möglichkeit einem Agenten das aktuelle Dokument im Speicher zu übergeben.
Der Agent kann dann seinerseits Felder in dem aktuellen Dokument verändern und an den Aufrufer zurückgeben.

Ein Beispiel:
In einer XPage liegt hinter einem Weiterleiten-Button folgender Code:

(serverseitiger Javascript-Code, antragDoc ist hier der Name der aktuellen Dokument-Resource)


var agent:NotesAgent = database.getAgent("(weiterleiten)");


agent.runWithDocumentContext(antragDoc.getDocument());

antragDoc.save();
Dem Agent wird das aktuelle Dokument übergeben. Sobald der Agent mit dem Dokument fertig ist, wird dieses gespeichert.

Beim Agent "(weiterleiten)" wurde unter Security "Run as Webuser" eingestellt.
Der Code des Agenten ist in Lotus Script geschrieben und könnte wie folgt aussehen.


Sub Initialize


Dim db As NotesDatabase

Dim agent As NotesAgent

Dim session As New NotesSession

Dim actDoc As NotesDocument

Set db = session.CurrentDatabase
Set agent = session.CurrentAgent
Set actDoc = session.DocumentContext

Call Weiterleiten(actDoc)
End Sub

Call Weiterleiten() ist eine Funktion in der nun beliebig Felder des Dokumentes gesetzt werden können.

Um die Veränderungen zu übergeben muss das Dokument NICHT gespeichert werden.

Sobald der Agent fertig ist, übergibt er dem Aufrufer das veränderte Dokument.

15Mrz 120

XPages: Abfragen von radiobuttons mit javascript (clientseitig)

am Donnerstag, den 15. März 2012

Nicht selten sind es die kleinen Änderungen, die plötzlich mehr Zeit verschlingen als erwartet.

Die Aufgabe:
Wenn man bei einem Radiobutton einen neuen Wert auswählt, soll über eine Dialogbox nachgefragt werden, ob man dies wirklich ändern will.
Überlegt es sich der Anwender noch einmal anders, so soll der neue Wert ignoriert werden.

Auf den ersten Blick sieht dies nach einer Aufgabe aus, die schnell erledigt ist.
Doch wie so oft liegt die Tücke im Detail.

Zunächst wartet bei den Events eine Überraschung:
Der IE (8 & 9) ignoriert unter XPages beim RadioButton das onChangeEvent()

Somit darf das onChangeEvent über das onClick Event nachgebildet werden.

Beim onClick-Event muss berücksichtigt werden, dass dieses bei der Auswahl eines neuen Wertes zweimal durchlaufen wird.
Einmal mit dem alten und einmal mit dem neuen Wert.

Den alten Wert der RadiobuttonGroup erhält man über folgenden Ausdruck:

alterwert = '#{javascript:getComponent("radioGroup1").getValue();}';

Beim Versuch den neuen Wert zu ermitteln, wartet dann die nächste Überraschung.
Einige empfehlen hier folgende Variante:


var elements = dojo.byId(id);
for(i=0;i if (elements[i].value == value) {
elements[i].checked = true;
}
}


Kleiner Schönheitsfehler: Dies klappt zwar mit dem Firefox einwandfrei aber der IE (8 & 9) hält von dieser Variante nichts. Das Element daß der IE zurückgibt enthält schlichtweg keine Elemente durch die man sich durchhangeln könnte.

Allerdings kann man sich recht elegant mit dojo.query den Wert des aktuell ausgewählten Radiobuttons holen:

elements = dojo.query('INPUT[type=radio][name=#{id:radioGroup1}]:checked');


neuerWert = elements[0].value;

Das Deaktivieren eines Radiobuttons ist mit dojo.query nicht mehr als ein Einzeiler:

dojo.query('INPUT[type=radio][name=#{id:radioGroup1}]:checked').forEach(function(n) {n.checked=false;});

Und auch das Setzen eines radiobuttons (z.B. den alten Wert) ist nicht mehr als eine Zeile

dojo.query('INPUT[type=radio][name=#{id:radioGroup1}][value='+alterwert+']').forEach(function(n) {n.checked=true;});

Die dojo.query-Varianten funktionieren mit Firefox und mit dem IE.

21Feb 120

XPages-Optimierung mit der Option „Use runtime optimized Javascript and CSS resources“

am Dienstag, den 21. Februar 2012

Content-Type: multipart/related; boundary="=_related 00359C42C12579AB_=" This is a multipart message in MIME format.

15Feb 120

Neues Buch „XPages Portable Command Guide“

am Mittwoch, den 15. Februar 2012

IBM hat ein neues Buch für Entwickler veröffentlicht.

"XPages Portable Command Guide offers fast access to working code, tested solutions, expert tips, and example-driven best practices. Drawing on their unsurpassed experience as IBM XPages lead developers and customer consultants, the authors explore many lesser known facets of the XPages runtime, illuminating these capabilities with dozens of examples that solve specific XPages development problems. Using their easy-to-adapt code examples, you can develop XPages solutions with outstanding performance, scalability, flexibility, efficiency, reliability, and value."

Hier kann das Buch bestellt werden. Wer den Code IBM3055 eingibt, kann 35% an der virtuellen Kasse sparen.

11Jan 120

Rich-Text-Felder unter XPages auf Leer abprüfen

am Mittwoch, den 11. Januar 2012

Rich-Text-Felder waren seit jeher für Überraschungen gut. Dies ist unter XPages nicht anders.

Möchte man zum Beispiel prüfen ob ein Benutzer etwas in ein Rich-Text-Feld eingetragen hat, stellt man verwundert fest, dass das Feld selbst wenn man noch nichts eingegeben hat mitnichten leer ist.
Schaut man sich die XPage im Browser etwas genauer an, stellt man fest, dass der CKEditor gleich am Anfang in das Feld zwei Tags setzt, womit die üblichen Abfragen ob ein Feld leer ist ins Leere laufen.

Will man wissen, ob das Feld wirklich leer ist, muss man zunächst alle Tags aus dem Feld entfernen, danach die Länge ermitteln und diese auf 0 abfragen.

Bei Javascript (clientseitig ab 8.5.2) kann man mit dem folgenden Ausdruck die Textlänge ohne Tags ermitteln:


CKEDITOR.instances['#{id:inputRichText}'].getData().replace( /< [^<|>]+?>/gi,'' ).replace(/^s+|s+$|t+/g, '').length

Serverseitig kann man in Javascript diesen Code verwenden:


@Length(getComponent("inputRichText").getValue().getContentAsText().replace( /< [^<|>]+?>/gi,'' ).replace(/^s+|s+$|t+/g, ''))

11Jan 120

JDBC-Projekt für den Zugriff auf Domino-Daten

am Mittwoch, den 11. Januar 2012

Auf OpenNTF.Org ist seit kurzen ein Projekt veröffentlicht, das sich mit dem Zugriff auf Domino-Daten mittels JDBC-Driver - insbesondere über XPages, aber auch Drittanwendungen wie z. B. Reportgeneratoren, die über JDBC kommunizieren können - beschäftigt. Es ermöglicht den Zugriff auf Ansichten über Server- und Datenbankengrenzen hinweg und erlaubt so z. B. die Auswertung und Darstellung verschiedenster Datenbestände.
Als Basis wird SQLite verwendet. Erforderlich sind Domino 8.5.3, die neueste Extension Library, sowie ein weiteres OpenNTF-Projekt mit dem Namen OSGI Tasklet Service for IBM Lotus Domino.
Testen konnten wir bisher noch nicht, zumal die Implementierung nicht ganz banal und offenbar etwas aufwendiger ist. Insgesamt aber für bestimmte Szenarien ein recht spannendes Projekt...


Vollständiger Artikel

28Nov 110

CKEditor Konfiguration

am Montag, den 28. November 2011

Content-Type: multipart/related; boundary="=_related 003073B0C1257959_=" This is a multipart message in MIME format.