Oracle提供APP_MULTI
包(在APPCORE
库中找到)以支持Oracle Forms中的多选记录。为了利用这个功能,我必须对我的表单做些什么?例如:
APP_MULTI
方法以及何时使用?答案 0 :(得分:1)
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 st ,4 th 和9 th 记录。 CUSTOMER_MULTI
记录组将包含以下数据:
+---------+ | REC_NUM | +---------+ | 1 | | 4 | | 9 | +---------+
取消选择4 th 记录后,CUSTOMER_MULTI
记录组现在将如下所示:
+---------+ | REC_NUM | +---------+ | 1 | | 9 | +---------+
虽然您可以使用标准内置插件(FIND_GROUP
,FIND_COLUMN
,GET_GROUP_ROW_COUNT
)导航此记录组,但最好使用GET_GROUP_COL
和GET_GROUP_COUNT
包的APP_MULTI
函数代替。