Oracle 提供了APP_MULTI包(可在APPCORE库中找到)以支持在 Oracle Forms 中多选记录。为了利用此功能,我必须对我的表单做些什么?例如:
- 我必须实施哪些触发器?
- 我应该调用哪些
APP_MULTI方法以及何时调用?
Oracle 提供了APP_MULTI包(可在APPCORE库中找到)以支持在 Oracle Forms 中多选记录。为了利用此功能,我必须对我的表单做些什么?例如:
APP_MULTI方法以及何时调用?该APP_MULTI软件包允许您向表单添加多选功能。这包括:
该APP_MULTI包通过响应表单上的以下事件来工作:
DESELECT_ALLKEY-CLRFRMKEY-CLRRECKEY-CRERECKEY-DELRECPOST-BLOCKPRE-BLOCKSELECT_ALLWHEN-CLEAR-BLOCKWHEN-MOUSE-CLICKWHEN-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.