楼主: 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
41#
 楼主| 发表于 2008-8-25 19:26 | 只看该作者
2. Find window
Find window在下列情况下适于使用:
*一次返回多条记录,特别适合multi-row block;
*需要多个查询条件关联进行复杂查询的;
*数据量很多的情况。
创建Find window的步骤相对比较复杂::
* 从APPSTAND.fmb中拷贝QUERY_FIND Object Group到开发窗体的.fmb文件中,此时开发窗体中会自动多出生成新的Window、Canvas、Block。删除拷贝过来的QUERY_FIND Object Group,然而新生成的对象不会被删除,合理设置这些对象的property classes属性;
* 重命名这些新对象,比如:ORDERS_QF,ORDERS_QF_CANVAS,ORDERS_QF_WINDOW;
* 修改Find Windows的title名为 “Find <Objects>”;
* 编辑NEW Button的WHEN-BUTTON-PRESSED Trigger;
app_find.new('ORDERS');  results block name  这个函数使得Find Window关闭回到原来的Block,创建一条新记录。
* 编辑FIND Button的WHEN-BUTTON-PRESSED Trigger;
  arameter.G_query_find := 'TRUE';
app_find.find('ORDERS');  results block name
arameter.G_query_find := 'FALSE';
如果查询到数据,则关闭Find Window关闭回到原来的Block,显示查询到的记录。
* 编辑Find block-level的KEY-NXTBLK Trigger
  arameter.G_query_find := 'TRUE';
app_find.find('ORDERS');
arameter.G_query_find := 'FALSE';
作用与FIND Button相同。
* 正确导航
      Find block的Previous Navigation Data Block应设为results block,应保证用户即使不作查询也能退出Find Window。而通过导航Block进入Find Window也是不推荐的。
*开发Canvas
   在Find Canvas上创建所需的Item,所有的Item都可为空,default values均设置为 NULL;Check boxes和option groups都改为允许空值的poplists;唯一可以设置Item logic的字段类型是LOV,使用时注意Find Window不要和results Window共用LOV,因为Find Window的返回值会同时返回到results Window中,但是Find Window要和results Window共享Record Groups,保证数据一致性;创建那些在查询中要用到的隐藏字段;创建Item时,可从results block上拷贝,但要注意设置所有item为non-database items,正确的canvas、property class属性,删除所有item的trigger,保留或修改date fields的Calendar控制逻辑。
  *合理设置Find Window的大小
*创建Results Block-Level PRE-QUERY Trigger (Execution hierarchy of Before),将Find Window中的值拷贝到results Window中。
IF arameter.G_query_find = 'TRUE' THEN
  rders.order_id := :ORDERS_QF.ORDER_ID;
  app_find.query_range(rders_qf.date_ordered_from,
                       rders_qf.date_ordered_to,
                       'ORDERS.DATE_ORDERED');
  COPY (rders_qf.order_status, 'ORDERS.ORDER_STATUS');
  rders.customer_id := :ORDERS_QF.CUSTOMER_ID;
  COPY (rders_qf.customer_name, 'ORDERS.CUSTOMER_NAME');
  rders.sales_rep_id := :ORDERS_QF.SALES_REP_ID;
  COPY (rders_qf.sales_rep_name, 'ORDERS.SALES_REP_NAME');
  if   rders_qf.payment_type is not null then --判断poplist是否非空
       COPY (rders_qf.payment_type, 'ORDERS.PAYMENT_TYPE');
  end if;
 arameter.G_query_find := 'FALSE';
end if;
  *创建Results Block-level QUERY_FIND trigger (Execution hierarchy of Override) 打开Find Window
app_find.query_find('ORDERS',
                 'ORDERS_QF_WINDOW',
                 'ORDERS_QF');

注意使用Find Window时不要设置Find Window和Results Window的Item同步,减少cross-field validation的使用,当Find Window没有查到数据时,焦点仍然停留在该窗体中。

使用道具 举报

回复
论坛徽章:
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
42#
 楼主| 发表于 2008-8-25 20:23 | 只看该作者
