FORM执行查询的各种方法
一.FORM调用FORM后执行查询
1.打开 APPSTAND.fmb,把 Object Groups 下的 QUERY_FIND 对象组拖动到自己的 form 中的
Object Groups 下,点击 copy。
2. 这时在 block、 canvases 和 windows 下多了 QUERY_FIND
修改 Data Blocks 的 QUERY_FIND 下 NEW 按钮和 FIND 按钮的 when-button-pressd 的代码,
New 下的代码:app_find.new('要执行查询的数据块')
FIND 下的代码:
:parameter.G_query_find := 'TRUE';
app_find.find('要执行查询的数据块');
:parameter.G_query_find := 'FALSE';
3. 修改 QUERY_FIND 数据块下的 KEY-NXTBLK 的代码,如下:
:parameter.G_query_find := 'TRUE';
app_find.find('要执行查询的数据块');
:parameter.G_query_find := 'FALSE';
4. 在 QUERY_FIND数据块下创建查询条件所需的ITEM,设置数据库属性为否,画布属性为null
5. 在数据块下创建 user_named 触发器,改名为 QUERY_FIND,添加如下代码
app_find.query_find('MAIN','QUERY_FIND','QUERY_FIND');
第一个参数 MAIN 为主窗口的窗口名
第二个参数 QUERY_FIND 为查找所在的窗口名(拖拽时在 windows 下自动生成的)
第三个参数 QUERY_FIND 为 QUERY_FIND 数据块名(拖拽时在 data block 下自动生成的)
6.在所要查找的数据块下添加 pre-query tirgger,代码如下
if :parameter.g_query_find = 'TRUE' then
copy(name_in('query_find.ORG_ID'),'HEADER.ORG_ID');
copy(name_in('query_find.VENDOR_ID'),'HEADER.VENDOR_ID');
/* app_find.query_range(name_in('query_find.AVAILABLE_AMOUNT'),
name_in('query_find.AMOUNT_LOWER_RANGE'),'query_find.AMOUNT_HEIGHT_RANGE');*/
app_find.query_range(:query_find.AMOUNT_LOWER_RANGE, :query_find.AMOUNT_HEIGHT_RANGE,'HEADER.AVAILABLE_AMOUNT');
:parameter.G_query_find := 'FALSE';
end if;
说明:
copy 可查询等于某值的条件
app_find.query_range 可以设置所要查找的数据范围,
第一个参数为起始值所在项,
第二个参数为终止值所在项,(起始终止一样时就是查找当前值)
第三个参数为查找数据块的 item,起始值和终止值针对数据块的 item 而设置。如下图
7.设置所查找的数据块的 when-new-record-instance trigger 的执行等级为 after
8.在FORM级触发器WHEN-NEW-FORM-INSTANCE中将调用FORM传过来的参数付给QUERY_FIND数据块的ITEM
:query_find.INVOICE_ID := :parameter.G_INVOICE_ID;
:query_find.org_id := :parameter.g_org_id;
:query_find.vendor_id := :parameter.g_vendor_id;
9.在FORM级触发器WHEN-NEW-FORM-INSTANCE中执行查询
go_block('HEADER');
:parameter.g_query_find := 'TRUE';
app_find.find('HEADER');
-- app_find.find('HEADER');
:parameter.g_query_find := 'FALSE';
二.Form中Block的带条件重新查询
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。
FORM执行查询的各种方法的更多相关文章
- 从客户端中检测到有潜在危险的Request.Form值的解决方法
描述:从客户端中检测到有潜在危险的Request.Form值的解决方法asp.net 2.0 通常解决办法将.aspx文件中的page项添加ValidateRequest="false&qu ...
- jquery实现ajax提交form表单的方法总结
本篇文章主要是对jquery实现ajax提交form表单的方法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 方法一: function AddHandlingFeeToRefund( ...
- PHP通过get方法获得form表单数据方法总结
下面给大家带来具体的代码示例: 1.form表单代码示例(表单get提交) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <head> <meta cha ...
- 【异常记录(七)】MVC:从客户端中检测到有潜在危险的 Request.Form 值 的解决方法 [转]
从客户端(Content="<EM ><STRONG ><U >这是测试这...")中检测到有潜在危险的Request.Form 值. 说明: ...
- ckeditor出现错误“从客户端(***)中检测到有潜在危险的 Request.Form值”的解决方法
ckeditor出现错误“从客户端(***)中检测到有潜在危险的 Request.Form值”的解决方法 页面中使用ckeditor,提交文章时总是出错,“从客户端(TextBox1="&l ...
- jquery的validate.js 和 form.js 的使用方法
在使用 Jquery 的方法的验证并且修改 原Form 表单的提交方式的时候,需要引用的文件有 <script type="text/javascript" src=&quo ...
- MVC:从客户端中检测到有潜在危险的 Request.Form 值 的解决方法
从客户端(Content="<EM ><STRONG ><U >这是测试这...")中检测到有潜在危险的Request.Form 值. 说明: ...
- 从客户端中检测到有潜在危险的Request.Form值 的解决方法
在提交表单时候,asp.net 提示:"从客户端(......)中检测到有潜在危险的 Request.Form 值" .asp.net中的请求验证特性提供了某一等级的保护措施防止X ...
- ASP.NET在MVC控制器中获取Form表单值的方法
在网站开发中我们经常需要用到表单,那么,在前台页面的表单中提交到后台控制器后,后台控制器如何接收表单提交过来的数据呢?下面我们介绍几种常用的方法. 我们先看看前台页面,这里我们用一个用户名和密码的表单 ...
随机推荐
- [HAOI 2011]向量
Description 题库链接 给你一对数 \(a,b\) ,你可以任意使用 \((a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b ...
- no zuo no die
#include <iostream> #include <cstring> #include <cstdio> using namespace std; name ...
- [NOI2009]变换序列
Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50: 60%的数据中N ...
- hdu 3939(勾股+容斥)
题意: 给定一个整数L(L<=1e12),计算(x,y,z)组的个数.其中x<y<z,x^2+y^2=z^2,gcd(x,y)==1,gcd(x,z)==1,gcd(y,z)==1. ...
- Spring学习笔记2——创建Product对象,并在其中注入一个Category对象
第一步:创建Product类.在Product类中有对Category对象的set和get方法 package com.spring.cate; public class Product { priv ...
- git报错:'fatal:remote origin already exists
git报错:'fatal:remote origin already exists'怎么处理?附上git常用操作以及说明. git添加远程库的时候有可能出现如下的错误, 怎么解决? 只要两步: 1 ...
- 数据库4m10d作业
Create table student ( Sno char(15) primary key , Sname varchar(10) not null, Sage tinyint , Special ...
- Eclipse创建Maven工程
Eclipse创建Maven工程: Eclipse: New -> Other -> Maven Project -> Next -> webapp -> Finish ...
- 关于html+ashx开发中几个问题的解决方法
在跟html+ashx打交道的园友们肯定会发现,这种模式虽然优美,但在开发中会遇到一些难处理的地方.我也不例外,下面是自己在实际开发中总结出来的几条经验,希望跟大家分享,更希望得到大家的建议和更好的解 ...
- 通过内核修改centos密码
在开机启动的时候按键盘上的"E"键会进入如下界面. 选择相应的内核,再次按"E",出现下图,选择第二项,再次按"E"键 经过第二步,这个画面 ...