EBS开发总结_FORM篇(一)

常用功能

手电筒功能

在需要使用手电筒的数据块下,添加快级触发器:QUERY_FIND,调用过程app_find.query_find,具体逻辑如下所示:

PROCEDURE query_find(block_window VARCHAR2 --需要使用手电筒的数据块名称
                    ,find_window  VARCHAR2 --查询块所在窗口
                    ,find_block   VARCHAR2 --查询块名称
                    )
BEGIN
  copy('Entering app_find.query_find.'
      ,'global.frd_debug');
  app_window.set_window_position(find_window
                                ,'CENTER_ONCE'
                                ,block_window);
  go_block(find_block);
  copy('Completed app_find.query_find.'
      ,'global.frd_debug');
END query_find;

具体如下图所示:
头块添加手电筒功能,头所在窗口为 MAIN ,查询块所在窗口为 QUERY_FIND ,查询块名称为 QUERY_FIND
在这里插入图片描述

跳转界面

1.调用存储过程 fnd_function.execute 实现跳转功能:

PROCEDURE EXECUTE(function_name  IN VARCHAR2 --功能代码
                 ,open_flag      IN VARCHAR2 DEFAULT 'Y' --调用不同的内置函数 Y: open_form, C: call_form, 其他值: new_form
                 ,session_flag   IN VARCHAR2 DEFAULT 'SESSION' --SESSION: 新建会话,界面提交互不影响,NOSESSION: 不新建会话,任意一个界面提交,两个界面都会生效
                 ,other_params   IN VARCHAR2 DEFAULT NULL --传参 格式:param1name="param 1 value" param2name="param 2 value",如果跳转web页面,各参数之间改成 & 作为分隔符
                 ,activate_flag  IN VARCHAR2 DEFAULT 'ACTIVATE' --ACTIVATE/NO_ACTIVATE,表示是否聚焦到新打开的FORM
                 ,browser_target IN VARCHAR2 DEFAULT NULL);

这里以跳转到查看请求界面作为示例:

fnd_function.execute(function_name => 'FND_FNDRSRUN'
                                ,open_flag     => 'Y'
                                ,session_flag  => 'Y'
                                ,other_params  => 'CONCURRENT_PROGRAM_NAME="CUXXXXRPT" PROGRAM_APPL_SHORT_NAME="CUX" DODT_REQ_ID="' || to_char(666) || '"');

2.调用存储过程 app_navigate.execute 实现跳转功能:

  PROCEDURE EXECUTE(function_name IN VARCHAR2 --同
                   ,open_flag     IN VARCHAR2 DEFAULT 'Y' --同fnd_function.execute
                   ,session_flag  IN VARCHAR2 DEFAULT 'SESSION' --同fnd_function.execute
                   ,other_params  IN VARCHAR2 DEFAULT NULL --同fnd_function.execute
                   ,activate_flag IN VARCHAR2 DEFAULT 'ACTIVATE' --同fnd_function.execute
                   ,pinned        IN BOOLEAN DEFAULT FALSE --值为TURE时,与fnd_function.execute一致,为TRUE时,相同FORM会复用,只会打开同一个实例,不会新打开一个FORM实例
                   );

询问

fnd_message.question 定义:

    -- QUESTION-
    --  display the message in a dialog box, with user defined buttons
    --
    function QUESTION(BUTTON1 in varchar2 default 'YES',
                      BUTTON2 in varchar2 default 'NO',
                      BUTTON3 in varchar2 default 'CANCEL',
                      DEFAULT_BTN in number default 1,
                      CANCEL_BTN  in number default 3,
                      ICON    in varchar2 default 'question') return number;

示例:

PROCEDURE warning_test IS
  l_result          NUMBER;
  l_warning_message VARCHAR2(2000) := '存在警告信息,是否继续?';
BEGIN

  fnd_message.set_string(l_warning_message);

  l_result := fnd_message.question(button1     => 'YES'
                                  ,button2     => 'NO'
                                  ,button3     => ''
                                  ,default_btn => 1
                                  ,cancel_btn  => 2);

  IF l_result <> 1 THEN
    RAISE form_trigger_failure;
  END IF;
END;

显示如下:选择是时,返回 1,选择否时,返回 2,选择关闭时,返回 NULL
在这里插入图片描述

批量操作

勾选记录行,点击按钮,实现批量功能,本例中,LINE 为需要全选的数据块,CONTROL 作为按钮所在的数据块,点击测试按钮 TEST_BTN,提示勾选的行数
在这里插入图片描述

