您的位置:首页 > 其它

Form中Block的重新查询

2011-09-05 08:59 190 查看
Form中某些按钮可能调用了Package对表中某些字段进行更新,但是数据库中字段的修改不会马上反映到form的界面上,所以要进行重新查询,但是用户可能使用了查询窗口进行查询之后然后再点击按钮动作,如果简单的使用execute_query进行查询的话那么就会把原来的查询条件冲掉。所以这里写了一个公用的包进行查询:

--重新execute_query的数据块为:

PROCEDURE query_block(p_block_name varchar2) is
l_cursor_block   varchar2(50);
l_cursor_record  NUMBER;
l_cursor_item    VARCHAR2(50);
l_trigger_record NUMBER;
l_default_where  VARCHAR2(1000);
l_last_query     VARCHAR2(2000);
l_where_anchor   NUMBER;
l_order_anchor   NUMBER;
l_where_clause   VARCHAR2(1000);
l_message_level  NUMBER;
BEGIN
l_cursor_item    := name_in('SYSTEM.CURSOR_ITEM');
l_cursor_record  := name_in('SYSTEM.CURSOR_RECORD');
l_cursor_block   := name_in('SYSTEM.CURSOR_BLOCK');
l_trigger_record := l_cursor_record;
l_message_level  := :system.message_level;
--如果光标不在目标块。则go_block到目标块
IF l_cursor_block <> p_block_name THEN
--光标定位
l_trigger_record := get_block_property(p_block_name, CURRENT_RECORD);
go_block(p_block_name);
IF name_in('SYSTEM.CURSOR_BLOCK') <> p_block_name THEN
fnd_message.debug('DEVELOPER ERROR :To
SELECT records ' ||
'in another block,
you     must be able to navigate');
RAISE FORM_TRIGGER_FAILURE;
END IF; --IF name_in('SYSTEM.CURSOR_BLOCK') <> p_block_name THEN
END IF;--IF l_cursor_block <> p_block_name THEN
l_default_where := get_block_property(p_block_name, DEFAULT_WHERE);--数据块的默认查询条件
l_last_query    := get_block_property(p_block_name, LAST_QUERY);--最后查询语句
-- 检查是否有Order By语句
IF instr(upper(l_last_query), 'ORDER BY') = 0 THEN
l_order_anchor := length(l_last_query);
ELSE
l_order_anchor := instr(upper(l_last_query), 'ORDER BY')-1;
END IF; --IF instr(upper(l_last_query), 'ORDER BY') = 0 THEN
IF instr(upper(l_last_query), 'WHERE') = 0 THEN
l_where_anchor := l_order_anchor - 5;
ELSE
l_where_anchor := instr(upper(l_last_query), 'WHERE') + 1;
END IF; --IF instr(upper(l_last_query), 'WHERE') = 0 THEN
--得到上一次的查询条件
l_where_clause := substr(l_last_query,
l_where_anchor + 6,
l_order_anchor - l_where_anchor - 5);
--设置数据块得查询条件
set_block_property(p_block_name, default_where, l_where_clause);
--设置消息级别
:system.message_level := 25;
--执行查询
execute_query;
:system.message_level := l_message_level;
set_block_property(p_block_name, default_where, l_default_where);
go_block(p_block_name);
go_record(l_trigger_record);
fnd_message.debug('p_block_name'||p_block_name);
fnd_message.debug('l_trigger_record'||l_trigger_record);
fnd_message.debug('l_cursor_block'||l_cursor_block);
fnd_message.debug('l_cursor_record'||l_cursor_record);
fnd_message.debug('l_cursor_item'||l_cursor_item);
go_block(l_cursor_block);
go_record(l_cursor_record);
go_item(l_cursor_item);
END query_block;


程序首先保存当前的block,record以及Item使得在执行完之后光标依然停留在原位置而不会跳来挑去。之后判断当前所在的Block是否和参数传进来的P_Block一致,如果不一致,那么就go到P_Block上,然后获取该Block的Last_Query,由于可能查询带有Order By,所以需要判断是否带有Order By来决定截取的最终位置。取得了where条件之后,通过使用set_block_property(p_block_name,default_where,l_where_clause)以及execute_query对block进行查询,在这之前需要先保存原来的default
where,在查询之后将default_where设置为默认的。最后讲光标定位到原位置。

调用的时候输入Block Name,便可以截取到Block的查询条件查询该Block。

程序首先保存当前的block,record以及Item使得在执行完之后光标依然停留在原位置而不会跳来挑去。之后判断当前所在的Block是否和参数传进来的P_Block一致,如果不一致,那么就go到P_Block上,然后获取该Block的Last_Query,由于可能查询带有Order By,所以需要判断是否带有Order By来决定截取的最终位置。取得了where条件之后,通过使用set_block_property(p_block_name,default_where,l_where_clause)以及execute_query对block进行查询,在这之前需要先保存原来的default
where,在查询之后将default_where设置为默认的。最后讲光标定位到原位置。

调用的时候输入Block Name,便可以截取到Block的查询条件查询该Block。

程序首先保存当前的block,record以及Item使得在执行完之后光标依然停留在原位置而不会跳来挑去。之后判断当前所在的Block是否和参数传进来的P_Block一致,如果不一致,那么就go到P_Block上,然后获取该Block的Last_Query,由于可能查询带有Order By,所以需要判断是否带有Order By来决定截取的最终位置。取得了where条件之后,通过使用set_block_property(p_block_name,default_where,l_where_clause)以及execute_query对block进行查询,在这之前需要先保存原来的default
where,在查询之后将default_where设置为默认的。最后讲光标定位到原位置。

调用的时候输入Block Name,便可以截取到Block的查询条件查询该Block。

程序首先保存当前的block,record以及Item使得在执行完之后光标依然停留在原位置而不会跳来挑去。之后判断当前所在的Block是否和参数传进来的P_Block一致,如果不一致,那么就go到P_Block上,然后获取该Block的Last_Query,由于可能查询带有Order By,所以需要判断是否带有Order By来决定截取的最终位置。取得了where条件之后,通过使用set_block_property(p_block_name,default_where,l_where_clause)以及execute_query对block进行查询,在这之前需要先保存原来的default
where,在查询之后将default_where设置为默认的。最后讲光标定位到原位置。

调用的时候输入Block Name,便可以截取到Block的查询条件查询该Block。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: