Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: m3 am 12.07.05 - 16:13:45
-
Hi!
Ich gebs zu, bei Listen bekomm ich immer einen Knoten im Kopf. ;)
Folgende Ausgangssituation:
Ich hab ein Multivaluefield (mfeld) mit folgenden 2 Eintraegen:
01|TextA1|TextA2|TextA3|TextA4
02|TextB1|TextB2|TextB3
Ich will nun mit Formelsprache diese beiden Zeilen so umformen, dass sowas dabei herauskommt:
01|01|01|01
02|02|02
Also der Text vor dem ersten "|" soll verschwinden, der Rest durch diesen ersetzt werden.
Mit
linkerteil := @Left(mfeld; "|"); { "01" : "02" }
rechterteil := @Right(mfeld; "|"); { "TextA1" : "TextA2" : "TextA3" : "TextA4" : "TextB1" : " TextB2" : "TextB3" }
haette ich ja schon mal zwei Listen mit den benoetigten Werten.
Aber was nun? Könnte mir wer einen Schlag auf den Hinterkopf geben, damit ich dieses Problem lösen kann.
Ich lobe für den Helfer auch ein Bierchen aus, wenn er mal in Wien ist. ;)
-
Mit @Left (Feldname; "|") bekommst Du den verbleibenden Teil heraus.
Mit @Explode bekommst Du eine temp. Liste der Elemente.
Mit @Elements bekommst Du die Anzahl der Einträge (pro temp. Liste), die Du noch dekrementieren musst.
Mit @Repeat kannst Du dann den verbleibenden Teil vervielfältigen. Das letzte Pipe-Symbol muss anschliessend noch weg.
Notes wendet das automatisch auf jedes Listenelement einzeln an.
Reicht Dir diese Prinzipbeschreibung für das ausgelobte Bier, Martin ? ;D
HTH,
Bernhard
-
Im Prinzip ja, aber ... ;)
Ich bekomme mit @explode() immer 7 zurueck, da die temp. Liste der Elemente anscheinend beide Zeilen zusammenzieht, was fuer meinen Anwendungsfall nicht passt.
Ich braucht was, wo ich 4 bzw. 3 pro Listenwert zurueckbekomme, dann wuerde es passen. :(
-
Es geht mit etwas Left,Right, Implode, Explode ;D
_Liste1 := @Subset(mfeld;1);
_Elem1 := @Left(_Liste1;"|");
_Liste2 := @Subset(mfeld;-1);
_Elem2 := @Left(_Liste2;"|");
_L1 := @Implode(@Right(@Explode(@Right(_Liste1;"|");"|") + ("#" + _Elem1);"#");"|");
_L2 := @Implode(@Right(@Explode(@Right(_Liste2;"|");"|") + ("#" + _Elem2);"#");"|");
_L1 : _L2
Andreas
der hofft bald in Wien zu sein ;)
-
und wenn es mehr als zwei Elemente sein sollten:
_NewList := @Transform(
OldList;
"x";
@Do(
_val1:= @Word( x; "|"; 1);
_members:= @Elements(@Explode( x ; "|")) - 1;
_newElem := _val1;
@For(
n := 1 ;
n < _members;
n := n + 1;
( _newElem := _newElem + "|" +_val1)
);
_newElem
)
);
Sieht ein bißchen erschreckend aus,
aber sie tuts.
-
Oder so:
(geht sogar relativ übersichtlich in eine Zeile):
@Transform(mfeld;
"x";
@LeftBack(@Repeat(@Left(x; "|") + "|";
@Elements(@Explode(@Right(x; "|"); "|"))); "|")
)
(wahlweise natürlich auch mit @Trim um Leerzeilen zu entfernen)
Andreas
EDIT: sehe gerade das ich ohne es zu wollen Bernhards Prinzipbeschreibung von oben umgesetzt habe, also Ehre, wem Ehre gebührt :EDIT
-
Danke, danke, danke, danke!
Die postenden Herren haben ein Bierchen|Getränk der Wahl bei mir offen.
Listenverarbeitung ist meine Achillesferse, was Notesentwicklung betrifft. :-\
Vielen herzlichen Dank!