具体实现:
(1)在数据块中,添加非数据块项 CHECK_FLAG,相关属性如下(物理属性略):

属性名称属性值
子类信息CHECKBOX
复选时的值Y
未复选时的值N
其他值的复选框映射未选中
数据库项

(2)全选框,一般还会配套加上全选功能,比如可以在数据块 CONTROL 中添加数据库项 SELECT_ALL,相关属性参考上面字段 CHECK_FLAG
方式一:
CONTROL.SELECT_ALL 添加触发器 WHEN-CHECKBOX-CHANGED,内容如下:

  PROCEDURE select_all IS
    l_top_record         NUMBER;
    l_current_record     NUMBER;
    l_current_record_old NUMBER;
    l_current_record_new NUMBER;
  BEGIN
    go_block('LINE');
    l_top_record     := get_block_property('LINE'
                                          ,top_record);
    l_current_record := get_block_property('LINE'
                                          ,current_record);
    first_record;
    LOOP
      :line.check_flag := :control.select_all;
    
      --do something
    
      EXIT WHEN :system.last_record = 'TRUE';
      /*
      移动记录前,如果有修改过字段的值,会触发 WHEN-VALIDATE-ITEM,如果中间有报错导致移动失败,导致下次循环时,仍定位的是相同记录
      也可以前面修改字段值后,主动调用 WHEN-VALIDATE-ITEM 触发器的代码,保证不会报错,那么即使后面 next_record 时,会再调用一次 WHEN-VALIDATE-ITEM 也无所谓
      至于 CHECKBOK 类型的 WHEN-CHECKBOX-CHANGED 触发器是不会自动触发,所有如果有必要,需要手工调用      
      */
      l_current_record_old := get_block_property('LINE'
                                                ,current_record);
      next_record;
      l_current_record_new := get_block_property('LINE'
                                                ,current_record);
      IF l_current_record_old = l_current_record_new THEN
        RAISE form_trigger_failure;
      END IF;
    END LOOP;
  
    go_record(l_top_record);
    go_record(l_current_record);
  END;

方式二:
除了手写 for loop 循环,也可以使用封装好的方法,封装的代码逻辑有兴趣的话,也可以看看,会发现其实和上面手写逻辑一致的

1)首先给 LINE 添加自定义触发器,如 SELECT_ALL

DECLARE
BEGIN
  :line.check_flag := :control.select_all;
  --do something
END;

在这里插入图片描述
2)CONTROL.SELECT_ALL 添加触发器 WHEN-CHECKBOX-CHANGED,内容如下:

DECLARE
  l_current_record NUMBER;
BEGIN
  app_record.for_all_records('LINE'
                            ,'SELECT_ALL'); --会自动循环执行自定义的触发器
END;

(3)点击按钮,提示勾选的行数,CONTROL.TEST_BTN 添加触发器 WHEN-BUTTON-PRESSED,我这里比较简单,就直接再次循环,记录勾选的记录数

  PROCEDURE test_btn IS
    l_top_record         NUMBER;
    l_current_record     NUMBER;
    l_current_record_old NUMBER;
    l_current_record_new NUMBER;
  
    l_count NUMBER;
  BEGIN
    go_block('LINE');
    l_top_record     := get_block_property('LINE'
                                          ,top_record);
    l_current_record := get_block_property('LINE'
                                          ,current_record);
    l_count          := 0;
    first_record;
    LOOP
      IF :line.check_flag = 'Y' THEN
        l_count := l_count + 1;
      END IF;
      EXIT WHEN :system.last_record = 'TRUE';
      /*
      移动记录前,如果有修改过字段的值,会触发 WHEN-VALIDATE-ITEM,如果中间有报错导致移动失败,导致下次循环时,仍定位的是相同记录
      也可以前面修改字段值后,主动调用 WHEN-VALIDATE-ITEM 触发器的代码,保证不会报错,那么即使后面 next_record 时,会再调用一次 WHEN-VALIDATE-ITEM 也无所谓
      至于 CHECKBOK 类型的 WHEN-CHECKBOX-CHANGED 触发器是不会自动触发,所有如果有必要,需要手工调用      
      */
      l_current_record_old := get_block_property('LINE'
                                                ,current_record);
      next_record;
      l_current_record_new := get_block_property('LINE'
                                                ,current_record);
      IF l_current_record_old = l_current_record_new THEN
        RAISE form_trigger_failure;
      END IF;
    END LOOP;
    go_record(l_top_record);
    go_record(l_current_record);
  
    fnd_message.set_string('已勾选 ' || l_count || ' 条记录');
    fnd_message.show;
  END;

在这里插入图片描述
拓展:
以上只是一个最简单的例子,实际情况下,一般做法是在按钮逻辑中,将勾选数据插入临时表中,再调用存储过程;如果需要提并发请求,那就需要用普通表。

权限控制

参考代码如下,然后在 WHEN-NEW-RECORD-INSTANCEPOST-QUERY 触发器中调用 set_items_property,在触发器 POST-INSERTPOST-UPDATE,也可以考虑加上

  ---重置块字段属性
  PROCEDURE reset_block_property(p_block_name IN VARCHAR2
                                ,p_value      IN NUMBER) IS
    l_item_name      VARCHAR2(240);
    l_last_item_name VARCHAR2(240);
  BEGIN
    --fetch the first block item
    l_item_name := p_block_name || '.' ||
                   get_block_property(p_block_name
                                     ,first_item);
  
    --fetch the last block item
    l_last_item_name := p_block_name || '.' ||
                        get_block_property(p_block_name
                                          ,last_item);
  
    LOOP
      IF get_item_property(l_item_name
                          ,displayed) = 'TRUE' THEN
        set_item_property(l_item_name
                         ,insert_allowed
                         ,p_value);
        set_item_property(l_item_name
                         ,update_allowed
                         ,p_value);
      END IF;
    
      EXIT WHEN l_item_name = l_last_item_name;
    
      l_item_name := p_block_name || '.' ||
                     get_item_property(l_item_name
                                      ,nextitem);
    END LOOP;
  END;

  --重置当前记录字段属性
  PROCEDURE reset_record_property(p_block_name IN VARCHAR2
                                 ,p_value      IN NUMBER) IS
    l_item_name      VARCHAR2(240);
    l_last_item_name VARCHAR2(240);
  BEGIN
    --fetch the first block item
    l_item_name := p_block_name || '.' ||
                   get_block_property(p_block_name
                                     ,first_item);
  
    --fetch the last block item
    l_last_item_name := p_block_name || '.' ||
                        get_block_property(p_block_name
                                          ,last_item);
  
    LOOP
      IF get_item_property(l_item_name
                          ,displayed) = 'TRUE' THEN
        set_item_instance_property(l_item_name
                                  ,current_record
                                  ,insert_allowed
                                  ,p_value);
        set_item_instance_property(l_item_name
                                  ,current_record
                                  ,update_allowed
                                  ,p_value);
      END IF;
    
      EXIT WHEN l_item_name = l_last_item_name;
    
      l_item_name := p_block_name || '.' ||
                     get_item_property(l_item_name
                                      ,nextitem);
    END LOOP;
  END;

  --权限控制
  PROCEDURE set_items_property IS
  BEGIN
  
    --重置
    --block
    set_block_property('LINE'
                      ,insert_allowed
                      ,property_true);
    set_block_property('LINE'
                      ,update_allowed
                      ,property_true);
    set_block_property('LINE'
                      ,delete_allowed
                      ,property_true);
  
    --item
    reset_block_property(p_block_name => 'LINE'
                        ,p_value      => property_true);
    /*
    如果允许更改的字段比较少,那可以默认全部不允许更新,然后再设置允许更新的字段;
    如果允许更改的字段比较多,那可以默认全部允许更新,然后再设置不允许更新的字段;    
    */
    --record
    reset_record_property(p_block_name => 'LINE'
                         ,p_value      => property_false);
  
    --根据条件,将修改具体字段权限
    set_item_instance_property('LINE.COLUMN1'
                              ,current_record
                              ,insert_allowed
                              ,property_true);
    set_item_instance_property('LINE.COLUMN1'
                              ,current_record
                              ,update_allowed
                              ,property_true);
  END;

客户化菜单栏

可定义45个表单层的触发器,SPECIAL1 ~ SPECIAL45:
工具:SPECIAL1 ~ SPECIAL15
报表:SPECIAL16 ~ SPECIAL 30
活动:SPECIAL31 ~ SPECIAL45

设置快码菜单

CUX:快速编码 功能定义示例:
功能:CUX_LOOKUP
用户功能名:CUX:快速编码
表单:定义代码
参数:APPL_SHORT_NAME=“CUX” VIEW_APPLICATION=“CUX”

