Разработка Web-приложений в Oracle Forms

Группы записей (Record Groups)

Показывать лекцию целиком

Цель лекции: научить слушателя создавать группы записей и ознакомить со стандартными встроенными подпрограммами, предназначенными для работы с Record Group.

Разобьем изучение этой главы на несколько частей, т. к. этот материал довольно объемный и требует внимательного изучения, поскольку используется более чем с одним объектом.

  • Описание и свойства групп записей.
  • Создание групп записей.
  • Примеры использования.
  • Описание, назначения и свойства

    Группы записей – это структурированные наборы данных, которые могут использоваться для передачи данных между модулями прикладных программ либо для заполнения списков значений или других элементов списка. Группа записей подобна как таблицам, так и представлениям базы данных. Как и таблица, группа записей содержит столбцы и строки, которые принадлежат той рабочей области, в которой определены. Так же, как и представление, группа записей создается на основе запроса, но является более гибкой, и не только по той причине, что группа записей для Oracle Forms локальна, но и потому что запрос, на основе которого создается группа записей, можно конструировать динамически, во время выполнения программы.

    Группы записей можно разделить на два основных типа, которые вы можете определить в таблице свойств этого объекта:

  • Запросные – это группа записей, имеющая связанный с ней оператор выборки – SELECT. При создании группы записей Forms дает столбцам этой группы имена по умолчанию; все остальные данные, такие как размерность столбца и тип данных, Forms наименует исходя из тех данных, которые вы указали в SELECT. Записи для такой группы извлекаются тем же запросом, что и при построении группы записей. Колонки запросной группы записей берут свои имена по умолчанию, типы данных и размерность – из колонок базы данных, на которые делаются ссылки в операторе SELECT.
  • Статические – это группа записей, не связанная с запросом, поэтому структуру такой группы вы определяете во время проектирования, и, следовательно, во время выполнения формы ее значения остаются фиксированными, т. к. вы их задаете заранее при построении группы.
  • Основные функциональные свойства группы записей:

    Тип запроса – здесь вы можете выбрать тип запроса "Статический" или "Запрос". Их различия описаны выше. В зависимости от выбранного типа группа записей принимает разные функциональные свойства.

    Если выбран тип "Запрос":

  • Запрос группы записей – в этом свойстве вы пишете запрос, которым будете выбирать записи в группу и создавать группу;
  • Размер выборки группы записей – это число строк, выбираемое Запросом группы записей;
  • С пецификация столбца – при выборе этого свойства запускается окно "STUDY: Спецификация столбца", в котором вы можете указать имя столбца, длину и тип.
  • Если выбран тип "Статический":

  • Спецификация столбца – при выборе этого свойства запускается точно такое же окно "STUDY: Спецификация столбца", как и в предыдущем случае, с той лишь разницей, что помимо полей, в которых вы можете указать имя столбца, длину и тип, вы также можете указать и значение столбцов (Column Values).
  • Применение групп записей

    Группы записей являются неотъемлемой частью списков значений LOV, так как LOV связан с определенной группой записей. Когда в мастере создания LOVLOV 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 – номер помеченной строки.
  • Вернуться к учебному плану