Февраль 2005


Советы, рекомендации, опыт


Аркадий Старцев.

Как использовать календарь в Oracle Developer.

Источник: http://dba.ru/, апрель 2003, http://dba.ru/docs/dev6_calendar.html http://dba.ru/docs/dev6_calendar.html

Введение

В Oracle Developer не очень много визуальных элементов, которые можно использовать в разрабатываемых формах. Для исправления этого положения можно использовать поставляемые вместе с Developer демонстрационные формы. В этой статье показано, как нужно изменить демонстрационную форму CALENDAR.FMB для ее использования в своих разработках. Внешний вид календаря показан на рисунке.

Исправление формы Calendar.fmb

  1. В каталоге DEVELOPER ...\TOOLS\DEVDEM60\DEMO\FORMS возьмите файлы CALENDAR.FMB, CALENDAR.PLL и положите их рядом с формой, которая будет использовать календарь.

  2. В форме CALENDAR.FMB удалите:

    • блоки EMP и CONTROL;
    • канву DEMO_CANVAS;
    • окно DEMO_WINDOW;
    • программу DATE_CHOOSEN.

  3. Из триггера WHEN-NEW-FORM-INSTANCE формыCALENDAR.FRM удалите все строки и вставьте:
    -- Готовим параметры и стартуем Get_date из библиотеки Calendar

    DECLARE

    dStartDate DATE := SYSDATE;
    vNameVar VARCHAR2(30) := 'GLOBAL.DATE_FROM_CALENDAR';
    nX_Pos NUMBER := 150;
    nY_Pos NUMBER := 80;
    vNameTitle VARCHAR2(30) := 'Выберите дату';
    vNameBut1 VARCHAR2(30) := 'ОК';
    vNameBut2 VARCHAR2(30) := 'Отмена';
    bHiWeekEnd BOOLEAN := FALSE;

    BEGIN

    -- Переписываем параметры формы в локальные переменные.

    -- Если начальная дата календаря не передана,
    -- используем системную дату.


    IF :Parameter.Start_Date IS NOT NULL THEN
    dStartDate := To_Date( :Parameter.Start_Date, 'DD.MM.YYYY');
    END IF;

    -- Если имя глобальной переменной для записи
    -- возвращаемой даты не передано, то
    -- используем имя GLOBAL.DATE_FROM_CALENDAR.



    IF :Parameter.Name_Var IS NOT NULL THEN
    vNameVar := :Parameter.Name_Var;
    END IF;


    -- Если Х координата для окна календаря не передана,
    -- используем значение 150.


    IF :Parameter.X_Pos IS NOT NULL THEN
    nX_Pos := To_Number( :Parameter.X_Pos);
    END IF;

    -- Если Y координата для окна календаря не передана,
    -- используем значение 80.


    IF :Parameter.Y_Pos IS NOT NULL THEN
    nY_Pos := To_Number( :Parameter.Y_Pos);
    END IF;

    -- Если признак того, что нужно выделять выходные дни,
    -- не передан, используем FALSE.


    IF :Parameter.Hi_Week_End IS NOT NULL THEN
    IF :Parameter.Hi_Week_End = 'TRUE' THEN
    bHiWeekEnd := TRUE;
    END IF;
    END IF;

    -- запускаем подпрограмму получения даты
    -- из библиотеки CALENDAR


    Date_Lov.Get_Date(
    dStartDate, -- initial date
    vNameVar, -- return global variable
    nX_Pos, -- window x position
    nY_Pos, -- window y position
    vNameTitle, -- window title
    vNameBut1, -- ok button label
    vNameBut2, -- cancel button label
    bHiWeekEnd, -- highlight weekend days
    FALSE, -- autoconfirm selection
    FALSE); -- autoskip after selection
    END;
  4. Из триггера WHEN-WINDOW-CLOSED формы CALENDAR.FRM удалите все строки и вставьте:
    -- Окно календаря закрыто командой Close window manager,
    -- т.е. пользователь отказался от ввода даты.
    -- Записываем NULL в возвращаемую переменную и
    -- закрываем форму календаря.

    Copy( NULL, Date_Lov.Date_Lov_Return_Item);
    Exit_Form;
  5. Из триггера WHEN-MOUSE-DOUBLECLICK блока DATE_BUTTON_BLOCK формы CALENDAR.FRM удалите все строки и вставьте:
    -- После двойного клика записываем дату 
    -- в возвращаемую переменную и закрываем форму календаря.


    Copy( To_Char( Date_Lov.Current_Lov_Date,'DD.MM.YYYY'),
    Date_Lov.Date_Lov_Return_Item);
    Exit_Form;
  6. Из триггера WHEN-BUTTON-PRESSED элемента OK_BUTTON блока DATE_CONTROL_BLOCK формы CALENDAR.FRM удалите все строки и вставьте:
    -- После нажатия на кнопку OK записываем дату 
    -- в возвращаемую переменную и закрываем форму календаря.


    Copy( To_Char( Date_Lov.Current_Lov_Date,'DD.MM.YYYY'),
    Date_Lov.Date_Lov_Return_Item);
    Exit_Form;
  7. Из триггера WHEN-BUTTON-PRESSED элемента CANCEL_BUTTON блока DATE_CONTROL_BLOCK формы CALENDAR.FRM удалите все строки и вставьте:
    -- Нажата кнопка CANCEL, т.е. пользователь 
    -- отказался от ввода даты.
    -- Записываем NULL в возвращаемую переменную и
    -- закрываем форму календаря.


    Copy( NULL, Date_Lov.Date_Lov_Return_Item);
    Exit_Form;
  8. В обьектном навигаторе создайте следующие параметры формы:

    START_DATE, NAME_VAR, X_POS, Y_POS, NAME_TITLE,
    NAME_BUT1, NAME_BUT2, HI_WEEK_END


    Forms по умолчанию создает символьные параметры с максимальной длиной 30. Так и оставьте.

  9. После компиляции форма календаря готова к работе

Как вызывать форму календаря.

Для демонстрации способа вызова формы календаря рассмотрим простую формы с блоком, содержащим поле MY_DATE типа дата и кнопку BUT_DATE.



Tриггер KEY-LISTVAL поля MY_DATE содержит строки:

To_Get_Date( :My_Block.My_Date);

Tриггер KEY-LISTVAL поля MY_DATE содержит строки:

Go_Item('MY_BLOCK.MY_DATE');
Do_Key('LIST_VALUES');

Таким образом, нажатие кнопки Календарь или клавиши F9 в поле MY_DATE приводит к вызову подпрограммы TO_GET_DATE, которая в свою очередь стартует форму календаря. Подпрограмме в качестве параметра передается поле MY_DATE. Если пользователь выбирает какую-нибудь дату, она помещается в MY_DATE, в противном случае содержимое поля остается без изменения.

Сначала рассмотрим параметры, которые можно передавать форме календаря:
Имя
Значение по умолчанию
Примечание
START_DATE Текущая дата (SYSDATE) Начальная дата календаря
NAME_VAR GLOBAL.DATE_FROM_CALENDAR Имя возвращаемой переменной
X_POS 150 Х координата окна календаря
Y_POS 80 Х координата окна календаря
NAME_TITLE Выберите дату Заголовок окна календаря
NAME_BUT1 ОК Заголовок кнопки ОК
NAME_BUT2 Отмена Заголовок кнопки Cancel
HI_WEEK_END TRUE Выделять цветом выходные дни

Если значения параметров по умолчания вас устраивают, то подпрограмма TO_GET_DATE может выглядеть примерно так:

-- Процедура вызывает форму календаря без параметров.
-- В зависимости от того выбрал пользователь дату или нет,
-- календарь записывает в глобальную переменную символьную дату или NULL.
-- Если дата не NULL, она на помещается в входной параметр процедуры.


PROCEDURE TO_GET_DATE( dParDate IN OUT Date) IS

BEGIN

-- Стартуем форму календаря.

Call_Form( 'CALENDAR', NO_HIDE);

-- Если пользователь выбрал дату, записываем ее в поле формы.
-- Символьная дата возвращается в глобальной переменной
-- в виде DD.MM.YYYY. Именно такую форматную маску нужно
-- использовать в функции To_Date.


IF :GLOBAL.Date_From_Calendar IS NOT NULL THEN
dParDate := To_Date( :GLOBAL.Date_From_Calendar, 'DD.MM.YYYY');
END IF;

-- Удаляем глобальную переменную, созданную в календаре.

Erase( 'GLOBAL.Date_From_Calendar');

END;

Другой вариант подпрограммы TO_GET_DATE позволяет передавать параметры форме календаря:

-- Процедура готовит список параметров и вызывает форму календаря.
-- В зависимости от того выбрал пользователь дату или нет,
-- календарь записывает в глобальную переменную символьную дату или NULL.
-- Если дата не NULL, она на помещается в входной параметр процедуры.

PROCEDURE To_Get_Date( dParDate IN OUT Date) IS

idPar ParamList;

BEGIN

-- Если список параметров PARLIST существует,
-- удаляем его.

idPar := Get_Parameter_List( 'PARLIST');

IF NOT Id_Null( idPar) THEN
Destroy_Parameter_List( 'PARLIST');
END IF;

-- Создаем новый список параметров.

idPar := Create_Parameter_List( 'PARLIST');

-- Добавляем параметры в список. Не обязательно добавлять все параметры.
-- Если значение параметра по умолчанию устраивает, его можно пропустить.

-- Начальная дата календаря в формате DD.MM.YYYY
Add_Parameter( idPar, 'START_DATE', TEXT_PARAMETER, '10.02.2003');
-- Имя глобальной переменной, в которую календарь
-- заносит выбранную пользователем дату.

Add_Parameter( idPar, 'NAME_VAR', TEXT_PARAMETER, 'GLOBAL.DATE');
-- Х координата окна календаря
Add_Parameter( idPar, 'X_POS', TEXT_PARAMETER, '150');
-- Х координата окна календаря
Add_Parameter( idPar, 'Y_POS', TEXT_PARAMETER, '80');
-- Заголовок окна календаря
Add_Parameter( idPar, 'NAME_TITLE', TEXT_PARAMETER, 'Выберите дату');
-- Заголовок кнопки ОК
Add_Parameter( idPar, 'NAME_BUT1', TEXT_PARAMETER, 'Ok');
-- Заголовок кнопки Cancel
Add_Parameter( idPar, 'NAME_BUT2', TEXT_PARAMETER, 'Отмена');
-- Выделять цветом выходные дни
Add_Parameter( idPar, 'HI_WEEK_END', TEXT_PARAMETER, 'TRUE');

--Запускаем форму календаря.

Call_Form( 'CALENDAR', NO_HIDE, NO_REPLACE, QUERY_ONLY,
NO_SHARE_LIBRARY_DATA, idPar);

-- Если пользователь выбрал дату, записываем ее во входной параметр.
-- Символьная дата возвращается формой календаря в глобальной переменной
-- в виде DD.MM.YYYY. Именно такую форматную маску нужно
-- использовать в функции To_Date.

IF :GLOBAL.Date IS NOT NULL THEN
dParDate := To_Date( :GLOBAL.Date, 'DD.MM.YYYY');
END IF;

-- Удаляем глобальную переменную, созданную в календаре

Erase( 'GLOBAL.DATE');

END;
E-mail this page