如何使用APP_MULTI包支持Oracle表单中的多选?

时间:2010-07-20 15:42:08

标签: oracle oracleforms

Oracle提供APP_MULTI包(在APPCORE库中找到)以支持Oracle Forms中的多选记录。为了利用这个功能,我必须对我的表单做些什么?例如:

  • 我必须实施哪些触发器?
  • 我应该拨打哪种APP_MULTI方法以及何时使用?

1 个答案:

答案 0 :(得分:1)

APP_MULTI包允许您向表单添加多选功能。这包括:

  • 只需单击即可选择单个记录。
  • 可以通过按住 Ctrl 键并单击各种记录来选择多个记录。
  • 通过从应用程序菜单中选择“全选”,可以批量选择多个记录。
  • 通过从应用程序菜单中选择“取消全选”,可以批量取消选择多个记录。
  • 通过单击第一条记录,然后按住 Shift 键,然后单击最后一条记录,可以批量选择多条记录。

启用功能

APP_MULTI包通过响应表单上的以下事件来运行:

  • DESELECT_ALL
  • KEY-CLRFRM
  • KEY-CLRREC
  • KEY-CREREC
  • KEY-DELREC
  • POST-BLOCK
  • PRE-BLOCK
  • SELECT_ALL
  • WHEN-CLEAR-BLOCK
  • WHEN-MOUSE-CLICK
  • WHEN-NEW-RECORD-INSTANCE

不幸的是,包不能自动“挂钩”到这些事件中。相反,您负责创建必要的触发器并在每个触发器中显式调用APP_MULTI.EVENT过程,并传递正在处理的事件的名称。此过程声明如下:

  PROCEDURE event(event_name VARCHAR2,
                  blockname  VARCHAR2 DEFAULT NULL);

例如,您的KEY-CLRFRM触发器可能就像这样简单:

APP_MULTI.EVENT('KEY-CLRFRM');

请注意,该过程接受可选的blockname参数。如果blocknameNULL,则该过程将使用SYSTEM.TRIGGER_BLOCK的值。

如果您希望表单上的所有数据块能够接收多选功能,则可以在表单上而不是在单个数据块上创建触发器。如果您只希望某些数据块接收功能,则可以在这些数据块上创建触发器,您可以在表单上创建触发器并执行自己的检查以确定是否APP_MULTI.EVENT应该被称为。

响应选择/取消选择事件

您可以通过实施自定义MULTI_RETURN_ACTION触发器(在数据块或表单的顶层)通知您选择和取消选择。在每次选择或取消选择记录后(即使批量选择/取消选择记录),将触发此触发器。在触发器中,您可以利用这些值来更好地理解上下文:

  • GLOBAL.APPCORE_MULTI_BLOCK全局包含受选择/取消选择影响的数据块的名称。
  • GLOBAL.APPCORE_MULTI_ACTION全球可能是以下任何一项:
      选择记录时
    • 'RECORD_SELECTED'
    • 取消选择记录时
    • 'RECORD_DESELECTED'
    • 'LABEL_CHANGE'当启用或禁用“全选”和“取消全选”菜单项时(通常在焦点分别进入或离开数据块时发生)
  • APP_MULTI.LOOPING包变量可以是TRUEFALSE,具体取决于是否在循环内调用MULTI_RECORD_ACTION(即,如果正在选择记录) /批量取消选择)。

在批量操作期间,APP_MULTI将在所有选择/取消选择完成后再次调用MULTI_RETURN_ACTION触发器。在最后一次通话中,GLOBAL.APPCORE_MULTI_ACTION将设置为'LABEL_CHANGE'APP_MULTI.LOOPING将设置为FALSE。出于性能原因,您可能希望利用此最终调用来避免批量操作期间进行不必要的计算。例如,您的MULTI_RETURN_ACTION可能如下所示:

IF NOT APP_MULTI.LOOPING THEN
  costly_calculation();
END IF;

确定当前选择的记录

对于每个数据块,APP_MULTI维护一个包含当前所选记录号的记录组。对于给定的数据块,您可以通过APP_MULTI.GET_GROUP_COL函数访问此记录组的唯一列。您还可以通过APP_MULTI.GET_GROUP_COUNT功能确定所选记录的数量。这两个函数都接受数据块的名称作为它们唯一的参数。

例如,假设您有一个名为CUSTOMER的数据块,其字段名为CUSTOMER_NAME。您可以通过以下代码打印出所选客户的名称:

PROCEDURE PRINT_SELECTED_CUSTOMER_NAMES IS
  record_number_column GROUPCOLUMN;
  selected_record_count NUMBER;
BEGIN
  record_number_column := APP_MULTI.GET_GROUP_COL('CUSTOMER');
  selected_record_count := APP_MULTI.GET_GROUP_COUNT('CUSTOMER');

  FOR i IN 1 .. selected_record_count LOOP
    DECLARE
      record_number NUMBER;
    BEGIN
      record_number := GET_GROUP_NUMBER_CELL(record_number_column, i);
      GO_RECORD(record_number);
      print(:CUSTOMER.CUSTOMER_NAME);
    END;
  END LOOP;
END;

实施细节

对于启用了多选的每个数据块,APP_MULTI包维护一个名为blockname || '_MULTI'的单独记录组。此记录组为每个选定记录包含一行。它只有列(REC_NUM)存储所选记录的记录号。这是前面提到的GROUPCOLUMN函数返回的APP_MULTI.GET_GROUP_COLUMN

例如,假设您有一个名为CUSTOMER的数据块,并且您选择了1 st ,4 th 和9 th 记录。 CUSTOMER_MULTI记录组将包含以下数据:

+---------+
| REC_NUM |
+---------+
|       1 |
|       4 |
|       9 |
+---------+

取消选择4 th 记录后,CUSTOMER_MULTI记录组现在将如下所示:

+---------+
| REC_NUM |
+---------+
|       1 |
|       9 |
+---------+

虽然您可以使用标准内置插件(FIND_GROUPFIND_COLUMNGET_GROUP_ROW_COUNT)导航此记录组,但最好使用GET_GROUP_COLGET_GROUP_COUNT包的APP_MULTI函数代替。