27. Februar 2009

Daten filtern über Multi-Rows

Angenommen, wir haben eine Maske auf der Tabelle EMP aufgebaut und möchten die Daten filtern, so dass nur Mitarbeiter der Abteilungen 20 und 30 zu sehen sind. Die beste Art und Weise einen solchen Filter anzubieten wäre ein Block, der alle Abteilungen anzeigt und man jede Abteilung markieren kann oder nicht.

Wir würden dann zum Beispiel die Checkboxen für Abteilung 20 und 30 anklicken:



Der Button Abfrage starten startet dann eine Query im Block EMP



Was brauchen wir für diese Technik?

-) Einen CONTROL-Block mit einem Feld TI_Filter_String (Char, 2000)
-) Eine Checkbox CB_Filter im DEPT-Block (Numerisch, 0-unchecked, 1-checked)

Der Button, der die Query startet, benötigt noch einen WHEN-BUTTON-PRESSED:

:Control.TI_Filter_String := ';';
go_block ('DEPT');
first_record;
LOOP
IF :DEPT.CB_Filter = 1 THEN
:Control.TI_Filter_String := :Control.TI_Filter_String || :DEPT.DEPTNO || ';';
END IF;
IF :SYSTEM.LAST_RECORD = 'TRUE' THEN
EXIT;
ELSE
Next_Record;
END IF;
END LOOP;
go_block ('EMP');
execute_query;


Zum Schluss benötigt der EMP-Block noch folgende Default-Where-Eigenschaft:


:Control.TI_Filter_String LIKE '%;' || DEPTNO || ';%'

Der Trick ist nun, dass jede DEPTNO des Filter-Strings in der EMP-Tabelle gefunden werden kann durch die LIKE %;...;% - Technik:



Viel Spass damit
Gerd

Keine Kommentare: