《Oracle+EBS+Forms开发指南(中级).docx》由会员分享,可在线阅读,更多相关《Oracle+EBS+Forms开发指南(中级).docx(57页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、信息技术最佳实践ORACLE核心应用技术E-Business SuiteForms开发指南Author:黄建华Creation Date:October 16, 2006Last Updated:Document Ref:February 7, 2014Version:DRAFT 1AApprovals: Copy Number Document ControlChange RecordDateAuthorVersionChange Reference16-Oct-06Jianhua.HuangDraft laNo Previous DocumentReviewersNamePositionD
2、istributionCopy No.NameLocation1Library MasterProject Library2Project Manager34Note To Holders:If you receive an electronic copy of this document and print it out, please write your name on the equivalent of the cover page, for document control purposes.If you receive a hard copy of this document, p
3、lease write your name on the front cover, for document control purposes.ContentsDocument Controlii1. Folder, JTFGrid21.1. Folder开发步骤(从头开始)21.3. Folder开发步骤(基于模版)71.4. JTFGrid 开发步骤102. 多语言开发142.1. 国际化支持142.2. Form 自身 的多语言 版本142.3. 数据多语言开发步骤142.4. EBS启用新语言时的考虑223. 附件开发243.1. 关于附件:241.1. Form 与 Java291.
4、2. 例子:Hello World311.3. 例子:执行PC本地命令341.4. 例子:读取PC文本文件371.5. 例子:通用导入395. Form个性化415.1. Form个性化概述415.2. 例子:修改字段Prompt425.3. 例子:有条件显示消息435.4. 例:调用数据库Package445.5. 例子:添加菜单44子子子子例例例例:打功能45:执行查询46:其他应用47:Instance间迁移486. 技巧、常用代码496.1. Form中的变量496.2. 初始值、格式掩码496.3. 消息处理506.4. Special 菜单506.5. 库存组织访问506.6. M
5、FGJDRG ANIZ ATION_ID 相关问题516.7. 常用而置过程526.8. 待续527. Open and Closed Issues for this Deliverable53Open Issues53Closed Issues531. Folder JTF Grid1.1. Folder开发步骤(从头开始)本节标题说明:标准指做Folder都要做而且是样的步骤,可以考虑做个模版了:普通 指和做普通Form 样;特殊指做Folder都要做但需要根据实际内容作修改。1.1.1. 什么是 FolderFolder不是Form的标准功能,而是Oracle自己在EBS开发中总结出来的
6、“动态界面”: 不同用户可以根据自己的需要,设置块中哪些字段需要显示以及顺序;而开发人员则 免于被布局折腾的痛苦。对于开发来说,要做的事情就是用“遵循Folder规范”换取“布局零工作量”。1.1.2. 拷贝标准Folder对象标准打开APPSTAND.fmb,把对象组“STANDARD一FOLDER”拖到我们自己的Form 中,并选择“Subclass”而非“Copy”,这个和前面讲的查询块不同。这样会自动产生一系列用于Folder的对象:块、阿布、Lov/记录组、参数、PropertyClasses, Window,这些都不用修改。1.1.3. 引用Folder的PLL库 标准 Alert
7、sB Attached Libr-r1 二x_position?=GET二U:EEW_PROPERTY GDEMO_FdLDER_STACKL VEWFORT_X_POS);1 x position :7_K_poQ it ioni1 widthi0 015 :S康二BLOCK:PROPeAt I DEMO_FOLDER ,BLGCKSCRCLBAR二%R6S,二荒_posi由ion)nd if:注意必须用代码对内容画布进行调整,因为改变窗口大小时,Form不会自动调整。2,在WHEN-NEW-FORM-INSTANCE中追加:app_folder.define_folder_block(ob
8、ject_name= DEMO_FOLDER,f1der_block_name = DEMO_FOLDER, prompt_block_name = DEMO_PROMPT, folder二canvaQiame = DEMO二FOLDER_STACK, folder_window_name = DEMO_FOLDER, disabled_functions = ,tab_canvas_name = , fixed canvas_name = );app_folder.event(INSTANTIATE); show_view(DEMO_FOLDER_CONTENT);第一句是Folder申明,
9、根据参数名给出具体值即可,注意tab.canvas.name,我们不用 Tab页,所以为空。最后一句是因为本例中内容画布上没有可导航的块,所以需要用带码使其显示。1.1.14. 上传&编译&运行运行结果如下:可以调整列宽度和顺序、隐藏或显示列,并可以保存布局;调整窗口大小,Folder会自 动调整适应。代码请见 CUXFLDDEMO.fmb。注,上述触发器代码可以全部组织到个Program Units中。1.2. Folder问题1.2.1. Item隐藏后显示,变成可更新(蔡芳钧)将一个Folder Item (TEXT_ITEM_DISPALYONLY)隐藏后然后再显示,这个Item就 变
10、成了可以更新的字段了。这个问题的原因是继承过来的STANDARD.FOLDER Object是旧版本导致的,所以如果大家在做Folder Form的时候,检查一下这个问题, 如果发现出现以上问题可以删掉Object然后再从服务器下载一个最新的下来继承。1.2.2. Item隐藏后显示,变成不可更新(蔡芳钧)当个Folder Item (TEXT_ITEM)隐藏后再显示,这个Item就变成不可更新了,这个 问题是由于APPFLDR中代前的问题,当隐藏的时候,它对这个Item执行了setjtem一property(promptjd, DISPLAYED, PROPERTY一OFF)执行这个代码的时
11、候, Form中吊帮助说明里有解释,DISPLAYED设为OFF的时候相应也会把UPDATEABLE的属性设为OFF,而执行显示后,set_item_property(prompt_id,DISPLAYED,PROPERTYJDN)并不会相应的把这个Item设为可更新,所以Item就变灰 了。要解决这个问题可以在WHEN-NEW-RECORD-INSTANCE中写下相应对Item控制的 方法(但是如果是多行可能需要点到相应的行上会将该行的Item显示为可更新,否 则都是灰的),也可以在Form级的触发器FOLDER.RETURN_ACTION中对Item进行 逻辑控制,这样就不会出现上面的情况
12、了。1.3. Folder开发步骤(基于模版)这里的模版指汉得提供的TEMPLATE_FOLDER.fmb,文档由赖旭华提供。用FormBuilder打开TEMPLATE_FOLDER.fmb,把名称改为 个有意义的名称,并另 存为相同名称的fmb文件。关闭TEMPLATE_FOLDER.fmb,然后再打开刚保存的文 件进行修改。如下图:ZlJTPLANUPMTNJmb 因口亘JTPRTNWDEF.fmb ZlPTSITMRE2,fmb SPTSITMRE.FmbXI TEMPLATE_FOLDERJmb jTEMPLFLD.fmbFile name: |PTEITMRE|fmbSave as
13、 type: | 表格 门mb)Save取消1.3.2.创建数据块右键Folder数据块,运行数据块向导,来创建一个数据块,取个有意义的名字,如ITEM_RELATIONo 如下图:白兄! ITEM RELATIONE触度器創 PRE-QUERYr S POST-QUERY WHEN-NEW-BLOCK-INSTANCE - 丑 WHEN-NEW-RECORD-INSTANC 福 KEY-PREV-ITEM 0 KEY-NEXT-ITEM Skey-prvrec S KEY-NXTREC 福 KEY-CLRREC Skey-exeqry Skey-entqry S PRE-BLOCK:S PO
14、ST-BLOCK S KEY-CLRBLK Son-insert 眼 ON-UPDATE( Son-lockS ON-DELETE将FOLDER一PROMPT数据块改成一个有意义的名字,如ITMRE一PROMPT,并把 FOLDER一PROMPT数据块中的FIELD1项删除。如下闇:S Si ITMRE.PROMPT触发喜-項电 S3 ITEM_CODE由 58 RELATION_ITEM_CODE S3 RELATION_TYPE_MEANING由岡 QUANTITY 汨 EFFECTIVE_DATE申园 DISABLE_DATE由 3 DESCRIPTION由岡 FOLDER_TITLE由
15、 P FOLDER.OPEN1+1 0 FCH HFD DI IMMY当前记录视觉属性担空”记录间的距离04显示的项数1物理层性、可视的e.a圆布MAIN标筌页空? X轴坐标*a Y轴坐标3.51宽度.254高度.250 G由GS PORDER_BY1ORDER.BY2视觉星性ORDER.BY3视觉属性姐BUTTONJCONIC1.3.4.创建标题块把ITEM_RELATION中需要显示的项设置为在堆叠画布FOLDER-STK中显示,并清空 属性面版里的“提示”属性,然后把物理属性中的X轴坐标和丫轴建标分别设为和0.25o (项的子类属性按实际需要选择即可)白 JI ITEM.RELATION
16、审触发器 一項:$ 园 FOLDER_SWITCHER0 园 CURRENT RECORDJNDICATCITEM.CODERELATION ITEM CODERELATION_TYPE_MEANINGQUANTITYEFFECTIVE.DATEDISABLE DATEDESCRIPTION1可视的Bs画布FOLDER.STKa标签页空。X轴坐标0a Y轴坐标.25?宽度*4o*t*1高度.25、立体凹陥1释放B、显示垂直滚动条是1.3.5.创建标题块把上一步设置的项复制到ITMRE_PROMPT数据块中(按住Ctrl拖动,然后选复制), 并把这些项的类信息设置为FOLDER.PROMPT_M
17、ULTIROW,物理属性中的X轴坐 标和丫轴坐标分别设为和。,然后分别给它们个有意义的初始值。这些项的宽度属性 决定了在上一步设置的项的显示宽度,所以调节显示宽度需要在这个块的项里调。如卜.图:多项选择常規TITLEOPENITEM.CODERELATION JTEM_CODERELATION_TYPE_MEANINGQUANTITYEFFECTIVE DATEDESCRIPTION的园陶的打驹的包ITM触项田由囹囹由由由由国(0;日打开WHEN-NEW-FORM-INSTANCE触发器,加上如下语句:app_folder.define_folder_block(PTSITMRE, ITEM.
18、RELATION, ITMRE-PROMPT, FOLDER-STK, MAIN);app_folder.event(INSTANTIATE);其中app_folder.define_folder_block中的参数含义依次为:Form名,数据块名, PROMPT数据块名,堆妻画布石,主窗口名。六个步骤做下来之后,Folder就完成了。注意:Folder显示的项不需要手动去画布里 调整布局,运行的时候会自动排列开来。横向滚动条会自动产生。1.4. JTFGrid开发步骤本节标题说明:标准指做JTFGrid都要做而且是样的步骤,可以考虑做个模版了:普 通指和做普通Form一样;特殊指做JTFGr
19、id都要做但需要根据实际内容作修改。1.4.1. 什么是 JTFGridJTFGrid不是Form的标准功能,而是Oracle自己在EBS开发中总结出来的“可配置块字 段”:块中有多少字段可以通过专门的界面定义。对于开发来说,要做的事情就是用“遵循JTFGrid规范”换取“增删字段无需修改 Form代码”。1.4.2. 拷贝标准JTF Grid对象 标准1,对象组打.开!TFSTAND.fmb,把对象组“JTF-GRID”拖到我们自己的Form中,并选择 “Subclass”而非Copy”,这个和前面讲的Folder样。这样会自动产生一系列用于JTF.GRID的对象:块、画布、参数、Prope
20、rty Classes、 Window,尤其注意Form级触奖器JTF一GRID一EVENT。这些都不用修改。2、过程从JTFSTAND.fmb拷贝!TF一CUSTOM一GRID-EVENT过程到我们自己的Form中,然后 补上事件处理,暂时全部就ull:PROCEDURE jtf custom gridevent(gridname IN VARCHAR2,eventtype IN VARCHAR2) ISBEGINIF eventtype = jtf grid events, hyperlink event THENNULL;ELSIF eventtype = jtf_grid_events
21、. new record_event THENNULL;ELSIF eventtype = jtf grid events, popup event THENNULL;ELSIF eventtype = jtf_grid_events. row_selection_event THENNULL;ELSIF eventtype = jtf grid events.end of find event THENNULL;ELSIF eventtype = jtf grid events. doubled ick event THEN NULL;END IF;END;1.4.3. 引用JTF Grid
22、的PLL库 标准选中Attached Libraries,点击 “ + ”,选择JTF一GRID.pll,其将自动引用JTFJJTIL、 JTFDEBUGo如果本地没有请先从服务器下载。1.4.4. 创建数据库对象普通创建数据库对象,没有任何特殊之处,可以使用现成的View和Table,本例子使用 gl_je_headers_v,做之前,请确保有总账凭证,不然没有数据;或者你也可以随便换 个有数据的视图,但下面的也子表格定义、触发器代码要注意跟着换.1.4.5. 定义CRM电子表格特殊N: CRM Admins tra tor / Spread table/ Metadata Administ
23、raion输入电子表格名称、源视图、字段定义:1.4.6.创建 Grid 块普通手工创建非数据库块,规范起见,块名后加“GRID”,这里是“DEMO_GRID”。当然了,从Template开始的常规修改步骤也是要做的。1.4.7. 修改Grid块 特殊手工创建非数据库项,并设置这些字段的关键属性:字段名Subclass说明READONLY_GRIDJTF_GRIDTEM必须,名字随便FINDBUTTON可选字段名Subclass说明DETAILBUTTON,二1.4.8. 布局Item到画布 普通把DEMO一GRID布局到画布,什么画布都可以,我们需要设置其在画布的启示位置、 高度、宽度,因为
24、设计时在画布上不容易看到,我们可以直接设置属性。特殊1.4.9. 追加Form级触发器在 WHEN-NE W-FORM-INST ANCE 中追加:IF NOT jtf_grid. getbooleanproperty ( DE.MO_GRID. READONLY. GRID,jtf_ grid_property. initialized) THENjtf grid. init (jtf custom. grid name, GL一JE_HEADERS.V);jtf_grid. setbooleanproperty ( DEMO GRID. READONLY GRID,jtf_grid_pro
25、perty. allow multiple row selection,FALSE);END IF;1.4.10. 编写Find Button触发器 特殊用户点击Find,通常是弹出査询界面,输入完条件再执行查询。我们这里省去貪询条件界而,直接在FIND按钮的WHEN-BUTTON-PRESSED中编 写:jtf grid.removeallbindvariables(,DEMO GRID. READONLY GRID*);-jtf_grid. setbindvariable(*DEMO_GRID. READONLY_GRID, CURRENCY_CODE, CNY);jtf_grid. se
26、tcharproperty(*DEMO GRID. READONLY_GRID,,jt f_gr i d_property. where_clause,CURRENCY CODE二CNY);IF jtf_grid. getbooleanpropertyC DEM0_GRID. READONLY_GRID,jtf_grid_property. is_populated) THENjtf grid, refresh(* DEMO GRID. READONLY_GRID*);ELSEjtf_grid. populate (* DEMO_GRID. READONLY_GRID*);END IF;141
27、1.处理选择事件特殊用户选中某行后,我们可以根据其选中的信息去打开个普通块,这样首先需要在 FIND按钮的 WHEN-BUTTON-PRESSED 中编写:jtf_grid. RequestRowSelectionC DEM0_GRID. READONLY GRID,);可以打开该包查看其具体作用。然后在过程jtf_custom_grid_event中响应选择事件:PROCEDURE jtf_custom_grid_event(gridname IN VARCHAR2,eventtype IN VARCHAR2) ISgrid_selection JTF GRID PROPERTY. ROW
28、SELECTION TYPE;l_startRow number;BEGINIF eventtype = jtf_grid_events. hyper1ink_event THENNULL;ELSIF eventtype = jtf_grid_events. new record_event THENNULL;ELSIF eventtype = jtf grid events.popup event THENNULL;ELSIF eventtype = jtf_grid_events. row_selection_event THENgrid_selection := jtf_grid. Ge
29、tRowSelection(* DEMO GRID. READONLY GRID*);if grid_selection. COUNT 0 thenl_startRow := grid_selection(l). startRow;fnd_message. debug(jtf grid. GetColumnCharValue(, DEMO GRID. READONLY GRID*, I startRow, NAME);-Do any thing hereEND IF;ELSIF eventtype 二 jtf grid events, end of find event THENNULL;EL
30、SIF eventtype = jtf_grid_events. doubled ick event THENnull;END IF;END;问题:如何响应双击事件呢?1.4.12.上传&编译&运行运行结果如下:代码请见 CUXJTFDEMO.fmb。注,上述触发器代码通常全部组织到一个名字为“JTFJZUSTOM” tfjProgram Units 中,这样就可以定义个变量GRID_NAME来保存字段名,免得每处代码重复写 DEMO_GRID. READONLY一GRID 0如果要使Window变化时Grid跟着变,那么需要参考Folder的做法,在WHEN- WINDOW-RESIZED触发器中调整画布大小、Grid的大小2.多语言开发2.1. 国际化支持2.1.1. 说明EBS的国际化支持,也叫多语言支持,包含多个层面:1、数据库级别: