1. 基于EBS的Forms开发过程
1.1 Form文件类型
.fmb:源文件,目前是二进制格式,也可以转成早期版本的ASCII格式
.fmx:可执行文件,类似VB的.exe文件,其也需要在Forms Runtime环境中运行
.pll:库函数源文件,类似所有开发语言的库函数,如VC的.cpp文件
.plx:库函数可执行文件
调用关系:fmb文件可以引用其他fmb文件、pll文件,pll文件可以进一步引用其他pll文件,引用是可以嵌套的。所以要成功打开一个forms源文件,必须保证其直接引用、间接引用的fmb、pll文件均存在。
怎样才叫“存在”呢?类似各种语言如C的Include Path或Java的Class Path,Forms也有一个参数——注册表FORMS60_PATH来指示引用的路径,只要需要的文件在该路径下即可。
1.2 Forms Builder安装
1.2.1 版本
尽管Oracle的Developer工具已经升级到9i、10g,但EBS中使用的Forms Server和Forms Builder版本还是6i,今后的开发将逐步转移到Java,Oracle将来也不会在EBS中使用高于6i的Forms。
可以从form下载,其包含在EBS for Windows版本的下载列表中。
1.2.2 oracle forms builder 安装配置
1.3 下载Template相关文件
1.4 一个简单的例子
1.4.1 创建数据库对象
要求:表、序列、索引建在应用数据库用户下,表放在数据表空间中,索引放在索引表空间中;视图、包建在APPS下,表和序列需要在APPS下创建别名(同义词)。
1.4.2 注册表和字段
需要向EBS注册表和字段,这样以后就可通过标准功能设置弹性域、监控表操作。(调用包中专门的procedure注册表)
1.4.3 创建用于Form的View
Form可以直接基于基表,但对于复杂的表,则必需使用View,将各个ID转换为有意义的编码或者描述。
1.4.4 创建表操作API
不管是基于基表还是基于视图的Block,都建议编写ON-UPDATE、ON-INSERT、ON-DELETE、ON-LOCK触发器,并且,把具体的DML和锁记录代码放入数据库Package中,然后在Form中调用,该Package以后还可以在其他地方调用。这些设计,都是基于以往开发经验所归纳出来的,有利于模块化开发、有利于扩展。
PROCEDURE: insert_row() PROCEDURE: lock_row() PROCEDURE: update_row()
PROCEDURE: delete_row()
1.5 Form开发 · 从模版开始设计
1.5.1 快速认识Forms Builder开发环境
1、 Object Navigator,分层次的对象管理,常用的有:Triggers触发器、Data Blocks数据块(其下有Items字段、Triggers触发器)、Canvases画布、LOVs下拉列表、Parameters参数、Program Units程序单元、Record Group记录组、Windows窗体。这些对象可以通过左边红框标记的按钮进行添加、删除。
2、Property Palette,分类别的属性设置,主要属性后面用到再介绍。
3、Canvases,设计各字段在画布上的布局。
快捷键F4:选中Object Navigator中的某个对象,F4可以调出Property Palette。
4、Code Editor代码编辑器:编写PL/SQL代码的地方。
1.5.2 拷贝TEMPLATE.fmb
拷贝TEMPLATE.fmb,改名为CUXORDENT.fmb,打开之后把Form Name也改为CUXORDENT,一定要保持一致性。
1.5.3 删除多余对象
删除拷贝过来的TEMPLATE.fmb文件中Data Blocks的两个块--BLOCKNAME,DETAILBLOCK。
它们是模版自带的示例主从块。
删除Canvases下的一个画布——BLOCKNAME。
1.5.4 修改Windows名称
修改Windows下的Window,在Property Palette中将Name改为“窗口名字”,将Title改为“显示的title名字”。(这个步骤可以放到后边)
1.5.5 修改2个触发器,1个程序单元
因为一个Forms有多个Window,所以需要明确指出哪个Window是主Window,这样在关闭主Window的时候将退出整个Forms;此外,我们也须要在源代码中记录作者、开发时间、版本等备注信息。这些是通过代码而非属性来控制的。
1、 修改Forms级触发器PRE-FORM
将其中app_window.set_window_position('BLOCKNAME', 'FIRST_WINDOW');改为app_window.set_window_position('你的window名字', 'FIRST_WINDOW');
同时修改上面几行代码中的作者、时间、版本、Form描述、应用简称,示例如下:FND_STANDARD.FORM_INFO('$Revision:1.0.0 $', 'Sales Order Form', 'SCF','$Date:2007/02/28 11:02 $', '$Author:huajhua$');
2、 修改Forms级触发器WHEN-NEW-FORM-INSTANCE主要修改Form名字、版本和日期。
3、 修改Program Unit下app_custom中的close_window过程将
if (wnd = '') thenapp_window.close_first_window;改为if(wnd='你的window名字') thenapp_window.close_first_window;
1.5.6 创建Block数据块
数据块,定义Form上的字段与数据库中的字段是如何对应的,同时定义块和字段的各种操作特性——字段类型、长度、默认值、可否增删改查等等。
N: 在Data Blocks上右键,选择数据块创建向导:
之后第一步跳过,第二步保持默认的选择“Table or View”
第三步输入View名字CUX_ORDER_HEADERS_V,如果没有登录过,则会弹出登录框:
登录后Available Column将显示所有视图字段,点击>>全部选过来。
第四步跳过,第五步选择“Just create the data block”后Finish。
Forms Builder将自动将表字段的名称、类型、长度、是否必须等信息带到Block下的Items中。
1.5.7 设置Block属性机器Subclass
设置块属性中的Subclass为Block:
此外,需要设置块的前后导航属性,本例目前仅有一个有意义的数据块,这里将Previous和Next Navigation Data Block均设置为自身,这样在运行时,使用快捷键Shift+Pageup和Shift+Pagedown时,均不会跳离本块。
子类:类似Java中的子类,用来继承Item类型和各种属性,在开发过程中,要严格设置各种Item的子类,不得手工随意修改对象的属性,从而保持界面有一致的风格;设置过子类的对象,图标上有个红色的箭头。
1.5.8 设置Item属性及其Subclass
设置需要显示Item和特殊Item的子类,同时设置部分Item的默认值:
1.5.9 创建Canvas画布
画布,用来设计各字段的布局,画布必需放置在Window上后才真正对用户“可见”。最基本的画布为Content画布,一个Window必需有且仅有一个Content画布。
N: 在Data Blocks上右键,选择布局创建向导:
第一步选择New Canvas,Type选择Content:
第二步选择要显示的字段:
第三步修改各字段的提示和显示长度:
后面两步跳过直至Finish。
在打开的画布设计界面,删除自动生成的Frame。
1.5.10 设置画布属性和子类、调整布局
1、设置画布名字为SALES_ORDER,放置的Window为SALES_ORDER,子类为Canvas:
2、调整View和Canvas大小,Content画布这两者设置为一样大,即拉到重叠为止。
Canvas与View:Canvas是整个画布的大小,Item是放置在Canvas上的;View是这个画布的可见部分,如果View小于Canvas,那么通常需要借助滚动条来查看整个Canvas中的内容;可以通过菜单View中的Show
View、Show Canvas来确定哪个框是Canvas哪个框是View。
1.5.11 调整布局
1.5.12 调整prompt提示
Oracle标准的Form中,Form形式的布局,提示放置在字段左边,居中对齐,并且距离字段0.073;而Table形式的布局,提示放置在第一行字段上边,数字靠右,其他靠左,并分别距离字段边缘0.05。以ORDER_NUMBER为例设置如下(其他字段可以按住Ctrl一起选中,然后一次性设置。):
1.5.13 设置windows属性
设置Window“SALES_ORDER”的Primary Canvas为“SALES_ORDER”,该Window的大小将自动调整为Content Canvas的大小:
1.5.14 设置From属性
设置Form的第一个导航块为ORDER_HEADERS,这样运行时,一进入Form,光标将停在该块的第一个字段上:
1.6 编写数据操作触发器
1.6.1 编写数据操作Program Unit
该Program Unit主要用来调用之前步骤创建的数据库API。
1、 选中对象管理器中的Program Unit,点击左边的+,选择Package Spec,在Name中输入ORDER_HEADERS_PRIVATE。
2、 OK后,输入如下包头代码。
3、 同1,选择Package Body,OK后输入如下包体代码,注意块字段的值的引用格式“:块名.字段名”。
4、编写完成后,点击PL/SQL Editor窗口顶上的Compile按钮,必须保证没有错误。
1.6.2 编写块的On触发器
1、 选中Block“ORDER_HEADERS”下的Triggers,点击左边的+,选择ON-INSERT触发器:
2、 OK后输入如下代码:
ORDER_HEADERS_PRIVATE.insert_row;
3、 同1,选择ON-LOCK后输入如下代码:
ORDER_HEADERS_PRIVATE.lock_row;
4、 同1,选择ON-UPDATE后输入如下代码:
ORDER_HEADERS_PRIVATE.update_row;
5、 同1,选择ON-DELETE后输入如下代码:
ORDER_HEADERS_PRIVATE.delete_row;
理解:对于基于非单表视图的Block来说,这里的4个触发器是必须要写的,具体代码可以直接写在触发器内,但为了模块化管理和今后维护方便,这里分为三层调用,触发器中调用Program Unit中的过程,Program Unit中调用数据库Package中的过程。
1.7 上传与编译
通过FTP上传fmb文件,然后通过xshell编译。
编译命令:frmcmp_batch userid=apps/apps module=$AU_TOP/forms/ZHS/CUX_BOOK_CONTROLS.fmb module_type=form output_file=$FA_TOP/forms/ZHS/CUX_BOOK_CONTROLS.fmx
成功编译的话,最后一行将显示:
Created form file xxx.fmx
1.8 EBS中注册运行
1.8.1. 登录EBS
用至少需要有Application
Developer职责的用户登录,比如Sysadmin用户,然后选择Application Developer职责。
1.8.2 注册Form
1、 这里的Form、源文件中Form名字、文件名三者要一致,这里是CUXORDENT。
2、 选择合适的Application,通常用企业的客户化应用,这里是SCF Customized System。
3、 User Form Name可以输入一个友好的名字,建议直接用Form名字。
1.8.3 定义Function
1、输入Function名字和Form名字一致,输入一个友好的名字SCF Sales Order。
2、切换到Form标签页,选择刚才定义的Form后按Ctrl+S保存。
1.8.4 加入Menu
假定我们用SCF Customized System Super User这个职责来测试,该职责对应的菜单为SCF_SUPER_USER。查出菜单SCF_SUPER_USER,在下面添加一行:
1.8.5 运行Form
切换到SCF Customized
System Super User职责,选择Sales Order菜单,可以看到做好的Form:
这个例子最重要,必需保证能够自己做出来。
陈子豪,一个已经步入社会的年轻人。