一.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,代码如下

  1. if :parameter.g_query_find = 'TRUE' then
  2. copy(name_in('query_find.ORG_ID'),'HEADER.ORG_ID');
  3.  copy(name_in('query_find.VENDOR_ID'),'HEADER.VENDOR_ID');
  4. /* app_find.query_range(name_in('query_find.AVAILABLE_AMOUNT'),
  5.   name_in('query_find.AMOUNT_LOWER_RANGE'),'query_find.AMOUNT_HEIGHT_RANGE');*/
  6.   app_find.query_range(:query_find.AMOUNT_LOWER_RANGE, :query_find.AMOUNT_HEIGHT_RANGE,'HEADER.AVAILABLE_AMOUNT');
  7. :parameter.G_query_find := 'FALSE';
  8. 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进行查询的话那么就会把原来的查询条件冲掉。所以这里写了一个公用的包进行查询

  1. procedure query_block(p_block_name varchar2)
  2. is
  3. l_cursor_block varchar2(50);
  4. l_cursor_record number;
  5. l_cursor_item varchar2(50);
  6. l_trigger_record number;
  7. l_default_where varchar2(1000);
  8. l_last_query varchar2(2000);
  9. l_where_anchor number;
  10. l_order_anchor number;
  11. l_where_clause varchar2(1000);
  12. l_message_level number;
  13. begin
  14. l_cursor_item := name_in(‘SYSTEM.CURSOR_ITEM’);
  15. l_cursor_record := name_in(‘SYSTEM.CURSOR_RECORD’);
  16. l_cursor_block := name_in(‘SYSTEM.CURSOR_BLOCK’);
  17. l_trigger_record := l_cursor_record;
  18. l_message_level := :system.message_level;
  19. if l_cursor_block <> p_block_name then
  20. l_trigger_record := get_block_property(p_block_name, CURRENT_RECORD);
  21. go_block(p_block_name);
  22. if name_in(‘SYSTEM.CURSOR_BLOCK’) <> p_block_name then
  23. fnd_message.debug(‘DEVELOPER ERROR: To select records ‘||
  24. in another block, you must be able to navigate.’);
  25. raise FORM_TRIGGER_FAILURE;
  26. end if;
  27. end if;
  28. l_default_where := get_block_property(p_block_name, DEFAULT_WHERE);
  29. l_last_query := get_block_property(p_block_name, LAST_QUERY);
  30. //检查是否有Order By语句
  31. if instr(upper(l_last_query), ORDER BY’) = 0 then
  32. l_order_anchor := length(l_last_query);
  33. else
  34. l_order_anchor := instr(upper(l_last_query), ORDER BY’) 1;
  35. end if;
  36. if instr(upper(l_last_query), WHERE’) = 0 then
  37. l_where_anchor := l_order_anchor 5;
  38. else
  39. l_where_anchor := instr(upper(l_last_query), WHERE’) + 1;
  40. end if;
  41. l_where_clause := substr(l_last_query, l_where_anchor+6, l_order_anchor-l_where_anchor-5);
  42.  
  43. set_block_property(p_block_name,default_where,l_where_clause);
  44. :system.message_level := 25;
  45. execute_query;
  46. :system.message_level := l_message_level;
  47. set_block_property(p_block_name,default_where,l_default_where);
  48. go_block(p_block_name);
  49. go_record(l_trigger_record);
  50. go_block(l_cursor_block);
  51. go_record(l_cursor_record);
  52. go_item(l_cursor_item);
  53. 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执行查询的各种方法的更多相关文章

  1. 从客户端中检测到有潜在危险的Request.Form值的解决方法

    描述:从客户端中检测到有潜在危险的Request.Form值的解决方法asp.net 2.0 通常解决办法将.aspx文件中的page项添加ValidateRequest="false&qu ...

  2. jquery实现ajax提交form表单的方法总结

    本篇文章主要是对jquery实现ajax提交form表单的方法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 方法一:  function AddHandlingFeeToRefund( ...

  3. PHP通过get方法获得form表单数据方法总结

    下面给大家带来具体的代码示例: 1.form表单代码示例(表单get提交)   1 2 3 4 5 6 7 8 9 10 11 12 13 14 <head>   <meta cha ...

  4. 【异常记录(七)】MVC:从客户端中检测到有潜在危险的 Request.Form 值 的解决方法 [转]

    从客户端(Content="<EM ><STRONG ><U >这是测试这...")中检测到有潜在危险的Request.Form 值. 说明:  ...

  5. ckeditor出现错误“从客户端(***)中检测到有潜在危险的 Request.Form值”的解决方法

    ckeditor出现错误“从客户端(***)中检测到有潜在危险的 Request.Form值”的解决方法 页面中使用ckeditor,提交文章时总是出错,“从客户端(TextBox1="&l ...

  6. jquery的validate.js 和 form.js 的使用方法

    在使用 Jquery 的方法的验证并且修改 原Form 表单的提交方式的时候,需要引用的文件有 <script type="text/javascript" src=&quo ...

  7. MVC:从客户端中检测到有潜在危险的 Request.Form 值 的解决方法

    从客户端(Content="<EM ><STRONG ><U >这是测试这...")中检测到有潜在危险的Request.Form 值. 说明:  ...

  8. 从客户端中检测到有潜在危险的Request.Form值 的解决方法

    在提交表单时候,asp.net 提示:"从客户端(......)中检测到有潜在危险的 Request.Form 值" .asp.net中的请求验证特性提供了某一等级的保护措施防止X ...

  9. ASP.NET在MVC控制器中获取Form表单值的方法

    在网站开发中我们经常需要用到表单,那么,在前台页面的表单中提交到后台控制器后,后台控制器如何接收表单提交过来的数据呢?下面我们介绍几种常用的方法. 我们先看看前台页面,这里我们用一个用户名和密码的表单 ...

随机推荐

  1. [JLOI 2014]松鼠的新家

    Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想 ...

  2. [HNOI2014]画框

    题目描述 小T准备在家里摆放几幅画,为此他买来了N幅画和N个画框.为了体现他的品味,小T希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和. 对于第 幅画与第 个画框的配对,小T都给出了这个配 ...

  3. POJ - 3264:Balanced Lineup

    ST表模版 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring&g ...

  4. 51 nod 1405 树的距离之和

    1405 树的距离之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题   给定一棵无根树,假设它有n个节点,节点编号从1到n, 求任意两点之间的距离(最短路径)之 ...

  5. 17.10.28&29

    28上午 骚猪选讲 28下午 BOZJ 1081 [SCOI2005]超级格雷码 感觉就是一个找规律,然后模拟输出.半天没找到一个比较简便的模拟方法,这份代码是学习网上一位大佬的,很巧妙. 代码: # ...

  6. [bzoj4873]寿司餐厅

    来自FallDream的博客,未经允许,请勿转载,谢谢. Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序提供n种寿司,第i种寿司有一个代号ai和美味度di,i,不同种类的 ...

  7. I/O控制的主要功能

    主要功能: 1.  解释用户的I/O系统调用.将用户I/O系统调用转换为I/O控制模块认识的命令模式. 2.  设备驱动.根据得到的I/O命令,启动物理设备完成指定的I/O操作. 3.  中断处理.对 ...

  8. mooc-python语言语法week3-6

    week3 1.类型的概念:程序编程不允许有歧义的数据类型存在,所以对数据进行了划分,python语言类型分为,数字类型.字符串类型.元组类型.列表类型.文件类型.字典类型. i:数字类型: pyth ...

  9. Python中文件的操作

    文件的操作介绍 文件打开的方法 主要有两种: no with 格式:open(file, mode='r', buffering=-1, encoding=None, errors=None, new ...

  10. 【给你一个承诺 - 玩转 AngularJS 的 Promise】

    了解Promise 在谈论Promise之前我们要了解一下一些额外的知识:我们知道JavaScript语言的执行环境是"单线程",所谓单线程,就是一次只能够执行一个任务,如果有多个 ...