如何使用APP_MULTI package支持Oracle表单中的多项选择?

如何使用APP_MULTI package支持Oracle表单中的多项选择?,oracle,oracleforms,Oracle,Oracleforms,Oracle提供了APP_MULTI软件包(可在APPCORE库中找到),以支持Oracle表单中记录的多选。为了利用此功能,我必须对表单执行哪些操作?例如: 我必须实现哪些触发器 我应该调用哪些APP\u MULTI方法以及何时调用 使用APP\u MULTI软件包,您可以在表单中添加多选功能。这包括: 只需单击一条记录,即可选择该记录 按住Ctrl键并单击各种记录,可以选择多个记录 通过从应用程序菜单中选择“全选”,可以批量选择多个记录 通过从应用程序菜单中选择“全部取消选择”,可以批量

Oracle提供了
APP_MULTI
软件包(可在
APPCORE
库中找到),以支持Oracle表单中记录的多选。为了利用此功能,我必须对表单执行哪些操作?例如:

  • 我必须实现哪些触发器
  • 我应该调用哪些
    APP\u MULTI
    方法以及何时调用

使用
APP\u MULTI
软件包,您可以在表单中添加多选功能。这包括:

  • 只需单击一条记录,即可选择该记录
  • 按住Ctrl键并单击各种记录,可以选择多个记录
  • 通过从应用程序菜单中选择“全选”,可以批量选择多个记录
  • 通过从应用程序菜单中选择“全部取消选择”,可以批量取消选择多个记录
  • 通过单击第一条记录,然后按住Shift键,然后单击最后一条记录,可以批量选择多条记录
启用功能
APP\u MULTI
程序包通过响应表单上的以下事件来工作:

  • 全部取消选择
  • KEY-CLRFRM
  • KEY-CLRREC
  • KEY-CREREC
  • KEY-DELREC
  • POST-BLOCK
  • PRE-BLOCK
  • SELECT\u ALL
  • WHEN-CLEAR-BLOCK
  • 当鼠标单击时
  • WHEN-NEW-RECORD-INSTANCE
不幸的是,包不能自动“钩住”这些事件。相反,您负责创建必要的触发器,并在每个触发器中显式调用
APP\u MULTI.EVENT
过程,传递正在处理的事件的名称。本程序声明如下:

  PROCEDURE event(event_name VARCHAR2,
                  blockname  VARCHAR2 DEFAULT NULL);
例如,您的
KEY-CLRFRM
触发器可以如此简单:

APP_MULTI.EVENT('KEY-CLRFRM');
请注意,该过程接受可选的
blockname
参数。如果
blockname
NULL
,则过程将使用
SYSTEM.TRIGGER\u BLOCK
的值

如果希望表单上的所有数据块都能接收多选功能,可以在表单上而不是在单个数据块上创建触发器。如果您只希望某些数据块接收功能,可以在这些数据块上创建触发器,也可以在表单上创建触发器并执行自己的检查,以确定是否应调用
APP\u MULTI.EVENT

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

  • GLOBAL.APPCORE\u MULTI\u块
    GLOBAL包含受选择/取消选择影响的数据块的名称
  • GLOBAL.APPCORE\u MULTI\u操作
    GLOBAL可以是以下任一操作:
    • “已选择记录”
      当已选择记录时
    • “取消选择记录”
      取消选择记录时
    • “标签更改”
      当“全选”和“全选”菜单项处于启用或禁用状态时(通常在焦点分别进入或离开数据块时发生)
  • APP\u MULTI.LOOPING
    package变量可以是
    TRUE
    FALSE
    ,这取决于是否在循环中调用了
    MULTI\u RECORD\u ACTION
    (即,如果批量选择/取消选择记录)
在批量操作期间,
APP\u MULTI
将在所有选择/取消选择完成后再次调用
MULTI\u RETURN\u操作
触发器。在最后一次调用期间,
GLOBAL.APPCORE\u MULTI\u ACTION
将设置为
'LABEL\u CHANGE'
APP\u MULTI。循环
将设置为
FALSE
。出于性能原因,您可能希望利用此最终调用来避免批量操作期间不必要的计算。例如,您的
MULTI\u RETURN\u操作可以如下所示:

IF NOT APP_MULTI.LOOPING THEN
  costly_calculation();
END IF;
+---------+ | REC_NUM | +---------+ | 1 | | 9 | +---------+ 确定当前选择的记录 对于每个数据块,
APP_MULTI
维护一个包含当前选定记录编号的记录组。对于给定的数据块,您可以通过
APP\u MULTI.GET\u group\u COL
功能访问此记录组的唯一列。您还可以通过
APP\u MULTI.GET\u GROUP\u COUNT
功能确定所选记录的数量。这两个函数都接受数据块的名称作为其唯一参数

例如,假设您有一个名为
CUSTOMER
的数据块,其字段名为
CUSTOMER\u 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
)存储所选记录的记录编号。这是前面提到的
APP\u MULTI.GET\u GROUP\u COLUMN
函数返回的
GROUPCOLUMN

例如,假设您有一个名为
CUSTOMER
的数据块,并且选择了第1、第4和第9条记录。
CUSTOMER\u MULTI
记录组将包含以下数据:

+---------+ | REC_NUM | +---------+ | 1 | | 4 | | 9 | +---------+ 尽管您可以使用标准bu导航此记录组