Autor Thema: Position in Liste bestimmen  (Gelesen 6104 mal)

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Position in Liste bestimmen
« am: 18.11.08 - 16:15:12 »
So hoffe ich kann nun auch mal nen produktiven Beitrag bringen.

Problemstellung : Ich möchte nach einem Wert in einer Liste suchen und wenn dieser enthalten ist, möchte ich Position haben. Da ich keinen passenendes Posting gefunden habe und auch keine @Function die so etwas kann habe ich mir selber was gebaut und hoffe damit anderen weiter helfen zu können


Code
_position := 0 ; 
@For(_n := 1 ; _n < @Elements(_list) &  _position = 0 ; _n := _n + 1 ; _position := @If(@Subset(@Subset(_list; _n); - 1) = _key ; _n ; 0));

Ich bitte um anregende Kritik
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Position in Liste bestimmen
« Antwort #1 am: 18.11.08 - 16:19:55 »
geht mit @member
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Position in Liste bestimmen
« Antwort #2 am: 18.11.08 - 16:23:22 »
Hmmm nagut hatte nur soweit gelesen bist returns 1
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Position in Liste bestimmen
« Antwort #3 am: 18.11.08 - 16:25:58 »
Gut dann hier das Upgrade dass , dir alle Positionen zurück gibt

Code
@For(_n := 1 ; _n < @Elements(_list) ; _n := _n + 1 ; 
_pos := @If(@Subset(@Subset(_list; _n); - 1) = _key ; _n ; 0);
@If(_pos != 0 ; _positions := _positions : @Text(_pos); ""));


Bitte um weitere Kritik
« Letzte Änderung: 18.11.08 - 16:27:52 von bikerboy »
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline dirk_2909

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.173
  • Geschlecht: Männlich
  • Expand your Notes Client with ECM functionality..
    • d.velop
Re: Position in Liste bestimmen
« Antwort #4 am: 18.11.08 - 17:55:38 »
Und was spricht gegen @Member ??

 :P
Dirk

[IBM CLP R5]
[IBM CAD 6/6.5]
[IBM CAD 7]
[IBM CAD 8]


"Nein!! … Es genügt nicht Mails in einen anderen Ordner oder Datenbank zu verschieben, um sie zu archivieren!"

   
Disclaimer:
Ich Antworte nach besten Wissen und Gewissen. Sollte sich jemand durch meine Antwort persönlich angegriffen fühlen, ist dies nicht meine Absicht!
Ich bin auch nur ein Mensch, der Fehler machen kann. ....

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Position in Liste bestimmen
« Antwort #5 am: 18.11.08 - 18:09:03 »
@Mewmber gibt nur den ersten "Treffer" zurück, Dirk. Roberts Lösung erzeugt aber ggf. eine Liste aller Treffer.

Was mir nicht gefällt: @Text(_pos). Wenn schon, dann sollte eine Zahl oder Zahlenliste zurückgegeben werden.

Bernhard

Offline dirk_2909

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.173
  • Geschlecht: Männlich
  • Expand your Notes Client with ECM functionality..
    • d.velop
Re: Position in Liste bestimmen
« Antwort #6 am: 19.11.08 - 06:58:01 »
Ok. Wenn man es braucht.
Dirk

[IBM CLP R5]
[IBM CAD 6/6.5]
[IBM CAD 7]
[IBM CAD 8]


"Nein!! … Es genügt nicht Mails in einen anderen Ordner oder Datenbank zu verschieben, um sie zu archivieren!"

   
Disclaimer:
Ich Antworte nach besten Wissen und Gewissen. Sollte sich jemand durch meine Antwort persönlich angegriffen fühlen, ist dies nicht meine Absicht!
Ich bin auch nur ein Mensch, der Fehler machen kann. ....

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Position in Liste bestimmen
« Antwort #7 am: 19.11.08 - 09:30:50 »
So bin auf Bernhards Kritik eingegangen

Hatte aber ein Problem mit der Zahlenliste, wenn diese leer ist, habe es nun folgendermaßen gelöst;

Code
_positions := 0;

@For(_n := 1 ; _n < @Elements(_list) ; _n := _n + 1 ; 	_pos := @If(@Subset(@Subset(_list; _n); - 1) = _key ; _n ; 0);
																				@If(_pos != 0 ; _positions := _positions : _pos; ""));

_positions := @Subset(_positions; - (@Elements(_positions) - 1));

Läuft natürlich auf einen Fehler, wenn er gar Nichts findet
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline Thomas Schulte

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re: Position in Liste bestimmen
« Antwort #8 am: 19.11.08 - 11:46:26 »
Deine Lösung hat, außer dem Fehler den du bereits nennst, wenn das gesuchte Element nicht enthalten ist, noch einen anderen Haken.

Stell doch an die letzte Stelle deiner Werteliste das gesuchte Element noch einmal und schau dir dann deine Positionen die du zurückbekommst an.

Wenn du nur das letzte Element hast bekommst du den Fehler beim Subset wieder. Wenn es in der Liste an anderer Stelle noch vorkommt entfällt bei deiner Lösung das letzte Element.

Eine funktionierende Lösung deines Problemes mit einem etwas anderen Ansatz schaut zum Beispiel so aus:
Code
REM {Baue eine Zählerliste mit der gleichen Anzahl von Elementen};
@For(_i:=1;_i<= @Elements(fldListe);_i :=_i+1;_Counter := _Counter : @Text(_i));
REM {Verheirate beide Listen, einfache ConCat Operation (möglich weil die Anzahl der Elemente beider Listen gleich sein muss),};
REM {aber weil das erste Element der _Counter Liste leer ist mach da einen Trim außenrum, damit beide Listen gleich lang sind};
_ListeCount := @Trim(_Counter) + ":" + fldListe;
REM {Entferne aus der Liste alles was nicht dem gesuchten Wert entspricht und gebe nur den _Counter Teil zurück. Entferne alle leeren Elemente};
@Trim(@Transform(_ListeCount;"x";@If(@Word(x;":";2)=fldWert;@Word(x;":";1);"")))

Diesen Ansatz kann man übrigens mit wenigen Handgriffen so umbauen, das er dir die Positionen aller Elemente in der Liste zurückgibt, in denen dein gesuchter Wert auch nur teilweise enthalten ist.
« Letzte Änderung: 19.11.08 - 12:33:37 von Thomas Schulte »
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Position in Liste bestimmen
« Antwort #9 am: 19.11.08 - 12:30:14 »


Stell doch an die letzte Stelle deiner Werteliste das gesuchte Element noch einmal und schau dir dann deine Positionen die du zurückbekommst an.



Hmm passt bei mir, hier der Beispiel Code :

Code
_pos := 0 ;
_positions := 0;
_list :="Eins" : "Zwei" : "Drei" : "Vier":"Eins" : "Zwei" : "Drei" : "Vier":
_key := "Vier";


@For(_n := 1 ; _n < @Elements(_list) ; _n := _n + 1 ; 	_pos := @If(@Subset(@Subset(_list; _n); - 1) = _key ; _n ; 0);
																				@If(_pos != 0 ; _positions := _positions : _pos; ""));

_positions := @Subset(_positions; - (@Elements(_positions) - 1));

@Prompt([Ok]; "Position" ; @Implode(@Text(_positions);"#"))
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline Thomas Schulte

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re: Position in Liste bestimmen
« Antwort #10 am: 19.11.08 - 12:41:57 »
Ersetz mal den Doppelpunkt nach deiner letzten Vier durch einen Strichpunkt (so wie es sich gehört wenn man in der Formelsprache unterwegs ist) und versuch es dann noch mal.

Klar das du, so wie du es geschrieben hast, die Vier bekommst. Dein letztes Element in der Liste ist ja schließlich nicht "Vier", sondern LEER.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Position in Liste bestimmen
« Antwort #11 am: 19.11.08 - 12:48:36 »
Sorry das war denn wohl vertippt mit Semikolon hat es dann nicht funktioniert, bis ich aus ....

Code
@For(_n := 1 ; _n < @Elements(_list) ; _n := _n + 1 ; ....
,


Code
@For(_n := 1 ; _n <= @Elements(_list) ; _n := _n + 1 ; 

gemacht habe
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline Werner Götz

  • Aktives Mitglied
  • ***
  • Beiträge: 248
  • Geschlecht: Männlich
Re: Position in Liste bestimmen
« Antwort #12 am: 20.11.08 - 10:56:12 »
Mein einfacher Vorschlag wäre:

i:=0;
@If(fldliste = fldwert; @transform(fldliste; "zeile"; @If((i := i + 1) & @False; ""; zeile = fldwert; i; @Nothing) ); 0)


wobei ich 0 (die Zahl ganz hinten ...) zurückgebe, wenn es den Wert in der Liste nicht gibt.

-Werner

Offline Werner Götz

  • Aktives Mitglied
  • ***
  • Beiträge: 248
  • Geschlecht: Männlich
Re: Position in Liste bestimmen
« Antwort #13 am: 20.11.08 - 11:00:45 »
Wem die "komische" Zuweisung innerhalb der @If-Anweisung nicht gefällt:

i:=0;
@If(fldliste = fldwert; @transform(fldliste; "zeile"; @Do(i := i + 1; @If(zeile = fldwert; i; @Nothing))); 0) 

-Werner

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz