Autor Thema: einzelne Felder aus Liste löschen  (Gelesen 2052 mal)

Offline Christian97

  • Aktives Mitglied
  • ***
  • Beiträge: 182
  • Geschlecht: Männlich
einzelne Felder aus Liste löschen
« am: 10.09.02 - 17:23:44 »
Hat schonmal einer versucht, einzelne Felder aus einer Liste zu löschen? In meiner Anwendung habe ich zwei Felder "Datum" und "Wert", die dann gemeinsam in zwei Listenfelder "DatumListe" und "WertListe" übernommen werden. Doch wie bekomme ich bei mehreren Einträgen einen aus der Mitte wieder raus? Ich stelle mir das so vor, das ich die zwei Listenfelder in einem Dialogfeld anzeigen lasse, wo dann ein Datum mit einem Wert ausgewählt werden kann und die dann beim Bestätigen gelöscht werden. Ich würde mich sehr freuen, wenn jemand eine Lösung für mich hat.

Christian
« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »

Offline Rob Green

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.651
  • Geschlecht: Männlich
    • Meipor
Re: einzelne Felder aus Liste löschen
« Antwort #1 am: 10.09.02 - 21:50:55 »
Ich zeige Dir 2 Wege(von vielen möglichen). Es handelt sich um das Prinzip, das Du natürlich für Deinen Fall umzubiegen hast.

Einer über die replacesubstring und der andere über subset.

Vorgabe:
- ich habe ein editierbares Multivaluefield genommen und einfach mehrere Werte reingehauen. Name des Feldes "ListSource"

- 2 Buttons, die auf 2 Wege das gleiche erreichen

- Doc ist im EDIT Modus

BUTTON 1 REPLACESUBSTRING:
Key:=@Prompt([OKCANCELLIST]; "Wählen Sie einen zu löschenden Eintrag"; "Auswahl" ;@Subset(ListSource;-1); ListSource);
NewListSource:=@Explode(@Trim(@ReplaceSubstring(@Implode(ListSource;";");Key;""));";");
FIELD ListSource:=NewListSource;
@Command([ViewRefreshFields]) ;
void

Trick?
Die innerste Implode Klammer zieht die Liste zu einem String zusammen, wobei die Elemente durch Semikola getrennt werden. Die zweite Klammer schmeisst per replace alle mit Key übereinstimmenden Substrings raus und ersetzt sie durch Leer. Dir dritte Klammer Trimmed Spaces und die äußerste Klammer exploded den String wieder zu einem Multivalue Eintrag.

BUTTON 2 SUBSET:
Key:=@Prompt([OKCANCELLIST]; "Wählen Sie einen zu löschenden Eintrag"; "Auswahl" ;@Subset(ListSource;-1); ListSource);
Count:=@Elements(ListSource);
Position:=@Member(Key;ListSource);
stripleft:=@If(Position=1;"";@Subset(ListSource;Position-1));
stripright:=@If(Position=Count;"";@Subset(ListSource;Position-Count));
NewListSource:=@Trim(stripleft):@Trim(stripright);
FIELD ListSource:=NewListSource;
@Command([ViewRefreshFields]) ;
void

Trick?
Dieser Weg ist etwas komplexer und mE hat er auch nen großen Haken...aber zunächst:
1. es wird die Anzahl der Elemente im Multivalue bestimmt
2. per Member wird die genaue Position des zu löschenden Eintrags bestimmt (=>Haken !!!)
3. dann werden alle Elemente links vom zu lösch. Eintrag in stripleft übertragen (mit Ausnahme, wenn Eintrag No.1 ist, da gibt es ja keine linken Elemente mehr davon)
4. und alle Elemente rechts vom zu lösch. Eintrag in stripright übertragen (mit Ausnahme, wenn Eintrag der letzte ist, da gibt es ja keine rechten Elemente mehr davon)
5. dann strip left und right zusammensetzen und das wars.

Haken dabei? Wenn die Liste mindestens doppelte Einträge enthält (also 1:2:3:1:1:4) kommt Member nicht weit, denn es liefert nur den ersten Treffer zurück. Wenn also 1 zu löschen wäre, würde es nur die 1. Position melden, statt noch dazu die 4. und 5.

Aber, irgendwo im Forum wurde diese versteckte Funktion GetMember erwähnt (such mal danach). Die müßet das lösen, doch unsuported Functions haben einen gravierenden NAchteil: mögl. verschwinden die mit dem nächsten Rel. oder Update.

Daher würde ich replacesubstring bevorzugen, wenn mehrfache Doppeleinträge vorkommen können. Wenn nein und die Liste ist sehr lang, dann würde ich allerdings die andere Methode bevorzugen, da sie tendenziell immer performanter gegenüber replace wird (denk ich mir mal).
Vielleicht verdirbt Geld wirklich den Charakter.
Auf keinen Fall aber macht Mangel an Geld ihn besser.
(John Steinbeck)

