楼主: ganghz

[转载] Oracle Form 6i开发

[复制链接]
论坛徽章:
259
地主长老
日期:2008-05-16 13:45:41春季摄影比赛纪念奖
日期:2008-06-04 10:35:252008欧洲杯之星
日期:2008-07-01 14:52:28金牌徽章
日期:2008-09-04 11:32:50地主之星
日期:2009-03-30 10:29:22欧洲冠军杯纪念徽章
日期:2009-05-31 09:59:59NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA之星
日期:2010-04-15 14:14:34NBA大富翁
日期:2010-04-15 14:17:22博彩之星
日期:2010-07-12 13:14:39
51#
 楼主| 发表于 2008-8-25 20:57 | 只看该作者
注意,如果你在某个Form中利用某个Entity的Primary Key应用了Attachment,在系统其他任何Form 中,只要引用了该Entity的Primary Key,用户就可以查看基于这些Primary Key的Attachment。

使用道具 举报

回复
论坛徽章:
259
地主长老
日期:2008-05-16 13:45:41春季摄影比赛纪念奖
日期:2008-06-04 10:35:252008欧洲杯之星
日期:2008-07-01 14:52:28金牌徽章
日期:2008-09-04 11:32:50地主之星
日期:2009-03-30 10:29:22欧洲冠军杯纪念徽章
日期:2009-05-31 09:59:59NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA之星
日期:2010-04-15 14:14:34NBA大富翁
日期:2010-04-15 14:17:22博彩之星
日期:2010-07-12 13:14:39
52#
 楼主| 发表于 2008-8-25 20:58 | 只看该作者
Lab 18: Concurrent Processing
在系统里我们会经常用到并发处理,最常见的使用是报表以及数据库的操作。所有的并发处理都是由Concurrent Manager进程处理的,这其中包括了很多排队调度的机制以及出错恢复的机制,文档中说的很详细也很复杂。本节仅仅介绍了如何从系统中提交并发请求。提交并发请求的发式有很多种,比如使用Standard Request Submission,使用View/Requests或者使用某个窗体不见引发等等。
下面结合一下使用Concurrent Requests的步骤作进一步的说明。
第一步是建立Concurrent Program Executable,这是建立Concurrent Program的前提,随后建立的Concurrent Program会引用这个Concurrent Program Executable,一个Concurrent Program Executable可以被任意多个Concurrent Program所引用。

1.JPG (17.67 KB, 下载次数: 14)

1.JPG

使用道具 举报

回复
论坛徽章:
259
地主长老
日期:2008-05-16 13:45:41春季摄影比赛纪念奖
日期:2008-06-04 10:35:252008欧洲杯之星
日期:2008-07-01 14:52:28金牌徽章
日期:2008-09-04 11:32:50地主之星
日期:2009-03-30 10:29:22欧洲冠军杯纪念徽章
日期:2009-05-31 09:59:59NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA之星
日期:2010-04-15 14:14:34NBA大富翁
日期:2010-04-15 14:17:22博彩之星
日期:2010-07-12 13:14:39
53#
 楼主| 发表于 2008-8-25 20:59 | 只看该作者
上图建立了一个名为DEMVCREPORT的Concurrent Program Executable,在Team VC Order Entry Demo Application中被使用,Execution Method指的是这种Executable的类型(Oracle Report、SQL*Loader、PL/SQL Stored Procedure等),Execution File Name这里指的是DEMREPRT.sql文件。Execution File Path指的是Execution File存放的路径,一般是在Application Basepath对应目录下。
第二步是建立Concurrent Program,Enabled checkbox决定是否立即激活该Concurrent Program;Execution Region中选择上一步定义的Concurrent Program Executable;Request Region中的Use in SRS checkbox决定是否可以在Standard Request Submission窗体中提交request;Output Region是输出设置的常规选项。
Copy to选项卡:可以把当前Concurrent Program的设置拷贝到另一个Concurrent Program中;Session Control选项卡:对当前Session属性进行设置,比如优化模式,回退段等;Incompatibilities选项卡:设置与当前Concurrent Program不可同时处理的其他Program;Parameters选项卡:设置当前Concurrent Program的传入参数。
如下图所示:当前Concurrent Program定义了一个名为Order Number的传入参数,同时还设置了它的验证方式和显示格式。