Lab 16: Advanced Function Security
  在Lab2中我们了解了Basic Function Security,这是一种基于responsibility、menu和function(功能)的管理机制。Advanced Function Security将考虑更加详细的安全机制,用户是否有权使用某个form中的某个subfunction,是否有权看见form的某个部件,是否有权打开新的窗体等等。
对于这种安全控制策略,我的理解是这样的:首先在系统里定义一个subfunction,然后把它挂到某个responsibility的menu下,然后在form里判断登录的responsibility是否具有对form里特定function的使用权限,激活或禁用这些function。

1.JPG (18.29 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
43#
 楼主| 发表于 2008-8-25 20:23 | 只看该作者
定义subfunction时,还要在Form选项卡里选择依附的Form ,在Property选项卡里将 Type设置为subfunction。然后将该subfunction挂到指定的menu下面,下图所示的是把两个用户自定义的Function:VC Demo Form:SPECIAL和VC Demo Form: DEMVC_DEMVCEOR_PRINT_ORDER挂到了TEAM VC MENU的下面,注意因为它们的Prompt字段没有赋值,因此它们不会出现在Object Navigator中,实际上也不需要出现。
如果不把subfunction挂到menu下面,用户将无法访问该subfunction 。

1.JPG (27.26 KB, 下载次数: 17)

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
44#
 楼主| 发表于 2008-8-25 20:24 | 只看该作者
然后在form的pre-form trigger中调用FND_FUNCTION.TEST函数验证登录用户的权限:
IF (FND_FUNCTION.TEST('DEMVC_DEMVCEOR_PRINT_ORDER')) THEN
     --处理代码;
END IF;
处理代码往往是激活或禁用一些窗体部件,比如buttons, windows, fields, alternative regions等。实际也是激活或禁用某些窗体功能。
此处我有个疑问,我定义的Function如果Type设置为subfunction,系统就会报错。设置为Form,其他不变,运行正常,百思不得其解。

  Oracle EBS还允许客制化Form的菜单栏。
用户最多可以定义45个form-level 的trigger ,名称必须为SPECIALn,其中SPECIAL1 to SPECIAL15属于Tools菜单项,SPECIAL16 to SPECIAL30属于Reports菜单项, SPECIAL31 to SPECIAL45属于Actions菜单项, 其中Reports、Actions的名称可以被修改。
初始化示例:
  IF (FND_FUNCTION.TEST('DEMVC_DEMVCEOR_PRINT_ORDER')) THEN
   app_special.instantiate('SPECIAL1','&Print Order');
 app_special.enable('SPECIAL1',PROPERTY_ON);
   app_special.instantiate('SPECIAL2','Specia&l 2 Line', '',TRUE,'LINE');
    app_special.instantiate('SPECIAL3_CHECKBOX','Spe&cial 3 Box w Line', '',TRUE,'LINE');
    app_special.set_checkbox('SPECIAL3_CHECKBOX','TRUE');
    app_special.instantiate('SPECIAL4_CHECKBOX','Special &4 Box');
    app_special.set_checkbox('SPECIAL4_CHECKBOX','TRUE');
    app_special.instantiate('SPECIAL18','Specia&l 18 Line SEP', separator=>'LINE');
    app_special.instantiate('SPECIAL32','Specia&l 32 Line', '',TRUE,'LINE');
    app_special.instantiate('SPECIAL33','Specia&l 33');
    app_special.instantiate('SPECIAL30','Specia&l 30');
    app_special.instantiate('SPECIAL31','Specia&l 31 Line','',TRUE,'LINE');
    app_special.instantiate('SPECIAL45','Spe&cial 45');
/* and display a button on the form */
    app_item_property.set_property('orders.print_order',
                               DISPLAYED, PROPERTY_ON);
    ELSE
    app_item_property.set_property('orders.print_order',
                               DISPLAYED, PROPERTY_OFF);
    END IF;
app_special.instantiate设置菜单项的文字说明,app_special.enable设置菜单项是否可用,app_special.set_checkbox设置check_box菜单项的选定状态。
在form-level 的SPECIALn trigger中,定义了这些菜单项选中后的处理代码,如下所示:
Eg1:
  demvceor.PRINT_ORDER('SPECIAL1');
Eg2:
 if (app_special.get_checkbox('SPECIAL3_CHECKBOX')='TRUE') then
     fnd_message.debug('Special 3 is True!');
else
     fnd_message.debug('Special 3 is False!');
end if;
  
  右键菜单也可以自定义,form-level PRE-POPUP-MENU trigger 引用APPSTAND.EVENT('PRE-POPUP-MENU')建立default menu;建立block /item level pre-pop-menu trigger须(Execution Hierarchy àAfter)。
从block /item level pre-pop-menu trigger(Execution Hierarchy àAfter)中调用 app_popup.instantate函数初始化右键菜单项:
   procedure APP_POPUP.INSTANTIATE(
option_name varchar2,
txt varchar2,
initially_enabled boolean default true,
        separator varchar2 default null);
   Example
  • This example results in a menu that has a line above the second custom entry and
   has the third custom entry grayed out (disabled)
APP_POPUP.INSTANTIATE(
‘POPUP1’,’First Entry’);
APP_POPUP.INSTANTIATE(
‘POPUP2’,’Second Entry’, TRUE, ‘LINE’);
APP_POPUP.INSTANTIATE(
‘POPUP3’,’Third Entry’, FALSE);
  右键菜单的处理函数写在名为POPUP1 through POPUP10 的trigger中,应该在正确的level上建立这些trigger (通常是block/item level)。

使用道具 举报

回复
论坛徽章:
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
45#
 楼主| 发表于 2008-8-25 20:53 | 只看该作者
Lab 17: Setting Up Attachments
我觉得Oracle 中这个功能很好,就像在不破坏基表结构的前提下,动态地创建了若干个非结构化列,既可以存储普通文本,网页,还可以上传文件像word,excel,ppt,mp3等类型文件。比如对一行记录要做大量说明或是音频视频说明的,就可以采用这种办法。
在应用Attachment之前,先要搞清楚几个概念。一是Document Entity,Document Entity 可分为Base Entity 和Related Entity,简言之都可以认为是数据库的表,也是Attachment依附的主体。一个Entity中每条记录都可附加多个Attachment,依靠Entity的Primary Key对应。
所以应用Attachment的第一个步骤是定义Document Entity。如下图所示:

1.JPG (23.78 KB, 下载次数: 72)

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
46#
 楼主| 发表于 2008-8-25 20:54 | 只看该作者
另一个是先要搞清楚的概念Document Category,我的理解是Document Category限制了可附加Attachment的类型。所以第二个步骤是定义Document Category。

第三个步骤是定义Attachment Function,Attachment Function必须指定应用的窗体,在下图的Name中选择。Enabled Session Context Field我觉得是应用上下文Title。

1.JPG (10.03 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
47#
 楼主| 发表于 2008-8-25 20:55 | 只看该作者
接下来在Category窗体中选择第二步定义的Category,可选择多个。
打开Block窗体,下面的设置是关键。Block Declaration窗体中的Context字段与上下文Title有关。

1.JPG (21.82 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
48#
 楼主| 发表于 2008-8-25 20:56 | 只看该作者
再打开Entity Declaration窗体,设置Privileges选项卡的各项属性,接着再设置Primary Key Fields选项卡的各项,个人觉得这个地方非常重要不能设错。

1.JPG (24.4 KB, 下载次数: 17)

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
49#
 楼主| 发表于 2008-8-25 20:57 | 只看该作者
jpg

1.JPG (25.96 KB, 下载次数: 16)

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
50#
 楼主| 发表于 2008-8-25 20:57 | 只看该作者
在系统中运行Form,点击工具条别针型按钮,就可以添加附件了,效果如图所示:

1.JPG (20.08 KB, 下载次数: 17)

1.JPG

使用道具 举报

回复

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

本版积分规则 发表回复

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