F11查询功能是Oracle ERP的一大亮点,只要属性设置正确,几乎界面上的所有字段都能做为查询字段(Query_Allowed = Yes)。我们使用Ctrl+F11执行查询,实际上是执行do_key(execute_query)语句,系统会在查询语句中自动添加Block的WHERE Clause和ORDER BY Clause,这一点可以通过帮助--检查--SYSTEM.LAST_QUERY加以验证。
另外在很多情况下,都要通过代码实现查询功能,比如打开Form时执行查询,点击按钮查询,保存后重新执行查询,某些栏位值发生变化后执行查询等
查询代码实现:
1 GO_BLOCK(‘BLOCKNAME’);
2 SET_BLOCK_PROPERTY(‘BLOCKNAME’,DFAULT_WHERE,’where clause’);
3 DO_KEY(‘EXECUTE_QUERY’); oracle建议用do_key(‘execute_query’)取代execute_query
在实际应用中,往往需要根据业务逻辑创建一个parameter,控制是否执行查询。
常见的实现查询功能的触发器有:when-new-form-instance,when-button-pressed,when-new-item-instance等。在某些触发器中查询功能是禁用的,如when-validate-item等。
除了F11查询功能之外,EBS还支持一种更加灵活的查询方式—QUERY FIND,即我们通常所说的手电筒查询。这是一种Non-Query模式下的查询,主要要两种模式1Row-LOV和2Find Window,所有Query Allowed属性为Yes的Block都能支持这两种方式的任意一种。
1. Row-LOV
Row-LOV类似与普通LOV,在下列情况下适于使用:
(1)一次只返回一条记录,特别适合single row block;
(2)在detail block中自动查询关联master block的所有记录;
(3)基于主键而不是其他属性查询记录;
(4)数据量很少的情况。
比如我想建立一个关于order_line_num的lov,根据选中的订单行号码查询详细信息,以下是创建Row-LOV的步骤:
(1) 首先创建一个parameter(ORDER_LINE_NUM_QF)如用于存储返回的Primary Key(order_line_num);
(2) 接着创建合适的Row-LOV设置order_line_num字段返回给:parameter. ORDER_LINE_NUM_QF
(3) 再创建block-level PRE-QUERY trigger (Execution Hierarch:Before)
IF :parameter.G_query_find = 'TRUE' THEN
:lines.order_line_num := :parameter.ORDER_LINE_NUM_QF;
:parameter.G_query_find := 'FALSE';
end if;
(4) 最后创建block-level QUERY_FIND trigger (Execution Hierarch:Override)
app_find.query_find('ORDER_LINES_QF');