[gelöst] Filter über zwei Felder

17. Januar 2008 15:53

Hallo,

Habe in einer Tabelle Feld A und Feld B. Ein Wert X steht einweder in Feld A oder in Feld B, nie in beiden gleichzeitig. Jetzt möchte ich in einem Report alle Records haben, bei denen der Wert X in Feld A oder B steht. Weiß nicht wie ich solchen Filter setzen kann.

Wenn ich es mit einer

If (A <> X) and (B <> X) then
currreport.skip;

probiere, dann dauert der Report einfach mal Äonen!

Wie macht man das am besten mit einem SetFilter?!

MfG

Sebastian
Zuletzt geändert von NewComer am 17. Januar 2008 17:09, insgesamt 1-mal geändert.

17. Januar 2008 16:04

Über einen Filter kann leider kein ODER (Wert ist in A oder B) übergeben werden. Dir bleibt also nur der Weg über CurrReport.SKIP oder über Satzmarken. Ich würde es der Einfachheit halber bei deiner Lösung belassen.

Ich glaube nicht, dass die Lösung mit Satzmarken schneller wäre.

17. Januar 2008 16:13

Hm,

da es sich um die Tabelle 32 Artikelposten handelt, und ich ausser dem Datum nur den Wert X zum Filtern habe, dauert der Ausdruck, den man mehrmals täglich benötigt schon bis zu 15 Minuten.

Was wäre mit der Idee, Ich erzeuge eine Spalte C in den Artikelposten in welche ich immer den Wert "A,B" schreibe und dann nachher mit
setfilter(C , '%1', '*' + X +'*');
filtere.
Würde das Funktionieren bzw. den Report beschleunigen?

17. Januar 2008 16:13

Eine Alternative wäre erst per Filter alle X in Feld A in eine temp. Tabelle lesen und anschließend alle X aus Feld B in die temp. Tabelle lesen.

Abschließend die temp. Tabelle ausgeben.

17. Januar 2008 16:17

NewComer hat geschrieben:Was wäre mit der Idee, Ich erzeuge eine Spalte C in den Artikelposten in welche ich immer den Wert "A,B" schreibe und dann nachher mit
setfilter(C , '%1', '*' + X +'*');
filtere.Würde das Funktionieren bzw. den Report beschleunigen?

Wenn noch zusätzlich ein neuer Key über dieses neue Feld erzeugt wird, wird das wesentlich schneller als die erste genannte Alternative.

Die Lösung von MrBurns finde ich aber noch etwas eleganter, dürfte aber wohl nicht wirklich schneller sein.

Gruß, Marc
Zuletzt geändert von Marc Teuber am 17. Januar 2008 16:20, insgesamt 2-mal geändert.

17. Januar 2008 16:19

NewComer hat geschrieben:Was wäre mit der Idee, Ich erzeuge eine Spalte C in den Artikelposten in welche ich immer den Wert "A,B" schreibe und dann nachher mit
setfilter(C , '%1', '*' + X +'*');
filtere.
Würde das Funktionieren bzw. den Report beschleunigen?

Dies würde den Vorgang auf jeden Fall beschleunigen :-)
Denke aber daran, einen sinnvollen Schlüssel zu erstellen und diesen dann im Report zu verwenden.

Jedoch würde ich dein Feld anders verwenden. Statt es mit den Werten der beiden Felder zu füllen (ziemlich viel Datenmüll, gerade bei so vielen Artikelposten), mach doch ein Boolean-Feld daraus: "X vorhanden" und setze es bei der Artikelpostenerstellung.
SETRANGE("X vorhanden", TRUE);

Nachteil: Ein Booleanfeld als Schlüsselfeld ist in SQL-Datenbanken nicht optimal...
aber ich glaube, dies würde noch immer schneller sein als jetzt.

MrBurns' Vorschlag hat übrigens den Vorteil, dass du überhaupt keinen Datenmüll erzeugst - aber wäre das wirklich schneller ...?

17. Januar 2008 16:20

@Natalie

klingt zwar fiess.. aber ich glaube Marc war mal wieder schneller :-P

17. Januar 2008 16:29

Heike Bennerscheid hat geschrieben:@Natalie

klingt zwar fiess.. aber ich glaube Marc war mal wieder schneller :-P

Kannst du gut rennen? ....? :twisted:

17. Januar 2008 17:08

Gut, recht herzlichen Dank,

werde mal die elegante Variante von Mr Burns versuchen.
betrachte das Thema als gelöst!

MfG

Sebastian