zoukankan      html  css  js  c++  java
  • Oracle FORM 开发技巧(1)

    1.客户化FORM中选择库存组织  

    1.1. 将INVSTAND.fmb中的对象组:INV_PARAMS复制到客户化Form中 
     
    1.2. 在Form级别触发器PER-FORM触发器中添加:FND_ORG.CHOOSE_ORG代码
     
    1.3. 在程序中使用库存组织ID: PARAMETER.ORG_ID
                           库存组织CODE:PARAMETER.ORG_CODE
                           库存组织NAME: PARAMETER.ORG_NAME
     
    1.4. 将ORG加入FORM的title:  在Form级的WEHN-NEW-FORM-INSTANCE触发器中添加
                    app_window.set_title('<window_名称>', :parameter.org_code);

    2.查看弹性栏位数据来源的路径

     system administrator-->application-->flexfield-->descriptive-->segment


    3.初始化view

       begin
         dbms_application_info.set_client_info(188);
       end;

     对需要user_id才能访问的view,需要先初始化一个合法的user_id进去
     begin
      fnd_global.apps_initialize(26872,56536,401);
     end;

    4.使用MESSAGE测试FORM

       fnd_message.debug('show message'); --show出的提示窗口

       raise form_trigger_failure;  --配合show message使用,中断Form的执行


    5.在Form open/close的时候对界面的设定

       在close_window下写入,来控制多window的Form在关闭子窗口时切回到那个block上去

       if (wnd = 'QUERY_FIND') then                 --当query_find这个window关闭的时候
         app_window.close_first_window;        --关闭第一个window,即为关闭这个window
       elsif (wnd = 'APPROVER_UPDATE') then    --当approve_update这个window关闭时
         go_block('QUERY_FIND');                  --go_block到query_find这个block上去
       end if;
      
       在open_window下写入以下代码,来控制新window打开的方式

       if (wnd = 'UPDATE_USER') then       --当window  UPDATE_USER被打开时     

         --设定UPDATE_USER这个window在APPROVER_UPDATE这个window的左上角稍偏下点,具体详见下面的介绍

       APP_WINDOW.SET_WINDOW_POSITION('UPDATE_USER', 'CASCADE', 'APPROVER_UPDATE');

         SET_WINDOW_PROPERTY('UPDATE_USER', VISIBLE, PROPERTY_TRUE);  

         GO_BLOCK('UPDATE_USER');   --指定要显示的block
       elsif (wnd = 'ACT') then 
         APP_WINDOW.SET_WINDOW_POSITION('ACT', 'CASCADE', 'APPROVER_UPDATE');
         SET_WINDOW_PROPERTY('ACT', VISIBLE, PROPERTY_TRUE);  
           GO_BLOCK('ACT');
       end if;

     app_window.set_window_position详解
     procedure APP_WINDOW.SET_WINDOW_POSITION(
              child_window   varchar2,
              style        varchar2,
              parent_window     varchar2  default NULL);
     说明:说明子窗口的显示位置
     参数:child_window  指定位置的子窗体名称
              style         子窗口的定位类型
              parent_window 子窗口的上阶窗口名称
          style: CASCADE      多个窗口从左上向右下排列
               RIGHT,BELOW  子窗口在父窗口的右边或者下方,且父窗口不会覆盖子窗口
               OVERLAP      子窗口和父窗口重叠,对齐父窗口左边,但向下位移0.3
               CENTER       子窗口在父窗口的中间显示
               FIRST_WINDOW 显示在toolbar的下方,通常是主窗口

    6.处理查询时候,如果查询界面栏位不下条件,就表示这个栏位为空值

      方法:在显示记录的block下的KEY-EXEQRY这个trigger下做判断,然后将最终的where条件赋值给这个block的default_where里面去。代码如下
      declare
      v_default_where varchar2(400);  --定义变量用来存放这个block的初始where条件
      V_WHERE VARCHAR2(2000);         --定义变量用来存放新的where条件
      begin
        v_default_where:=get_block_property(:SYSTEM.CURSOR_BLOCK,DEFAULT_WHERE);--获取此block初始的where条件
        V_WHERE:=v_default_where;   --将初始的where条件赋值给V_WHERE这个变量中
        if v_default_where is null then   --当初始条件为空时,并条件的时候不需要加'where','and'之类
           if :QUERY_FIND.EMP_CLASS_CODE is null then     --如果查询界面的那个栏位为空
              V_WHERE:=V_WHERE || ' EMP_CLASS_CODE is null';  --将查询条件并上此栏位is null
             else
              V_WHERE:=V_WHERE || ' EMP_CLASS_CODE='||:QUERY_FIND.EMP_CLASS_CODE;--查询界面的栏位有值就用栏位等于的sql查询语句
             end if;
        else       --当初始条件不为空,并查询条件时需要加'and'
          if :QUERY_FIND.EMP_CLASS_CODE is null then
                V_WHERE:=V_WHERE || ' and EMP_CLASS_CODE is null';
            else
            V_WHERE:=V_WHERE || ' and EMP_CLASS_CODE='||:QUERY_FIND.EMP_CLASS_CODE;
            end if;
        end if;

        --将新的查询条件赋值给这个block的default_where进行查询 
        set_block_property(:SYSTEM.CURSOR_BLOCK,DEFAULT_WHERE,V_WHERE); 

        --清空,否则Form下次查询的时候会把前一次的条件带入
        clear_record; 

        --执行查询命令
        EXECUTE_QUERY;  

        --将原默认的default_where值重新恢复回去
        set_block_property(:SYSTEM.CURSOR_BLOCK,DEFAULT_WHERE,v_default_where);  
      end;

    7.取消lov的验证
      set_record_property(:system.trigger_record,:system.trigger_block, STATUS,QUERY_STATUS);
      常用于界面上的栏位值来源于select ....into...而此栏位又有绑定lov的情况下,防止以查询方式进入界面,没做任何操作就需要保存;或者界面上栏位在Table中只记录id,用name查找时,直接用select name into 栏位。

    8.设置栏位属性值
      app_item_property.set_property('ACT.NEW_ACT',Required,PROPERTY_TRUE);
         ACT.NEW_ACT   block的栏位
         Required      属性名称
         PROPERTY_TRUE 属性值

    9.调用block的trigger
       APP_RECORD.FOR_ALL_RECORDS('ACT_LIST','SELECT_COUNT');
           ACT_LIST       block名称
           SELECT_COUNT   trigger名称

    10.当一个window上有多个canvas的时候,往往会造成某个canvas不显示.
       解决此方法可用show_view('canvas')命令,其中canvas为需要显示的canvas名称。

     注意:当使用show_view来显示canvas时,焦点会回到之前的canvas上,这样在show  canvas_stacked的时候就不会有问题,但在show新打开的window的时     候就会造成要显示的window闪一下就跑到之前的window的后面去,解决此问题可以调用 
          app_custom.open_window('ACT_LIST'); 来show你要的window,其中ACT_LIST为block名称。

    11.弹出yes or no的询问对话框
      FND_MESSAGE.SET_STRING('此核流程中已有核人T,是否⑵h除再}u?');
      v_ques_no := FND_MESSAGE.QUESTION('YES','NO',NULL);
      if v_ques_no=1 then
          del_lines(p_head_id);
          add_lines(p_head_id,p_organization_id); 
      else
          null;
      end if;

    12.单击按钮使得下一个要弹出的界面值清空
       go_block('<blockname>');
       clear_block(no_validate);

    13.清空block中资料

       app_find.clear;清除当前block的值,不可用go_block('<blockname>');的方式清除其他的block
       app_find.clear_detail('<blockname>');清除指定block的值

  • 相关阅读:
    [CF707D]Persistent Bookcase_主席树_bitset
    [CF798D]Mike and distribution_贪心
    [LuoguP2164][SHOI2007]交通网络_拓扑排序_概率期望
    [LuoguP3064][USACO12DEC]伊斯坦布尔的帮派Gangs of Istanbull(加强版)_线段树_贪心
    [CF306C]White, Black and White Again_排列组合
    [LuoguP2167][SDOI2009]Bill的挑战_容斥原理/状压dp
    [LuoguP2163][SHOI2007]园丁的烦恼_CDQ分治
    正则字符串插入字符
    [react]
    react 预览pdf 转换
  • 原文地址:https://www.cnblogs.com/Cqiang/p/2868351.html
Copyright © 2011-2022 走看看