Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: theBastian am 17.08.05 - 14:31:22
-
Hallo,
ich habe mal wieder ein Problem, was eigentlich banal klingt aber mich schon wieder zum Verzweifeln bringt. :(
Ich habe ein Feld als Checkbox, das folgende Werte enthält: (Mehrfachauswahl möglich)
Birne |1
Apfel |2
Kirsche |3
Dieses Feld soll jetzt in einer View angezeigt werden. Logischerweise wird natürlich nur 1,2 oder 3 (oder eine Kombination davon) angezeigt.
Ich suche also eine Formel, die wieder die oben genannten Werte anzeigt.
Weiterhin habe ich damit ein grundsätzliches Problem.
Wenn ich das Ganze so mache, dann muss ich die Werte (Birne, Apfel usw.) an 2 Stellen pflegen (Feld und View).
Wie macht ihr denn sowas? Gibt es da eine bessere Lösung?
Dank Euch im voraus.
cu
der B@sti
-
Ich mache dies immer über ein berechnetes Feld für die Ansichten.
Dieses Feld wird im QuerySave gefüllt, da zu diesem Zeitpunkt über das NotesUIDokument noch an die Werte vor dem "|" zugegriffen werden kann, via uidoc.fieldgettext.
gruss
umi
-
Prinzipiell gibt es 2 Möglichkeiten:
1. Speichern des Anzeigenamens in dem Dokument
2. Berechnen in der Ansicht
1. macht Sinn, wenn sich die Begriffe nicht (oder nur selten) ändern.
Nachteil: bei Änderung müssen alle betroffenen Dokumente aktualisiert werden
Vorteil: Performance; wenig Programmieraufwand
2. macht Sinn, wenn sich die Begriffe ändern können
Nachteil: ggf. erheblicher Programmieraufwand, wenn das in vielen Ansichten ist
Vorteil: keine Änderung bestehender Dokumente
1 realisiere ich im QuerySave so
doc.FeldXYZ = Source.FieldGetText( "Feldname" )
2. realisiere ich in der View so
@Replace(Feldname, "1":"2";"Äpfel":"Birnen")
Andreas
-
Danke für die schnelle Antwort. Da die ähnlich sind, nehme ich mal zu Glombis Antwort Stellung.
1. Möglichkeit: Anzahl der Felder mit Checkboxen wird ja damit verdoppelt;
2. Möglichkeit: Arbeitsaufwand bei Änderung ist wirklich nicht zu vernachlässigen ;)
Die Dokumente sollen nach der Erstellung nicht mehr verändert werden. (Revisionssicherheit.)
Änderungen sollen dann nur für neue Dokumente gelten. Daher werde ich wohl Variante 1 wählen und halt noch ein paar Felder bauen. :(
Vielen Dank für Eure Hilfe. Wieder etwas schlauer geworden.
cu
der B@sti
-
Ich persönlich bevorzuge Lösung 2.
Auch wenn man ein paar View beackern muss, ist es wesentlich dynamischer.
Was ich übersehen habe: Es können Mehrfachwerte sein. D.h. du musst in der Eingabeumsetzung des neuen Feldes noch ein Explode machen, damit Du wieder Mehrfachwerte hast.
@Explode(Feldname;";")
Warum verwendest Du überhaupt einen Alias?
Andreas
-
Warum verwendest Du überhaupt einen Alias?
diese Frage habe ich mir auh gerade gestellt, was ist mit möglichkeit 3:
Feldinhalt:
Birna
Apfel
Kirsche
--> fertig?
-
Warum verwendest Du überhaupt einen Alias?
Jo, das frage ich mich auch. Dir geht es ja um Revisionssicherheit. Dokumentintern wäre die zwar weiter gegeben, aber wenn ein Alias geändert wird, werden im Frontend ja auf einmal auch für ältere Dokumente ganz andere Inhalte angezeigt. Aliase sind da in diesem Zusammenhang sogar kontraproduktiv.
Bernhard
-
Warum verwendest Du überhaupt einen Alias?
Naja, die Feldinhalte sehen in Wirklichkeit eher so aus:
bis 25.000 €|1
25.000 € bis 50.000 €|2
50.000 € bis 150.000 €|3
über 150.000 €|4
Und die muss ich dann später noch auswerten.
@If Feld = "1" ; ...
Da sind mir Zahlen einfach lieber.
cu
der B@sti
-
Jo, das frage ich mich auch. Dir geht es ja um Revisionssicherheit. Dokumentintern wäre die zwar weiter gegeben, aber wenn ein Alias geändert wird, werden im Frontend ja auf einmal auch für ältere Dokumente ganz andere Inhalte angezeigt. Aliase sind da in diesem Zusammenhang sogar kontraproduktiv.
Bei Verwendung von Variante 1 bleiben die Werte ja erhalten. Änderungen an der Auswahl gilt ja dann nur für neue Dokumente.
cu
der B@sti
-
Warum verwendest Du überhaupt einen Alias?
Naja, die Feldinhalte sehen in Wirklichkeit eher so aus:
bis 25.000 €|1
25.000 € bis 50.000 €|2
50.000 € bis 150.000 €|3
über 150.000 €|4
Und die muss ich dann später noch auswerten.
@If Feld = "1" ; ...
Da sind mir Zahlen einfach lieber.
cu
der B@sti
Ich verwende in solchen Fällen folgendes:
bis 25.000 €|bis 25.000 €#1
d.h. mein Alias hat sowohl den Anzeigenamen als auch einen Identifier, Dann kannnst Du mit
@Right(Feld;"#")
den "Alias" (Identifier) und mit
@Left(Feld;"#")
den Anzeigenamen berechnen.
Damit habe ich sowas immer gut im Griff.
Andreas
-
Die Idee ist natürlich noch besser. Und das klappt auch bei Mehrfachwerten?
-
Die Idee ist natürlich noch besser. Und das klappt auch bei Mehrfachwerten?
Das klappt auch bei Mehrfachwerten ohne Probleme. Du musst nur folgende Syntax einhalten:
<Anzeigename>|<Anzeigename>#<Identifier>
Eine Erweiterung wäre noch
<Anzeigename>|<Anzeigename>#<Identifier>~[<Flag1>~...~<FlagN>]
Alias = @Left(@Right(Feldname;"#");"~")
dann kannst Du quasi wie in einem QueryString noch diverse Flags mitgeben, bpsw. für Sortierung, Gruppierungen von Schlüsselworten etc.
Andreas
-
Hast natürlich recht. ;)
Solche kleinen Sachen fehlen mir als "Hobbyprogrammierer" eben immer.
cu
der B@sti
-
Hallo zusammen,
ich weiß, ein ewig alter Thread. Aber es ist ein immer wieder gesuchtes Thema.
Wie wäre es mit folgender Lösung (funzt unter Version 9.1):
Voraussetzung ist, dass der Klarname und dazugehörige Alias in einem Dokument steht, welches z. B. für die Feldauswahl verwendet wird. Quasi ein Konfigurationsdokument.
PostOpen der View:
_Field := "Reisemittel";
_Auswahl := @If(
@IsError( @DbLookup("":"NoCache";"";"(ViewConfiguration)"; _Field; "FeldName_mit_Werten") );
"kein Konfigurationsdokument >Auswahlfeld " + _Field + "< vorhanden!";
@DbLookup("":"NoCache";"";"(ViewConfiguration)"; _Field; "FeldName_mit_Werten")
);
@Environment("PL_Reisemittel"; @Implode(_Auswahl;"~"))
In der Spalte der View:
_Liste := @Explode( @Environment("PL_Reisemittel");"~");
_Liste_K := @Trim( @Left( _Liste; "|") );
_Liste_A := @Trim( @RightBack(_Liste; "|") );
_Column := @Replace( Reisemittel; _Liste_A; _Liste_K);
_Column
Dann im QueryClose der View den Eintrag wieder entfernen:
Dim session As New NotesSession
Call session.SetEnvironmentVar( "$PL_Reisemittel", "")
Nachtrag (edit): Problem dabei ist, dass man nicht um SHIFT+F9 herumkommt. O0