1

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

  • 我必须实施哪些触发器?
  • 我应该调用哪些APP_MULTI方法以及何时调用?
4

1 回答 1

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、第 4和第 9记录。记录组将CUSTOMER_MULTI包含以下数据:

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

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

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

Although you are able to navigate this record group using the standard built-ins (FIND_GROUP, FIND_COLUMN, GET_GROUP_ROW_COUNT), it is preferable to use the GET_GROUP_COL and GET_GROUP_COUNT functions of the APP_MULTI package instead.

于 2010-07-27T16:58:11.517 回答