Опубликован: 17.09.2009 | Доступ: свободный | Студентов: 1436 / 103 | Оценка: 3.94 / 3.53 | Длительность: 10:18:00
ISBN: 978-5-9963-0238-3
Лекция 13:

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

< Лекция 12 || Лекция 13: 12 || Лекция 14 >

Функции и процедуры для работы с группами записей

В 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.

Примечание. Учтите, что программно можно создавать и модифицировать только запросные и незапросные группы, в отличие от статических групп. Процедуры и функции, используемые для обработки как запросной, так и незапросной группой, не всегда одинаковы.

Создание групп записей программно

Перед тем как перейти к рассмотрению этой темы и проработке представленных примеров, выполните следующие два шага:

  1. Создайте таблицу ABOUT в SQL*Plus или любой другой утилите:
    SQL> create table ABOUT (
    2 Name varchar2(10),
    3 FName varchar2(12),
    4 SName varchar2(12));
  2. После создания таблицы перейдите в 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 (процедура) – для отмены выбора всех выбранных в текущий момент строк в группе.

Теперь рассмотрим простой пример: "Пометить как выбранные все строки, в которых встречается имя Вова". Для этого выполните следующие шаги:

  1. Откройте форму ABOUT и создайте кнопку с меткой "Пометить".
  2. Создайте триггер 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;
  3. Запустите форму на выполнение. Нажмите кнопку "Пометить", после чего у вас в поле "Количество строк в запросной группе" появится значение, равное количеству помеченных строк в запросной группе с именем Вова. Но теперь учтите, что функция 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 – номер помеченной строки.
< Лекция 12 || Лекция 13: 12 || Лекция 14 >