Autor Thema: Über Textliste weitere, berechnete Textliste mit Summenfunktion?!?  (Gelesen 2772 mal)

Offline Silver

  • Senior Mitglied
  • ****
  • Beiträge: 294
  • Geschlecht: Männlich
  • "free your mind"
Hallo,

ich möchte über eine vorhandene Textliste eine weitere Liste berechnen, die u. a. eine Summe bei jew. gleichem String-Anfang enthalten soll. Am besten erklärt/erläutert über Bsp.:

Vorhandenes Feld mit Textliste:
1234~550,00
9876~300,00
1234~200,00
6543~150,00
6543~50,00

Nun soll also anhand des jew. Element-Anfangs eine Summe gebildet und wieder in einer neuen Textliste ausgegeben werden (pro Element-Anfag bis "~" ein Element, evtl. über @Unique gekürzt?!?). Gewünschtes Ergebnis:
1234~750,00
9876~300,00
6543~200,00

Ich habe zwar schon einiges ausprobiert (@For?!?) - schaffe es aber leider nicht.
Kann mir jemand weiterhelfen?!? Wäre super.
« Letzte Änderung: 05.11.12 - 12:33:39 von Silver »

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.885
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
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:
Code
_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...
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline Silver

  • Senior Mitglied
  • ****
  • Beiträge: 294
  • Geschlecht: Männlich
  • "free your mind"
Hallo Tode,

vielen, herzlichen Dank für Deine Antwort bzw. Hilfe.
Aber bei mir bringt die Variable _allVals in unserem Bsp.:
0,00
0,00
0,00

D. h. in der neuen Liste sieht`s dann wie folgt aus:
1234~0
9876~0
6543~0

Habe ich da noch etwas übersehen?

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Ich hätt noch eine interessante Lösung mit @Transform:
Code
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
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.885
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Sehr elegant @Roland... Dein Code funktioniert wunderbar, obwohl ich mich erst mal durch den Variablennamen habe in die Irre führen lassen... tatsächlich steht in "candidates" die Liste der Werte, die gerade NICHT verarbeitet werden (weil der "Candidate" ja per Replacesubstring rausgeflogen ist...).

Als @For- Schleife könnte man Deine Idee ja 1:1 ebenfalls umsetzen, und sie ist definitv eleganter als meine.

@Silver: Ne, so geht's nicht... Ich liefere Dir (entgegen der normalen Vorgehensweise hier im Board und entgegen meiner normalen Überzeugung) fertigen Code, und Du willst, dass ich Ihn auch noch für Dich debugge? Sorry... Der Code ist wirklich nicht schwer zu durchschauen, und auch wenn die Formelsprache nicht so ganz einfach zu debuggen ist, müsstest Du doch in der Lage sein, aus diesem Beispiel was lauffähiges zu basteln. Normalerweise verdiene ich mit solchen Dingen nämlich meine Brötchen...

Gruss
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline Silver

  • Senior Mitglied
  • ****
  • Beiträge: 294
  • Geschlecht: Männlich
  • "free your mind"
Hi!

Super - vielen Dank an Euch.
Habe beide Vorschläge getestet und (noch) zum Laufen gebracht.
Dankeschön.

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
@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
Code
~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
Code
decimalSep := @ReplaceSubstring(@Text(1,1);"1";"");
tmp := "~" + @ReplaceSubstring(TextListe;".":",";decimalSep);

Gruß
Roland
« Letzte Änderung: 05.11.12 - 13:35:18 von pram »
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz