Пакет APP_MULTI
позволяет добавить в форму несколько вариантов выбора.Это включает в себя:
- Можно выбрать одну запись, просто щелкнув по ней.
- Можно выбрать несколько записей, удерживая нажатой клавишу Ctrl и нажавразличные записи.
- Несколько записей можно выбрать оптом, выбрав «Выбрать все» в меню приложения.
- Несколько записей можно отменить массовым выбором «Отменить выбор» из меню приложения..
- Несколько записей можно выбрать оптом, щелкнув первую запись, затем, удерживая нажатой клавишу Shift , затем щелкнув последнюю запись.
Включениефункциональность
Пакет 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
пакет вместо.