深入浅出Oracle之Forms开发指南

更新时间:2023-04-08 06:37:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Oracle ERP最佳技术实践

E-B USINESS S UITE

O RACLE核心应用技术

Forms开发指南

Author: 黄建华

Creation Date: October 16, 2006

Last Updated: August 13, 2014

Document Ref:

Version: DRAFT 1A

Approvals:

Copy Number _____

Oracle ERP最佳技术实践

Forms开发指南

File Ref: 228265142.doc (v. DRAFT 1A )

Company Confidential - For internal use only Doc Ref:

December 13, 2012

Document Control ii

Document Control

Change Record

Reviewers

Distribution

Note 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.

Oracle ERP最佳技术实践

Forms开发指南

File Ref: 228265142.doc (v. DRAFT 1A )

Company Confidential - For internal use only Doc Ref:

December 13, 2012

Document Control iii

Contents

Document Control .................................................................................................................. i i 1.开发背景与基础 (2)

1.1.读者基础要求 (2)

1.2.用户和常用工具 (2)

1.3.AOL开发框架 (2)

1.4.多组织支持 (6)

1.5.主要实例 (6)

2.基于EBS的Forms开发过程 (8)

2.1.Form文件类型 (8)

2.2.Forms Builder安装 (8)

2.3.下载Template相关文件 (12)

2.4.一个简单的例子.创建数据库对象 (14)

2.5.一个简单的例子.从模版开始设计 (25)

2.6.一个简单的例子.编写数据操作触发器 (32)

2.7.一个简单的例子.上传&编译 (37)

2.8.一个简单的例子.在EBS中注册运行 (37)

3.参数、List、LOV、字段和记录控制、日历 (40)

3.1.例子:Parameter参数 (40)

3.2.例子:List值列表 (41)

3.3.例子:LOV窗口式值列表 (42)

3.4.例子:字段和记录控制 (44)

3.5.例子:日历 (45)

3.6.上传&编译&运行 (46)

4.行指示符、主从块、滚动条、Stacked&Tab画布、多行文本 (47)

4.1.例子:销售订单行 (47)

4.2.例子:Master-Detail主从块 (49)

4.3.例子:滚动条 (51)

4.4.例子:Stacked画布 (52)

4.5.画布小结 (57)

4.6.例子:Tab画布 (59)

4.7.例子:控制Tab画布 (61)

4.8.例子:多行文本框 (63)

5.Lov查询、块查询、Button (64)

5.1.查询原理 (64)

5.2.例子:Lov查询 (64)

5.3.例子:块查询 (66)

Oracle ERP最佳技术实践

Forms开发指南

File Ref: 228265142.doc (v. DRAFT 1A )

Company Confidential - For internal use only Doc Ref:

December 13, 2012

Document Control iv

5.4.例子:Button (68)

6.触发器层次关系、常用触发器编写规范 (69)

6.1.理解层次关系 (69)

6.2.触发器原理 (69)

6.3.基于EBS模版开发的触发器 (70)

6.4.一些触发器的理解 (71)

7.描述性弹性域、Key弹性域、Key弹性域查询 (73)

7.1.描述性弹性域开发步骤 (73)

7.2.Key弹性域开发步骤 (76)

8.Folder、JTF Grid (79)

8.1.Folder开发步骤(从头开始) (79)

8.2.Folder问题 (84)

8.3.Folder开发步骤(基于模版) (84)

8.4.JTF Grid开发步骤 (87)

9.多语言开发 (91)

9.1.国际化支持 (91)

9.2.Form自身的多语言版本 (91)

9.3.数据多语言开发步骤 (91)

9.4.EBS启用新语言时的考虑 (99)

10.附件开发 (101)

10.1.关于附件 (101)

10.2.标准附件设置 (101)

11.Javabean (106)

11.1.Form与Java (106)

11.2.例子:Hello World (108)

11.3.例子:执行PC本地命令 (111)

