ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle Form二次开发实战总结 调用Form

Oracle Form二次开发实战总结 调用Form

原创 Linux操作系统 作者:blueshine07 时间:2012-06-28 09:22:19 0 删除 编辑

http://blog.163.com/hcyhan@126/blog/static/50315227200831491559855/

Form开发中经常会用到Form间相互调用的功能,总结了以下,大概有以下3种方法:

方法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中与参数列表中的同名参数会被赋予传 入的值,随后被其他程序引用。

 

下面是app_form.open API的源代码,也可以了解下open_form. built-in的用法。

APPCORE.pll app_form.open

PROCEDURE 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) IS

BEGIN

   COPY('Entering app_form.open.','global.frd_debug');

   if session_mode = SESSION then

     open_form(fnd_navigate.formpath(app_shortname, form_name),

      ACTIVATE, session_mode, NO_SHARE_LIBRARY_DATA, parameter_list);

   else

    open_form(fnd_navigate.formpath(app_shortname, form_name), --原来是这样调用的

       ACTIVATE, session_mode, SHARE_LIBRARY_DATA, parameter_list);

   end if;

COPY('Completed app_form.open.','global.frd_debug');

END open;

 

方法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,也就是说无论该函数被调用了多少次,界面上只会有一个目标窗体。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25103190/viewspace-733987/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-08-26

  • 博文量
    55
  • 访问量
    150876