Группы записей (Record Groups)
Функции и процедуры для работы с группами записей
В Oracle Forms существует достаточно много процедур и функций для работы с группами записей, которые дают возможность делать следующее:
- изменять запрос, связанный с запросной группой, при этом добавляя новые столбцы и строки в структуру группы;
- заполнять и очищать группу;
- программно создавать группу;
- управлять размером массива извлекаемых данных;
- добавлять и удалять строки;
- устанавливать и получать значения колонок;
- помечать и отменять пометки строк как "выбранные";
- получать и устанавливать свойства группы.
Разобьем все процедуры и функции на несколько категорий, определяющих их назначение.
Создание и удаление групп:
- CREATE_GROUP (RECORDGROUP_NAME IN VARCHAR2, SCOPE IN NUMBER, ARRAY_SIZE IN NUMBER) RETURN FORMS4C. RECORDGROUP;
- CREATE_GROUP_FROM_QUERY (RECORDGROUP_NAME IN VARCHAR2, QUERY IN VARCHAR2, SCOPE IN NUMBER, ARRAY_SIZE IN NUMBER) RETURN FORMS4C.RECORDGROUP;
- DELETE_GROUP (RECORDGROUP_NAME IN VARCHAR2).
Изменение структуры группы – эти подпрограммы неприменимы к статическим запросным группам:
- ADD_GROUP_COLUMN (RECORDGROUP_NAME IN VARCHAR2, GROUPCOLUMN_NAME IN VARCHAR2, COLUMN_TYPE IN NUMBER) RETURN FORMS4C.GROUPCOLUMN;
- ADD_GROUP_ROW (RECORDGROUP_NAME IN VARCHAR2, ROW_NUMBER IN NUMBER);
- DELETE_GROUP_ROW (RECORDGROUP_NAME IN VARCHAR2, ROW_NUMBER IN NUMBER).
Заполнение групп:
- GET_GROUP_SELECTION_COUNT (RECORDGROUP_ID IN FORMS4C.RECORDGROUP) RETURN NUMBER;
- POPULATE_GROUP_WITH_QUERY (RECORDGROUP_ID IN FORMS4C.RECORDGROUP, QUERY IN VARCHAR2) RETURN NUMBER;
- SET_GROUP_CHAR_CELL (GROUPCOLUMN_ID IN FORMS4C.GROUPCOLUMN, ROW_NUMBER IN NUMBER, CELL_VALUE IN VARCHAR2);
- SET_GROUP_DATE_CELL (GROUPCOLUMN_NAME IN VARCHAR2, ROW_NUMBER IN NUMBER, CELL_VALUE IN DATE);
- SET_GROUP_NUMBER_CELL (GROUPCOLUMN_NAME IN VARCHAR2, ROW_NUMBER IN NUMBER, CELL_VALUE IN NUMBER).
Получение значений ячеек:
- GET_GROUP_CHAR_CELL (GROUPCOLUMN_NAME IN VARCHAR2, ROW_NUMBER IN NUMBER) RETURN VARCHAR2;
- GET_GROUP_DATE_CELL (GROUPCOLUMN_ID IN FORMS4C.GROUPCOLUMN, ROW_NUMBER IN NUMBER) RETURN DATE;
- GET_GROUP_NUMBER_CELL (GROUPCOLUMN_NAME IN VARCHAR2, ROW_NUMBER IN NUMBER) RETURN NUMBER.
Обработка строк:
- GET_GROUP_ROW_COUNT (RECORDGROUP_ID IN FORMS4C.RECORDGROUP) RETURN NUMBER;
- GET_GROUP_SELECTION (RECORDGROUP_NAME IN VARCHAR2, SELECTION_NUMBER IN NUMBER) RETURN NUMBER;
- GET_GROUP_SELECTION_COUNT (RECORDGROUP_ID IN FORMS4C.RECORDGROUP) RETURN NUMBER;
- RESET_GROUP_SELECTION (RECORDGROUP_NAME IN VARCHAR2);
- SET_GROUP_SELECTION (RECORDGROUP_ID IN FORMS4C.RECORDGROUP, ROW_NUMBER IN NUMBER);
- UNSET_GROUP_SELECTION (RECORDGROUP_ID IN FORMS4C.RECORDGROUP, ROW_NUMBER IN NUMBER).
Функции идентификаторов объектов:
- FIND_GROUP (RECORDGROUP_NAME IN VARCHAR2) RETURN FORMS4C.RECORDGROUP;
- FIND_COLUMN (GROUPCOLUMN_NAME IN VARCHAR2) RETURN FORMS4C.GROUPCOLUMN.
Примечание. Учтите, что программно можно создавать и модифицировать только запросные и незапросные группы, в отличие от статических групп. Процедуры и функции, используемые для обработки как запросной, так и незапросной группой, не всегда одинаковы.
Создание групп записей программно
Перед тем как перейти к рассмотрению этой темы и проработке представленных примеров, выполните следующие два шага:
- Создайте таблицу ABOUT в SQL*Plus или любой другой утилите:
SQL> create table ABOUT ( 2 Name varchar2(10), 3 FName varchar2(12), 4 SName varchar2(12));
- После создания таблицы перейдите в Forms и с помощью Data Block Wizard создайте блок данных, выбрав в качестве структуры таблицу ABOUT.
Мы с вами уже детально ознакомились с созданием группы записей в режиме проектирования. Теперь перейдем к следующему этапу – созданию групп записей программно. Рассмотрим два примера: создание запросной и незапросной группы.
Создание запросной группы:
- Откройте созданный вами модуль ABOUT.fmb.
- Откройте редактор разметки и создайте в нем следующие элементы:
- Button1 - в палитре свойств этого элемента установите свойство "Метка" в "Создать запросную группу";
- Button2 - в палитре свойств этого элемента установите свойство "Метка" в "Создать незапросную группу";
- Button3 - в палитре свойств этого элемента установите свойство "Метка" в "Добавить колонку";
- Button4 - в палитре свойств этого элемента установите свойство "Метка" в "Добавить строку";
- Button5 - в палитре свойств этого элемента установите свойство "Метка" в "Удалить строку";
- Button6 и Button7 - "Метка" этих двух кнопок установите в """;
- Button8 - в палитре свойств этого элемента установите свойство "Метка" в "Удалить группу";
- Text-item1 (элемент текста) - в палитре свойств этого объекта измените 2 свойства: "Имя" - на ZAP_GR, а "Элемент базы данных" - на "НЕТ";
- Text-item2 - в палитре свойств этого объекта измените 2 свойства: "Имя" - на NO_ZAP_GR, а "Элемент базы данных" - на "НЕТ".
- Для кнопки "Создать запросную группу" создайте триггер WHENBUTTON_PRESSED:
/*WHEN-BUTTON_PRESSED*/ DECLARE group_id RecordGroup; query_ok NUMBER; row_count number; BEGIN /* создаем группу prod_group и присваиваем ее идентификатор ** переменной group_id */ group_id := Create_Group_From_Query('about_group', 'SELECT Name,FName, SName FROM ABOUT WHERE rownum<10'); /* теперь исполним запрос новой группы, используя переменную ** group_id для идентификации группы */ query_ok := Populate_Group(group_id); /* если запрос неудачный, то прерываем этот триггер вызовом ** предварительно определенного исключения */ IF query_ok <> 0 THEN RAISE Form_Trigger_Failure; END IF; IF query_ok = 0 THEN message('SQL maked succesfull'); END IF; END;
- Для кнопки "Создать незапросную группу" создайте триггер WHENBUTTON_PRESSED:
/*WHEN-BUTTON_PRESSED*/ DECLARE group_id RecordGroup; col1_id GroupColumn; col2_id GroupColumn; col3_id GroupColumn; query_ok number; total_rows NUMBER; new_row NUMBER; BEGIN /* Создаем незапросную группу с именем my_group и присваиваем ее ** идентификатор переменной group_id. */ group_id := Create_Group('about_no_query_group'); /* Добавляем в новую группу три колонки, используя для идентификации ** группы переменную group_id. Первые две колонки типа CHAR_COLUMN и ** их длина должна определяться. ** Третья типа NUMBER_COLUMN и параметр длины не принимает */ col1_id := Add_Group_Column(group_id,'col1_id',CHAR_COLUMN,50); col2_id := Add_Group_Column(group_id,'col2_id',CHAR_COLUMN,50); col3_id := Add_Group_Column(group_id,'col3_id',NUMBER_COLUMN); query_ok := Populate_Group(group_id); /* если запрос неудачный, то прерываем этот триггер вызовом ** предварительно определенного исключения */ END;
- Для кнопки "Добавить колонку" создайте триггер WHEN-BUTTON_PRESSED:В первом параметре процедуры Add_Group_Column вы указываете группу, в которую собираетесь добавить колонку, во втором параметре вы указываете имя новой колонки, а в третьем указываете тип, создаваемой колонки: CHAR_COLUMN, DATE_COLUMN, NUMBER_COLUMN.
/*WHEN-BUTTON_PRESSED*/ Add_Group_Column('about_no_query_group','N_AME',CHAR_COLUMN); Set_Group_Char_Cell('about_no_query_group .N_AME',2,'Nik');
Примечание. Новую колонку можно добавить только в группу, не содержащую строк.
- Для кнопки "Добавить строку" создайте триггер WHEN-BUTTON_PRESSED:Первый параметр about_group указывает на имя группы, в которую мы хотим добавить запись, а второй параметр - это номер строки, в которую мы хотим вставить запись. Для добавления новой строки в группу с уже имеющимся набором строк используйте константу END_OF_GROUP, например:
/*WHEN-BUTTON_PRESSED*/ Add_Group_Row('about_group',2);
Примечание. В новой строке значения колонок по умолчанию определяются как NULL. Поэтому после добавления новой строки используйте процедуру SET_GROUP_CHAR (NUMBER, DATE)_CELL для установки значений новой строки.Add_Group_Row('about_group', END_OF_GROUP);
- Для кнопки "Удалить строку" создайте триггер WHEN-BUTTON_PRESSED:Первый параметр about_group указывает на имя группы, в которой мы хотим произвести удаление. Второй параметр указывает на номер удаляемой строки; вы также можете использовать в качестве параметра константу ALL_ROWS, которая выполняет удаление всех строк группы.
/*WHEN-BUTTON_PRESSED*/ Delete_Group_Row('about_group',1);
- Для кнопки "(Q)-"" (подсчет строк запросной группы) создайте триггер WHEN-BUTTON_PRESSED:В функции Get_Group_Row_Count вам достаточно указать имя группы или ее ID для нахождения количества строк в группе.
/*WHEN-BUTTON_PRESSED*/ :ABOUT.zap_gr:=Get_Group_Row_Count('about_group');
- Для кнопки "(NoQ)-"" (подсчет строк незапросной группы) создайте триггер WHEN-BUTTON_PRESSED:
/*WHEN-BUTTON_PRESSED*/ :ABOUT.no_zap_gr:=Get_Group_Row_Count('about_no_query_group');
- Для кнопки "Удалить группу" создайте триггер WHEN-BUTTON_PRESSED:Примечание. Удалять группы записей программно, то есть с помощью вышеупомянутой функции, можно, но лишь те группы записей, которые создавались программно, а не во время проектирования.
/*WHEN-BUTTON_PRESSED*/ :ABOUT.no_zap_gr:=Get_Group_Row_Count('about_no_query_group');
Теперь запустите форму и попробуйте создать запросную и незапросную группу, посчитать количество строк в группе до и после удаления или вставки. Для ответа на вопрос "Создана ли группа или удалена?" можно выполнить такую проверку:
- создать, к примеру, запросную группу одноименной кнопкой;
- затем еще раз нажать на эту кнопку, пытаясь создать такую же группу. После повторной попытки Oracle Forms выведет вам следующее сообщение: FRM – 41072 "Невозможно создать группу about_group" – это означает, что группа с таким именем уже существует. После этой проверки мы знаем, что группа создана;
- теперь нажмем кнопку DELETE_GROUP, то есть удалим созданную нами группу. Теперь, нажав кнопку "Создать запросную группу", мы получим сообщение о создании группы, следовательно, группа действительно была удалена.
Пометка строк в группе записей
Программно вы можете не только считать количество строк, устанавливать новые или изменять предыдущие значения, но и выделять (помечать) из существующей группы интересующий вас набор данных, удовлетворяющий, к примеру, какому-то одному значению. Функции и процедуры, связанные с пометкой, имеют окончание "_ SELECTION". Опишем назначение каждой из них более подробно.
- SET_GROUP_SELECTION (процедура) – для пометки строки как выбранной;
- GET_GROUP_SELECTION_COUNT (функция) – для определения количества выбранных строк в группе;
- GET_GROUP_SELECTION (функция) – для получения номера строки, помеченной как выбранная;
- UNSET_GROUP_SELECTION (функция) – для отмены пометки выбранной строки;
- RESET_GROUP_SELECTION (процедура) – для отмены выбора всех выбранных в текущий момент строк в группе.
Теперь рассмотрим простой пример: "Пометить как выбранные все строки, в которых встречается имя Вова". Для этого выполните следующие шаги:
- Откройте форму ABOUT и создайте кнопку с меткой "Пометить".
- Создайте триггер WHEN_BUTTON_PRESSED:
/*WHEN-BUTTON_PRESSED*/ DECLARE C_OUNT NUMBER; count_names NUMBER; group_id RecordGroup; BEGIN group_id:= FIND_GROUP('about_group'); C_OUNT := Get_Group_Row_Count(group_id); FOR i IN 1..C_OUNT LOOP IF Get_Group_Char_Cell('about_group.Name',i) = 'Вова' THEN Set_Group_Selection(group_id,i); END IF; END LOOP; count_names := Get_Group_Selection_Count(group_id); :ABOUT.ZAP_GR:=TO_CHAR (count_names); END;
- Запустите форму на выполнение. Нажмите кнопку "Пометить", после чего у вас в поле "Количество строк в запросной группе" появится значение, равное количеству помеченных строк в запросной группе с именем Вова. Но теперь учтите, что функция GET_GROUP_SELECTION будет вам возвращать значение из набора, сформированного процедурой SET_GROUP_SELECTION, причем номера строк в новом наборе будут расставлены заново начиная с единицы. Поэтому если до этого выбранные вами строки, к примеру, имели номера 2, 7, 10, 15, ..., то после формирования нового набора 2 будет иметь порядковый номер 1, 7 – порядковый номер 2, 10 – порядковый номер 3 и так далее:Здесь about_group – имя группы, а 2 – номер помеченной строки.
Get_Group_Selection('about_group',2);