Oracle+EBS+s开发指南(中级).doc_第1页
Oracle+EBS+s开发指南(中级).doc_第2页
Oracle+EBS+s开发指南(中级).doc_第3页
Oracle+EBS+s开发指南(中级).doc_第4页
Oracle+EBS+s开发指南(中级).doc_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Doc Ref: 信息技术最佳实践二月 21, 2009信息技术最佳实践ORACLE核心应用技术E-Business SuiteForms开发指南Author:黄建华Creation Date:October 16, 2006Last Updated:二月 21, 2009Document Ref: Version:DRAFT 1AApprovals: Copy Number_Document ControlChange Record4DateAuthorVersionChange Reference16-Oct-06Jianhua.HuangDraft 1aNo Previous DocumentReviewersNamePositionDistributionCopy 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, please write your name on the front cover, for document control purposes.ContentsDocument Controlii1.Folder、JTF Grid21.1.Folder开发步骤(从头开始)21.2.Folder问题71.3.Folder开发步骤(基于模版)71.4.JTF Grid开发步骤102.多语言开发142.1.国际化支持142.2.Form自身的多语言版本142.3.数据多语言开发步骤142.4.EBS启用新语言时的考虑223.附件开发243.1.关于附件243.2.标准附件设置244.Javabean294.1.Form与Java294.2.例子:Hello World314.3.例子:执行PC本地命令344.4.例子:读取PC文本文件374.5.例子:通用导入405.Form个性化415.1.Form个性化概述415.2.例子:修改字段Prompt425.3.例子:有条件显示消息435.4.例子:调用数据库Package445.5.例子:添加菜单445.6.例子:打开功能455.7.例子:执行查询465.8.例子:其他应用475.9.例子:Instance间迁移486.技巧、常用代码496.1.Form中的变量496.2.初始值、格式掩码496.3.消息处理506.4.Special菜单506.5.库存组织访问506.6.MFG_ORGANIZATION_ID相关问题516.7.常用内置过程526.8.待续527.Open and Closed Issues for this Deliverable53Open Issues53Closed Issues53Open and Closed Issues for this Deliverable 53Forms开发指南File Ref: F26516afe5064f5d1006ea76f22904a0.pdf (v. DRAFT 1A )Company Confidential - For internal use only1. Folder、JTF Grid1.1. Folder开发步骤(从头开始)本节标题说明:标准指做Folder都要做而且是一样的步骤,可以考虑做个模版了;普通指和做普通Form一样;特殊指做Folder都要做但需要根据实际内容作修改。1.1.1. 什么是FolderFolder不是Form的标准功能,而是Oracle自己在EBS开发中总结出来的“动态界面”:不同用户可以根据自己的需要,设置块中哪些字段需要显示以及顺序;而开发人员则免于被布局折腾的痛苦。对于开发来说,要做的事情就是用“遵循Folder规范”换取“布局零工作量”。1.1.2. 拷贝标准Folder对象标准打开APPSTAND.fmb,把对象组“STANDARD_FOLDER”拖到我们自己的Form中,并选择“Subclass”而非“Copy”,这个和前面讲的查询块不同。这样会自动产生一系列用于Folder的对象:块、画布、Lov/记录组、参数、Property Classes、Window,这些都不用修改。1.1.3. 引用Folder的PLL库标准选中Attached Libraries,点击“+”,选择APPFLDR.pll,如果本地没有请先从服务器下载。点击Attach后选择“Yes”移除绝对路径。1.1.4. 创建数据库对象普通创建数据库对象,没有任何特殊之处:- Create tablecreate table SCF.CUX_FLODER_DEMO( FLODER_DEMO_ID NUMBER not null, NUMBER_FIELD1 NUMBER not null, NUMBER_FIELD2 NUMBER, NUMBER_FIELD3 NUMBER, NUMBER_FIELD4 NUMBER, DATE_FIELD1 DATE NOT NULL, DATE_FIELD2 DATE, VARCHAR2_FIELD1 VARCHAR2(100) NOT NULL, VARCHAR2_FIELD2 VARCHAR2(100), VARCHAR2_FIELD3 VARCHAR2(100), VARCHAR2_FIELD4 VARCHAR2(100), VARCHAR2_FIELD5 VARCHAR2(100), VARCHAR2_FIELD6 VARCHAR2(100), CREATION_DATE DATE not null, CREATED_BY NUMBER not null, LAST_UPDATED_BY NUMBER not null, LAST_UPDATE_DATE DATE not null, LAST_UPDATE_LOGIN NUMBER, ATTRIBUTE_CATEGORY VARCHAR2(30), ATTRIBUTE1 VARCHAR2(240), ATTRIBUTE2 VARCHAR2(240), ATTRIBUTE3 VARCHAR2(240), ATTRIBUTE4 VARCHAR2(240), ATTRIBUTE5 VARCHAR2(240), ATTRIBUTE6 VARCHAR2(240), ATTRIBUTE7 VARCHAR2(240), ATTRIBUTE8 VARCHAR2(240), ATTRIBUTE9 VARCHAR2(240), ATTRIBUTE10 VARCHAR2(240), ATTRIBUTE11 VARCHAR2(240), ATTRIBUTE12 VARCHAR2(240), ATTRIBUTE13 VARCHAR2(240), ATTRIBUTE14 VARCHAR2(240), ATTRIBUTE15 VARCHAR2(240)tablespace SCF;- Create/Recreate indexes create unique index SCF.CUX_FLODER_DEMO_U1 on SCF.CUX_FLODER_DEMO (FLODER_DEMO_ID) tablespace SCF; - Create/Recreate sequenceCREATE SEQUENCE SCF.CUX_FLODER_DEMO_S;- Create/Recreate synonumCREATE SYNONYM CUX_FLODER_DEMO_S FOR scf.CUX_FLODER_DEMO_S;CREATE SYNONYM CUX_FLODER_DEMO FOR scf.CUX_FLODER_DEMO;1.1.5. 创建Folder块普通按照普通步骤创建数据块,包括块和字段的子类、LOV、On-XXX触发器、行指示符等等,如果有弹性域,那么也需要DF字段和相关的触发器。当然了,从Template开始的常规修改步骤也是要做的。为规范起见,块名后加“FOLDER”,这里是“DEMO_FOLDER”,这种数据块我们叫“Folder块”。1.1.6. 修改Folder块标准1、 创建SWITCHER字段手工添加字段,名字叫FOLDER_SWITCHER,子类为SWITCHER:并编写触发器WHEN-NEW-ITEM-INSTANCE:app_folder_move_cursor(1);2、 编写触发器需要编写如下触发器:WHEN-NEW-RECORD-INSTANCEWHEN-NEW-BLOCK-INSTANCEPRE-QUERYPOST-QUERYPRE-BLOCKPOST-BLOCKKEY-ENTQRYKEY-EXEQRYKEY-PREV-ITEMKEY-NEXT-ITEMKEY-PRVRECKEY-NXTRECKEY-CLRRECKEY-CLRBLK这些触发器的内容都是app_folder.event(触发器名称);1.1.7. 创建Prompt块标准手工创建非数据库块,子类仍为Block,为规范起见,块名后加“PROMPT”,这里是“DEMO_PROMPT”,这种数据块我们叫“Prompt块”。手工创建6个标准Item,名字和子类必须同下表:NameSubclassFOLDER_TITLEDYNAMIC_TITLEFOLDER_OPENFOLDER_OPENFOLDER_DUMMYFOLDER_DUMMYORDER_BY1FOLDER_ORDERBYORDER_BY2FOLDER_ORDERBYORDER_BY3FOLDER_ORDERBY1.1.8. 修改Prompt块和Folder块特殊“Folder块”有多少字段要显示,就需要在“Prompt块”创建多少同名字段(除了SWITCHER字段、行指示符、DF字段,前者是Folder的特殊字段,后两者通常需要固定在内容画布上),并设置这些字段的关键属性:属性值SubclassFOLDER_PROMPT_MULTIROWInitial Value字段的PromptWidth字段的宽度,根据实际需要调整Prompt注:清空对“Folder块”的字段,也需要清空Prompt属性。1.1.9. 理解Folder自动布局原理到这里,我们先理解下Folder是如何自动布局的:1、 需要使用Folder功能的字段必须放在堆叠画布上,Folder功能仅自动布局堆叠画布宽度和在其上的字段顺序。2、 放在内容画布上的所有对象,包括堆叠画布自身在内容画布上的起始位置,需要我们和以前一样手工调整布局;只要布局得当,一个Windows上可以有多个Folder。3、 自动布局的堆叠画布宽度 = 内容画布宽度 堆叠画布的X座标 0.26,这个0.26啊,正好可以让我们放垂直滚动条!此外,堆叠画布高度也会被自动调整,调整时系统自动回算上水平滚动条的位置!4、 最终界面的字段顺序由Prompt块字段的顺序决定,那么Folder块的字段在界面的排列顺序如何自动和Prompt对应起来呢?原来系统是根据字段名!5、 最终界面Tab键导航的顺序仍然由Folder块字段的顺序决定,所以设计时注意两者要一致。6、 系统并不自动决定字段的Y轴位置!Y轴位置由字段自身属性决定,所以需要手工设置,通常Prompt块的为0,Folder块的为0.25,即等于Prompt块的Item的高度。7、 为操作方便,也为了标准化,通常需要放个文件夹按钮在内容画布的左上角,这个就是Folder_Open字段。1.1.10. 创建堆叠画布、内容画布、窗口普通Floder要求字段放置在堆叠画布上,为规范起见,画布名后加“FOLDER_STACK”,View和Canvas的宽度无所谓,运行时将自定根据窗口的大小调整,右边正好会留出滚动条的位置。另外,为规范起见,内容画布后也可加“FOLDER_CONTENT”。设置这两个画布的子类,并设置它们的Windows属性相同。1.1.11. 布局Item到画布特殊设置如下Item到画布:1、 把FOLDER_OPEN、FOLDER_DUMMY、行指示符、Folder块的垂直滚动条,都设到内容画布上,并设计它们的位置。Folder_Open按照其子类默认值即可:X为0.1、Y为0。行指示符X我们改为0.1、Y改为0.5。垂直滚动条的Y为0.5,X则需要在Window的Resize事件中设置,还记得那个0.26吗?2、 这样,堆叠画布在内容画布上的位置,应该就是X为0.2,Y为0.25,想想为什么。同时启用堆叠画布的水平滚动条。3、 Folder块的SWITCHER字段设置到堆叠画布。4、 Folder块的其他需要显示的字段都设置到堆叠画布,并且Y座标为0.25。5、 Prompt块的其他字段全部设置到堆叠画布,并且Y座标为0。注:FOLDER_TITLE字段不知道是干什么的,其宽度设为0。1.1.12. 追加Form级触发器标准在FOLDER_ACTION中追加:app_folder.event(:global.folder_action);在KEY-CLRFRM中追加:app_folder.event(KEY-CLRFRM);1.1.13. 追加Form级触发器特殊1、 在WHEN-WINDOW-RESIZED中追加:if :system.event_window in (DEMO_FOLDER) then app_folder.event(WHEN-WINDOW-RESIZED);end if;declarel_x_position number;l_width number;beginif :system.event_window in (DEMO_FOLDER) then app_folder.event(WHEN-WINDOW-RESIZED); l_width:=GET_VIEW_PROPERTY(DEMO_FOLDER_CONTENT,WIDTH); SET_CANVAS_PROPERTY(DEMO_FOLDER_CONTENT,WIDTH,l_width); l_width:=GET_VIEW_PROPERTY(DEMO_FOLDER_STACK,WIDTH); l_x_position:=GET_VIEW_PROPERTY(DEMO_FOLDER_STACK,VIEWPORT_X_POS); l_x_position:=l_x_position + l_width + 0.015; SET_BLOCK_PROPERTY(DEMO_FOLDER,BLOCKSCROLLBAR_X_POS,l_x_position); end if;end;注意必须用代码对内容画布进行调整,因为改变窗口大小时,Form不会自动调整。2、 在WHEN-NEW-FORM-INSTANCE中追加:app_folder.define_folder_block(object_name = DEMO_FOLDER, folder_block_name = DEMO_FOLDER, prompt_block_name = DEMO_PROMPT, folder_canvas_name = 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申明,根据参数名给出具体值即可,注意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就变成了可以更新的字段了。这个问题的原因是继承过来的STANDARD_FOLDER Object是旧版本导致的,所以如果大家在做Folder Form的时候,检查一下这个问题,如果发现出现以上问题可以删掉Object然后再从服务器下载一个最新的下来继承。1.2.2. Item隐藏后显示,变成不可更新(蔡芳钧)当一个Folder Item(TEXT_ITEM)隐藏后再显示,这个Item就变成不可更新了,这个问题是由于APPFLDR中代码的问题,当隐藏的时候,它对这个Item执行了set_item_property(prompt_id, DISPLAYED, PROPERTY_OFF)执行这个代码的时候,Form中的帮助说明里有解释,DISPLAYED设为OFF的时候相应也会把UPDATEABLE的属性设为OFF,而执行显示后,set_item_property(prompt_id, DISPLAYED,PROPERTY_ON)并不会相应的把这个Item设为可更新,所以Item就变灰了。要解决这个问题可以在WHEN-NEW-RECORD-INSTANCE中写下相应对Item控制的方法(但是如果是多行可能需要点到相应的行上才会将该行的Item显示为可更新,否则都是灰的),也可以在Form级的触发器FOLDER_RETURN_ACTION中对Item进行逻辑控制,这样就不会出现上面的情况了。1.3. Folder开发步骤(基于模版)这里的模版指汉得提供的TEMPLATE_FOLDER.fmb,文档由赖旭华提供。1.3.1. 基于模版新建Form用Form Builder打开TEMPLATE_FOLDER.fmb,把名称改为一个有意义的名称,并另存为相同名称的fmb文件。关闭TEMPLATE_FOLDER.fmb,然后再打开刚才保存的文件进行修改。如下图:1.3.2. 创建数据块右键Folder数据块,运行数据块向导,来创建一个数据块,取一个有意义的名字,如ITEM_RELATION。如下图:1.3.3. 创建标题块将FOLDER_PROMPT数据块改成一个有意义的名字,如ITMRE_PROMPT,并把FOLDER_PROMPT数据块中的FIELD1项删除。如下图:1.3.4. 创建标题块把ITEM_RELATION中需要显示的项设置为在堆叠画布FOLDER_STK中显示,并清空属性面板里的“提示”属性,然后把物理属性中的X轴坐标和Y轴坐标分别设为0和0.25。(项的子类属性按实际需要选择即可)1.3.5. 创建标题块把上一步设置的项复制到ITMRE_PROMPT数据块中(按住Ctrl拖动,然后选复制),并把这些项的子类信息设置为FOLDER_PROMPT_MULTIROW,物理属性中的X轴坐标和Y轴坐标分别设为0和0,然后分别给它们一个有意义的初始值。这些项的宽度属性决定了在上一步设置的项的显示宽度,所以调节显示宽度需要在这个块的项里调。如下图:1.3.6. 更改触发器打开WHEN-NEW-FORM-INSTANCE触发器,加上如下语句:app_folder.define_folder_block(PTSITMRE, ITEM_RELATION, ITMRE_PROMPT, FOLDER_STK, MAIN);app_folder.event(INSTANTIATE); 其中app_folder.define_folder_block中的参数含义依次为:Form名,数据块名,PROMPT数据块名,堆叠画布名,主窗口名。 六个步骤做下来之后,Folder就完成了。注意:Folder显示的项不需要手动去画布里调整布局,运行的时候会自动排列开来。横向滚动条会自动产生。1.4. JTF Grid开发步骤本节标题说明:标准指做JTF Grid都要做而且是一样的步骤,可以考虑做个模版了;普通指和做普通Form一样;特殊指做JTF Grid都要做但需要根据实际内容作修改。1.4.1. 什么是JTF GridJTF Grid不是Form的标准功能,而是Oracle自己在EBS开发中总结出来的“可配置块字段”:块中有多少字段可以通过专门的界面定义。对于开发来说,要做的事情就是用“遵循JTF Grid规范”换取“增删字段无需修改Form代码”。1.4.2. 拷贝标准JTF Grid对象标准1、 对象组打开JTFSTAND.fmb,把对象组“JTF_GRID”拖到我们自己的Form中,并选择“Subclass”而非“Copy”,这个和前面讲的Folder一样。这样会自动产生一系列用于JTF_GRID的对象:块、画布、参数、Property Classes、Window,尤其注意Form级触发器JTF_GRID_EVENT。这些都不用修改。2、 过程从JTFSTAND.fmb拷贝JTF_CUSTOM_GRID_EVENT过程到我们自己的Form中,然后补上事件处理,暂时全部放null:PROCEDURE jtf_custom_grid_event(gridname IN VARCHAR2, eventtype IN VARCHAR2) ISBEGIN IF eventtype = jtf_grid_events.hyperlink_event THEN NULL; ELSIF eventtype = jtf_grid_events.new_record_event THEN NULL; ELSIF eventtype = jtf_grid_events.popup_event THEN NULL; ELSIF eventtype = jtf_grid_events.row_selection_event THEN NULL; ELSIF eventtype = jtf_grid_events.end_of_find_event THEN NULL; ELSIF eventtype = jtf_grid_events.doubleclick_event THEN NULL; END IF;END;1.4.3. 引用JTF Grid的PLL库标准选中Attached Libraries,点击“+”,选择JTF_GRID.pll,其将自动引用JTF_UTIL、JTFDEBUG。如果本地没有请先从服务器下载。1.4.4. 创建数据库对象普通创建数据库对象,没有任何特殊之处,可以使用现成的View和Table,本例子使用gl_je_headers_v。做之前,请确保有总账凭证,不然没有数据;或者你也可以随便换个有数据的视图,但下面的电子表格定义、触发器代码要注意跟着换。1.4.5. 定义CRM电子表格特殊N: CRM Adminstrator/Spreadtable/Metadata Administraion输入电子表格名称、源视图、字段定义:1.4.6. 创建Grid块普通手工创建非数据库块,规范起见,块名后加“GRID”,这里是“DEMO_GRID”。当然了,从Template开始的常规修改步骤也是要做的。1.4.7. 修改Grid块特殊手工创建非数据库项,并设置这些字段的关键属性:字段名Subclass说明READONLY_GRIDJTF_GRID_ITEM必须,名字随便FINDBUTTON可选DETAILBUTTON可选1.4.8. 布局Item到画布普通把DEMO_GRID布局到画布,什么画布都可以,我们需要设置其在画布的启示位置、高度、宽度,因为设计时在画布上不容易看到,我们可以直接设置属性。1.4.9. 追加Form级触发器特殊在WHEN-NEW-FORM-INSTANCE中追加:IF NOT jtf_grid.getbooleanproperty(DEMO_GRID.READONLY_GRID, jtf_grid_property.initialized) THEN jtf_grid.init(jtf_custom.grid_name, GL_JE_HEADERS_V); jtf_grid.setbooleanproperty(DEMO_GRID.READONLY_GRID, jtf_grid_property.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.setcharproperty(DEMO_GRID.READONLY_GRID, jtf_grid_property.where_clause, CURRENCY_CODE=CNY);IF jtf_grid.getbooleanproperty(DEMO_GRID.READONLY_GRID, jtf_grid_property.is_populated) THEN jtf_grid.refresh(DEMO_GRID.READONLY_GRID);ELSE jtf_grid.populate(DEMO_GRID.READONLY_GRID);END IF;1.4.11. 处理选择事件特殊用户选中某行后,我们可以根据其选中的信息去打开一个普通块,这样首先需要在FIND按钮的WHEN-BUTTON-PRESSED中编写:jtf_grid.RequestRowSelection(DEMO_GRID.READONLY_GRID);可以打开该包查看其具体作用。然后在过程jtf_custom_grid_event中响应选择事件:PROCEDURE jtf_custom_grid_event(gridname IN VARCHAR2, eventtype IN VARCHAR2) IS grid_selection JTF_GRID_PROPERTY.ROW_SELECTION_TYPE; l_startRow number;BEGIN IF eventtype = jtf_grid_events.hyperlink_event THEN NULL; ELSIF eventtype = jtf_grid_events.new_record_event THEN NULL; ELSIF eventtype = jtf_grid_events.popup_event THEN NULL; ELSIF eventtype = jtf_grid_events.row_selection_event THEN grid_selection := jtf_grid.GetRowSelection(DEMO_GRID.READONLY_GRID); if grid_selection.COUNT 0 then l_startRow := grid_selection(1).startRow; fnd_message.debug(jtf_grid.GetColumnCharValue(DEMO_GRID.READONLY_GRID, l_startRow, NAME); -Do any thing here END IF; ELSIF eventtype = jtf_grid_events.end_of_find_event THEN NULL; ELSIF eventtype = jtf_grid_events.doubleclick_event THENnull; END IF;END;问题:如何响应双击事件呢?1.4.12. 上传&编译&运行运行结果如下:代码请见CUXJTFDEMO.fmb。注,上述触发器代码通常全部组织到一个名字为“JTF_CUSTOM”的Program Units中,这样就可以定义一个变量GRID_NAME来保存字段名,免得每处代码重复写DEMO_GRID.READONLY_GRID。如果要使Window变化时Grid跟着变,那么需要参考Folder的做法,在WHEN-WINDOW-RESIZED触发器中调整画布大小、Grid的大小。2. 多语言开发2.1. 国际化支持2.1.1. 说明EBS的国际化支持,也叫多语言支持,包含多个层面:1、 数据库级别:字符集支持多国语言,如UTF8支持全球所有语言2、 数据级别:采用_B表+_TL表+ENV(LANG)环境变量+_VL表+“小地球”来实现3、 消息级别:所有消息,通过分语种维护的消息字典获取4、 文件级别:采用分语种目录的形式来实现Forms、Reports的国际化支持2.2. Form自身的多语言版本EBS时运行时“找fmx文件”,实际上是根据用户登录时选择的语言,首先到$_TOP/forms/下找fmx文件,如果没有则继续在$_TOP/forms/US下找。也就是说,需要我们维护不同语言的Form编译到不同的目录。不过Oracle提供了工具“Oracle Translation Builder (OTB)”,可以将多个语言的字符串保存入1个fmb文件,这样在设计时根据NLS_LANG 自动显示该语言的内容,编译时、运行时也是同样道理。更多多语言方面的转换,请参考Note:372952.1“Customer Translations”。2.3. 数据多语言开发步骤要求熟练掌握基于Template、基于View的开发过程;要求熟悉EBS中“小地球”的操作。下面结合例子直接说明开发步骤和注意点,假定只有2个字段,1个需要维护多语言信息,不考虑弹性域字段。2.3.1. 数据库对象的要求:基表B没有什么特殊之处:create table SCF.CUX_MULTILINGUAL_DEMO_B( MULTILINGUAL_DEMO_ID NUMBER not null, MULTILINGUAL_DEMO_CODE VARCHAR2(30) not null, CREATED_BY NUMBER(15) not null, CREATION_DATE DATE not null, LAST_UPDATED_BY NUMBER(15) not null, LAST_UPDATE_DATE DATE not null, LAST_UPDATE_LOGIN NUMBER(15);create unique index SCF.CUX_MULTILINGUAL_DEMO_B_U1 on SCF.CUX_MULTILINGUAL_DEMO_B (MULTILINGUAL_DEMO_ID);Create Sequence SCF.CUX_MULTILINGUAL_DEMO_B_S;Create Synonym CUX_MULTILINGUAL_DEMO_B For scf.CUX_MULTILINGUAL_DEMO_B;Create Synonym CUX_MULTILINGUAL_DEMO_B_S For scf.CUX_MULTILINGUAL_DEMO_B_S;2.3.2. 数据库对象的要求:多语言表TL主键字段:基表主键+LANGUAGE。其他字段:需要维护多语言的字段+Who字段+SOURCE_LANG。create table SCF.CUX_MULTILINGUAL_DEMO_TL( MULTILINGUAL_DEMO_ID NUMBER not null, DESCRIPTION VARCHAR2(255), LANGUAGE VARCHAR2(4) not null, CREATED_BY NUMBER(15) not null, CREATION_DATE DATE not null, LAST_UPDATED_BY NUMBER(15) not null, LAST_UPDATE_DATE DATE not null, LAST_UPDATE_LOGIN NUMBER(15), SOURCE_LANG VARCHAR2(4) not null);create unique index SCF.CUX_MULTILINGUAL_DEMO_TL_U1 on SCF.CUX_MULTILINGUAL_DEMO_TL(MULTILINGUAL_DEMO_ID, LANGUAGE);Create Synonym CUX_MULTILINGUAL_DEMO_TL For scf.CUX_MULTILINGUAL_DEMO_TL;2.3.3. 数据库对象的要求:视图VL该视图根据登录用户的语言过滤数据:Create Or Replace View CUX_MULTILINGUAL_DEMO_VL AsSELECT b.ROWID row_id, b.multilingual_demo_id, b.multilingual_demo_code, t.description, b.created_by, b.creation_date, b.last_updated_by, b.last_update_date, b.last_update_login FROM scf.cux_multilingual_demo_b b, scf.cux_multilingual_demo_tl t WHERE b.multilingual_demo_id = t.multilingual_demo_id AND t.LANGUAGE = userenv(LANG);2.3.4. 数据库对象的要求:表操作API需要同时操作TL表,同时提供a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论