Form中Block的重新查询
2012-05-18 13:20
260 查看
Form中某些按钮可能调用了Package对表中某些字段进行更新,但是数据库中字段的修改不会马上反映到form的界面上,所以要进行重新查询,但是用户可能使用了查询窗口进行查询之后然后再点击按钮动作,如果简单的使用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;
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;
end if;
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), ‘WHERE’) = 0 then
l_where_anchor := l_order_anchor – 5;
else
l_where_anchor := instr(upper(l_last_query), ‘WHERE’) + 1;
end if;
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);
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。
http://ema100.i.sohu.com/blog/view/203191409.htm
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;
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;
end if;
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), ‘WHERE’) = 0 then
l_where_anchor := l_order_anchor – 5;
else
l_where_anchor := instr(upper(l_last_query), ‘WHERE’) + 1;
end if;
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);
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。
http://ema100.i.sohu.com/blog/view/203191409.htm
相关文章推荐
- Form中Block的重新查询
- Form中Block的重新查询
- Form中Block的重新查询
- Form中Block的重新查询
- 根据form查询条件,重新加载datagrid
- 设置block的where条件并执行查询
- 如何解决此错误:7405 16 异类查询要求为连接设置 ANSI_NULLS 和 ANSI_WARNINGS 选项。这将确保一致的查询语义。请启用这些选项,然后重新发出查询
- [SharePoint Designer技巧-1]使用DataView与Form Web Part实现列表的关键字查询
- Day51、数据库、远程连接服务器、查询select语句、form字句、where字句、order by 子句
- 根据行记录数据查询它的RFNO &block no(pl/sql程序)
- 获取form表单提交回来的值或者html标签的值或者加载过后重新给lable赋的值
- Magento 利用block缓存 查询的所有分类菜单
- Oracle 重新解析表中索引令其查询速度加快
- Lucene4.2源码解析之fdt和fdx文件的读写——fdx文件存储一个个的Block,每个Block管理着一批Chunk,通过docID读取到document需要完成Segment、Block、Chunk、document四级查询,引入了LZ4算法对fdt的chunk docs进行了实时压缩/解压
- ORACLE EBS DATA_BLOCK不显示数据,但Last_query可以查询到数据
- form提交刷新页面显示重新提交解决方法
- mysql重新生成慢查询日志
- 在最近做一个高级查询时遇见的问题,javascript在动态的form里使用会出现问题
- JS 模式对话框 form提交 重新打开窗口问题
- ExtJs中tree根据查询条件重新load数据