Press "Enter" to skip to content

Define Custom Data Filter Using default_where In Oracle Forms

Oracle Forms is having its default records filter, which we can use through Enter Query mode to specify some search criteria or to filter records before display, but you can also create your own filter, which can be more user friendly and easy to use. You can define search criteria in control block and on click of a button you can set default_where clause of data block to query records matching that criteria.
In this example I have created a form based on SCOTT’s Emp table, below is the screen shot of this form and I am sharing also the form source code FMB file with Scott.Emp table script which can be downloaded with the following link Prequery_Filter.Zip
Created two drop downs and one text item to specify search criteria and populating these drop downs on When-New-Form-Instance trigger, the following is the code written in it:
DECLARE
 rg_name VARCHAR2 (40) := 'DYNGRP';
 rg_id RecordGroup;
 errcode NUMBER;
BEGIN
 /*
 ** Make sure group doesn't already exist
 */
 rg_id := FIND_GROUP (rg_name);
 
 /*
 ** If it exists then delete it first then re-create it.
 */
 IF NOT ID_NULL (rg_id)
 THEN
 DELETE_GROUP (rg_id);
 END IF;
 
 rg_id :=
 CREATE_GROUP_FROM_QUERY (
 rg_name,
 'select DISTINCT job, job job1 from scott_emp order by 1');
 /*
 ** Populate the record group
 */
 errcode := POPULATE_GROUP (rg_id);
 CLEAR_LIST ('FLTJOB');
 POPULATE_LIST ('FLTJOB', 'DYNGRP');
 ------- populate for department
 rg_id := FIND_GROUP (rg_name);
 
 /*
 ** If it exists then delete it first then re-create it.
 */
 IF NOT ID_NULL (rg_id)
 THEN
 DELETE_GROUP (rg_id);
 END IF;
 
 rg_id :=
 CREATE_GROUP_FROM_QUERY (
 rg_name,
 'select DISTINCT TO_CHAR(deptno), TO_CHAR(deptno) deptno1 from scott_emp order by 1');
 /*
 ** Populate the record group
 */
 errcode := POPULATE_GROUP (rg_id);
 CLEAR_LIST ('FLTDEPT');
 POPULATE_LIST ('FLTDEPT', 'DYNGRP');
 GO_BLOCK ('SCOTT_EMP');
 EXECUTE_QUERY;
END;
Created a Pre-Query trigger on Scott_Emp block to modify the Where Clause by using set_block_property to set default_where property of the block. So that query will return only those records matching search criteria. Below is the code:
DECLARE
VWHERE varchar2(1000) := 'empno is not null ';
begin
-- build where clause
if :fltjob is not null then
vwhere := vwhere || 'and job = :fltjob ';
end if;
if :fltdept is not null then
 vwhere := vwhere || 'and deptno = :fltdept ';
end if;
if nvl(:fltsal,0) > 0 then
 vwhere := vwhere || 'and sal >= :fltsal ';
end if;
set_block_property('scott_emp', default_where, vwhere);
end;
Created a Push Button to execute query in Scott_Emp block and following is the code written in When-Button-Pressed trigger:
go_block(‘scott_emp’);
execute_query;
Note: Run the SQL script first to create the table in your current schema before running the form which I provided in source code Prequery_Filter.zip.