Oracle FORMS BUILDER开发最全常用代码
更新时间:2024-05-30 06:58:01 阅读量: 综合文库 文档下载
- oracle推荐度:
- 相关推荐
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.
1.8 切换FORM表单时判断是否提交成功
1.9 CALL FORM在不关闭原表单同时打开新的并设置Query模式
10 of 67
1.10 NEW_FORM及OPEN_FORM
11 of 67
1.11 EXIT_FORM实现强制退出
1.12 确定Form是否成功
12 of 67
1.13 POST写入数据及刷新屏幕、同步状态
1.14 退出时判断表单状态或数据块状态
BEGIN IF :SYSTEM.BLOCK_STATUS IN(‘NEW’) THEN COMMIT_FORM; END IF; END;
RAISE FORM_TRIGGER_FAILURE;
--form trigger
--when_tab_page_changed
if :system.form_status in (\
set_canvas_property('画布名',topmost_tab_page,:system.tab_pervious_page); raise_application_error(-40401,没有修改需要保存.\raise_form_trigger_failure;
if :system.form_status not in (‘CHANGED’) then raise_form_trigger_failure;
END if;
13 of 67
1.15 通过表单状态可控制子Block的状态
1.16 判断当前表单状态
1.17 COMMIT时的判断
1. COMMIT_FORM和COMMIT
都对form和数据库进行提交。针对form上面的数据变动提交到后台数据库,同时数据库提交数据。
2. DO_KEY('COMMIT_FORM')
它会首先执行KEY-COMMIT触发器里面的代码,如果没有这个触发器,则会做COMMIT_FORM一样的操作。
3. FORMS_DLL('COMMIT')
只针对代码中insert、update、delete语句进行提交,form上面的数据不提交。 DG 里面提到:
Replace COMMIT with do_key('commit_form'), This routine raises the exception FORM_TRIGGER_FAILURE if there is an invalid record. COMMIT时触发器执行顺序: (1).KEY-COMMIT (2).PRE-COMMIT
(3).PRE/ON/POST DELETE (4).PRE/ON/POST UPDATE (5).PRE/ON/POST INSERT (6).ON-COMMIT
(7).Post DataBase Commit
4. QUIETCOMMIT
oracle form \悄悄\提交。如果使用commit_form的话会弹出信息提示\没有修改需要保存\或者\记录已保存\。如果你不想提示出现,则可以调用函数
app_form.quietcommit。由于是一个function, 所以需要定义一个变量用来接收返回值, 返回值类型为boolean,当true的时候就说明成功, 否则commit失败。
14 of 67
2. Block块
2.1 块的分类及查询更新插入控制
块分为数据块及控制块:控制块只需建立完数据块后,Database Datablock选‘NO’. 属性中可控制查询、更新、插入的允许及Where语句. 一个Form在一个画布上可以有多个块儿。。 2.2 块Block属性 (1)Subclass Information
2.3 通过登录账号设置BLOCK的可修改属性
Set_block_property(‘’,update_allowed,property_false);
DECLARE The_usernameVARCHAR2(30); BEGIN The_username :=Get_Application_property(USERNAME); END;
15 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 通过语句赋值记录组
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
正在阅读:
Oracle FORMS BUILDER开发最全常用代码05-30
JBT81-94凸面板式平焊钢制管法兰08-09
尊敬老人作文800字(精选4篇)04-01
2016年秋人教版七年级英语上册Unit 6同步练习题及答案单元知识背记手册03-14
华为统一通信产品渠道售前培训07-19
田维龙销售语录09-11
冀教版英语七下Unit3Lesson14JennysSchoolLifeword教案11-06
山东省高级人民法院关于印发全省民事审判工作会议纪要的通知鲁高06-30
给水厂设计计算书03-17
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 最全
- 常用
- BUILDER
- 代码
- Oracle
- 开发
- FORMS
- 小学前鼻音后鼻音汇总(简单)
- 2019届中考数学专题复习代数式整式与因式分解专题训练2019031111
- 基于单片机的视力保护器设计
- 4×50MW供热式火力发电厂电气设计部分
- 2018年社科院金融学题库整理(完)
- 在全镇社会抚养费征收工作动员会上的讲话
- 基础孔桩旋挖钻孔施工方案
- 消防工程安装合同
- 新形势下基层社区面临的负担问题和减负对策
- 利用生物教材中插图与补信息提高课堂效率
- 压铸模具复习题
- 毕设工作手册 - 图文
- 第一单元复习测试题 人民版
- 电大《组织行为学》期末复习重点及参考答案
- 上海2018年下半年建筑施工A类安全员考试题
- 题库管理系统毕业论文
- oracle数据库ORA-12541TNS无监听程序-错误解决方法
- 《初级财务会计》习题
- ArcEngine_开发文档(ArcGIS AO开发)
- 基于单片机空气PM2.5浓度检测系统设计毕业论文 - 图文