Цель лекции: научить слушателя создавать группы записей и ознакомить со стандартными встроенными подпрограммами, предназначенными для работы с Record Group.
Разобьем изучение этой главы на несколько частей, т. к. этот материал довольно объемный и требует внимательного изучения, поскольку используется более чем с одним объектом.
Описание и свойства групп записей.
Создание групп записей.
Примеры использования.
Описание, назначения и свойства
Группы записей – это структурированные наборы данных, которые могут использоваться для передачи данных между модулями прикладных программ либо для заполнения списков значений или других элементов списка. Группа записей подобна как таблицам, так и представлениям базы данных. Как и таблица, группа записей содержит столбцы и строки, которые принадлежат той рабочей области, в которой определены. Так же, как и представление, группа записей создается на основе запроса, но является более гибкой, и не только по той причине, что группа записей для Oracle Forms локальна, но и потому что запрос, на основе которого создается группа записей,
можно конструировать динамически, во время выполнения программы.
Группы записей можно разделить на два основных типа, которые вы можете определить в таблице свойств этого объекта:
Запросные – это группа записей, имеющая связанный с ней оператор выборки – SELECT. При создании группы записей Forms дает столбцам этой группы имена по умолчанию; все остальные данные, такие как размерность столбца и тип данных, Forms наименует исходя из тех данных, которые вы указали в SELECT. Записи для такой группы извлекаются тем же запросом, что и при построении группы записей. Колонки запросной группы записей берут свои имена по умолчанию, типы данных и размерность – из колонок базы данных, на которые делаются ссылки в операторе SELECT.
Статические – это группа записей, не связанная с запросом, поэтому структуру такой группы вы определяете во время проектирования, и, следовательно, во время выполнения формы ее значения остаются фиксированными, т. к. вы их задаете заранее при построении группы.
Основные функциональные свойства группы записей:
Тип запроса – здесь вы можете выбрать тип запроса "Статический" или "Запрос". Их различия описаны выше. В зависимости от выбранного типа группа записей принимает разные функциональные свойства.
Если выбран тип "Запрос":
Запрос группы записей – в этом свойстве вы пишете запрос, которым будете выбирать записи в группу и создавать группу;
Размер выборки группы записей – это число строк, выбираемое Запросом группы записей;
С пецификация столбца – при выборе этого свойства запускается окно "STUDY: Спецификация столбца", в котором вы можете указать имя столбца, длину и тип.
Если выбран тип "Статический":
Спецификация столбца – при выборе этого свойства запускается точно такое же окно "STUDY: Спецификация столбца", как и в предыдущем случае, с той лишь разницей, что помимо полей, в которых вы можете указать имя столбца, длину и тип, вы также можете указать и значение столбцов (Column Values).
Применение групп записей
Группы записей являются неотъемлемой частью списков значений LOV, так как LOV связан с определенной группой записей. Когда в мастере создания LOV – LOV Wizard – вы выбираете столбцы из одной или более таблицы для их отображения в LOV, вы на самом деле создаете группу записей, которая после завершения работы мастера появится в соответствующем узле навигатора. Если же вы создаете LOV вручную, то вам придется самим создавать группу записей, а затем присоединять ее к LOV. Подсоединение группы запросов к LOV может осуществляться как статически, так и динамически, во время выполнения программы.
Помимо LOV группы записей использует объект TREE VIEW – в этом объекте группа записей является одним из двух вариантов заполнения этого элемента. Создав группу записей, вы можете ее присоединить к TREE VIEW через его палитру свойств. Однако запросная группа для этого элемента строится не через обычный запрос, а через иерархический запрос. Создание групп записей для этого объекта мы рассмотрим в разделе, посвященном объекту TREE VIEW.
С помощью специального набора процедур и функций для работы с группами записей можно не только менять структуру группы в ходе выполнения программы, но и переопределять группу записей как для LOV, так и для TREE VIEW. Для динамического подключения групп записей к LOV и TREE VIEW используются две процедуры:
SET_LOV_PROPERTY – содержит аргумент для установки группы записей в LOV;
SET_TREE_PROPERTY – содержит аргумент для установки группы записей в TREE VIEW.
Строки групп записей внутренне пронумерованы последовательно начиная с 1, то есть 1, 2, 3 и т. д., поэтому если вам будет необходимо обратиться к каким-либо определенным строкам, то достаточно указать номер этой строки.
Создание группы записей
Поскольку существует два типа запросных групп — статическая и запросная, этапы создания статической и запросной групп рассмотрим отдельно.
Для создания запросной группы выполните следующие шаги:
Перейдите в навигатор и выберите узел " группы записей ". В меню навигатора выберите Navigator->Create.
В появившемся окне New Record Group выберите тип запроса Based on the Query below.
В поле Query Text введите ваш запрос. В запросе вы можете без проблем использовать как параметры формы, так и глобальные переменные. После окончания ввода запроса нажмите кнопку "ОК", причем ввод символа ";" в конце запроса необязателен. После этого Forms проверит ваш запрос на наличие ошибок и закроет окно, если таковые отсутствуют.
Созданная вами группа пока еще не имеет строк, поэтому для так называемого заполнения вам необходимо программно исполнить запрос с помощью процедуры POPULATE_GROUPЕсли на запросной группе записей основывается LOV, то Oracle Forms исполняет запрос, связанный с этой группой записей, при каждом вызове LOV либо при проверке LOV Validation.
. Исполняемый запрос, естественно, должен быть связан с запросной группой.
После создания Запросной группы записей перейдите в палитру свойств группы записей и выберите свойство "Спецификация столбца" (Column Specification). При выборе этого свойства запускается окно Query Record Group Column Specification, в котором вы увидите выбранные вами столбцы (Column Names), их тип (Data Type) и размер (Length).
При выборе определенной колонки отображаются соответствующие ей структуры (тип, размер). Если вы удалите какой-нибудь столбец из Column Names, ваш запрос абсолютно не пострадает, а вот изменение запроса, будь то удаление, добавление или изменение запрашиваемого столбца в запросе, приведет и к его изменению в Query Record Group Column Specification.
Примечание. При изменении группы запросов не забудьте сделать соответствующие преобразование в LOV, потому что в этом случае вам придется обновить определение этого LOV.
Для создания статической группы выполните следующие шаги:
Перейдите в навигатор объектов и выберите узел " Группы записей ". В меню навигатора выберите Navigator->Create.
В появившемся окне New Record Group выберите тип запроса Static Values и нажмите "ОК".
В появившемся окне "Спецификация столбца" (Column Specification) для каждого столбца выполните следующее:в списке Column Name введите имена колонок для группы записей в нужном порядке;
установите тип данных и длину каждой колонки, причем длины необходимо указывать только для данных типа VARCHAR и LONG, для всех остальных типов Oracle автоматически расставляет значения.
Введите значение для каждой ячейки в группе записей, выбирая нужную колонку в списке Column Name и затем вводя нужные значения в списке Column Value. Очень важно правильно указать размер, т. к. в противном случае такие данные будут недоступны.
Что касается случая, когда запрос в запросной группе не связан с таковой, то такая группа называется "Незапросной группой". Поскольку у незапросной группы нет связанного с ней запроса, в отличие от запросной группы, для заполнения которой мы программно исполняем запрос, в случае с незапросной группой вы должны программно устанавливать значения столбцов.
Функции и процедуры для работы с группами записей
В 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, а "Элемент базы данных" - на "НЕТ".
Если хотите разместить элементы на канве самостоятельно, то в свойстве "Обновить разметку" CANVAS (вид-картинки) выберите пункт "Вручную" и разместите элементы на канве в удобном для вас порядке.
Для кнопки "Создать запросную группу" создайте триггер 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:/*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');
В первом параметре процедуры Add_Group_Column вы указываете группу, в которую собираетесь добавить колонку, во втором параметре вы указываете имя новой колонки, а в третьем указываете тип, создаваемой колонки: CHAR_COLUMN, DATE_COLUMN, NUMBER_COLUMN.Примечание. Новую колонку можно добавить только в группу, не содержащую строк.
Для кнопки "Добавить строку" создайте триггер WHEN-BUTTON_PRESSED:/*WHEN-BUTTON_PRESSED*/
Add_Group_Row('about_group',2);
Первый параметр about_group указывает на имя группы, в которую мы хотим добавить запись, а второй параметр - это номер строки, в которую мы хотим вставить запись. Для добавления новой строки в группу с уже имеющимся набором строк используйте константу END_OF_GROUP, например:Add_Group_Row('about_group', END_OF_GROUP);
Примечание. В новой строке значения колонок по умолчанию определяются как NULL. Поэтому после добавления новой строки используйте процедуру SET_GROUP_CHAR (NUMBER, DATE)_CELL для установки значений новой строки.
Для кнопки "Удалить строку" создайте триггер WHEN-BUTTON_PRESSED:/*WHEN-BUTTON_PRESSED*/
Delete_Group_Row('about_group',1);
Первый параметр about_group указывает на имя группы, в которой мы хотим произвести удаление. Второй параметр указывает на номер удаляемой строки; вы также можете использовать в качестве параметра константу ALL_ROWS, которая выполняет удаление всех строк группы.
Для кнопки "(Q)-"" (подсчет строк запросной группы) создайте триггер WHEN-BUTTON_PRESSED:/*WHEN-BUTTON_PRESSED*/
:ABOUT.zap_gr:=Get_Group_Row_Count('about_group');
В функции Get_Group_Row_Count вам достаточно указать имя группы или ее ID для нахождения количества строк в группе.
Для кнопки "(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 и так далее:Get_Group_Selection('about_group',2);
Здесь about_group – имя группы, а 2 – номер помеченной строки.