zoukankan      html  css  js  c++  java
  • 调用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,也就是说无论该函数被调用了多少次,界面上只会有一个目标窗体。

     

  • 相关阅读:
    pgspider sqlite mysql docker 镜像
    pgspider docker 镜像
    pgspider基于pg 的高性能数据可视化sql 集群引擎
    diesel rust orm 框架试用
    golang 条件编译
    Performance Profiling Zeebe
    bazel 学习一 简单java 项目运行
    一个好用node http keeplive agnet
    gox 简单灵活的golang 跨平台编译工具
    mailhog 作为smtp server mock工具
  • 原文地址:https://www.cnblogs.com/toowang/p/2317685.html
Copyright © 2011-2022 走看看