11.4.例子:读取PC文本文件 (114)

11.5.例子:CSV通用导入 (117)

12.Form个性化 (121)

12.1.Form个性化原理 (121)

12.2.例子:修改字段Prompt (122)

12.3.例子:有条件显示消息 (123)

12.4.例子:调用数据库Package (124)

12.5.例子:添加菜单 (124)

12.6.例子:打开功能 (125)

12.7.例子:执行查询 (126)

12.8.例子:Instance间迁移 (128)

13.技巧、常用代码 (129)

13.1.Form中的变量 (129)

13.2.初始值、格式掩码 (129)

13.3.消息处理 (130)

13.4.Special菜单 (130)

13.5.库存组织访问 (130)

13.6.MFG_ORGANIZATION_ID相关问题 (131)

13.7.常用内置过程 (132)

13.8.待续 (132)

Oracle ERP最佳技术实践

Forms开发指南

File Ref: 228265142.doc (v. DRAFT 1A )

Company Confidential - For internal use only Doc Ref:

December 13, 2012

Document Control v

附录:我开始学习Form时的笔记1,仅供参考,未必100%正确 (133)

附录:我开始学习Form时的笔记2,仅供参考,未必100%正确 (136)

14.Open and Closed Issues for this Deliverable (139)

Open Issues (139)

Closed Issues (139)

Oracle ERP最佳技术实践

Forms开发指南

File Ref: 228265142.doc (v. DRAFT 1A )

Company Confidential - For internal use only Doc Ref:

December 13, 2012

开发背景与基础 2 of 143

1.开发背景与基础

1.1.读者基础要求

1、有EBS的使用经验,尤其是Form的使用经验

2、创建客户化应用,参考《深入浅出Oracle EBS之全模块设置详例》第一章节

3、熟悉PL/SQL

4、熟悉Telnet和FTP工具,熟悉Windows常规操作

5、理解或开发过数据库应用系统

6、有Form开发经验则更佳

1.2.用户和常用工具

1.2.1.区分3类用户

1、OS用户:包括超级用户root,应用OS用户如applprod,数据库OS用户如

oraprod。后两个用户具体由dba安装环境时创建,名字不定。

2、数据库用户:包括内置管理用户sys、system,EBS用户apps,EBS各模块用户

applsys、gl、inv、po、ar、ap等等,EBS网关用户applsyspub。

3、EBS用户:也叫OA用户、应用用户、ERP用户,包括默认超级用户sysadmin,其

他内置用户(参见《深入浅出Oracle EBS之安全机制探索》),企业实施、使用过

程中创建的用户。

1.2.2.Form开发使用的用户和工具

Forms开发过程中需要具体使用如下3个用户。

1、应用OS用户:用telnet工具如SecureCRT登录服务器,获得各$XXX_TOP的具体

路径、编译form和pll;用FTP如cuteftp连接服务器,下载必要文件、上传开发的

form。

2、APPS:用PL/SQL Developer登录数据库,创建各类数据库对象。

3、sysadmin或者拥有应用开发员和系统管理员职责的等价用户:注册form等各AOL

对象、测试form。

1.3.AOL开发框架

1.3.1.再说Navigator

Forms自身菜单其实和传统菜单一样:

Oracle ERP 最佳技术实践

Forms 开发指南

File Ref: 228265142.doc (v. DRAFT 1A ) Company Confidential - For internal use only Doc Ref: December 13, 2012 开发背景与基础

3 of 143

然而EBS 中基本摒弃Forms 自身的菜单功能,而是专门开发了一个Navigator 界面,采用树形结构显示菜单,每个菜单项对应一个Forms :

