
Февраль 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
- В каталоге
DEVELOPER
...\TOOLS\DEVDEM60\DEMO\FORMS возьмите файлы
CALENDAR.FMB, CALENDAR.PLL и положите их рядом
с формой, которая будет использовать календарь.
- В форме
CALENDAR.FMB удалите:
- блоки
EMP и CONTROL;
- канву
DEMO_CANVAS;
- окно
DEMO_WINDOW;
- программу
DATE_CHOOSEN.
- Из триггера
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;
- Из триггера
WHEN-WINDOW-CLOSED формы
CALENDAR.FRM удалите все строки и вставьте: -- Окно календаря закрыто командой Close window manager, -- т.е. пользователь отказался от ввода даты. -- Записываем NULL в возвращаемую переменную и -- закрываем форму календаря. Copy( NULL, Date_Lov.Date_Lov_Return_Item); Exit_Form;
- Из триггера
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;
- Из триггера
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;
- Из триггера
WHEN-BUTTON-PRESSED элемента
CANCEL_BUTTON блока
DATE_CONTROL_BLOCK формы CALENDAR.FRM
удалите все строки и вставьте: -- Нажата кнопка CANCEL, т.е. пользователь -- отказался от ввода даты. -- Записываем NULL в возвращаемую переменную и -- закрываем форму календаря. Copy( NULL, Date_Lov.Date_Lov_Return_Item); Exit_Form;
- В обьектном навигаторе создайте следующие параметры
формы:
START_DATE, NAME_VAR, X_POS, Y_POS,
NAME_TITLE, NAME_BUT1, NAME_BUT2, HI_WEEK_END
Forms по умолчанию создает символьные
параметры с максимальной длиной 30. Так и оставьте.
- После компиляции форма календаря готова к работе
Как вызывать форму календаря.
Для демонстрации способа вызова формы календаря рассмотрим
простую формы с блоком, содержащим поле 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;
|