1. Ich hoffe, das bleibt in Deutschland, sonst kriegst Du mit Deinen Zahlen im Textfeld Probleme (, und . vertauscht)...
2. Ich dachte, das wäre recht simpel und habe das kurz ausprobiert... ist doch nicht ganz so simpel, normalerweise liefer ich auch keine fertigen Lösungen, aber das Problem war interessant:
_allNams := @Unique( @Word( TextListe ; "~" ; 1 ) );
_elements := @Elements( _allNams );
REM "Hier wird eine Liste mit der selben Anzahl Elemente wie _allNams aufgebaut, gefüllt mit nullen";
_allVals := @TextToNumber( @Trim( @Explode( @Repeat( "0~" ; _elements ); "~" ) ) );
_allValsX := _allVals;
@For( i := 1 ; i <= @Elements( TextListe ) ; i := i + 1;
_nam := @Word( TextListe[i] ; "~" ; 1 );
_val := @TextToNumber( @Word( TextListe[i] ; "~" ; 2 ) );
_pos := @Member( _nam ; _allNams );
_vals1 := @If( _pos = 1 ; "" ; @Subset( _allVals ; _pos - 1 ) );
_vals2 := @Subset( @Subset( _allVals ; _pos ) ; -1 ) + _val;
_vals3 := @If( _pos = _elements ; "" ; @Subset( _allVals ; _pos - _elements ) );
_allVals := @If( _pos = 1 ; _vals2 : _vals3; _pos = _elements ; _vals1 : _vals2 ; _vals1 : _vals2 : _vals3 )
);
@For( k := 1 ; k <= _elements ; k := k + 1;
_newVal := _allNams[k] + "~" + @Text( _allVals[k] );
_newVals := @Trim( _newVals : _newVal )
);
_newVals;
Der Code macht keinerlei Prüfungen, ob da gültige Zahlen drin sind und fällt auf die Schnauze, wenn das nicht der Fall ist... aber als Ansatz sollte es reichen...
Ich hätt noch eine interessante Lösung mit @Transform:
TextListe := "1234~550,00":"9876~300,00":"1234~200,00":"6543~150,00":"6543~50,00";
_allNames := @Unique( @Word( TextListe ; "~" ; 1 ) );
tmp := "~" + TextListe;
@transform(_allNames; "x"; @do(
candidates := @ReplaceSubstring(tmp; "~" + x + "~"; "candidate");
needed := @trim(@Replace(tmp;candidates;""));
summands := @RightBack(needed;"~");
x + "~" +@text(@sum(@textToNumber(summands)))
))
Der Trick ist, dass man in der Textliste die Werte die man braucht durch "~candidate~..." ersetzt (oder ein String der halt nicht vorkommt).
In der Liste stehen dann die Werte die man nicht braucht unverändert drin, welche man dann mit einem erneuten Replace entfernen kann.
Wichtig ist noch die Zeile
tmp := "~" + TextListe;
sonst sind die Ersetzungen u.U nicht eindeutig.
Gruß
Roland
@Tode, ja der Variablenname verwirrt ggf.
In Candidates stehen jedenfalls alle Werte, wobei die Werte die ich wirklich brauche, abweichen. d.h für 1234 steht da
~candidate~550,00
~9876~300,00
~candidate~200,00
~6543~150,00
~6543~50,00
dadurch werden sie beim anschließenden @Replace(tmp;candidates;"") nicht mehr gefunden und auch nicht durch "" ersetzt.
Somit bleiben alle als "~candidate~" markierten Werte übrig.
Für Manipulationen als Liste ist mir @Transform immer lieber, da der Code i.d.R. kürzer wird als mit @For, wobei man jedes @Transform in ein @For überführen kann (den @Transform-Befehl muss man auch erst mal verstehen)
Man muss aber wirklich nochmal in aller Deutlichkeit darauf hinweisen, dass der Code nur auf deutschen Clients funktioniert, da sonst das "," nicht als Dezimaltrennzeichen interpretiert wird. Besser wäre wohl die Felder in getrennten Listen mit entsprechenden Datentyp zu führen.
Ggf. könnte man so noch zusätzliche (un)sicherheit einbauen
decimalSep := @ReplaceSubstring(@Text(1,1);"1";"");
tmp := "~" + @ReplaceSubstring(TextListe;".":",";decimalSep);
Gruß
Roland