这里的菜单是可随意组织的,因此非常灵活,而不用如传统菜单那样要么写死要么用代码控制。 实际上,该方式完成了EBS 最主要的安全性控制——功能安全性,为什么这么说呢? 1.3.2. AOL 开发框架:EBS 功能安全性基本原理 这里仅说明Forms 部分,其他的可参考《深入浅出Oracle EBS 之安全机制探索》。 安全性最终都要落实到“用户”身上,即某一用户是否具有某一权限;功能安全性的核心就是某一用户是否具有运行某一个Forms 的权限。 为了方便管理,分类维护,EBS 在“用户”和“Forms ”之间加了几个层次。考察如下过程: 1、 “用户”如sysadmin 登录,系统验证其用户名/密码 2、 如果OK ,系统列出其拥有的所有角色,在EBS 中叫“职责”(Responsibility ),而每个职责,都对应一个定义好的“菜单” 3、 当用户选择相应的职责进入“Navigator ”后,显示的就是此菜单的内容 4、 每个底层菜单项,还不是直接对应Forms ,而是先对应一个“功能”(Function ),由功能再去对应一个具体的“Forms ”。这里的好处是,在功能上可以定义参数比如查询条件、控制码等,然后传递给Forms ,当然大部分情况是不定义参数,所以功能和Forms 基本上是一一对应关系 5、 用户点击菜单项,到定义Forms 时指定的应用的TOP 下,找到“fmx 文件”执行之

Oracle ERP最佳技术实践

Forms开发指南

File Ref: 228265142.doc (v. DRAFT 1A )

Company Confidential - For internal use only Doc Ref:

December 13, 2012

开发背景与基础 4 of 143

所以,反过来,如果我们开发好一个Forms,要在EBS中跑起来,完整的过程就是为该“Forms”定义“功能”,定义“菜单”调用该功能,定义“职责”使用该菜单,最后把职责分配给“用户”等一系列无Coding的定义工作。

1.3.3.Template.fmb

专业的软件系统,其操作方式、界面风格总是非常统一,即便是后来收购集成进来的模块,经过调整优化后,风格也基本一致。那么如何才能做到统一呢?一是依赖于规范文档,大家老老实实照标准开发;二是采用更加直接有效的办法——模版。

Oracle EBS的Forms,基本上都是从Template.fmb开始,该模版预先定义了:

1、各种界面元素的属性集——子类

2、常用的控件——日历、进度条

3、一系列Form级触发器,统一处理各种未被明确处理的事件

4、丰富的PLL库函数,大大超越了Forms Builder内置的函数

所以,我们基于EBS的开发,当然也是从Template.fmb开始

1.3.4.EBS文件系统

EBS文件系统,指其以怎样的目录结构组织各种可执行文件、命令文件、配置文件的。从整个EBS的角度看,分DB、APP两部分、五个大目录:

其中COMN目录(对应环境变量$COMMON_TOP)存放服务启停脚本和基于HTML 的应用文件(Java类、JSP页等):

Oracle ERP 最佳技术实践

Forms 开发指南

File Ref: 228265142.doc (v. DRAFT 1A ) Company Confidential - For internal use only Doc Ref: December 13, 2012 开发背景与基础

5 of 143

APPL (对应环境变量$APPL_TOP )则存放配置文件、各种管理脚本、各模块应用代码:

APPL 下的各个应用模块目录,则是本次介绍的主角了:

AU 模块存放fmb 、pll 、plx 文件、各应用模块存放fmx 文件,具体是: $AU_TOP/resource : pll 文件、plx 文件 $AU_TOP/forms/US : 英文fmb 文件 $AU_TOP/forms/<语言代码>: 特定语种(如ZHS )的fmb 文件 $<应用简称>_TOP/forms/US : 各模块英文fmx 文件录 $<应用简称>_TOP/forms/<语言代码>: 特定语种(如ZHS )fmb 文件

Oracle ERP最佳技术实践

Forms开发指南

File Ref: 228265142.doc (v. DRAFT 1A )

Company Confidential - For internal use only Doc Ref:

December 13, 2012

开发背景与基础 6 of 143

上面<应用简称>,如INV、GL、AP、AR等等,在System Administrator职责下的

Application/Register中定义。

通常各个企业都会创建一个客户化应用来管理二次开发的所有代码和设置,比如

CUX、HAND等,下面以CUX(客户化的意思)为例。

总之我们需要的模版及相关文件在AU_TOP下;我们开发的fmb文件呢,也应根据上述

规则传到$AU_TOP/forms的相关语言路径下,不过为管理、备份方便,实际开发中可

能故意违反EBS的规则,与fmx一起放在$CUX_TOP/forms的相关语言路径下。

详情可参考:Arone的《11iConcepts.ppt》或Oracle的《Oracle Applications

Concepts》PDF。

1.4.多组织支持

1.4.1.说明

Oracle的多组织数据屏蔽,设计要点如下:

1、核心层次:业务组BG→账套SOB→法人实体LE→经营单位OU→库存组织INV,这

些层次统称为组织,可通过视图org_organization_definitions查看关系。

2、数据级别:表中设计有组织ID来屏蔽;不同模块因为针对的层次不同,其组织ID

含义不同,比如HR的表用Business_Group_Id,GL的表用Set_Of_Book_Id,

AR/AP/PO/OM等表用经营单位Org_Id,INV/MRP/WIP/BOM等模块用库存组

织Organization_Id。

3、程序级别:用户登录、选择职责后,其所能操作的业务组、账套、法人实体、经营

单位就确定了,这个是通过相关的Profile来设置的;当进入制造和库存相关模块,

需要通过Change Organization菜单来获得可操作的库存组织。Oracle标准的

Package、Form、Java等程序,都是严格根据当前用户的参数来过滤各模块表数

据。

1.5.主要实例

本文档主要围绕开发销售订单来介绍Form开发过程中涉及的关键技术点。

1.5.1.销售订单

销售订单最核心的内容为:某客户,在某天,以何价格,购买多少数量的哪些商品。

一张销售订单,客户是一定的,销售员可能有多个,这里假定只记录主销售员,所以

这两个信息构成销售订单的“头信息”;一次订单,客户通常会同时购买多种商品,

并且未必是同一天要货,这样需求日期、商品、数量、价格构成销售订单的“行信

息”。

1.5.

2.开发需求分析

销售订单还需要记录其它重要的内容,这个可直接参照EBS的“Sales Order”,为学习

方便,这里仅加入如下不完整、不严谨的信息。

Oracle ERP最佳技术实践

Forms开发指南

File Ref: 228265142.doc (v. DRAFT 1A )

Company Confidential - For internal use only Doc Ref:

December 13, 2012

开发背景与基础 7 of 143

头信息:订单编号、订单日期、内销还是外销、所采用的价目表、总价、币别、订单状态;非“录入”的不能删除,“部分履行”或“完全履行”的不能修改。

订单状态:录入、确定、部分履行、完全履行。

行信息:发货日期、收款日期;如果已发货,商品和数量不能修改,记录不能删除;如果已收款,整条记录都不能修改、不能删除。

全部行都已发货、已收款则订单状态为“完全履行”,部分发货或部分收款,则订单状态为“部分履行”。

订单查询:需要提供按订单号、订单日期、客户、销售员、销售类型、商品、是否发货、是否收款等条件进行组合查询,查询表现方式分为Folder形式和Grid形式。

1.5.3.其它说明

本文档使用“SCF”客户化应用做开发,不过数据库对象仍然沿用“CUX”前缀;没有建立专门的索引表空间。

Oracle ERP最佳技术实践

Forms开发指南

File Ref: 228265142.doc (v. DRAFT 1A )

Company Confidential - For internal use only Doc Ref:

December 13, 2012 基于EBS的Forms开发过程 8 of 143

2.基于EBS的Forms开发过程

2.1.Form文件类型

2.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来指示引用的路径,只要需要的文件在该路径

下即可。

2.2.Forms Builder安装

2.2.1.版本

尽管Oracle的Developer工具已经升级到9i、10g,但EBS中使用的Forms Server和

Forms Builder版本还是6i,今后的开发将逐步转移到Java,Oracle将来也不会在EBS中

使用高于6i的Forms。

可以从8ceada2427284b73f3425018/EPD/Search/get_form下载,其包含在EBS for

Windows版本的下载列表中。

2.2.2.Oracle Home

Oracle Home:Oracle产品的根目录及其名称;不同产品可以装到不同的目录,拥有各

自的Oracle Home;通过安装目录下的bin\oracle.key来指示使用哪个注册表项。

Default Home:指所有Oracle Home中,哪个是Default,其名字则未必叫Default。

Developer 6i的安装不够友好,必须安装到Default Home,为避免手工修改注册表的烦

恼,最好先安装6i,再安装其他Oracle产品。

2.2.

3.基本安装过程,请采用Custom

1、运行Setup,选择安装目录和语言,建议采用English:

Oracle ERP 最佳技术实践

Forms 开发指南

File Ref: 228265142.doc (v. DRAFT 1A ) Company Confidential - For internal use only Doc Ref: December 13, 2012 基于EBS 的Forms 开发过程

9 of 143

2、 选择Oracle Forms Developer :

Tips :待装完Forms Developer ,需要重新运行Setup 来安装Reports Developer ,至于两个Server ,基于EBS 的开发不需要,装了也用不了。 3、 选择安装类型,请采用Custom :

4、 选择安装Forms Builder ,将自动分析并安装需要的相关组件和文件:

Oracle ERP 最佳技术实践

Forms 开发指南

File Ref: 228265142.doc (v. DRAFT 1A ) Company Confidential - For internal use only Doc Ref: December 13, 2012 基于EBS 的Forms 开发过程

10 of 143

如果系统足够“干净”,通常一路OK 就能顺利安装;点击Exit 退出。 5、 请从头开始,安装Reports Developer :

2.2.4. 打Patch ,请采用Typical 上述安装的Developer6i 的版本是6.0.8.11.3,在编辑比较复杂的Form 时会报错退出,需要打Patch ,我打的是6.0.8.25。 1、 运行Setup ,选择安装目录和语言,默认即可。 2、 选择安装类型,请采用Typical :

Oracle ERP 最佳技术实践

Forms 开发指南

File Ref: 228265142.doc (v. DRAFT 1A ) Company Confidential - For internal use only Doc Ref: December 13, 2012 基于EBS 的Forms 开发过程

11 of 143

通常一路OK 就能顺利安装。 2.2.5. 配置TNSNAME 从DBA 或他人索要SQLNET.ORA 和TNSNAMES.ORA ,直接覆盖到安装目录的NET80\ADMIN 下。 SQLNET.ORA 是Oracle SQL*Net 协议配置文件,样例如下: SQLNET.AUTHENTICATION_SERVICES= NONE NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME) SQLNET.EXPIRE_TIME=1 TNSNAMES.ORA 是Oracle SQL*Net 数据库服务解析文件,样例如下: PROD= (DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=8ceada2427284b73f3425018)(PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=PROD) (INSTANCE_NAME=PROD) ) ) 2.2.6. 配置FORMS60_PATH 基于EBS 的Forms 开发,需要从服务器上下载必要的fmb 和pll 文件到本地,比如两类文件都放在d:\oracle\resource

,那么需要添加注册表的字符串值FORMS60_PATH ,类似C 语言的Include Directory 或者Java 的Class Path : 2.2.7. 配置NLS_LANG 修改注册表:Local Machine/Software/Oracle/NLS_LANG 改为AMERICAN_AMERICA.ZHS16GBK ,这样开发IDE 使用英文,字符集可满足英文、简体中文、繁体中文的需要。

Oracle ERP 最佳技术实践

Forms 开发指南

File Ref: 228265142.doc (v. DRAFT 1A )

Company Confidential - For internal use only Doc Ref: December 13, 2012

基于EBS 的Forms 开发过程

12 of 143

习惯上也同时修改其他子分支下的NLS_LANG 。

2.3. 下载Template 相关文件

用FTP 以应用操作系统用户登录EBS 服务器,进入到$AU_TOP 目录下。

2.3.1. 下载TEMPLATE.fmb

从$AU_TOP/forms/US 下载TEMPLATE.fmb 到FORMS60_PATH 对应的目录下。

2.3.2. 启动Form Builder

通过开始菜单启动:

去掉Display at startup ,点击Cancel :

Oracle ERP 最佳技术实践

Forms 开发指南

File Ref: 228265142.doc (v. DRAFT 1A ) Company Confidential - For internal use only Doc Ref: December 13, 2012 基于EBS 的Forms 开发过程

13 of 143

2.3.3. 打开TEMPLATE.fmb 及报错分析 N: 点击Open ,打开

TEMPLATE.fmb 本地仅有TEMPLATE.fmb ,将报fmb 文件找不到——Source Module 后就是form 文件名:

点击OK ,再报pll 文件找不到——PL/SQL library 后面就是就是pll 文件名:

Oracle ERP 最佳技术实践

Forms 开发指南

File Ref: 228265142.doc (v. DRAFT 1A )

Company Confidential - For internal use only Doc Ref: December 13, 2012

基于EBS 的Forms 开发过程

14 of 143

注意只可关闭、不可保存TEMPLATE.fmb !

2.3.4. 下载必要的文件到FORMS60_PATH 对应的目录

目标:不断测试、下载,直至打开TEMPLATE.fmb ,没有任何错误为止。

从$AU_TOP/forms/US 下载缺失的fmb 文件。

从$AU_TOP/resource 下载缺失的pll 文件。

因为form 和pll 都可嵌套引用,所以有时候把提示的form 或者pll 下载下来,打开

TEMPLATE.fmb 依然报错,那么需要直接打开提示缺失的fmb 或pll 文件,这个时候才

会看到真正缺失的文件,下载之。

为减少每个人的麻烦,现把需要的文件全部列出:

EBS 11i :请看附件中的“EBS11Source ”目录。

EBS 12请看附件中的“EBS12Source ”目录。

2.4. 一个简单的例子.创建数据库对象

要求:表、序列、索引建在应用数据库用户下,表放在数据表空间中,索引放在索引

表空间中;视图、包建在APPS 下,表和序列需要在APPS 下创建别名。

本小节的脚本在PL/SQL Developer 中,用APPS 登录,在Command Window 中运行。

2.4.1. 创建数据库对象

这里仅创建“头信息”表,并遵循如下规范:

1、 1个表关键字ID ,通常与表名一致,并用Sequence 为每条记录获得一个唯一值。

2、 1个组织ID ,根据不同的开发选用不同层次的组织ID ,这里的销售订单跑在OU

层,所以基表命名为_ALL 表,并创建一个过滤组织的View 作为“基表”。

Oracle ERP最佳技术实践

Forms开发指南

File Ref: 228265142.doc (v. DRAFT 1A )

Company Confidential - For internal use only Doc Ref:

December 13, 2012 基于EBS的Forms开发过程 15 of 143

3、5个Who字段,记录由谁在何时创建,并由谁在何时修改,登录ID是多少。

4、4个请求字段,处理的请求ID、请求日期、并发程序ID及其应用ID,如果有的话。

5、16个描述性弹性域字段,1个上下文字段,15个弹性域字段。

6、另外,根据以往开发经验,加个描述字段可解决不少难缠的问题。

7、因为脚本中带有Schema前缀,可以在APPS直接运行创建,源文件为

cux_order_headers_all.sql。

-- Create table

create table SCF.CUX_ORDER_HEADERS_ALL

(

HEADER_ID NUMBER not null,

ORG_ID NUMBER not null,

ORDER_NUMBER NUMBER not null,

ORDERED_DATE DATE not null,

ORDER_TYPE VARCHAR2(1) not null,

CUSTOMER_ID NUMBER not null,

SALESREP_ID NUMBER(15),

PRICE_LIST_ID NUMBER,

CURRENCY_CODE VARCHAR2(15) not null,

FLOW_STATUS_CODE VARCHAR2(30) not null,

DESCRIPTION VARCHAR2(240),

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,

PROGRAM_APPLICATION_ID NUMBER,

PROGRAM_ID NUMBER,

PROGRAM_UPDATE_DATE DATE,

REQUEST_ID 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_ORDER_HEADERS_U1 on SCF.CUX_ORDER_HEADERS_ALL (HEADER_ID) tablespace SCF;

create unique index SCF.CUX_ORDER_HEADERS_U2 on SCF.CUX_ORDER_HEADERS_ALL (ORG_ID, ORDER_NUMBER) tablespace SCF;

create index SCF.CUX_ORDER_HEADERS_N1 on SCF.CUX_ORDER_HEADERS_ALL (CUSTOMER_ID) tablespace SCF;

create index SCF.CUX_ORDER_HEADERS_N2 on SCF.CUX_ORDER_HEADERS_ALL (SALESREP_ID) tablespace SCF;

create index SCF.CUX_ORDER_HEADERS_N3 on SCF.CUX_ORDER_HEADERS_ALL (FLOW_STATUS_CODE) tablespace SCF;

-- Create/Recreate sequence

CREATE SEQUENCE SCF.CUX_ORDER_HEADERS_S;

Oracle ERP最佳技术实践

Forms开发指南

File Ref: 228265142.doc (v. DRAFT 1A )

Company Confidential - For internal use only Doc Ref:

December 13, 2012 基于EBS的Forms开发过程 16 of 143

-- Create/Recreate synonum

CREATE SYNONYM CUX_ORDER_HEADERS_S FOR scf.CUX_ORDER_HEADERS_S;

CREATE SYNONYM CUX_ORDER_HEADERS_ALL FOR scf.CUX_ORDER_HEADERS_ALL;

-- Create/Recreate View

CREATE OR REPLACE VIEW CUX_ORDER_HEADERS AS

SELECT header_id,

org_id,

order_number,

ordered_date,

order_type,

customer_id,

salesrep_id,

price_list_id,

currency_code,

flow_status_code,

description,

creation_date,

created_by,

last_updated_by,

last_update_date,

last_update_login,

program_application_id,

program_id,

program_update_date,

request_id,

attribute_category,

attribute1,

attribute2,

attribute3,

attribute4,

attribute5,

attribute6,

attribute7,

attribute8,

attribute9,

attribute10,

attribute11,

attribute12,

attribute13,

attribute14,

attribute15

FROM cux_order_headers_all

WHERE nvl(org_id,

nvl(to_number(decode(substrb(userenv('CLIENT_INFO'), 1, 1),

' ',

NULL,

substrb(userenv('CLIENT_INFO'), 1, 10))),

-99)) =

nvl(to_number(decode(substrb(userenv('CLIENT_INFO'), 1, 1),

' ',

NULL,

substrb(userenv('CLIENT_INFO'), 1, 10))),

-99);

2.4.2.注册表和字段

需要向EBS注册表和字段,这样以后就可通过标准功能设置弹性域、监控表操作。EXECUTE AD_DD.REGISTER_TABLE('SCF','CUX_ORDER_HEADERS_ALL','T',2,10,40);

EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','HEADER_ID',1,'NUMBER',38,'N','N');

EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ORG_ID',2,'NUMBER',38,'N','N');

EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ORDER_NUMBER',3,'NUMBER',38,'N','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ORDERED_DATE',4,'DATE',9,'N','N');

EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ORDER_TYPE',5,'VARCHAR2',1,'N','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','CUSTOMER_ID',6,'NUMBER',38,'N','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','SALESREP_ID',7,'NUMBER',38,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','PRICE_LIST_ID',8,'NUMBER',38,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','CURRENCY_CODE',9,'VARCHAR2',15,'N','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','FLOW_STATUS_CODE',10,'VARCHAR2',30,'N','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','DESCRIPTION',11,'VARCHAR2',240,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','CREATION_DATE',12,'DATE',9,'N','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','CREATED_BY',13,'NUMBER',38,'N','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','LAST_UPDATED_BY',14,'NUMBER',38,'N','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','LAST_UPDATE_DATE',15,'DATE',9,'N','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','LAST_UPDATE_LOGIN',16,'NUMBER',38,'Y','N');

