Destroy_Parameter_List Get_Parameter_Attr Get_Parameter_List Set_Parameter_Attr
1.4.3应注意的问题
1·在创建参数表后并执行Add_Parameter向参数表追加参数时,要保证被调用表中已创建参数,并且已经对其属性作出恰当的定义。否则会出现找不到参数,或类型不匹配等错误。
2·Create_Parameter_List是一个函数,其返回值为所创建参数表的ID值。所以你要预先在PL/SQL中定义一个PARAMLIST型的变量(Oracle Form的一种数据类型),然后通过给该变量赋值来引用。
3·执行Create_Parameter_List所创建的参数表不含有任何参数。你必须用Add_Parameter向其追加参数。
4·Get_Parameter_Attr以及Set_Parameter_Attr是用来读取或设置追加到参数表中参数的类型或值的。在Form设计时,不能用其来读取或设置Form参数的值。Form参数值的引用或赋值应该用上面提到的方法。
5·参数表通过CALL_FORM、OPEN_FORM、NEW_FORM等内部子程序传送到被调用Form后,你要在该Form中自行设计合适的触发器或以其它方式引用此参数,以控制Form的运行。
6·当执行CALL_FORM去调用另一个FORM时,发出调用的FORM即处于非活动状态,直到你从被调用FORM退出并返回后才恢复;被调用FORM又可以再去调用另一个FORM,从而产生一个FORM调用堆栈。在这种连续调用的过程中,只有一个FORM处于活动状态。如果使用CALL_FORM及OPEN_FORM同时调用多个FORM模块,则要注意:①不允许以程序控制方式导航到一个非活动的堆栈。②如果FORM调用链中的某个模块是由OPEN_FORM打开的,则该FORM模块不能执行CALL_FORM去调用其它FORM模块。
4·应用举例
下面以一个实际应用中的例子,来说明参数及参数表的用法。
Form_a是设备管理中的一个综合查询模块,用于浏览所有设备的编号、名称、 位号等主要数据:
Form_b是塔类设备档案管理的明细模块,用于塔类设备档案的查询、删除、追加、修改
现在要求当在Form_a中浏览到某一塔类设备时,只要触发某一触发器(如用鼠标双击其中的一项,就去执行Form_b,并且查询出在Form_a中浏览到的那台设备。下面是具体步骤:
1·在Form_b中创建与“设备编号(SBBH)”对应的参数SBBH_P(见图3),并打开SBBH_P的属性窗口设置其属性使其与SBBH相一致。
2·在Form_b中创建一个模块(MODULE)级的when-new-form-instance触发器,在此触发器中加入以下PL/SQL语句:
declare
blk_id block; begin
blk_id:=find_block('sbzwj1');
/*'sbzwj1'为被调用模块的BLOCK名称*/ if :parameter.sbbh_p is not null then
set_block_property(blk_id,default_where,'sbbh=:parameter.sbbh_p'); end if;
count_query; execute_query; end;
3·在Form_a中找到SBBH,并为其创建一个项目(ITEM)级的触发器,其类型为when-mouse-doubleclick,在其中加入以下PL/SQL语句:
declareList_idParamList;
begin
List_id:=Get_Parameter_List('input_params');
IF NOT Id_null(list_id) THEN
Destroy_Parameter_List(List_id);
end if;
6 of 67
List_id:=Create_Parameter_List('input_params');
Add_Parameter(List_id,'SBBH_P',TEXT_PARAMETER,:sbzwj1.sbbh);
ifsubstr(:sbzwj1.sbbh,3,2)='02' then
/*设备编号中的第3、4位为‘02’时,该设备为炉类设备*/
call_form('tlsb1',hide,do_replace,no_query_only,List_id);
end if;
end;
4·分别编译Form_a、Form_b,并创建(GENERATE)、保存(SAVE)两个Form的对应文件。
5·运行Form_a并浏览到塔类设备后,用鼠标双击该塔类设备的设备编号区,即可调出此设备的档案明细。
使用参数传送可使模块之间的有条件调用变得更灵活,模块的效率更高。参数传送不仅限于Form模块,你还可在应用程序中向Oracle * Reports以及Oracle*Graphics等其它CDE工具传送参数,步骤也与向Form传送参数相似。 1.4 Global参数使用—也是一个窗体使用前一窗体参数
declare
rg_name_testvarchar2(40) :='test_name'; --定义记录组名称 v_sql_testvarchar2(300); --定义存SQL语句的变量 rg_id_testrecordgroup; --定义记录组变量 v_status number;
the_usernameVARCHAR2(40); --定义一个接收登录用户名的变量
--LOV SetUp Lov_id LOV;
begin
the_username := Get_Application_Property(USERNAME); clear_list('CTROL.SOUSUO');
rg_id_test := find_group(rg_name_test); ifid_null(rg_id_test) then
--记录组要求有两个为varchar2的列
v_sql_test := ' select * from alexvan where name='|| '''' ||the_username||''''; rg_id_test := create_group_from_query(rg_name_test,v_sql_test); end if;
v_status := populate_group(rg_id_test);
--populate_list('CTROL.SOUSUO', rg_id_test);
下边是最终代码:
WHEN-NEW-FORM-INSTANCE中写:
:GLOBAL.the_username :=Get_Application_Property(USERNAME);
PRE-FORM中写: DECLARE the_usernameVARCHAR2(40); BEGIN the_username := Get_Application_Property(USERNAME); MESSAGE ('当前登录用户是:'||the_username); -- IF lower(the_username) = 'nnras1' THEN -- MESSAGE ('当前登录用户是aaa:'||the_username); -- ELSE -- MESSAGE ('用户不正确!' ); -- END IF;
7 of 67
END;
WHEN-WINDOW-CLOSED中写: exit_form;
Record Group 中建立:
select * from ALEXVAN where name= :GLOBAL.the_username不要有后边的分号。
重要说明:
GLOBAL参数,在某些情况下,
1.如FORM加载时必须将该参数传递给已有参数,才能被ITEM使用。但在WINDOW_TITLE中却可直接引用。 2.下边这个,必须在NEW_FORM之前给GLOBAL参数值,否则传递不到新FORM中。 3.定义的参数引用及ITEM的引用还有global参数引用的区别
定义的参数引用时,前边不加“:”,其它的都需要加上“:”来引用。 Declare my_studyvarchar2(30); my_sitevarchar2(30); Begin if :STUDY.STUDY IS NOT NULL THEN my_study :=:STUDY.STUDY; IF :STUDY.SITE IS NOT NULL THEN my_site :=:STUDY.SITE; :global.the_study :=:STUDY.STUDY; :global.the_site :=:STUDY.SITE; NEW_FORM('MAIN'); else message('Please select one site!'||my_study); END IF; else message('Please select one study!'); END IF; END;
才能被ITEM使用。但在WINDOW_TITLE中却可直接引用。
Set_window_property('STUDY',TITLE,'STUDY:'||:GLOBAL.the_study||','||'SITE:'||:global.the_site);
Declare study2 varchar2(30); site2 varchar2(30); BEGIN study2 :=:GLOBAL.the_study; site2 :=:global.the_site; :STUDY.study :=study2; :study.site :=site2; END;
8 of 67
1.4 多表单操作CLOSE_FORM-GO_FORM
1.5 Form中调用不同WINDOW
9 of 67
1.6 Form之调用函数
1.7 FORM中的变量及初始值设置
Form中用到的变量,总结如下:
变量定义位置 各层触发器中的变量 Program Units中的变量 DB存储过程中的变量 Block中的Item Parameters中的Item SYSTEM变量 GLOBAL变量 作用域,由低到高 该触发器 该FormSession 该FormSession 该FormSession 该FormSession 该FormSession 整个应用 的的的的的访问方法 Form PL/SQL Form PL/SQL Form PL/SQL+DB PL/SQL Form PL/SQL+界面录入、修改 Form PL/SQL+EBS定义Function传初值 Form PL/SQL,只读,不能定义和修改值 Form PL/SQL,不用明确定义 引用方式 变量名 包名.变量名 包名.变量名 :块名.变量名 :parameter.变量名 :SYSTEM.变量名 :GLOBAL.变量名 1.7.1初始值、格式掩码
1.1.1. Item的初始值属性 当前日期:$$dbdate$$ 当前时间:$$dbdatetime$$
下一序列::sequence.
1.8 切换FORM表单时判断是否提交成功
1.9 CALL FORM在不关闭原表单同时打开新的并设置Query模式
10 of 67