1.JPG (31.73 KB, 下载次数: 21)

1.JPG

使用道具 举报

回复
论坛徽章:
259
地主长老
日期:2008-05-16 13:45:41春季摄影比赛纪念奖
日期:2008-06-04 10:35:252008欧洲杯之星
日期:2008-07-01 14:52:28金牌徽章
日期:2008-09-04 11:32:50地主之星
日期:2009-03-30 10:29:22欧洲冠军杯纪念徽章
日期:2009-05-31 09:59:59NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA之星
日期:2010-04-15 14:14:34NBA大富翁
日期:2010-04-15 14:17:22博彩之星
日期:2010-07-12 13:14:39
54#
 楼主| 发表于 2008-8-25 20:59 | 只看该作者
第三步是建立Concurrent Program Library,由于这一步在练习中没有出现,我也就没做。
  第四步是将Concurrent Program添加到System Administrator Reports request group中。这步说的比较隐晦,初学者往往不知道该怎么做。处理方法其实就是在Responsibility设置Request Group,如果不设的话,Concurrent Request 没法用。

1.JPG (34.46 KB, 下载次数: 22)

1.JPG

使用道具 举报

回复
论坛徽章:
259
地主长老
日期:2008-05-16 13:45:41春季摄影比赛纪念奖
日期:2008-06-04 10:35:252008欧洲杯之星
日期:2008-07-01 14:52:28金牌徽章
日期:2008-09-04 11:32:50地主之星
日期:2009-03-30 10:29:22欧洲冠军杯纪念徽章
日期:2009-05-31 09:59:59NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA之星
日期:2010-04-15 14:14:34NBA大富翁
日期:2010-04-15 14:17:22博彩之星
日期:2010-07-12 13:14:39
55#
 楼主| 发表于 2008-8-25 21:00 | 只看该作者
完成了以上的步骤后,就可以在系统中提交Concurrent Request。先看一下在SRS中提交的情况。

1.JPG (28.15 KB, 下载次数: 23)

1.JPG

使用道具 举报

回复
论坛徽章:
259
地主长老
日期:2008-05-16 13:45:41春季摄影比赛纪念奖
日期:2008-06-04 10:35:252008欧洲杯之星
日期:2008-07-01 14:52:28金牌徽章
日期:2008-09-04 11:32:50地主之星
日期:2009-03-30 10:29:22欧洲冠军杯纪念徽章
日期:2009-05-31 09:59:59NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA之星
日期:2010-04-15 14:14:34NBA大富翁
日期:2010-04-15 14:17:22博彩之星
日期:2010-07-12 13:14:39
56#
 楼主| 发表于 2008-8-25 21:01 | 只看该作者
此外,在Form中也可以提交请求。先期工作如下:在form中添加一个parameter REQ_ID,用以存储concurrent request ID。编写Request的Handler,如下所示:

PROCEDURE PRINT_ORDER(EVENT VARCHAR2) IS
BEGIN
  IF (EVENT = 'SPECIAL1') OR (EVENT = 'WHEN-BUTTON-PRESSED')  
 THEN
     arameter.req_id :=
     fnd_request.submit_request('DEMVC',
     'DEMREPRT','', '',
     FALSE, NAME_IN('ORDERS.ORDER_ID'),chr(0),'','','','','','','','',
     '','','','','','','','','','',
     '','','','','','','','','','',
     '','','','','','','','','','',
     '','','','','','','','','','',
     '','','','','','','','','','',
     '','','','','','','','','','',
     '','','','','','','','','','',
     '','','','','','','','','','',
     '','','','','','','','','','');
     IF arameter.req_id = 0 THEN
         FND_MESSAGE.RETRIEVE;
         FND_MESSAGE.ERROR;
     ELSE
        IF :SYSTEM.FORM_STATUS != 'CHANGED' THEN
            IF app_form.quietcommit  THEN
                 /*form commits without asking user to save changes*/
       fnd_message.set_name('SQLGL','GL_REQUEST_SUBMITTED');
              fnd_message.set_TOKEN('REQUEST_ID',   
        TO_CHAR(:PARAMETER.REQ_ID), FALSE);
              fnd_message.show;
            ELSE
              fnd_message.set_name('FND', 'CONC-REQUEST
        SUBMISSION FAILED');
              fnd_message.error;
            END IF;
       ELSE
            DO_KEY('COMMIT_FORM');
            IF :SYSTEM.FORM_STATUS != 'CHANGED' THEN
                 /*commit was successful*/
                 fnd_message.set_name('SQLGL','GL_REQUEST_SUBMITTED');
             fnd_message.set_TOKEN('REQUEST_ID',
       TO_CHAR(:PARAMETER.REQ_ID), FALSE);
              fnd_message.show;
            END IF;              
        END IF;
    END IF;
  ELSE
      fnd_message.debug('Invalid event passed to
       DEMXXEOR.PRINT_order: ' || EVENT);
  END IF;
END PRINT_ORDER;

然后在form-level的Special1和PRINT_ORDER Button的when-button-pressed Trigger中调用处理代码。
demvceor.PRINT_ORDER('SPECIAL1');
我在练习中做到这一步,在窗体中提交Request报错,同事说是由于先前定义的Execution File在系统中不存在,我在网上也没找到该文件的脚本,因此这节练习也就做到这里了。

使用道具 举报

回复
论坛徽章:
259
地主长老
日期:2008-05-16 13:45:41春季摄影比赛纪念奖
日期:2008-06-04 10:35:252008欧洲杯之星
日期:2008-07-01 14:52:28金牌徽章
日期:2008-09-04 11:32:50地主之星
日期:2009-03-30 10:29:22欧洲冠军杯纪念徽章
日期:2009-05-31 09:59:59NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA之星
日期:2010-04-15 14:14:34NBA大富翁
日期:2010-04-15 14:17:22博彩之星
日期:2010-07-12 13:14:39
57#
 楼主| 发表于 2008-8-25 21:02 | 只看该作者
Lab 19: Implementing Zoom Use the Custom Library
使用CUSTOM library可以在不修改Oracle Application代码的情况下实现Oracle Application功能的扩展,在下面的情形下,会使用到CUSTOM library,当然每种情况的处理代码也不一样。
• Zoom—从当前窗体获得参数又打开另一个窗体;
• Logic for generic events—对某些form events的控制等,比如WHEN–FORM–NAVIGATE,WHEN–NEW–FORM–INSTANCE,WHEN–NEW–BLOCK–INSTANCE,WHEN–NEW–RECORD–INSTANCE,WHEN–NEW–ITEM–INSTANCE,WHEN–VALIDATE–RECORD,EXPORT,KEY–Fn (where n is a number between 1 and 8);
• Logic for product–specific events—对某些product–specific events的控制等,比如WHEN–LOGON–CHANGED,WHEN–RESPONSIBILITY–CHANGED;
• Custom entries for the special menus—添加客制化菜单的功能SPECIALn (where n is a number between 1 and 45);
• Setting visual attributes —运行时修改visual属性等。
有些问题在使用前先弄清,在customer library中WHEN–FORM–NAVIGATE, WHEN–NEW–BLOCK–INSTANCE, WHEN–NEW–RECORD–INSTANCE或者WHEN–NEW–ITEM–INSTANCE只在form/block/item level的同名trigger触发后才触发;WHEN–NEW–FORM–INSTANCE 会在调用app_standard_event时触发,如form when-new-form-instance的 app_standard_event.(when-new-form-instance);
WHEN–VALIDATE–RECORD 会在调用app_standard_event 或 fnd_flex.event时触发(form/ block level);SPECIALn在同名trigger触发前触发;ZOOM 靠(View–>Zoom) 或工具条按钮触发;EXPORT靠(File–>Export)触发;KEY–Fn 在按下corresponding function key 或 key combination触发。在 Help–>Keyboard 菜单项可以找到快捷键。
下面我介绍如何利用CUSTOM library使用Zoom功能。
首先在窗体中添加两个parameter:ORDER_ID 和CUSTOMER_NAME;
然后修改ORDERS block的WHERE clause属性,该block应是目标block,即目标窗体所对应的block,我认为这样改的目的兼顾非Zoom下的查询和匹配先前定义parameter的查询;
WHERE (arameter.order_id is null or
    dem_orders_v.order_id like arameter.order_id)
AND (arameter.customer_name is null or
    dem_orders_v.customer_name like arameter.customer_name)
接着在WHEN–NEW–FORM–INSTANCE trigger中添加下列代码:
/* fire automatic query if a parameter has a value from Zoom */
if (arameter.order_id is not null) or (arameter.customer_name is not null) then
GO_BLOCK('ORDERS');
do_key('EXECUTE_QUERY');
/* clear the parameters after the query so they don’t remain
criteria for future queries */
arameter.order_id := null;
arameter.customer_name := null;
end if;
目的在于每次处理完Zoom Event后清空相关parameter。
  最后我在CUSTOM.PLL文件中作了如下的修改:
function zoom_available return boolean is
    form_name  varchar2(30) := name_in('system.current_form');
    block_name varchar2(30) := name_in('system.cursor_block');  
  begin
    if (form_name = 'DEMVCEOR' and block_name = 'ORDERS')
   then
      return TRUE;
    else
      return FALSE;
    end if;
  end zoom_available;
  这个函数会在form-level when-new-form-instance trigger的
app_standard.event(when-new-form-instance)中被调用,用来判断是否可以激活工具条上的Zoom图标按钮。
procedure event(event_name varchar2) is
     form_name      varchar2(30) := name_in('system.current_form');
    block_name     varchar2(30) := name_in('system.cursor_block');  
     param_to_pass1 varchar2(255);
     param_to_pass2 varchar2(255);
  begin
   if (event_name = 'ZOOM')  then   
      if (form_name = 'DEMVCEOR' and block_name = 'ORDERS') then
        param_to_pass1 := name_in('ORDERS.order_id');
        param_to_pass2 := name_in('ORDERS.customer_name');
        fnd_function.execute(FUNCTION_NAME=>'DEMVC_DEMVCEOR',  
           OPEN_FLAG=>'Y',  SESSION_FLAG=>'Y',  
            OTHER_PARAMS=>'ORDER_ID="'||param_to_pass1||
            '" CUSTOMER_NAME="'||param_to_pass2||'"');
                end if;   
   else
      null;
   end if;
  end event;
  这个过程就是Zoom事件的处理函数,它的传入参数包括了两个预先定义的参数,form_name 和block_name。注意fnd_function.execute函数的作用就是打开一个新窗体,该窗体使用了传入的参数。该过程也会在系统预先定义好的form-level ZOOM trigger的appcore_custom.event('ZOOM')中被调用。
做完以上步骤后,就可以在系统中使用ZOOM功能了,可是我很遗憾的失败了。探究原因可能是由于编译CUTOM.PLL生成的CUTOM.PLX方法不对。
我的方法:
f60gen module=CUTOM.PLL userid=apps/apps module_type=LIBRARY;
查看文档后觉得可能是:
f60gen module=DEMVCEOR userid=apps/apps COMPILE_ALL=Yes output_file=$DEM_TOP/forms/US/DEMVCEOR.fmx
  我想既然系统不自动激活ZOOM图标,那么我就自己写代码显式激活,然后显式调用处理函数,于是做了下面的工作。
在Orders block-level的when-new-block-instance trigger中添加了下列代码:
SET_MENU_ITEM_PROPERTY('VIEW.ZOOM',ENABLED,PROPERTY_TRUE;
在form-level的 zoom trigger中改写成下列代码:
custom.event('ZOOM');
重新编译生成后就可以,如下图所示:

1.JPG (32.62 KB, 下载次数: 24)

1.JPG

使用道具 举报

回复
论坛徽章:
259
地主长老
日期:2008-05-16 13:45:41春季摄影比赛纪念奖
日期:2008-06-04 10:35:252008欧洲杯之星
日期:2008-07-01 14:52:28金牌徽章
日期:2008-09-04 11:32:50地主之星
日期:2009-03-30 10:29:22欧洲冠军杯纪念徽章
日期:2009-05-31 09:59:59NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA之星
日期:2010-04-15 14:14:34NBA大富翁
日期:2010-04-15 14:17:22博彩之星
日期:2010-07-12 13:14:39
58#
 楼主| 发表于 2008-8-25 21:02 | 只看该作者
到这里,我就做完了这个关于Form的练习,完成之后算是对开发Form的过程、重点、难点有了个大致的了解。后面是一些总结,当是补充吧,内容实现太多了,就怕自己过两天又忘了。

使用道具 举报

回复
论坛徽章:
259
地主长老
日期:2008-05-16 13:45:41春季摄影比赛纪念奖
日期:2008-06-04 10:35:252008欧洲杯之星
日期:2008-07-01 14:52:28金牌徽章
日期:2008-09-04 11:32:50地主之星
日期:2009-03-30 10:29:22欧洲冠军杯纪念徽章
日期:2009-05-31 09:59:59NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA之星
日期:2010-04-15 14:14:34NBA大富翁
日期:2010-04-15 14:17:22博彩之星
日期:2010-07-12 13:14:39
59#
 楼主| 发表于 2008-8-25 21:02 | 只看该作者
Lab 20: About Trigger
1. Pre-form trigger
   FND_STANDARD.FORM_INFO
('$Revision: 115.12 $', 'Demo Order Form', 'DEMVCEOR', $Date: 2006/07/18 17:12  $', '$Author: appldemvc $');
app_standard.event('PRE-FORM');
app_window.set_window_position('ORDERS', 'FIRST_WINDOW');
demvceor.pre_form;
   Pre-form trigger调用APPCORE Routing APIS的APP_WINDOW.SET_WINDOW_POSITION和FNDSQF Routing APIS的 FND_STANDARD.FORM_INFO函数,这些函数在template.fmb的Pre-form trigger中已经存在,但是必须改变这些函数的参数值,窗体才能正常使用。

使用道具 举报

回复
论坛徽章:
259
地主长老
日期:2008-05-16 13:45:41春季摄影比赛纪念奖
日期:2008-06-04 10:35:252008欧洲杯之星
日期:2008-07-01 14:52:28金牌徽章
日期:2008-09-04 11:32:50地主之星
日期:2009-03-30 10:29:22欧洲冠军杯纪念徽章
日期:2009-05-31 09:59:59NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA之星
日期:2010-04-15 14:14:34NBA大富翁
日期:2010-04-15 14:17:22博彩之星
日期:2010-07-12 13:14:39
60#
 楼主| 发表于 2008-8-25 21:03 | 只看该作者
2. Record history (WHO): Track Data Changes
在练习中我发现一个奇怪的现象,在Block-Level的Pre-insert和Pre-update的trigger中都调用了FND_STANDARD.SET_WHO;而且在Order和Line Block中都包括了下表所示的几个字段。

请教过同事,他说一般的ebs的oracle table中都会包括这几个字段,主要用于数据处理的跟踪,调用FND_STANDARD.SET_WHO函数后系统将自动完成对这几个字段的操作过程,如果是并发程序,还会用到下面的几个字段。

我觉得这种字段设置方式对我们开发其它系统也是一个很好的启发。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表