• 调用Form


    1.open_form
    open_form是一个受限的封装过程,他可以产生一个新的form但不代替原来的form,在新的form启动后可以不把控制移动到新的form里面,也可以将输入焦点移动到新的form里面,用户可以在两个form之间导航。
    open_form的调用格式
    open_form(form_name,activate_mode,session_mode,data_mode,paramlist_id)
    具体意思:
    1) form_name 文件名以及路径。
    2) activate_mode选择activate是打开新的form并且把输入焦点移入该form,选择no_activate是不移动焦点,还在原来的form里面
    3) session_mode是打开新的form的时候的会话方式,可选session和no_session,session创建新的数据库会话,no_session不产生新的会话,和原来的form享受一个session,这个时候原来form里面的commit,都有效果,该选项为默认值.
    4) data_mode表示form 之间是否可以共享数据库(libraty data) 取值 no_share_library_data 不共享(默认) share_library_data  共享
    5) paramlist_id是form中唯一的参数,次项可选
    2.call_form
    call_form于open_form有较大的区别,call_form是一个非受限过程,启动一个新的form后,焦点立刻被转意到新的form里面,原form失去输入焦点,便的不可操作,只有等到新的form退出后在可以使用原来的form.
    call_form调用格式  call_form(form_name,display,switch_nemu,query_mode,data_mode,paramlist_name)
    具体意思:
    1) display 打开新的form是否隐藏原form hide 隐藏,no_hide不隐藏
    2) switch_nemu 打开新的form,是否用新的form的菜单代替原来的form菜单 取值o_replace ,no_replace
    3) query_mode shi 表示是否仅以查询方式新的form,no_share_only,不是仅以查询方式打开form(默认),query_only,以查询方式启动form
    4) data_mode 表示form之间是否可以共享数据库(library data)(同上)
    5) paramlist_name 表示form 之间传递的参数,为可选项
    3. new_form
    new_form:启动一个新的form,新的form将完全取代原form,但退出新的form时,输入焦点直接退出到原form的父级form或者其他启动原form的位置,在启动新的form之前,系统首先要从原form中退出,并且释放所占内存空间,然后加载新的form,如果原form数据有变化,则在启动新的form的时候终止原form的用户操作,提示用户提交数据,然后在启动新的form
      new_form的调用格式
    new_form(form_name,rollback_mode,query_mode,data_mode,paramlist_name)
    1) form_name 文件名以及路径
    2) rollback_mode 取值to_savepoint,no_rollback,full_rollback
    3) query_mode 表示是否仅以查询方式启动新的form
    4) data_mode 表示form之间是否可以共享数据库(同上)
    5) paramlist_name代表form之间传递的参数,此项为可选项目!

    对应的包为:   app_form.call(app_shortname VARCHAR2,
          form_name   VARCHAR2,
          query_mode   NUMBER   DEFAULT NO_QUERY_ONLY,
          parameter_list PARAMLIST DEFAULT NULL_PARAMETER_LIST);
            app_form.open(app_shortname VARCHAR2,
          form_name VARCHAR2,
          query_mode NUMBER   DEFAULT NO_QUERY_ONLY,
          parameter_list PARAMLIST DEFAULT NULL_PARAMETER_LIST,
          session_mode NUMBER   DEFAULT SESSION);
    方法1
    PROCEDURE shot_plan_new IS
      fm_id FormModule;
    BEGIN  
      fm_id := Find_Form('TVSNPMPSCRNMT');      
      if id_null(fm_id) then
        app_form.open('TVSN','TVSNPMPSCRNMT');
        --Application Name --Function Name
      else
    go_form('TVSNPMPSCRNMT');
    end if;
    END;
      实现思路:首先检测是否已经打开了目标Form,是的话就是目标Form成为当前窗体,否的话就新打开一个目标Form。假如在目标Form需要随源Form自动查询出数据,须将代码写在when-window-actived trigger中。
      注意:go_form会引起源Form的when-window-deactived和目标form的when-window-actived trigger,when-window-actived trigger在form切换时都会被触发,因此目标form如果有弹出日历等调用新窗体的操作时,需要设置是否是第一次触发标识作判断,否则可能达不到设计的效果,在该trigger中不要写FND_MESSAGE.DEBUG等调用新窗体的信息,否则会引起死锁。另外此种go_form方法如需要传递参数的话,只能依靠:global.XXXXX,关闭窗体时需要在close-windows或WHEN-WINDOW-CLOSED事件中清除,否则可能导致不需要的后果。
    方法2
    declare pl_id ParamList;
      fm_id FormModule;
    BEGIN
      pl_id := Get_Parameter_List('SCRNMTPL');
    IF NOT Id_Null(pl_id) THEN
        Destroy_Parameter_List( pl_id );
      END IF;
    pl_id := Create_Parameter_List('SCRNMTPL');
      Add_Parameter(pl_id,'SHOT_DATE',TEXT_PARAMETER,to_char(d_from,'YYYY-MM-DD'));
      Add_Parameter(pl_id,'CHANNEL_TYPE_ID', TEXT_PARAMETER,:CONTROL.CHANNEL_TYPE_ID);
      Add_Parameter(pl_id,'CHANNEL_TYPE_NAME', TEXT_PARAMETER,:CONTROL.CHANNEL_TYPE_NAME);
        fm_id := Find_Form('TVSNPMPSCRNMT');      
        if id_null(fm_id) then
        app_form.open('TVSN','TVSNPMPSCRNMT',NO_QUERY_ONLY,pl_id,NO_SESSION);
    else
        go_form('TVSNPMPSCRNMT'); --估计只有通过全局变量传参数了
        end if;
    END ;
    以上两种方法都是FORM4.5的方法,方法2相对方法1的区别在于:定义了一个参数列表对象,可以添加参数后作为app_form.open的一个传入参数,打开一个新的Form。实际的效果是目标Form中与参数列表中的同名参数会被赋予传入的值,随后被其他程序引用。
    方法3
    自Oracle Form. 6之后,Oracle建议用发fnd_function.execute和app_navigate.execute来实现form间的相互调用,无论是从语法上还是在性能上,新方法都有所改善。
    ORACLE推荐用FND_FUNCTION.EXECUTE取代OPEN_FORM、CALL_FORM
    procedure FND_FUNCTION.EXECUTE
    (function_name IN varchar2,
    open_flag IN varchar2 default ’Y’,
    session_flag IN varchar2 default ’SESSION’,
    other_params IN varchar2 default NULL,
    activate IN varchar2 default ’ACTIVATE’,
    browser_target IN varchar2 default NULL);
    Example
    FND_FUNCTION.EXECUTE(FUNCTION_NAME=>’DEM_DEMXXEOR’,
    OPEN_FLAG=>’Y’, SESSION_FLAG=>’Y’,
    OTHER_PARAMS=>
    ’ORDER_ID=”’||param_to_pass1||
    ’” CUSTOMER_NAME=”’||param_to_pass2||’”’);
    APP_NAVIGATE.EXECUTE(function_name =>'TVSN_ TVSNPMPSCRNMT',
                    open_flag => 'Y',
                    session_flag => 'Y',
                    other_params =>
              'SHOT_DATE ="'||to_char(d_from,'YYYY-MM-DD')||
              '" CHANNEL_TYPE_ID="'||:CONTROL.CHANNEL_TYPE_ID||
              '" CHANNEL_TYPE_NAME="'||:CONTROL.CHANNEL_TYPE_NAME||
              '" CALL_FORM="'||'Y'||
    '"',
                   activate_flag => 'ACTIVATE',
                    pinned =>FALSE);
    procedure APP_NAVIGATE.EXECUTE(
    function_name in varchar2,
    open_flag in varchar2 default ’Y’,
    session_flag in varchar2 default ’SESSION’,
    other_params in varchar2 default NULL,
    activate_flag in varchar2 default ’ACTIVATE’,
    pinned in boolean default FALSE);
    注意:
    1当前用户具有对目标Form的访问权限;
    2在目标和源窗体的WHEN–NEW–FORM–INSTANCE和WHEN–FORM–NAVIGATE triggers中需要添加APP_STANDARD.EVENT代码;
    3使用APP_NAVIGATE.EXECUTE是需要在目标窗体的RESTART trigger添加处理重启的窗体的代码。
    APP_NAVIGATE.EXECUTE和FND_FUNCTION.EXECUTE会将源window的位置、大小信息存储在下面4个全局变量中,以供目标窗体使用
    global.fnd_launch_win_x_pos
    global.fnd_launch_win_y_pos
    global.fnd_launch_win_width
    global.fnd_launch_win_height
    APP_NAVIGATE.EXECUTE和FND_FUNCTION.EXECUTE区别在于:
    FND_FUNCTION.EXECUTE
    每次调用FND_FUNCTION.EXECUTE都会打开一个新的Form. instance,调用了几次,界面上就会出现几个目标窗体,执行查询的代码应写在WHEN–NEW–FORM–INSTANCE triggers中。
    APP_NAVIGATE.EXECUTE
    调用APP_NAVIGATE.EXECUTE会在目标窗体中引发下列事件:
    (1) do_key(’clear_form’),捕获目标窗体中的为保存修改,提示用户;
    (2)步骤1成功后,将传入的参数值赋给目标窗体
    (3)执行trigger RESTART代码
    在调用时,通常将查询代码写在RESTART trigger中,第一次调用不会触发目标Form中RESTART trigger代码,因此ORACLE建议可在在WHEN–NEW–FORM–INSTANCE triggers中添加第一次调用需执行代码;第二次以后调用,系统不会重新创建一个新的Form. instance,而是继续使用老的Form. instance,因此将不再触发目标窗体pre-form、when–new–form–instance triggers,也就是说无论该函数被调用了多少次,界面上只会有一个目标窗体。

  • 相关阅读:
    [iOS]利用系统NSRegularExpression使用正则表达式
    [iOS]URL编码和解码
    [其他]正则表达式大全
    [算法]不用第三个数交换2个数的位置
    java . -- IDEA运行最简单的Java程序Hello World
    IOS . -转载-10行代码搞定九宫格
    SourceTree --转载 SourceTree大文件上传提示POST git-receive-pack (chunked)相关问题记录
    iOS -转载-使用Navicat查看数据表的ER关系图
    iOS -转载-开发之个人开发者账号转公司开发者账号
    iOS --转载2018苹果$299美元企业级开发者账号申请攻略
  • 原文地址:https://www.cnblogs.com/keim/p/2372863.html
Copyright © 2020-2023  润新知