Oracle ERP最佳技术实践

Forms开发指南

File Ref: 228265142.doc (v. DRAFT 1A )

Company Confidential - For internal use only Doc Ref:

December 13, 2012 基于EBS的Forms开发过程 17 of 143

EXECUTE

AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','PROGRAM_APPLICATION_ID',17,'NUMBER',38,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','PROGRAM_ID',18,'NUMBER',38,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','PROGRAM_UPDATE_DATE',19,'DATE',9,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','REQUEST_ID',20,'NUMBER',38,'Y','N'); EXECUTE

AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE_CATEGORY',21,'VARCHAR2',30,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE1',22,'VARCHAR2',240,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE2',23,'VARCHAR2',240,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE3',24,'VARCHAR2',240,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE4',25,'VARCHAR2',240,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE5',26,'VARCHAR2',240,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE6',27,'VARCHAR2',240,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE7',28,'VARCHAR2',240,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE8',29,'VARCHAR2',240,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE9',30,'VARCHAR2',240,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE10',31,'VARCHAR2',240,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE11',32,'VARCHAR2',240,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE12',33,'VARCHAR2',240,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE13',34,'VARCHAR2',240,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE14',35,'VARCHAR2',240,'Y','N'); EXECUTE AD_DD.REGISTER_COLUMN('SCF','CUX_ORDER_HEADERS_ALL','ATTRIBUTE15',36,'VARCHAR2',240,'Y','N');

2.4.

3.创建用于Form的View

Form可以直接基于基表,但对于复杂的表,则必需使用View,将各个ID转换为有意义

的编码或者描述。

CREATE OR REPLACE VIEW CUX_ORDER_HEADERS_V AS

SELECT coh.ROWID row_id,

coh.header_id,

8ceada2427284b73f3425018_id,

coh.order_number,

coh.ordered_date,

coh.order_type,

coh.customer_id,

rac.customer_name,

coh.salesrep_id,

8ceada2427284b73f3425018 salesrep_name,

coh.price_list_id,

8ceada2427284b73f3425018 price_list_name,

coh.currency_code,

coh.flow_status_code,

coh.description,

coh.creation_date,

coh.created_by,

8ceada2427284b73f3425018st_updated_by,

8ceada2427284b73f3425018st_update_date,

8ceada2427284b73f3425018st_update_login,

coh.program_application_id,

coh.program_id,

coh.program_update_date,

coh.request_id,

coh.attribute_category,

coh.attribute1,

coh.attribute2,

coh.attribute3,

coh.attribute4,

coh.attribute5,

coh.attribute6,

coh.attribute7,

coh.attribute8,

coh.attribute9,

coh.attribute10,

coh.attribute11,

coh.attribute12,

coh.attribute13,

coh.attribute14,

coh.attribute15

FROM cux_order_headers coh,

ra_customers rac,

jtf_rs_salesreps jrs,

qp_list_headers_vl qlh

WHERE coh.customer_id = rac.customer_id

AND coh.salesrep_id = jrs.salesrep_id(+)

AND coh.price_list_id = qlh.list_header_id(+)

本文来源:https://www.bwwdw.com/article/7exl.html

Top