Archive

Archive for November, 2011

XSnippet – Sortierte Ergebnisliste aus Volltextsuche

Hallo,

seit kurzem bin ich auch bei OpenNTF im Projekt der XSnippets aktiv.

XSnippets ist ein Projekt wo jeder zugelassene Entwickler kurze Code-Schnipsel hochladen kann um anderen XPages-Entwicklern das Leben ein wenig leichter zu machen.
Ich finde dies eine sehr schöne Idee, vor allem da man schnell mal ein Stück Code hochladen kann anstatt ganze Projekte zu veröffentlichen.

Auf jeden Fall hier mein erster Beitrag dazu:

Get sorted resultlist of fulltext search

Dieses kleine Snippet ist dazu da, um auf eine Datenbank eine Volltextsuche durchzuführen und die Ergebnisliste sortiert, nach einem Feld zurückzugeben. Das funktioniert natürlich nur, wenn alle Dokumente in der Ergebnisliste dieses Feld besitzen, bzw. der selben Form zugeordnet sind.

Erweiterungsvorschläge nehme ich gern entgegen, auch wenn es bei XSnippets leider noch keine Funktion zu geben scheint seine eigenen Snippets zu bearbeiten.

Anbei auch der Link zu einem anderen Snippet, dessen Inhalt ich bereits in diesem Beitrag gepostet hab.

Advertisements

XPages: Useability – Parameter mit Aliaswerten in Custom Controls

Heute mal ein kleiner Tipp, welcher die Useability von Paremetern in selbst gebauten Custom Controls erhöhen kann.

Man kann für Custom Controls ja Parameter definieren, dies tut man in den Eigenschaften des Elements xp:view (root-Element des Controls) unter Property Definition.
Dort hat man die Möglichkeit für einen Parameter den Editor (die Art wie man bei der Einbindung den Parameter angibt) auf ComboBox zu setzen und dort mehrere Einträge mitzugeben, welche man dann bei der Einbindung in eine XPage oder ein anderes Custom Control auswählen könnte.

Natürlich möchte man es sich und anderen möglicht bequem machen und dort sprechende Vorgabewerte eintragen, damit man weiß was diese jeweils bedeuten. Dies ist auf der anderen Seite natürlich schlecht im Programmcode handlebar. Daher kann man einfach Aliaswerte benutzen.

Hier ein Beispiel:

Parameter 1 wird im Menü über eine ComboBox ausgewählt. Folgende Vorgabewerte werden angeboten:

0|Wert 1
1|Wert 2

Hier muss man mit dem Alias leider anders herum arbeiten als man es von Notes her gewohnt ist. Der Wert vor der Pipe (“|”) ist der Wert der tatsächlich übergeben wird, den man dann auch mittels compositeData azurückgegeben bekommt. Der zweite Wert dahinter wird dem User im Menü angezeigt.
Achtung: Dies ist lediglich eine optische Geschichte, d.h. der Aliaswert wird nur im Menü verwendet. D.h., wenn man den Parameter mit Aliaswerten berechnen möchte, so muss man wieder den richtigen Wert, welcher vor der Pipe angegeben wurde benutzen und zurückliefern.

Lediglich eine kleine optische Spielerei, erhöht aber den Komfort beim Benutzen von eigenen Custom Controls.

Notes: Attachments in Subforms

Mal wieder trieb mich Notes in den Wahnsinn, diesmal mit Attachments in RichText-Feldern.

Das Problem war, ich hatte einige Forms, welche im Grunde exakt gleich ausgesehen haben, daher mussten Subforms her.
Ich hatte in jeder Form eine Subform, welche das Layout abbildete und dann noch jeweils eine Subform für den Datenteil der jeweiligen Form und noch eine für die Attachments. Da die Attachments nicht in jeder Form auftauchen sollten, war die entsprechend computed.

Da war dann das Phänomen dass ständig unterhalb der Form noch die Attachments sichtbar waren, also nochmal separat aufgelistet wurden. Sehr nervig.
Normalerweise tritt dieses Phänoment nur auf, wenn das Dokument Attachments enthält, aber das Feld wo es drin liegt, ausgeblendet ist. Das war aber gar nicht der Fall.

Nach einigem hin und her probieren stand dann die Ursache fest. Das Problem war einfach, dass die Subform computed war. Scheinbar wird Notes intern erst dieser Mechanismus durchlaufen, also prüfen ob das RichText Feld da ist, wenn ja dann zeige es dort an, wenn nicht, dann zeig es unterhalb der Form an. Erst danach werden dann die Subforms berechnet. Von daher ist es vollkommen egal ob das Feld angezeigt wird oder nicht, Notes geht erstmal davon aus dass das Feld potentiell nicht angezeigt werden könnte und packt sie zur Sicherheit nochmal unter die Form. Wenn man die Subform so wie sie ist direkt einbaut funktioniert alles wie es soll. Statt der computed subform habe ich dann entsprechend Hide-When Formeln benutzt, dort tritt das Problem seltsamerweise nicht auf, die werden scheinbar vor dem Attachment Mechanismus berechnet.

Notes: Ein- und Ausblenden von View-Actions

Heute mal ein kleiner Tipp für Standard-Notesclient Anwendungen.

Ich hatte die Anforderung bekommen dass in einer kategorisierten View die Actions ein- und ausgeblendet werden sollen, je nachdem ob ich eine Kategorie oder ein Dokument ausgewählt habe. Langes Suchen brachte nichts und auch ein Kollege war der Meinung es geht nicht. Ein anderer Kollege brachte dann aber doch die Lösung:

In den View-Einstellungen gibt es eine Option namens “Evaluate actions for every document change”. Das funktioniert deshalb weil auch ein Wechsel der Selektion als Change aufgefasst wird.
Schlussendlich muss man in der Hide-When Formel nur noch auf die Form abfragen. Wenn sie leer ist verstecke den Button, wenn nicht dann zeige ihn an, denn Kategorien haben keine Form.

Darüber hinaus kann man so natürlich noch sehr flexibel entsprechende Actions anzeigen, beispielsweise wenn man in der View mehrere Forms hat.

XPages: Timezones and daylight saving time

Just one more:

Via serverside Javascript you can display the timezone quite easy. You can do this with this command:

context.getTimeZone().getDisplayName();

If you live in Germany, like me, or have to develop an application for german users, you will know the true promise of daylight saving time.

I have used the function and everything worked out fine, until the time switch came and my timezones weren’t displayed properly (CEST instead of CET)

The solution is easy. There is a parameter, which controls whether we have daylight saving time, or not. It is the first one of the function (which I must have overlooked in the beginning). True means we have daylight saving time, false means we haven’t.

But how can we check whether we have DST or not? There is a function with the name isDST() within the NotesDateTime object. It returns a boolean value, which you can use with the function.

XPages: Set headers

08/11/2011 2 comments

Because today is Tuesday, there’s another advice:

You have the possiblity to set meta-headers in XPages. To do so, you have two possiblities.
1. In the properties of the XPage, you can add a ressource with the type metaData (see it on this picture)
2. Add a few lines of code to your BeforeRenderResponse event, like this:

try {
   var response = facesContext.getExternalContext().getResponse();
   response.setHeader("Expires", -1);
   response.setHeader("Cache-Control", "no-cache");
   response.setHeader("IE=EmulateIE7", "X-UA-Compatible");
} catch (e) {}

Propably, you would think it wouldnÄt matter where to do this, but remember, we are dealing with XPages…

Some headers can’t be set with the first method. I don’t know exactly at which point they are rendered, but sometimes, they are alrady there.

That means, when you want to add the header IE=EmulateIE7, which was described as a workaround in a former post by me, you should do this via the scond method in the BeforeRenderResponse. Else, you receive a browser warning, that this header will be ignored, because the doctype was already set. If you add it in the event, everything works fine and the header is rendered.

The funny thing is, there header is rendered with the first method, anyway, but he gets ignored because he seems to be set too late.

XPages: FileUpload Control – replace filename

08/11/2011 1 comment

Today only a little advice.

I had the problem that some uploads failed in an application from time to time. I have used the standard FileUploadControl.

Unfortunately, the error wasn’t really reproducable, therefore I had to do some experiments.

A possible reason for this error were umlauts (we have them in germany, Ä, Ö, Ü) in the filename.

You can change the filename with a standard function of the control, it’s called “Replace file name of uploaded file with the following name”. You can find it in the main properties of the control.
You can also compute that, that works with the following code:

var path:com.ibm.xsp.http.UploadedFile = getComponent("fd_file").value;
var newPath:string = path.getClientFileName();

newPath = newPath.replace("Ä", "ae");
newPath = newPath.replace("Ö", "oe");
newPath = newPath.replace("Ü", "ue");
newPath = newPath.replace("ä", "ae");
newPath = newPath.replace("ö", "oe");
newPath = newPath.replace("ü", "ue");

return newPath;

There nothing special about that, except the class com.ibm.xsp.http.UploadedFile. This class is, in good old IBM manner, not documented. This class gives you some nice possibilities to access the uploaded file, before it is saved in a document.

Here is another interesting article about this topic: XPagesWiki

%d bloggers like this: