Form Builder基础开发文档【入门级】Form Builder Basic Development.doc
1 相关软件的安装1.1 Oracle Client1.1.1 Setup安装路径:hi4-sv11OracleSoftware9iclient目前我们都是用9iClient,安装基本上是一路Default,如果出现setup.exe不能执行的情况,请到hi4-sv11OracleSoftware9iclientinstallwin32 安装。安装时建议安装管理员(Administrator)1.1.2 注册表修改<1>、NLS_LANGHKEY_LOCAL_MACHINESOFTWAREORACLE搜索NLS_LANG,出现NLS_LANGZHS16GBK或者NLS_LANGZHS16CGB的地方请全部修改成NLS_LANG=AMERICAN_AMERICA.UTF8<2>、FORMS60_PATH变量在后面加上TEMPLATE/APSTAND.FMB所在的路径(F:WORKFORM)和PLL文件所在的路径(F:WORKPLL)。1.2 Patch安装路径:hi4-sv11OracleSoftwarepatchp_9204_WINNTDisk1安装这个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.1Microsoft Windows 2000Microsoft Windows XPMicrosoft Windows (32-bit)SymptomsUsing 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. CauseThis is a known BUG in the OCI API Layer. The BUG number is . FixApply the 9.2.0.4.0 Patch 2 Client/Database patchset on the client machine. The Patch number is for the Microsoft Windows (32-bit) platform安装这个补丁就是要修正Oracle的100 Records的BUG。打补丁时请参看文档:hi4-sv11OracleSoftwarepatchp_9204_WINNT p_9204_WINNT Setup.doc1.3 Form Builder安装路径: hi4-sv11OracleSoftwareOracle Form Report 6i在安装的过程中,可以一路默认值下去。需要注意的时候,在安装时,会不停的自动打开很多文件夹和命令提示符的窗口,不要手工去关闭这些窗口,安装程序会自动关闭,知道提示你安装成功(这时可以手工关闭余留下来的没有被关闭的窗口)。1.4 CuteFTP安装路径:hi4-sv11OracleSoftwareToolsFTP 3.1 Good作用:就是方便上传你写好的Form到Server或者从Server上下载Form或者其他的文件主机:10.89.48.198用户名:devap/ dev2ap/ dev3ap/ dev4ap密码:devap/ dev2ap/ dev3ap/ dev4apForm文件所在目录:/disk/DEV/devappl/au/11.5.0/forms/USPll文件所在目录:/disk/DEV/devappl/au/11.5.0/resource(包括Custom.pll)Fmx文件所在目录:/disk/DEV/devappl/bqe/11.5.0/forms/US1.5 NetTerm安装路径:hi4-sv11OracleSoftwareToolsNetTerm作用:编译我们写好的Form或者Pll文件点击进入后需要做系列配置:点击上图红色框框内的Button,会弹出配置文件1.5.1 配置IP如下图:Host Name:DEV/DEV2/DEV3或者其他名字均可Host/IP:10.89.48.198Telnet Port:23TCPIP1.5.2 取消本地端回应本地端回应产生的结果是:输入一个字符时,会自动的变成两个如下图红色框,实际上我输入的是一个d,但是显示的却是两个d取消的办法是:点击下图的红色框内的桌面将会弹出下图:去掉本地端回应的复选框的小勾勾然后确定即可。到此基本配置完成1.5.3 登录NetTerm点击下图红色框内Button就可以登录NetTerm了。目前用的用户名和密码分别是:devap/devapdev3ap/dev3apdev2ap/dev2ap1.5.4 NetTerm常用命令<1>、有cd.、ls、cd等常用命令<2>、f60gen编译Formf60gen module=XXPOQ002N.fmb userid=apps/apps123或者f60gen module=XXPOQ002N.fmb userid=apps/apps123 output_file=/disk/DEV3/dev3appl/bqp/11.5.0/forms/US/XXPOQ002N.fmx module_type=form batch=no compile_all=yes<3>、f60gen编译CUSTOM.PLL文件f60gen module=CUSTOM20 userid=apps/apps123 module_type=library module_access=file output_file=CUSTOM20.plx2 注册Form在AP上面你才可以看到你所写的Form的真正效果,所以我们还需要把Form挂到AP环境。2.1 注册FormApplication Developer> Application >Form Form:你编译生成的 XXX.fmx文件的文件名(不带后缀)User Form Name:可以是你任意输入的,并且将在下一步注册Function时用到。2.2 注册FunctionApplication Developer> Application >Function下图中,Description TabPageFunction、User Function Name、Description逗可以随意输入但User Function Name在下一步注册Menu时会用到。Form TabPageForm就是上一步注册Form时你输入的User Form Name了。2.3 增加MenuApplication Developer> Application >MenuPrompt可以随便填写,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 relatedThere are two main tupes of blocks:data block and control blockItem: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 tableLOV: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模板来开发FormOracle已经为我们提供了一个Form的开发模板,(/disk/DEV/devappl/au/11.5.0/forms/US/TEMPLATE.fmb)我们的开发实际要基本这个模板,这个模板里面已经存在了我们将会用到的Oracle标准的对象,我们需要做的,就是这这个模板的基础上面,添加我们自己的对象。3.2.1 下载、打开TEMPLATE.fmb然后选择另存为,比如这里的XXPOM100N.FMBForm Name必须符合Form的命名规范hi4-sv11OracleBenQ-OracleDocCoding_RuleCustomization-Rule-V12之6-3. File naming同时修改下图中的红色方框内的名字,达到保持一致的目的。修改TEMPLATE为XXPOM100N3.2.2 删除自带的样本对象这几个Object,是TEMPLATE.FMB自带的对象,需要全部删除的。注:不删除不会有大的影响,当时会给后期的修改维护带来不便,请删除之.可以删除的Objects3.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的图标,都能打开这个CanvasCanvas排版界面: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内置的一个LOV4.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>、选择Create4.2.3 设置LOV的属性点击 OK 之后修改LOV的几个属性:Name:Title:Record Group:选择你建立的Record GroupFilter 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后光标跳到下一个ItemNo:关闭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 Item4.4.1 在属性里面设置List Item选项这种方式值List Item的选择都是在添加List Item时在属性设置时就全部增加进去的。需要设置下面的几个属性:NameItem TypeSubClass PropertiesInitial Value: 缺省选项还有就是设置选项了:点击 Elemets In List:会弹出如下的对话框值页面显示执行出来的效果:4.4.2 在代码中增加List Item选项这种List Item其实就是我们在某个Trigger里面用代码来增加其选项. 比如在Blcok Level的WHEN-NEW-BLOCK-INSTANCE里面增加:Index是1开始,而不是0ADD_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.ListItemRecord Group Name4.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时,会自动跳到到下一个ItemKeyboard 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: FM999G999G999G999G999G999G999G990D00PRList 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没有以下的属性:EnabledKeyboard NavigableAutomatic SkipMulti-LineRequired,而且我们一般都不会把这些Item放到Canvas上面,它也不能接受光标获得焦点通常是用来放一些隐藏起来的ID之类的栏位的值。4.7 Check BoxCheck Box有下面几个重要的属性:Checked and Unchecked check box values must be distinct当然,还包括Canvas、Prompt等属性。Check Box比较常用的事件是:WHEN-CHECKBOX-CHANGED4.8 Button&Clear:在Label前面加&可以产生Button快捷键Button比较常用的事件是:WHEN-BUTTON-PRESSED到此,你已经可以掌握Form的基本开发的技巧了,也就能够开发一些简单的Form了。Oracle Form更深一层的开发技巧需要在我们的实际的开发过程中去讨论、归纳、总结。在下一份文档中,我会继续总结我们在日常开发过程中总结出来的一些基本技巧或者方法。中文技术网站:ITPUB论坛:Oracle Developer论坛:http:/61.144.28.248/dev/index.jsp