zoukankan      html  css  js  c++  java
  • 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一致,如果不一致,那么就goP_Block上,然后获取该BlockLast_Query,由于可能查询带有Order By,所以需要判断是否带有Order By来决定截取的最终位置。取得了where条件之后,通过使用set_block_property(p_block_name,default_where,l_where_clause)以及execute_queryblock进行查询,在这之前需要先保存原来的default where,在查询之后将default_where设置为默认的。最后讲光标定位到原位置。


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





  • 相关阅读:
    20145202 《信息安全系统设计基础》课程总结
    20145234黄斐《网络对抗技术》实验六-信息搜集与漏洞扫描
    20145234黄斐《Java程序设计》实验二—Java面向对象程序设计
    20145234黄斐《Java程序设计》第九周
    20145234黄斐《网络对抗技术》实验五,MSF基础应用
    20145234黄斐《Java程序设计》第八周
    20145234黄斐《Java程序设计》实验一—Java开发环境的熟悉(Linux + Eclipse)
    20145234黄斐《Java程序设计》第七周
    20145234黄斐《网络对抗技术》实验四,恶意代码分析
    20145234黄斐《java程序设计》第六周
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299422.html
Copyright © 2011-2022 走看看