Oracle FORMS BUILDER开发最全常用代码 - 图文

更新时间:2023-03-10 14:44:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1. FORM表单

1.1 Forms运行模式

1 of 67

1.1 Form表单模块属性

2 of 67

1.2 Form挂默认菜单及工具条

即Menu Module处用:DEFAULT&SMARTBAR

1.3 Form表单之多表单应用

3 of 67

1.4 多表单间传递参数

4 of 67

1.4 Form参数详细使用—一个窗体使用前一窗体参数

参数提供了一种简便的机制,它用来设置Form启动时所需要的输入值。参数的变量类型可以是CHAR、NUMBER或DATE,在设计Form时定义。在应用程序执行CALL_FORM、OPEN_FORM、RUN_PRODUCT等内部子程序时,可以向一个FORM传送参数。参数也可以由操作员在启动Form时,从命令行输入。

参数提供了一种简便的机制,它用来设置Form启动时所需要的输入值。参数的变量类型可以是CHAR、NUMBER或DATE,在设计Form时定义。在应用程序执行CALL_FORM、OPEN_FORM、RUN_PRODUCT等内部子程序时,可以向一个FORM传送参数。参数也可以由操作员在启动Form时,从命令行输入。 1.4.1创建并引用参数

在对象导航器中点中“参数”(PARAMETER),然后在工具条中点击“创建”图标,即可创建参数。创建后要在其属性窗口中设置属性。

Data Type 设置为CHAR、NUMBER或DATE。

Default 参数的缺省值,必须与参数的数据类型和长度一致。

Length 参数可存贮的最长字符数。它只对 CHAR型参数有效,最大为64K。 NUMBER型参数的缺省值为23字节,DATE型参数的缺省值为7字节。 Name 参数的名称。

在PL/SQL中,可以引用参数,或给参数赋值,方法是将保留字PARAMETER置于参数名之前,如: :PARAMETER.P_NAME1 :=’Qilu _Rubber’; 或:block.item := :PARAMETER.P_NAME1;

除了在PL/SQL中直接引用参数外,你也可以在某些内部子程序中,或者在对象属性中引用参数。

1.4.2创建并传送参数表

参数是通过参数表传送到被调用Form的,参数表是在被集成模块之间传送数据和参数的容器,单个的数据必须放在参数表中才能被传递。如果要向其它Form传送参数,可利用CALL_FORM、OPEN_FORM等内部子程序;如果要向Oracle的其它工具如Oracle Graghics传送参数,则要用RUN_PRODUCT。

参数表中的参数可以是text parameter或data parameter,参数的类型决定如何对其进行解释: text parameter 传到被调用模块的参数值是一个CHAR串,它可代表用户在Form 内定义的参数,或者是命令行上送入的参数。

data parameter 传到被调用模块的参数值是当前Form所定义的一个记录组,且只能由RUN_PRODUCT来传送。 在PL/SQL中,使用以下子程序创建并处理参数表:

Create_Parameter_List Add_Parameter Delete_Parameter

5 of 67

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..nextval 引用参数::parameter. 引用字段::.

1.8 切换FORM表单时判断是否提交成功

1.9 CALL FORM在不关闭原表单同时打开新的并设置Query模式

10 of 67

2.4 两个BLOCK数据关系属性

16 of 67

17 of 67

2.5 主明细关系窗体生成后的细节

建立好两个数据块或是建立好两个表后,在主表下边直接建立关系,指定detail数据库并指定join

condition:IWRS_STUDY.CLINICAL_STUDY_ID=IWRS_SITES.CLINICAL_STUDY_ID即数据块1.Item=数据块2.Item

建立完会自动生成触发器:ON-CLEAR-DETAILS及Program Units下的三个。

3 Window窗口及各类表单功能实现

3.1 窗口window的分类—从对话窗口到文档窗口

18 of 67

3.2窗口属性

19 of 67

3.3 表单打开后窗口TILE动态显示值

Set_window_property(‘MAIN’,TITLE,’STUDY:’||||’SITE:’||); Set_window_property(‘MAIN’,TITLE,’STUDY:’||||’SITE:’||);

3.4 让Block根据选择的条件进行查询显示

20 of 67

在WHEN_BUTTON_PRESSED中写 BEGIN set_block_property(‘emp’,default_where,’deptno=’||:control.dno); go_block(‘emp’); execute_query; END;

3.5 使用计算项实现单独汇总及表中列计算

说明必须执行查询才会更新数据。

21 of 67

3.6 判断是否为最后一条记录

3.7 从FOMR通过按钮打开另一个窗口

于包含多个window的form在已打开的window上通过按钮打开另一个window Begin

Show_window(‘TEST_WINDOW’,2,2);

Set_window_property(‘TEST_WINDOW’,title,’标题’); End;

4.各种条件判断-校验-Audi

4.1 检查输入条件是否正确—类似3.2.2及3.2.3

22 of 67

4.2 Insert前的判断及之后的Audit记录

4.3 更新时将信息写入审计表

23 of 67

4.4 Commit时判断账号是否有权

4.5输入数据后光标移动后的校验—类似3.2.2

这个功能直接用ITEM的属性(5.2)即可实现!!

4.6验证字段的前几位是字母后几位是数字

24 of 67

4.7 同上—通过验证触发器实现验证

4.8查询触发器—判断输入的条件不能为空

4.9 判断是否有删除权限-控制删除

25 of 67

4.10 删除总表时,统计明细表中的数量

4.11 FORM实现数据唯一性检查

26 of 67

5. ITEM专题

5.1 Item属性

27 of 67

28 of 67

29 of 67

30 of 67

31 of 67

5.2用代码控制ITEM属性及焦点转移

32 of 67

5.3 判断是否登录来修改ITEM是否可用

33 of 67

5.4 ITEM分类

34 of 67

5.5 返回当前系统时间到某个ITEM

5.6 动态给某个控件赋值-赋值初始时间—给ITEM赋值

35 of 67

WHEN-NEW-FORM-INSTANCE下写: BEGIN SELECT TO_CHAR(sysdat, ‘YYYY-MM-DD HH24:MI:SS’) INTO :control.datatime FROM dual; END;

5.7 让一个输入框初始化为只读的方法一

将该项的“子类信息”设置成TEXT_ITEM_DISPLAY_ONLY即可,如图所示:

5.8判断数据项是否为空

5.9 GO_RECORD到指定记录

36 of 67

5.10 遍历行

go_block('block_name'); first_record; LOOP

message(:block_name.item);

if :system.last_record = 'TRUE' then exit; end if;

next_record; END LOOP;

5.11 实现某数据项自动按记录序号加一操作

---- 设块名为VO,要操作的数据项为VO_ID,在该块中建立块级触发子WHEN-CREATE- RECORD,每当生成新记录时VO_ID就会自动加一了,加入如下代码: :VO_ID:=:System.Trigger_Record;

5.12 当某个Item为某值时,另一个ITEM不可用

2. 在FORM中当某个Item的值为某个状态不可修改:

在block级的trigger pre_record中加入如下代码:

If :block_name.item_name = P_value then

Set_item_instance_property(‘Block_Name.Item_Name’,

Current_record,

Update_Allowed,

Property_False);

Fnd_message.debug(‘item_name=P_value时不可以修改’);

End if;

3. 在某个Item下,当该Item为空时,它将复制这个Item的上一个值。

在该Item的trigger:when_new_form_instance下输入

If :block_name.item_name is null then

Duplicate_Item;

End if;

4. 在FORM中设置某个Item在某个条件下显示时:

在form 级trigger when_new_form_instance中加入如下代码:

If :parameter.p_select =’ENABLE’ then

App_item_property.set_property(‘Block_Name.Item_Name1’,visible,Property_On);

Else

App_item_property.set_property(‘Blocke_Name.Item_name1’,visible,Property_Off);

End if;

37 of 67

6. 记录组及LOV专题

6.1三种列表项的制作(区别于值列表LOV)

列表项只能显示一列值,LOV可以弹出一个窗体,显示多列。 组合框列表项既可以选择列表也可手动输入值

6.2列表项特有属性

38 of 67

6.3记录组的使用

查询记录组就是来源于SELECT查询;

静态记录组就是手工输入的一组值; 6.4 通过语句赋值记录组

1. 加入一个LIST

2. 加入一个文本域,用于显示LIST改变后的值

3. 加入一个按纽,用于初始化LIST的信息,其WHEN_BUTTON_PRESSED 语句为:

DECLARE

RG_ID RECORDGROUP; ERRCODE NUMBER; BEGIN

RG_ID := FIND_GROUP('REPORT_TYPE'); IF ID_NULL(RG_ID) THEN RG_ID := CREATE_GROUP_FROM_QUERY('REPORT_TYPE','SELECT ''[''||MS1||'']''||MS2,ms1 FROM RB_SET WHERE ID=4000 ORDER BY va5'); ERRCODE := POPULATE_GROUP('REPORT_TYPE'); POPULATE_LIST('BLOCK2.LIST5','REPORT_TYPE'); END IF; END;

39 of 67

40 of 67

6.5 LOV属性

6.6值列表LOV的使用—通过代码显示LOV

注意返回的值是哪列即可。

41 of 67

DECLARE a_value_chosen Boolean; BEGIN a_value_chosen :=show_lov(‘STUDY_ID’); END;

6.7动态给LOV换记录组

6.8 利用Cursor给列表项赋值

42 of 67

6.9 通过CURSOR填充新记录

6.10 动态增加List Item

在List所在的块的WHEN-NEW-BLOCK-INSTANCE触发器中,写如下代码

?

[Copy to clipboard]View Code PLSQL

1

Declare 2 inumber; 3 begin

4 i:=populate_group('TEST_REC_GP'); 5 ifi=0then

6 clear_list('CATALOG_RULES.RULE_TYPES');

7 populate_list('CATALOG_RULES.RULE_TYPES','TEST_REC_GP'); endif; 8

end; 9

43 of 67

7. Canvas画布

7.1 四种画布的类型—重点是TAB标签型画布—设置画布属性代码

1. 内容画布;2.标签画布;3.堆叠画布;4.工具条画布

使用标签TAB画布,最后是堆叠画布(见4.1制作)

即将不同的BLOCK中的ITEM放到不同的标签画布中即可。

7.2 堆叠画布的制作

在主画布上,直接通过工作画出一个画布,然后设定工具条的显示方式,然后到数据块中指定相应Items显示在该画布中即可。

若BLOCK中ITEMS在FRAME中,一定设置FRAME

否则一动框架,则堆叠画布中的ITEMS自动又跑回来了。

7.3 隐藏堆叠画布

44 of 67

8. Message及Alert警告

8.1消息及警告—如何显示Error及Message

BEGIN IF MESSAGE_CODE=40301 THEN MESSAGE (‘该雇员不存在,请仔细核对雇员号’); END IF; END;

45 of 67

46 of 67

=========================下边是内置子程序显示ERROR及Message===============

47 of 67

8.2 Message显示的几种方式

FIND_MESSAGE.SHOW;

48 of 67

49 of 67

FUNCTION QUESTION(BUTTON1 IN VARCHAR2 DEFAULT ‘YES’, BUTTON2 IN VARCHAR2 DEFAULT ‘NO’, BUTTON3 IN VARCHAR2 DEFAULT ‘CANCEL’, DEFAULT_BTN IN NUMBER DEFAULT 1, CANCEL_BTN IN NUMBER DEFAULT 3, ICON IN VARCHAR2 DEFAULT ‘QUESTION’) RETURN NUMBER

50 of 67

本文来源:https://www.bwwdw.com/article/s5xw.html

Top