Meiporblog: http://www.meipor.de/blog
allg. Unternehmerblog: http://www.m-e-x.de/blog

Offline Christian97

  • Aktives Mitglied
  • ***
  • Beiträge: 182
  • Geschlecht: Männlich
Re: einzelne Felder aus Liste löschen
« Antwort #2 am: 11.09.02 - 12:48:57 »
Wow! Ganz großen dank für die sehr ausführliche Beschreibung. Ich habe mich für die erste Variante entschieden, da es vorkommen kann, daß mehrere gleiche Werte vorkommen.
Ich habe vor das letzte ListSource in der Key:= Zeile noch @Text gesetzt, sonst bleibt das Auswahlfeld leer. Leider wird aber die Zeile nicht gelöscht, wenn ich einen Eintrag auswähle. Ich komm aber nicht drauf, wie ich die Formel ändern sollte. Vielleicht liegts an den Trennzeichen. Ich habe eine neue Zeile als Trennzeichen im Optionsfenster gewählt, damti die Werte untereinander stehen.
Hast Du evtl. auch noch eine Idee, wie ich mit einem Ritt in beiden Listenfeldern die Zeile löschen kann. Bei der Übernahme per Button wird das Datum im Feld Datum in das Feld DatumListe übertragen und der Wert aus dem Feld Wert ins Feld "WertListe". Ich würde die beiden gern nebeneinander im Dialogfenster anzeigen lassen, das bekomm ich hin. Aber wie kann ich dann die gewählten Werte aus Ihren beiden Feldern löschen?
« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »

Offline Rob Green

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.651
  • Geschlecht: Männlich
    • Meipor
Re: einzelne Felder aus Liste löschen
« Antwort #3 am: 11.09.02 - 15:59:52 »
bau das bitte exakt (!) nach

ein Feld "Feldname":
- Typ Text/Zahl/Datum
- Mehrfachwerte zulassen
- berechnet in sich selbst/oder editierbar
- Werte trennen bei Eingabe von Semikolon, Komma, neue Zeile
- Anzeigen mit neue Zeile

Mit welchen Werten und wie Du das Feld füllst (berechnet in sich selbst oder editierbar !!!), ist Deine Sache. Ich nehme beispielhaft die Werte A:B:C und tue sie in das editierbare Feld eintragen.

Wenn ich dann die Replaceformel über einen Button verwende, wird mir das A, B oder C rausgenommen (siehe erstes Posting von mir).

Wenn Du an dieser Stelle nicht weiterkommst, kann ich Dir nicht mehr weiterhelfen. Denn besser vermag ich es nicht mehr zu erläutern. Schau Dir halt alle Feldeigenschaften nochmal genau an.


Dann zu dem zweiten Listenfeld. Wenn Du Dir beide Wertelisten in einer Dialogbox (und ich gehe notestechnisch jetzt von einer echten @dialogbox aus) anzeigen läßt, wäre es dumm, wenn der User je Liste separat auf einen Button klicken müßte, um die zu löschenden Werte rauszupicken.
Ebenso kann man es vergessen, daß man die beiden Listen über Liste1+"-"+Liste2 zusammenfasst, den Notes beherrscht das mit Formelsprache/Verkettungsoperatoren nicht gut. Hierbei käme bei 2 Listen mit A:B:C und 1:2 = A-1;B-2;C-2 heraus (halt bei unterschiedlichen Listenlängen...wenn das nicht stört).
Was allerdings geht, ist die Liste per "Liste1:Liste2" zusammenzufassen, also dem Listenoperator. Dann käme A;B;1;2 heraus. Ist zwar nicht ganz Userfriendly, aber immerhin.
Also, den Button vermeiden: mache aus beiden angezeigten Listen ein Schlüsselwortfeld, Option und Mutltivalue, JEWEILS!!! Dann bekommst Du 2 nebeneinanderstehende Optionslisten, in die der User nur noch jeweils reinklicken muß. Dann einen Button "EINTRÄGE LÖSCHEN", der jeweils beide Auswahlen separat als Key (im Sinne der replacesubstring Routine) ausliest und in beiden Quell Listenfeldern die Werte rausfeuert.

Nachtrag: sehe gerade in Spotlight, daß Dein Problem mittlerweile gelöst worden ist. Ist zwar nett für Dich, wärst Du bitte nächstes Mal so nett und meldest in den anderen Foren, daß Dein prob gelöst ist???

>:(
Vielleicht verdirbt Geld wirklich den Charakter.
Auf keinen Fall aber macht Mangel an Geld ihn besser.
(John Steinbeck)

Meiporblog: http://www.meipor.de/blog
allg. Unternehmerblog: http://www.m-e-x.de/blog

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz