Autor Thema: @Max aus R6 für R5 nachprogrammieren...  (Gelesen 1693 mal)

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
@Max aus R6 für R5 nachprogrammieren...
« am: 18.02.05 - 09:37:38 »
Leider hatte bis R6 der @Max Befehl nicht wirklich sinn: Er verglich zwei Listen und gab von Korrespondierenden Elementen der Listen jeweils das grössere zurück... TOLL.

Wer mich kennt, der weiss, dass ich der Meinung bin, dass man fast alles mit ein wenig Geschick auch in Formel- Sprache ausgedrückt bekommt...

DIESEN AUSFÜHRLICHEN TEIL NUR LESEN, WENN IHR AM HINTERGRUND INTERESSIERT SEID

Folgende Aufgabenstellung:
Ich habe 2 Felder mit jeweils mehrfachwerten:
Test1
Liste1Liste2
100,00
Test210,00
Test31000,00

Nun soll für ein Auswahllistenfeld folgendes realisiert werden:

Test1  100,00
Test2   10,00
Test3 1000,00


Das ist ja an sich kein Problem: Liste2 in Text konvertieren, Rechtsbündig mit ausreichend Leerstellen ausrichten und zu Liste1 dazuaddieren.
Jetzt kommt allerdings der Wunsch des Anwenders:
Die Zahlen können sich zwischen 1,00 und 1.000.000,00 oder mehr bewegen. Also müsste ich, um garantiert ein sauberes Bild zu bekommen, die Zahlen mindestens auf 12 Stellen mit blanks erweitern, was dem Anwender aber -wenn nur kleine Zahlen vorkommen- nicht schön genug aussieht (O-Ton: "Da stehen die Zahlen SOOO weit weg von Text")... Ja, ich weiss: Das ist Quatsch, aber der Kunde ist König.

AB HIER BEGINNT DIE EIGENTLICHE FRAGE

Ich muss eine Liste rechtsbündig mit spaces ausrichten. die Anzahl Spaces wird dabei von der Länge des längsten Elements bestimmt:

(ich benutze mal _ anstelle von Leerstellen zur Visualisierung)


liste:
100,00
10,00
1.000,00
Ergebnis
___100,00
____10,00
_1.000,00
liste:
10,00
100,00
Ergebnis
__10,00
_100,00

Wie erhalte ich die Länge L des längsten Elements (in R6 @Max( @Length( list1 ) ) deshalb die Überschrift), um diese in dieser Formel einzusetzen:
(Wie gesagt: R6- Befehle wie @Max, @For, o.ä. sind nicht erlaubt)

spaces := @Repeat( " " ; L );
list2 := @Right( spaces + list1 ; L );



Ich habe mir schon den Kopf zerbrochen, aber ich fürchte, dass es nicht geht...
Allerdings wurde ich schon mal mit einer genialen Idee überrascht,
wie man in einer Liste herausfindet, wie oft jedes einzelne Element darin vorhanden ist... Vielleicht gibt es ja für dieses Problem einen ähnlichen Genie-Streich...

Thanx
Tode
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)

Glombi

  • Gast
Re: @Max aus R6 für R5 nachprogrammieren...
« Antwort #1 am: 18.02.05 - 10:00:33 »
Herausforderungen in Formelsprache - ich liebe es  ;)

Hier meine Lösung. Wenn es mehr als 12 Zeichen sind (inkl. Dezimal- und Tausendertrennzeichen) sind, musst Du die @If Bedingung entsprechend erweitern:

_L1 := @ReplaceSubstring(ZahlenListeStr;"0":"1":"2":"3":"4":"5":"6":"7":"8":"9":".":",";"X":"X":"X":"X":"X":"X":"X":"X":"X":"X":"X":"X");
_L2 := @Text(@Length(_L1));

_L :=
@If(
   @IsMember("12";_L2);12;
   @IsMember("11";_L2);11;
   @IsMember("10";_L2);10;
   @IsMember("9";_L2);9;
   @IsMember("8";_L2);8;
   @IsMember("7";_L2);7;
   @IsMember("6";_L2);6;
   @IsMember("5";_L2);5;
   @IsMember("4";_L2);4;
   @IsMember("3";_L2);3;
   @IsMember("2";_L2);2;
   @IsMember("1";_L2);1;
   0
);

_L




Erklärung:
ZahlenListeStr ist ein String, der die Werte enthält, bpsw. "10,00":"100,00":"1.000,00".
In _L steht dann als Zahl der größten Länge.


Andreas

Glombi

  • Gast
Re: @Max aus R6 für R5 nachprogrammieren...
« Antwort #2 am: 18.02.05 - 10:04:38 »
Sorry, ich habe etwas zu kompliziert gedacht und einen anderen Versuch (Mit X) gemischt.
Ich wollte eine Lösung finden, die mir ohne hardcodierte Obergrenze den max. Werte für die "X" Zeichen ermittelt. Das habe ich aber nicht herausbekommen und jetzt leider keine Zeit mehr...

_L1 := ZahlenListeStr;
_L2 := @Text(@Length(_L1));

_L :=
@If(
   @IsMember("12";_L2);12;
   @IsMember("11";_L2);11;
   @IsMember("10";_L2);10;
   @IsMember("9";_L2);9;
   @IsMember("8";_L2);8;
   @IsMember("7";_L2);7;
   @IsMember("6";_L2);6;
   @IsMember("5";_L2);5;
   @IsMember("4";_L2);4;
   @IsMember("3";_L2);3;
   @IsMember("2";_L2);2;
   @IsMember("1";_L2);1;
   0
);

_L
« Letzte Änderung: 18.02.05 - 10:07:08 von Glombi »

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: @Max aus R6 für R5 nachprogrammieren...
« Antwort #3 am: 18.02.05 - 10:19:21 »
ok... Das ist natürlich die einfachste wenn auch "uneleganteste" Lösung. Hier muss ich vorher wissen, was mein "Maxiumum" ist. In diesem Fall könnte man das allerdings tatsächlich verwenden, weil es bei den Zahlen um "Projektumsätze (EUR)" geht, und die werden wohl mit 15 Stellen mehr als ausreichend erschlagen.

Interessant wird die Geschichte aber erst, wenn sich die max- Zahl nicht so leicht vorhersagen lässt. (zum Beispiel: kurze Sätze, die ausgerichtet werden sollen...)

dann müsste man irgendwo 100 Werte in die If-Schleife aufnehmen (ich glaube da ist nach 255 Schluss, bin mir aber nicht sicher).

Und darauf zielte eigentlich meine Frage: Das ganze DYNAMISCH zu machen...
Trotzdem Danke für Deinen Ansatz, der hilft natürlich in dem konkreten Fall weiter, auch wenn er nicht meine eigentliche Neugier befriedigt...  ;D

Aber gerade sehe ich, Du hast genau das selbe geschrieben, während ich getippt habe... und den Ansatz mit den X um um das hardcodierte herumzukommen, den habe ich auch schon versucht zu verfolgen... mit dem selben Ergebnis, zu dem Du gekommen bist.

Schön, dass wir Notes- Programmierer alle so "ähnlich" denken... erst mal was "universelles" schaffen, und dann erst das eigentliche Problem mit der genau auf dieses zugeschnittenen ( aber unflexiblen) Lösung angehen.
Denn eigentlich suche ich ja einen "@Max"- Ersatz... Das angeführte Beispiel war nur, um die "Warum"- Fragen zu vermeiden...

Also nochmal: Thanx...
Tode

Gruß
Tode
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)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz