Manchmal möchte man einem Benutzer aus einer langen Liste von Möglichkeiten
auswählen lassen. Typischerweise sind die Optionen dann in verschiedenen
Notes-Dokumenten gespeichert und können vielleicht nach unterschiedlichen
Gesichtspunkten sortiert werden, zum Beispiel eine Liste von Produkten,
die zum einen innerhalb einer Produkthierarchie stehen, zum anderen nach
Kategorie, Name oder Produktnummer sortierbar sind.
Typische Lösungen für diese Aufgabe
sind:
- Man implementiert eine Aktion, die @Picklist aufruft und das Ergebnis der Auswahl in ein Feld speichert.
- Man realisiert die Auswahl in einer eignenen Dialogbox und erstellt dafür eine (Teil-)Maske.
- Man erstellt mehrere Auswahlfelder für die verschiedenen Hierarchiestufen, wobei die "unteren" von den "oberen" abhängen und sich die Optionen jeweils abhängig von den schon getroffenen Auswahlen abhängen.
- Oder man erstellt einfach eine
laaaaaange Dialogliste/Liste.
Ich möchte einen weiteren Weg aufzeigen, der über eine eingebettete Ansicht und einen eingebetteten Editor funktioniert. Ich sehe dabei folgende Vorteile:
- Der Benutzer bleibt im gleichen Kontext (anders als bei @Picklist oder der Dialogbox).
- Die Ansicht kann dynamisch nach verschiedenen Gesichtpunkten sortiert werden (anders als bei Dialoglisten-Kaskade oder einer einzelnen Dialogliste).
- Man kann die Ansicht optisch strukturieren (abwechselnde Zeilenhintergrund).
Erst einmal das praktische Beispiel, so
wie es im Notes-Client angezeigt wird:
Der Benutzer kann das Ergebnis der Akquise
auswählen, dann das Produkt und schließlich über "Ergebnis hinzufügen"
daraus ein neues Unterdokument zur Akquise erzeugen.
Um das Produkt auszuwählen, kann er
sich die eingebettete Ansicht nach verschiedenen Kriterien sortieren und
über die Schnellsuche einfach das betroffene Produkt finden.
Im Design gibt es zwei für diese Funktionalität
wesentliche Elemente: Die eingebettete Produkt-Ansicht und der eingebettete
Editor (hervorgehoben durch rote Umrandung):
Die eingebettete Ansicht enthält neben
den sichtbaren noch eine unsichtbare Spalte mit der Produkt-ID:
Und das Ziel für Einfach- und Doppelklick
ist der eingebettete Editor:
Dort ist natürlich wichtig, dass der
Name gesetzt ist. Außerdem ist der Editor versteckt!
Soweit eigentlich eine ganz normale
Kombination aus eingebetteter Ansicht und Editor - naja, bis auf dass der
Editor versteckt ist. Jetzt fehlt nur noch der "Trick", die Verbindung
zurück in die aufrufende Maske (den "Container"). Diese ist implementiert
im PostOpen-Ereignis der Produkt-Maske:
Sub
Postopen(Source
As Notesuidocument)
Dim containerDoc As NotesDocument
Dim thisDoc As NotesDocument
Set containerDoc = uiws.CurrentDocument.Document
Set thisDoc = source.Document
' is doc displayed in an embedded editor?
If containerDoc.UniversalID <>
thisDoc.UniversalID
Then
containerDoc.ProduktIDEingabe = thisDoc.ProduktID
containerDoc.ProduktNameEingabe = thisDoc.ProduktName
containerDoc.ProduktHierarchischerNameEingabe = _
thisDoc.ProduktHierarchischerName
End If
End
Sub
HTML using the ls2html routine,
provided
by Julian Robichaux at nsftools.com.
In der If-Anweisung wird geprüft, ob
die Maske in einem eingebetteten Editor angezeigt wird. Ist dies der Fall,
so enthält containerDoc das offene Dokument und thisDoc das ausgewählte
Produkt-Dokument. Es werden also einige Angaben aus dem Produkt-Dokument
in die Akquise kopiert!
Das war's schon!
Auf die Idee zu diesem Verfahren bin
ich durch den folgenden Blog-Eintrag auf Chris Blatnicks Blog gekommen:
Lotusphere
Demo: Enhancing A Template UI