如何使用APP_MULTI package支持Oracle表单中的多项选择?
Oracle提供了如何使用APP_MULTI package支持Oracle表单中的多项选择?,oracle,oracleforms,Oracle,Oracleforms,Oracle提供了APP_MULTI软件包(可在APPCORE库中找到),以支持Oracle表单中记录的多选。为了利用此功能,我必须对表单执行哪些操作?例如: 我必须实现哪些触发器 我应该调用哪些APP\u MULTI方法以及何时调用 使用APP\u MULTI软件包,您可以在表单中添加多选功能。这包括: 只需单击一条记录,即可选择该记录 按住Ctrl键并单击各种记录,可以选择多个记录 通过从应用程序菜单中选择“全选”,可以批量选择多个记录 通过从应用程序菜单中选择“全部取消选择”,可以批量
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包含受选择/取消选择影响的数据块的名称GLOBAL.APPCORE\u MULTI\u块
GLOBAL可以是以下任一操作:GLOBAL.APPCORE\u MULTI\u操作
当已选择记录时“已选择记录”
取消选择记录时“取消选择记录”
当“全选”和“全选”菜单项处于启用或禁用状态时(通常在焦点分别进入或离开数据块时发生)“标签更改”
package变量可以是APP\u MULTI.LOOPING
或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导航此记录组