Oracle 提供了APP_MULTI
包(可在APPCORE
库中找到)以支持在 Oracle Forms 中多选记录。为了利用此功能,我必须对我的表单做些什么?例如:
- 我必须实施哪些触发器?
- 我应该调用哪些
APP_MULTI
方法以及何时调用?
Oracle 提供了APP_MULTI
包(可在APPCORE
库中找到)以支持在 Oracle Forms 中多选记录。为了利用此功能,我必须对我的表单做些什么?例如:
APP_MULTI
方法以及何时调用?该APP_MULTI
软件包允许您向表单添加多选功能。这包括:
该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
参数。如果blockname
是NULL
,程序将使用 的值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
变量可以是TRUE
或FALSE
,这取决于是否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.