只展示某个快码的菜单,如 CUX_TEST
功能:CUX_LOOKUP_TEST
用户功能名:CUX:快速编码-TEST
表单:定义代码
参数:APPL_SHORT_NAME=“CUX” VIEW_APPLICATION=“CUX” LOOKUP_TYPE=“CUX_TEST”

### 回答1: EBS Form开发手册是指Oracle E-Business Suite(EBS)中Form开发的详细指南和教程。Oracle EBS是一套集成的企业资源规划(ERP)软件解决方案,它提供了许多标准的应用程序模块,用于不同的业务领域,例如财务、供应链、人力资源等。 FormEBS中用于开发用户界面的工具之一,它可以创建交互式的数据输入和显示窗体。Form开发手册提供了详细的说明和示例,帮助开发人员理解和使用Form开发工具的各种功能。 在EBS Form开发手册中,你可以学习到如何创建自定义的数据输入和显示窗体,如何利用Form Builder工具进行界面设计和布局,以及如何添加和管理字段、按钮、菜单等控件。手册还解释了各种Form开发的常用概念和技术,例如表单对象、触发器、继承、模块间通信等。 此外,手册还介绍了如何处理Form的验证、处理用户输入、数据保存和查询等操作。它还提供了一些最佳实践和技巧,以帮助开发人员编写高效、可靠和易于维护的Form代码。 总之,EBS Form开发手册是EBS开发人员学习和参考的重要资源。通过学习这份手册,开发人员可以深入了解Form开发工具的使用方法和技巧,从而更好地设计和开发EBS应用程序界面。 ### 回答2: EBS(Elastic Block Store)是亚马逊云计算平台提供的一种云存储服务,EBS Form是用于开发和管理EBS卷的专用工具。EBS Form开发手册为使用EBS Form开发人员提供了详细的操作指南和技术参考。 EBS Form开发手册首先介绍了EBS Form的基本概念和主要特性。它解释了如何使用EBS Form创建、修改和删除EBS卷,描述了EBS卷的各种属性和功能选项,并提供了实际案例和最佳实践,以帮助开发人员更好地理解和应用EBS Form。 手册中还包括了EBS Form的安装配置和环境设置的详细说明。它介绍了EBS Form客户端的安装过程,以及如何配置和连接到云存储服务。开发人员可以按照手册提供的步骤和示例,快速搭建EBS Form开发环境,开始使用EBS Form进行云存储的开发工作。 此外,手册还提供了EBS Form的API文档和开发接口说明,以及与其他云服务的集成方法和建议。开发人员可以通过手册了解如何调用EBS Form的API进行卷的管理和操作,并了解如何将EBS Form与其他云计算服务(如Amazon EC2)进行集成,实现更多复杂的应用场景和业务需求。 综上所述,EBS Form开发手册是一本面向开发人员的指南,它详细介绍了EBS Form的功能和用法,提供了丰富的实例和技术参考,帮助开发人员更好地理解和应用EBS Form。通过熟练使用EBS Form开发人员可以更高效地开发和管理云存储服务,满足不同应用场景的需求。 ### 回答3: ebs form开发手册是一本针对EBS(Enterprise Business Suite)系统的表单开发的指南。EBS是由Oracle开发的一套集成的企业级管理软件,涵盖了各个方面的业务功能,如人力资源管理、财务管理、供应链管理等。 该开发手册提供了详细的指导和说明,帮助开发人员了解和掌握EBS系统中的表单开发。它包含了各个阶段的开发过程,从需求分析、设计、开发、测试到部署和维护。通过遵循这个手册,开发人员可以按照规范的流程正确地开发表单,确保系统的稳定性和可靠性。 在这个开发手册中,开发人员将学习使用EBS系统中的表单开发工具和技术,如Oracle Forms和Oracle PL/SQL。他们将了解如何创建表单界面、定义数据字段、实现业务逻辑、编写触发器和事件等。此外,手册还介绍了与表单开发相关的最佳实践和常用的技巧,帮助开发人员提高开发效率和质量。 EBS表单开发手册还提供了丰富的示例和案例,让开发人员能够更好地理解和应用所学知识。通过实际练习和实践,开发人员可以更好地掌握EBS表单开发的技巧和方法,为企业提供定制化的解决方案。 总之,EBS表单开发手册是一本详尽的指南,帮助开发人员了解和掌握EBS系统中的表单开发。通过遵循手册中的指导,开发人员可以正确地开发表单,并提供高质量的解决方案,以满足企业的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值