Как я могу использовать пакет APP_MULTI для поддержки множественного выбора в моей форме Oracle? - PullRequest
1 голос
/ 20 июля 2010

Oracle предоставляет пакет APP_MULTI (находится в библиотеке APPCORE) для поддержки множественного выбора записей в формах Oracle.Что я должен сделать с моей формой, чтобы воспользоваться этой функциональностью?Например:

  • Какие триггеры я должен реализовать?
  • Какие APP_MULTI методы я должен вызвать и когда?

1 Ответ

1 голос
/ 27 июля 2010

Пакет 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 пакет вместо.

...