1 相关软件的安装
1.1 Form Builder
安装路径:\\sie-file-svr\01_公司级共享资源\06_工具软件\06 开发工具\6i
在安装的过程中,可以一路默认值下去。
需要注意的时候,在安装时,会不停的自动打开很多文件夹和命令提示符的窗口,不要手工去关闭这些窗口,安装程序会自动关闭,知道提示你安装成功(这时可以手工关闭余留下来的没有被关闭的窗口)。
注册表修改
<1>、NLS_LANG
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
搜索NLS_LANG,出现NLS_LANG=ZHS16GBK或者NLS_LANG=ZHS16CGB231280的地方请全部修改成
NLS_LANG=AMERICAN_AMERICA.UTF8
<2>、FORMS60_PATH变量
在后面加上TEMPLATE/APSTAND.FMB所在的路径(F:\WORK\FORM)和PLL文件所在的路径(F:\WORK\PLL)。
1.2 Patch
安装路径:\\hi4-sv11\Oracle\Software\patch\p3095277_9204_WINNT\Disk1
安装这个Patch的原因(来自MetaLink):
The information in this article applies to:
Oracle Server - Enterprise Edition - Version: 9.2.0.1 to
Oracle Provider for OLE DB - Version: 9.2.0.1
Microsoft Windows 2000
Microsoft Windows XP
Microsoft Windows (32-bit)
Symptoms
Using the Oracle Provider for OLEDB 9.2.0.1.0 with web applications, the data retrieved and sent to the webpage is good for the first 100 rows.
After the First 100 rows, th data is displayed as garbage or ????.
The OLEDB registry default fetchsize has been changed from the default of 100.
Cause
This is a known BUG in the OCI API Layer. The BUG number is 2549186.
Fix
Apply the 9.2.0.4.0 Patch 2 Client/Database patchset on the client machine.
The Patch number is 3160576 for the Microsoft Windows (32-bit) platform
安装这个补丁就是要修正Oracle的100 Records的BUG。
打补丁时请参看文档:
\\hi4-sv11\Oracle\Software\patch\p3095277_9204_WINNT\
p3095277_9204_WINNT Setup.doc
1.3 WSFTPPro
安装路径:\\sie-file-svr\06_技术顾问部\04 技术参考资料\工具软件\WS-ftp7.5Pro
作用:就是方便上传你写好的Form到Server或者从Server上下载Form或者其他的文件
主机:10.89.48.198
用户名:devap/ dev2ap/ dev3ap/ dev4ap
密码:devap/ dev2ap/ dev3ap/ dev4ap
Form文件所在目录:/disk/DEV/devappl/au/11.5.0/forms/US
Pll文件所在目录:/disk/DEV/devappl/au/11.5.0/resource(包括Custom.pll)
Fmx文件所在目录:/disk/DEV/devappl/bqe/11.5.0/forms/US
2 注册Form
在AP上面你才可以看到你所写的Form的真正效果,所以我们还需要把Form挂到Application环境。
2.1 注册Form
Application Developer……> Application ……>Form
Form:你编译生成的 XXX.fmx文件的文件名(不带后缀)
User Form Name:可以是你任意输入的,并且将在下一步注册Function时用到。
2.2 注册Function
Application Developer……> Application ……>Function
下图中,
Description TabPage
Function、User Function Name、Description逗可以随意输入
但User Function Name在下一步注册Menu时会用到。
Form TabPage
Form就是上一步注册Form时你输入的User Form Name了。
2.3 增加Menu
Application Developer……> Application ……>Menu
Prompt可以随便填写,Function就是你上一步注册的User Function Name
一个Menu可以包含很多的子菜单(SubMenu)
下图就是目前DEV3上面PO Module的所有菜单,
可以看到包含很多的SubMenu和直接的Function(也就是直接的菜单项)
找某个模组的菜单名称可以到:
System Administrator……>Security……>Responsibility……>Define
如下图,选择或者输入你想查找的Responsibility的名称,查找后
红色框内的 Menu就是你需要的菜单了。
比如下图查找的Reponsibility是:Order Management (Administrator), BQP
得到的Menu是ONT_SUPER_USER
然后我们再到Application Developer下面的Menu处搜索ONT_SUPER_USER,就可以得到你需要的菜单或者子菜单
到此,你已经在可以AP上去看你的Form的运行结果了。
修改fmb文件后,不需要重新注册,只需要重新编译,即可看到修改后的效果。
3 Form开发入门
3.1 Form的基本对象
3.1.1 基本对象图示
如下图,就是一个标准Form(TEMPLATE.fmb)所拥有的所有的对象
3.1.2 基本对象说明
FORM: 可以有多个Window。
Window: 只能有一个CANVAS,但是还可以包括其他的类型的CANVAS,
比如CANVAS_STACKED,这种Canvas类型将在后面的章节中讲到。
Canvas: Canvas is a surface where visual objects,such as graphics and items,are arranged.
和Block没有直接的对应关系,而是直接和Item对应。
一个Canvas上面可以有来自不同的Block的多个Item.
是我们对Item进行位置调整的平台。
Block: Logical owner of items,items in one block are logically related
There are two main tupes of blocks:data block and control block
Item: Form中最基本的组织元素,我们设计的最小单元
Parameter:相当于全局变量,其作用是传递参数,Oracle标准的Form也有单独建一个Block(多个Item)来传递参数的例子。
Record Group: 主要应用是可以提供给LOV与list item,ftree作为数据源
A record group is internal Form Builder data structure that has a column/row
framework similar to a database table
LOV: List Of Value,会直接对应到Text Item上面,点击后会弹出给用户选择数据。
Attached Libraries:存放的是Oracle标准的一些PLL文件。
Property Classes:Oracle标准的一些属性类,我们在建立Window、Canvas、Data Block等都会选择一个属性类以继承一些属性和方法
在我们的开发过程中,经常用到的有FORM Trigger、Window、Canvas、Data Block(Item)、LOV(List of Value)、Record Group、Parameters。其中Window、Canvas、Data Block、Item是四个最基本的Object,缺一不可。
3.2 利用TEMPLATE.fmb模板来开发Form
Oracle已经为我们提供了一个Form的开发模板,(/disk/DEV/devappl/au/11.5.0/forms/US/TEMPLATE.fmb)
我们的开发实际要基本这个模板,这个模板里面已经存在了我们将会用到的Oracle标准的对象,我们需要做的,就是这这个模板的基础上面,添加我们自己的对象。
3.2.1 下载、打开TEMPLATE.fmb
然后选择另存为,比如这里的XXPOM100N.FMB
Form Name必须符合Form的命名规范
\\hi4-sv11\Oracle\BenQ-Oracle\Doc\Coding_Rule\Customization-Rule-V12
同时修改下图中的红色方框内的名字,达到保持一致的目的。
修改TEMPLATE为XXPOM100N |
3.2.2 删除自带的样本对象
这几个Object,是TEMPLATE.FMB自带的对象,需要全部删除的。
注:不删除不会有大的影响,当时会给后期的修改维护带来不便,请删除之.
可以删除的Objects |
3.2.3 增加新的Window
如图,修改
Name,
SubClass Information,
Title
属性
Primary Canvas属性必须在增加Canvas后再设置 |
SubClass Information属性设置:
3.2.4 增加Canvas
为了便于识别,我们建议把Window、Canvas采取同样的命名。
如图,需要修改
Name,
SubClass Information,
Window
属性
SubClass Information属性设置:
增加完Canvas之后,别忘了回去设置Window属性的 Primary Canvas
3.2.5 增加Data Block
如下图:
<1>、选择Data Blocks
<2>、选择Create
选择之后,会弹出一个New Data Block的对话框
<3>、选择Build a new data block manually
<3>、选择Build a new data block manually |
<2>、选择Create |
<1>、选择Data Blocks |
目前我们一般都是用手工建立一个新的Data Block,用Data Block Wizard的情况会在后面有讲解。
然后需要修改Block的一些基本属性:
其中,我们必须设置SubClass Information,其他的一些属性设置会在后面的章节讲到。
3.2.6 修改Trigger
这两个Trigger一定要修改,否则你的Form不能正常的运行和关闭。
<1>、Form Level Trigger:PRE-FORM
修改Form的基本信息,便于后期维护 |
一定要修改成自己的Block Name QUERY_TEST |
<2>、Program Units:APP_CUSTOM(Package Body)
if (wnd = 'QUERY_TEST') then app_window.close_first_window; |
3.2.7 修改Form的属性
做了上面一系列的设置后,需要完成最后一个设置,修改Form的属性。
到这里,我们Form的一些基本设置都完成了。该Form可以上传,编译,
但是在编译的时候会有如下的警告信息:No Items on block QUERY_TEST
编译还是能够正常生成FMX文件。
不过Item是我们设计的最小单元,我们的一切数据操作都是对Item进行的,因此一个没有Item的Form是没有实际意义的。
按照我们前面讲的注册Form之后,点击你的Menu,会弹出如下信息, 并且不会把你的Form Show出来:
3.2.8 增加Item
<1>、增加一个Item
<1>、选择 Items |
<2>、点击 Create |
<2>、修改Item的属性
好了,到此,一个基本的Form已经完成。
可以正常编译,运行,但是这个Form是一个没有任何实际意义的对象。
我们开发Form的过程,就是按照这个大致流程,后续的过程,就是自己在这个Form里面增加Window、Canvas、Block、Item、Trigger等。
3.2.9 在Canvas上进行UI调整
我们都是在Canvas上面对Item进行位置的调整,达到使整个Form看起来美观整齐的目的。
右键单击一个Item,在弹出的菜单中选择Layout Editer就能打开这个Item所在的Canvas
|
右键单击一个Canvas,在弹出的菜单中选择Layout Editer或者双击该Canvas的图标,都能打开这个Canvas |
Canvas排版界面:
View:运行时所看到的实际大小 |
Canvas:所有Item必须在其上面 |
注意:在Canvas上面看到的Item,必须全部都在这个Canvas的范围里面,否则,在编译时会出现错误:
超出Canvas的范围 |
编译时的错误提示 |
4 Form 常用对象设计
4.1 日历Calendar的使用
这是在TEMPLATE.fmb里面内置的对象,可以看到,Form里面包含Calendar Window、Calendar Canvas、Calendar Data Block以及一些Trigger、Attached Libraries等。
4.1.1 设置Item的LOV属性
注意:请务必选择No |
如果需要日期验证,请把Item的Data Type属性设置为Date
请注意:这个地方的Validate from list请务必选择No,否则会出现你选择了日期之后弹出一个LOV让你对输入的日期验证,只要你设置Data Type为Date,会自动验证你输入的字符是不是一个合法的日期格式
4.1.2 增加Item Trigger KEY-LISTVAL
一定要写,大小写不敏感 |
这样你就可以在你的Form上面看到,光标落入该Item后,就可以弹出一个(下左图)
4.1.3 设置Calendar.Show的参数
calendar.show是可以带参数的,缺省值就是当前天(可以打开Attached Libraries->APPDAYPK->Calendar)。
其参数就是该日历的缺省Date
例如:calendar.show(to_date('2004-12-25','YYYY-MM-DD'));
那么弹出来的就是上面右图的样式
4.2 LOV(List of Value)设计
LOV一般都是和Item联系在一起,是方便Item取值,验证数据的一种方法.
Calendar就是Oracle内置的一个LOV
4.2.1 设置Record Group
<3>、在弹出的对话框中选择Based on zhe query below并且输入你的SQL语句 |
<2>、选择Create |
<1>、选择Record Groups |
如果在此之前你没有用File->Connect来连接到某个DataBase,就会弹出如下的对话框:
设置完成后修改该对象的Name(VENDOR_NO)
4.2.2 增加LOV
<3>、选择Build a new LOV manually |
<1>、选择LOVS |
<2>、选择Create |
4.2.3 设置LOV的属性
点击 OK 之后修改LOV的几个属性:
Name:
Title:
Record Group: 选择你建立的Record Group
Filter Before Display: Yes:必须输入条件才能有记录出来(以%来匹配)
No :如果没有条件则显示所有记录。
Automatic Display: Yes:等价于: <when-new-item-instance>事件
就是你光标一进这个Item,就会弹出LOV。
Automatic Refresh: 是否每次执行记录组查询
就如动态填充下拉列表数据项是,将填充代码写到<when-new-form-instance>和 <when-new-item-instance>中一样,主要体现在该在多次调出LOV的时间间隔里,
对记录组相应的表作了修改后是否刷新了记录组查询数据。
Automatic Select: 当只有唯一一条记录是直接接收返回值,而无须弹出LOV让用户做毫无选择的选择。
Automatic Skip: Yes:关闭LOV后光标跳到下一个Item
No:关闭LOV后光标仍然停留在本Item上面
当然,最重要的是Column Mapping Properties,点击More:
4.2.4 设置Item的List of Values属性
Validate from List: 该Item是可以手工输入值的,
这个属性就是设置是不是验证你输入的值是否存在于这个LOV里面
4.3 增加Choose ORG功能
有些Form,在第一次进入的时候需要你选择一个ORG,
比如:PO Module->Receiving->Receipts
实现这个功能需要如下的几个步骤:
4.3.1 增加Parameter
在Parameter里面增加如下几个参数:(前后顺序无所谓)
CHART_OF_ACCOUNTS_ID(Number)
ORG_NAME(Char)
ORG_CODE(Char)
ORG_ID(Number)
4.3.2 修改Trigger
在FORM Level的Trigger里面增加一句:FND_ORG.CHOOSE_ORG;
这样就可以在你的Form第一次打开之前,会让你选择一个ORG:
当然,Choose ORG也可以加载在某一个Block上,那么我们只是需要在Block Level的PRE-BLOCK Trigger里面加上FND_ORG.CHOOSE_ORG;就可以了。
4.3.3 显示ORG在Window Title上面
选择了一个ORG,Oracle会把你选择的ORG的ORG_CODE显示在Window的Title上面
需要修改下面的Trigger:(视你把Choose ORG加在FORM上还是BLOCK上)
WHEN-NEW-FORM-INSTANCE或者WHEN-NEW-BLOCK-INSTANCE上增加:
APP_WINDOW.SET_TITLE('RESULT',:PARAMETER.ORG_CODE);
Window Name |
这样,你的Form或者Block生成之后会有下面的效果:
会在你的Title属性里面设置的字符串后面加上你现在设置的,而不是覆盖你原来的.
4.4 List Item
4.4.1 在属性里面设置List Item选项
这种方式值List Item的选择都是在添加List Item时在属性设置时就全部增加进去的。
需要设置下面的几个属性:
Name
Item Type
SubClass Properties
Initial Value: 缺省选项
还有就是设置选项了:
点击 Elemets In List:
会弹出如下的对话框
值 |
页面显示 |
执行出来的效果:
4.4.2 在代码中增加List Item选项
这种List Item其实就是我们在某个Trigger里面用代码来增加其选项.
比如在Blcok Level的WHEN-NEW-BLOCK-INSTANCE里面增加:
Index是1开始,而不是0 |
ADD_LIST_ELEMENT是Form内置的函数,可以在帮助里面查看其参数含义
4.4.3 用Record Group的记录作为选项
这种情况的选项一般都是从DataBase中读取出来:
group_id:=POPULATE_GROUP('VENDOR_RG');
POPULATE_LIST('QUERY_TEST.LIST_RECORD_GROUP','VENDOR_RG');
POPULATE_GROUP和POPULATE_LIST都是Oracle Form内置函数
Block.ListItem |
Record Group Name |
4.5 Text Item
最常用的Text Item按照不同的SubClass Information又分为下面的几种情况
4.5.1 TEXT_ITEM
可编辑的Text_Item
这种Text_Item重要的有下面几个属性:
Enabled:
Justification: Text_Item里面的文本对齐方式
Multi-Line: 是否是多行文本框
Automatic Skip:
Yes时,key in 的长度大于Maxinum length时,会自动跳到到下一个Item
Keyboard Navigable:
No:按Tab键时光标不会落入这个Item,只有当点击这个Item才会让之获得焦点
Data Type:
注意区分的是Date(仅仅年月日)和DateTime(年月日时分秒)
Maximun Length:
Initial Value: 初始值
$$dbdate$$:当前天
$$dbdatetime$$:当前时间
Required:
Yes时,底色会变成黄色
Format Mask:掩码,Format显示样式,比如:9,900,123,123.12
一般对于金额,我们会填写这个栏位
Oracle Standard Format Mask: FM999G999G999G999G999G999G999G990D00PR
List of Values:
Validate from List:
Visible:
Canvas:
Prompt:
4.5.2 TEXT_ITEM_DISPLAY_ONLY
不可编辑
这种Text_Item的属性设置和普通的Text_Item基本上一样。
4.6 Display Item
看名字就知道,这种Item只能用来显示数据。
这种Item没有以下的属性:
Enabled
Keyboard Navigable
Automatic Skip
Multi-Line
Required
,而且我们一般都不会把这些Item放到Canvas上面,它也不能接受光标获得焦点
通常是用来放一些隐藏起来的ID之类的栏位的值。
4.7 Check Box
Check Box有下面几个重要的属性:
Checked and Unchecked check box values must be distinct |
当然,还包括Canvas、Prompt等属性。
Check Box比较常用的事件是:WHEN-CHECKBOX-CHANGED
4.8 Button
&Clear:在Label前面加&可以产生Button快捷键 |
Button比较常用的事件是:WHEN-BUTTON-PRESSED
到此,你已经可以掌握Form的基本开发的技巧了,也就能够开发一些简单的Form了。
Oracle Form更深一层的开发技巧需要在我们的实际的开发过程中去讨论、归纳、总结。
在下一份文档中,我会继续总结我们在日常开发过程中总结出来的一些基本技巧或者方法。
中文技术网站:
ITPUB论坛:http://www.itpub.net/index.php
Oracle Developer论坛:http://61.144.28.248/dev/index.jsp