Filter setzen

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Filter setzen

Beitrag von Jan »

Ich habe folgendes Problem: In der dbf gibt es ein Feld C60, in dem z. B. dieser Inhalt stehen kann:" G_2 S_12 T1_2 T3_1 T5_2 T6_13 T7_13 T9_1". Die Buchstaben mit der direkt folgenden Ziffer geben hier die Haupt- und Unter-Lagerbereiche an, die Ziffer hinter dem _ gibt die Anzahl der Artikel in diesem Bereich an.

Ich muß jetzt auf die dbf einen Filter setzen, um Positionen mit den passenden Hauptlagerbereiche auszufiltern. Es wäre ein Einfaches, wenn der Filter einfach nur wäre

Code: Alles auswählen

dbf_alias->(DbSetFilter({|| "T" $ dbf_alias->feldname})) 
Aber so einfach ist das leider nicht. Denn ich muß nicht einen einzelenen Lagerbereich ausfiltern, sondern eine Gruppe. Es sollen also alle Sätze angezeigt werden, in denen im entsprechenden Feld mind. 1x z. B. ein Buchstabe aus der Gruppe "GTLR" vorkommt. Hier kann ich natürlich nicht mehr mit $ arbeiten, denn ich suche ja nicht die Zeichenkette "GTLR", sondern ob irgend einer der vier Buchstaben mind. 1x in dem Feldinhalt auftaucht. Wobei die Länge der Vergleichszeichenkette variabel ist, die vier Zeichen hier sind nur ein Beispiel.

Als ob das nicht schon kompliziert genug wäre, läuft das ganze auch noch auf einem ADS. Es sollte also ein Filter sein, den der ADS intern auflösen kann. Weil der dann eben um ein vielfaches schneller ist als wenn der Filter auf dem Client aufgelöst werden würde. Ich hätte dabei dann auch kein Problem, wenn ich das mit einem Select oder ähnlichem auf SQL-Ebene machen würde.

Ich hoffe, ich habe das Problem halbwegs verständlich darstellen können ...

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Re: Filter setzen

Beitrag von Sören »

Hallo Jan,

wie wäre es damit:

Code: Alles auswählen

aChar := { "G", "T", "L", "R" }
cFilter := ""

AEval( aChar, { |c| cFilter += iif( ! Empty( cFilter ), " .OR. ", "" ) + "'" + c + "' $ dbf_alias->feldname" } )

cFilter := "{ || " + cFilter + " }"
bFilter := &(cFilter)  //  { || 'G' $ dbf_alias->feldname .OR. 'T' $ dbf_alias->feldname .OR. 'L' $ dbf_alias->feldname .OR. 'R' $ dbf_alias->feldname }

dbf_alias->( DbSetFilter( bFilter ) ) 
Beste Grüße,
Sören
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Filter setzen

Beitrag von georg »

Hallo, Jan -


ich halte Dir mal zugute, dass Du wieder an fremden Programmen arbeitest. Diese Art der Speicherung entspricht nicht der Normalisierung ...

Hast Du mal darüber nachgedacht, über dieses Feld einen RYO-Index zu legen? Dann könntest Du jede Lagerzuordnung einem eigenen Index zuordnen (Schlüsselwort CUSTOM beim INDEX-Befehl). Mit OrdkeyAdd() bzw. OrdKeyRemove() kannst Du dann Einträge in den Index übernehmen.

Dann kannst Du über Index zugreifen und brauchst nicht mit dem Filter zu operieren.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Filter setzen

Beitrag von Jan »

Hallo Sören,

nicht schlecht! Funktioniert einwandfrei und schnell. Mein Kunde wird den Code zwar nicht verstehen können, aber da kann ich jetzt mal mit leben.

Danke für den Code.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Filter setzen

Beitrag von Jan »

Georg,

nein, das ist wahrhaftig nicht mein Projekt. Wobei auch ich selber mich nicht immer an die Normalisierung halte - vieles geht auch so, und man kann es manchmal auch wirklich übertreiben damit.

Aber was ist denn ein RYO-Index? Das sagt mir überhaupt garnichts.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Filter setzen

Beitrag von georg »

Hallo, Jan -


die Roll-Your-Own Index-Dateien kamen (wenn ich mich recht erinnere) mit dem Six-Driver in die Clipper-Programme.

Ein INDEX ... CUSTOM unter Xbase++ erzeugt eine leere Index-Datei. Danach geht man einmal durch die Datei und fügt für jeden Datensatz keinen, einen oder mehrere Einträge (mittels OrdKeyAdd()) zur Index-Datei hinzu. Änderst Du in einem Satz das Index-Feld (es können auch mehrere sein, das entscheidet der Programmierer), musst Du als Programmierer die Änderungen am Index selbst vornehmen, da ein CUSTOM-Index nicht von der DBE automatisch gepflegt wird.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Antworten