3.3 Блоки

В Developer/2000 имеется ряд специальных средств, предназначенных для работы с блоками и их элементами. Они значительно повышают удобство применения создаваемых форм. Применение переключателей позволяет достаточно просто задавать взаимоисключающие варианты выбора. Использование вычисляемых полей намного упрощает задачу отображения на экране итоговых результатов и других вычислений, производимых в форме. Указание правильных масок формата для дат значительно снижает число ошибок, связанных с заданием дат и времени в базе данных.

Списки

Список (list) — это элемент формы, позволяющий отображать список текстовьк элементов в одном месте экрана. Назначение списка в том, что пользователю предоставляется возможность выбрать один из нескольких взаимоисключающих вариантов списка. Выше были представлены списки двух типов:

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

Существует четыре типа списков, три из которых являются списочными элементами (смотри рисунок):

Poplist (очередь) — раскрывающийся список, состоящий из текстовых элементов и активизирующийся небольшой стрелкой, которая находится в поле рядом со списком

T-list (Т-список) — окно списка, в котором все элементы отображаются в виде

"прокручивающегося" списка, подобно отдельной канве, но в пределах одного из полей формы

Combo box (поле со списком) — комбинация очереди и текстового элемента, позволяющая не только выводить на экран список текстовых элементов, но и вводить значения

List of values, LOV (список значений) — диалоговое окно, в котором отображаются текстовые элементы и предоставляется возможность поиска по шаблону. В диалоговом окне выбирается один списочный элемент, который копируется в элемент другого блока; это абсолютно самостоятельный объект Forms, а не списочный элемент, он соединяется с различными элементами при помощи специального набора свойств каждого из элементов. Смотри рисунок.

 

В каждом из этих списков некоторым образом отображается список текстовых элементов. Однако отображаемые строки символов не всегда являются значениями элементов. Список преобразует то, что показано на экране, т.е. ярлык (label), в фактическое значение (value) элемента, и именно это значение Forms хранит в базе данных. Между ярлыком и значением установлен так называемый уровень косвенности, поэтому можно использовать текст для отображения, а данные другого типа — для полей. Ниже приведен пример, в котором цвета выступают в роли ярлыков, а числа — значений элементов. Таким образом, с помощью списков можно отображать хорошо форматированный текст, имеющий конкретный смысл, храня тем временем в базе данных бессмысленные и сложные в использовании коды.

Рассмотрим пример. Быть может, вы работаете с устаревшей базой данных, в которой различные цвета кодируются конкретными числами. Число 1 обозначает Red (красный), 2 — Green (зеленый), 3 — Purple (пурпурный) и т.д. Назначение списочного элемента — показать пользователю текст Green, но записать в базу данных число 2. Кроме того, когда пользователь обращается с запросом к базе данных, этот элемент преобразует цифру 2 в Green, что и отображается на экране.

Эффективность списков

Списки — мощное средство отображения информации в удобном виде. Ряд специальных методов структурирования списков делает их более простыми в применении.

В качестве значения базы данных рекомендуется использовать отображаемую строку символов. Коды были полезны в то время, когда дисковое пространство ценилось очень высоко и когда программисты могли считывать только числа. Теперь же большинство программистов научилось считывать и текст (догнав в этом остальной мир). Конечно, применению кодов тоже находится место, однако по большей части причинами тому могут служить адаптация старых баз данных, в которых не используются современные методы проектирования, или оптимизация дискового пространства в очень крупных базах данных, содержащих миллиарды экземпляров значений. Если существует возможность выбора, выбирайте самое простое — храните в списке одни и те же ярлыки и значения.

У Forms есть одна весьма удивительная характеристика. Когда пользователь запрашивает набор записей, а по каким-то причинам запись, возвращаемая сервером базы данных, нарушает ограничение, установленное в триггере, или какое-то другое условие, затребованное в форме, Forms попросту отбрасывает такую запись, не уведомляя об этом пользователя. К чему все это говорится? Одним из этих условий является наличие значения списочного элемента в ранее кодированном списке. Если в базе данных запрашивается запись, которая содержит значение, отсутствующее в списке. Forms не позволит отобразить эту запись, попросту отбросив ее.

Поэтому списочные элементы имеют свойство Other Values (другие значения) (это не распространяются на списки значений, поскольку они являются не списочными элементами, а совершенно самостоятельными объектами). По умолчанию значение этого свойства списочного элемента равно NULL. Если не установить для этого свойства некоторое значение, Forms отбросит записи, значения которых отсутствуют в списке. Если же значение установлено, Forms отобразит запись, но вместо значения базы данных на экран выводится значение из Other Values. Forms отображает эту строку символов для любого значения, отсутствующего в списке. Значением этого свойства можно сделать, скажем, Other, добавив его в список и присвоив ему соответствующий ярлык.

Характеристики поля со списком еще более удивительны. Весь смысл поля со списком заключается в том, чтобы дать пользователю возможность ввести в поле какой-то текст, а также вывести на экран список и выбрать в нем некоторое значение. Результат: Developer/2000 не подтверждает достоверность вводимого в списке текста. Если такой режим вас устраивает, замечательно, если нет, внесите специальный программный текст подтверждения: либо для интерпретации ошибки базы данных, возникающей в результате, нарушения какого-то ограничения, либо для интерпретации текста, который вводит пользователь.

Жестко кодируемые списки

Жестко кодируемый список (hard-coded list) полностью формируется в Developer. Диалоговое окно заполняется ярлыками и соответствующими им значениями, которые становятся частью клиентского приложения. Преимущества такого подхода — простота и скорость. Можно создавать такие списки очень быстро, и функционируют они просто замечательно, поскольку во время открытия приложения список находится в оперативной памяти. Правда, у него есть недостаток: его нельзя изменить без повторного создания и внедрения приложения. Жестко кодировать следует простые, неизменяемые списки.

Для создания жестко кодируемого списка сначала создайте в блоке списочный элемент, а затем отобразите на экране Property Palette этого элемента. Установите свойство Туре в List Item (если, конечно, это не было сделано ранее). Определите для свойства Width значение, соответствующее самому длинному предполагаемому ярлыку. Теперь перейдите к разделу Functional в Property Palette. Установите свойство List Style в один из трех типов списков (Poplist, TList или Combo Box). Дважды щелкните мышью на свойстве Elements in List (подэлементы списка). Появится диалоговое окно List Item Elements:

Введите ярлыки и соответствующие значения. Если значение должно быть NULL, оставьте ячейку значения незаполненной. Для перемещения к новому подэлементу списка используется клавиша "стрелка вниз" или мышь; для просмотра списка функциональных клавиш, которые можно применять в этом диалоговом окне, — комбинация CTRL-К. Подэлемент, выбранный в данный момент, удаляется комбинацией CTRL-< (чтобы получить вместо запятой символ <, не забудьте нажать клавишу SHIFT в раскладке английской клавиатуры). После окончания всех операций в этом

диалоговом окне щелкните мышью на кнопке ОК. Затем, если нужно обрабатывать значения, отсутствующие в списке, укажите одно из значений (не ярлык) в свойстве Other Values.

Если запустить форму на выполнение, то этот элемент появится в том виде, который был для него задан. В отображаемом списке видны ярлыки, введенные в диалоговом окне, и пользователь может выбрать любой элемент в списке.

Динамические списки

Динамический список (dynamic list) — это список, заполняемый во время функционирования приложения. Для заполнения списка существует два способа. Проще всего создавать список на основании таблицы базы данных: он получает ярлыки и значения из объекта группы записей, создаваемого и заполняемого с помощью оператора SELECT. Затем в список заносится содержимое группы записей. Другой способ — добавление значений встроенной функцией Add_List_Element.

ПОСТРОЕНИЕ СПИСКОВ ИЗ ТАБЛИЦ Сначала создайте списочный элемент. В диалоговом окне List Elements введите, если нужно, одну пару ярлык — значение, которая будет использоваться для свойства Other Values (о свойстве Other Values рассказано в предыдущем разделе "Списки").

В новых версиях Forms это значение, к сожалению, не может быть NULL-значением. В версии 1 можно ввести NULL-подэлемент списка, оставив затем Other Values пустым. Если в версии 2 для одного из подэлементов жестко кодируемого списка указывается NULL-значение, то нельзя удалить этот подэлемент с помощью подпрограммы Clear_List перед созданием нового динамического списка из таблицы. Вместо этого выводится сообщение об ошибке, и загрузка списка закончится неуспешно. Корни этого, по-видимому, следует искать в версии 1, где в раскрывающемся списке появляются ненужные пустые строки. Так как удалить NULL-подэлемент списка нельзя, вводить его не нужно, чтобы не появилась нежелательная пустая строка. Это значит, что пользователь должен в качестве значения по умолчанию выбирать значение в базе данных. Например, в списке Поставщики формы Поставщики можно в качестве подэлемента по умолчанию воспользоваться значением, скажем, “Сытный рынок”. Когда список загружается из таблицы, это значение исчезает, но в Other Values оно, тем не менее, сохраняется, следовательно, должно фигурировать как в списке, загружаемом из базы данных, так и в жестко кодируемом варианте.

Одно из последствий этого требования — невозможность использования стандартного класса List SmartClass из библиотеки объектов; приходится настраивать List Elements и свойства Other Values для конкретного списочного элемента и его значений, выбираемых в базе данных. Это также означает, что если выбранное значение модифицируется в базе данных, то его следует изменить и в жестко кодируемом свойстве List Elements. Это весьма неудобно, однако приходится с этим мириться.

После того как свойство Other Values установлено, создайте для формы объект группы записей. Designer отображает на экране диалоговое окно с вопросом, создавать группу записей из списка значений или посредством некоторого запроса, и предлагает запрос по умолчанию. Оставьте переключатель, соответствующий выбору запроса, и введите запрос в текстовом блоке: В этом запросе должны выбираться данные, соответствующие ярлыку и значению, причем именно в таком порядке. Если значение представляет собой число или дату, используйте для преобразования его в строку символов функцию To_Char. Для сортировки подэлементов списка в том порядке, в котором они должны отображаться на экране, применяйте конструкцию ORDER BY.

Например, при создании списков столбца Т таблицы Трапезы вводится такой запрос:

SELECT DISTINCT Т, Т ' FROM Трапезы

ORDER BY 1

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

Теперь создайте процедуру формы или присоединенную библиотеку. Поместите этот программный текст в системную библиотеку, чтобы использовать данную процедуру в любой форме.

PROCEDURE Set_Up_List (pList in VARCHAR2, pGroup in VARCHAR2) IS vErrFlag NUMBER := 0;

eListPopulationProblem exception;

BEGIN

vErrFlag := Populate_Group(pGroup);

if vErrFlag = 0 then

Clear_List(pList); -удалить все находящееся здесь Populate_list(pList, pGroup);

elsif vErrFlag = 1403 THEN -подэлементы списка не найдены

null; -ничего не делать и игнорировать ошибку else

raise eListPopulationProblem;

end if;

EXCEPTION

WHEN OTHERS THEN

message('Exception: Could not populate 'IIpList

||' with query in group '||pGroupI I ' .' );

END;

 

Замечание

Если эта процедура вызывается несколько раз для одного и того же списка, очищается лишь этот список. Если список не очистить, значения добавляются к тем, которые уже находятся в списке. Кроме того, тщательно проверяйте код, возвращаемый подпрограммой Populate_Group, поскольку он указывает на различные ошибки в SQL-запросе. Проанализируйте и приведенные в начале этого раздела комментарии по поводу отношений, устанавливаемых между Clear_Ust, свойством List Elements и свойством Other Values списочного элемента,

Теперь выберите триггер для построения списка. Список можно создать во время открытия формы через триггер When-New-Form-Instance. А можно подождать, когда список потребуется, и создать его, например, с помощью триггера When-New-Block-Instance того блока, в котором будет отображаться список. Этот процесс позволяет проявить творческие наклонности и экономить время, затрачиваемое на загрузку формы. Теперь введите в триггер следующий программный текст:

Set_Up_List('Action', 'ГруппаБлюда');

При вызове данной процедуры в группу ГруппаБлюда записываются данные с помощью ее стандартного запроса, а затем эта группа используется для заполнения списка.

Замечание

Можно перестроить список, выполнив это как отдельную операцию приложения. Например, если существует подформа, позволяющая модифицировать набор значений, отображаемых в списке, для переустановки списка новыми значениями выполните программу, которая создает список вновь. К сожалению, при этом должны быть завершены все транзакции с блоком, в котором отображается списочный элемент. Оптимальный способ — использовать оператор Clear_Block или Clear_Form в программном тексте перестройки списка.

ПОСТРОЕНИЕ СПИСКОВ С ПОМОЩЬЮ ADD_LIST_ELEMENT Встроенная функция Add_List_Element за один раз добавляет к списку один подэлемент. По сравнению с заполнением списка из базы данных этот способ более трудоемкий в смысле программирования, и при его использовании вероятность ошибок в профаммном тексте выше, но в некоторых случаях он более эффективен. О встроенной подпрограмме Add_List_Element и примеры ее использования см. в диалоговой справке Help.

Списки значений

Список значений (list-of-values, LOV) — это объект, который остался от прежних версий Forms. В более ранних версиях Forms можно было связать имена таблицы и столбца с элементом для того, чтобы подтверждать соответствие этого элемента списку значений, генерируемому при выполнении оператора SELECT DISTINCT над столбцом таблицы. В последующих версиях Forms список значений превратился в отдельное диалоговое окно с внутренним списком и с функциями поиска по шаблону. Если вы работали с Form Builder, то наверняка имели дело со списками значений. Так, скажем, список триггеров представляет собой список значений.

Во многих отношениях список значений аналогичен динамическому списку Tlist с добавленной функцией поиска по шаблону. Тем не менее, это самостоятельный объект в иерархии объектов Forms, а не списочный элемент блока. Для создания и использования списка значений необходимо:

1. Создать список значений и его группу записей, полученную при помощи SQL.

2. Соединить элемент со списком значений, используя свойства элемента.

3. Соединить список значений с элементом через свойства Column Mapping списка значений.

чтобы использовать эту группу совместно с другими списками, списками значений и программами PL/SQL. Годится и старый вариант TABLE.COLUMN, предполагающий выбор значения из некоторого столбца таблицы при помощи SELECT DISTINCT. Однако по умолчанию создается новая группа записей с помощью того запроса, который пользователь вводит в этом диалоговом окне. Ниже приводится диалоговое окно New LOV, запрос которого выбирает информацию о специальностях в таблице Skill; столбец Skill является первичным ключом этой таблицы, поэтому конструкция DISTINCT (отличающиеся значения) не нужна. Если щелкнуть мышью на OK, Developer/2000 создает новый список значений и новую группу записей, давая обоим объектам одинаковые имена, например LOV15. Можно изменить имя одного или обоих объектов обычным образом.

Для соединения списка значений с элементом блока укажите имя списка значений в свойствах этого элемента.

Кроме того, чтобы использовать список значений для подтверждения достоверности элемента, можно установить Validate в свойстве list. При этом пользователи не смогут вводить значения, отсутствующие в списке значений.

В отличие от элемента списка, в котором существуют только ярлык и значение, в списке значений может быть указан ряд значений, связанных с каждым элементом содержащегося в нем списка. Обратите внимание: в операторе SELECT в диалоговом окне New LOV задан только один столбец — Skill. Список значений отображает все столбцы, указанные в запросе, и возвращает те из них, которым соответствуют элементы. Поэтому можно вывести на экран не просто Skill, но Skill вместе с Description (описание), а также установить соответствие этих столбцов двум отдельным элементам. Обращаться к списку значений можно только в одном из этих элементов, скажем, в Skill. Когда пользователь выбирает специальность с помощью списка значений, заполняется как элемент Skill, так и элемент Description. Для управления вводом данных посредством элементов отображения обычно создают вторичные, а не вводимые элементы.

Отображение столбцов и структура ввода значений устанавливаются в диалоговом окне LOV Column Mapping (установление соответствия столбцов списка значений), которое выводится на экран с помощью свойств Column Mapping Properties списка значений.

Для каждого из столбцов, приведенных в диалоговом окне New LOV, Developer/2000 заполняет заранее поля Column Names (имена столбцов), Display Width (ширина отображения) и Column Title (название столбца) в новом диалоговом окне. Остается заполнить лишь поле Return Item (возвращаемый элемент). В этом поле содержатся имена блока и элемента, в котором список значений размещает значения, выбираемые пользователем в списке значений. В этом диалоговом окне можно установить соответствие для некоторых или даже для всех столбцов.

Список значений имеет свойство Automatic Display (автоматическое отображение). Существует и еще ряд дополнительных свойств. Если установить для Automatic Display значение Yes, то Developer/2000 отображает список значений всегда, когда пользователь обращается к элементу, ссылающемуся на этот список значений. В результате список значений всплывает всякий раз при обращении к элементу. Это полезно, например, если существует текстовый элемент, инициализируемый в списке значений. Пользователи обращаются к элементу и в автоматически всплывающем списке значений изменяют текст так, как им нужно.

Вверху списка значений находится поле Pattern (шаблон). В данном поле можно ввести шаблон, используя для этого синтаксис соответствия — SQL-операцию LIKE (подобно), в которой символ "%" применяется для представления последовательности, состоящей из любого числа символов, а символ "_" — для представления одного символа. Когда пользователь вводит шаблон и щелкает мышью на кнопке Find, список значений ищет элементы, соответствующие шаблону, отбрасывая те из них, которые не подходят. После этого пользователь может выбрать из оставшихся элементов, соответствующих шаблону, то, что нужно. Это свойство и является основной причиной использования списков значений в Developer/2000. Благодаря ему работать с длинными или сложными списками текстовых элементов, например со стандартными описаниями тысяч элементов какого-то продукта или с длинным списком, содержащим названия заданий при планировании проекта, становится намного проще. Именно такие списки удобно ограничивать шаблоном списка значений. Если же необходимо просто подтверждать достоверность элементов, создайте динамический список-очередь или что-то аналогичное.

Переключатели

Пользователю, выбирающему одно значение из группы, обычно предлагается список вариантов выбора. Альтернативой спискам являются переключатели. Группа переключателей (radio group) — это совокупность переключателей (radio buttons), каждый из которых представляет собой небольшую круглую кнопку с ярлыком (точный формат зависит от графического пользовательского интерфейса). Когда пользователь щелкает мышью на переключателе, Developer/2000 отменяет выбор текущего переключателя и выбирает указанный. Таким образом, одновременно можно выбрать только один переключатель.

Название radio buttons происходит от аналогичного названия кнопок выбора станций, применяемых в обычных радиоприемниках, когда при нажатии одной из кнопок выскакивают другие (в современных цифровых радиоприемниках эти кнопки заменены электронными аналогами). Ниже показано, что в каждом случае имеет смысл выбирать лишь один переключатель.

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

Группа переключателей — это элемент блока, соответствующий столбцу таблицы базы данных. Переключатели, в свою очередь, соответствуют возможным значениям этого столбца. Таким образом, переключатели объединяются в одном элементе группы переключателей. Когда пользователь щелкает мышью на переключателе, свойство Value объекта этого переключателя становится значением всей группы.

Такая логическая схема определяет набор свойств этих объектов. Свойство, которое влияет на все переключатели одновременно, это свойство группы переключателей, например значение по умолчанию, свойства, связанные с базой данных, или навигационные свойства. Свойство, которое влияет только на один переключатель, это свойство переключателя, такое как значение переключателя, его ярлык или физическое местоположение. Для установления исходного значения переключателя, которое Developer/2000 показывает в качестве выбранного вновой записи, задайте данное значение (в рассмотренном примере это Bought) для свойства DefaulfValue группы переключателей.

Для того чтобы установить переключатель, сначала создайте его обычным способом, при помощи инструмента Create, а затем измените свойства Label и Radio Button Value. Label — это текст, отображаемый Developer/2000 в качестве подсказки, a Radio Button Value — фактическое значение, которое Developer/2000 присваивает группе переключателей, когда пользователь щелкает мышью на одном из них.

Как и в случае списков, при считывании в базе данных строки, значение которой не соответствует одному из значений переключателей, Developer/2000 незаметно для пользователя отбрасывает запись. Свойство Other Values группы переключателей выполняет те же функции, что и аналогичное .свойство списочного элемента. С его помощью можно преобразовывать значения, не соответствующие переключателям, в одно из отображаемых значений.

Что касается стиля пользовательского интерфейса, то обычно рекомендуется выделять группы переключателей визуально. Так, в приведенном примере для отделения группы четырех переключателей от остальных элементов блока канвы используется шаблонный графический прямоугольник. В данном случае свойство прямоугольника Beveled установлено в Lowered, что дает эффект трехмерного изображения.

Вычисляемые элементы

Широко распространенной задачей, выполняемой при построении формы, является создание элемента, представляющего некоторое вычисляемое значение. Например, можно объединить несколько элементов базы данных в конкатенированную строку символов, выделив отдельный элемент, который не соответствует какому-либо столбцу таблицы базы данных. Еще один широко известный пример — создание итогового поля, суммирующего записи другого блока.

В группе свойств Calculation (вычисление) создайте элемент отображения, отсутствующий в базовой таблице, для чего установите свойство элемента Database Item в No. Однако вместо создания триггеров определите свойства в группе Calculation. При установке Calculation Mode (режим вычислений) в Formula (формула) средство вычислений включается. Затем введите формулу, как если бы вводился программный текст PL/SQL, рассмотренный выше:

:ПОСТАВКИ.СУММА * :ПОСТАВКИ.СТОИМОСТЬ

Теперь каждый раз при изменении записи Developer/2000 вычисляет новое значение поля и отображает его.

Итоговый элемент создается в блоке, в котором предполагается выполнять операции агрегирования. Необходимо установить свойство Precompute Summaries (предварительно вычислять итоги) в группе Advanced Database для этого блока в Yes; это информирует Developer/2000 о необходимости вычислять итоги перед выполнением запроса. Поскольку осуществляются операции агрегирования, в блоке обычно отображается несколько записей. Однако не следует выводить по одному итоговому значению для каждой записи. Установите свойство Number of Items Displayed (число отображаемых элементов) итогового элемента в 1 (обычно это значение равно 0, т.е. число элементов равно числу записей, отображаемых в блоке).

Теперь определите четыре свойства этого элемента. При установлении для Calculation Mode значения Summary элементу разрешается выполнение операций подведения итогов. Установка Summary Function (итоговая функция) в Sum (сумма) указывает Developer/2000 на то, что нужно суммировать значения записей. В этом свойстве можно задавать любую стандартную функцию агрегирования: Count, Average, Min, Max, Stddev или Variance. В раскрывающихся списках Summarized Block и Summarized Item показываются соответственно все блоки и все элементы выбранного блока. Например, при создании итогового (Total) элемента для вычисления значения СУММА в блоке ПОСТАВКИ нужно установить Summary Function в Sum, Summarized Block — в 1-edger, a Summarized Item — в Amount. Developer/2000 автоматически отображает итоговый результат для блока в отдельном поле канвы и управляет всеми вычислениями, изменяющими подытоживаемые элементы, в том числе посредством очистки или удаления записей.

Элементы дат и времени, маски формата

Для того чтобы минимизировать последствия проблемы 2000 г., следует всегда указывать и отображать года в виде четырехцифровых значений. Что касается элементов дат, то Developer/2000 переводит их в маски формата, представляющие варианты формата "YYYY". Маски формата дат управляют всеми известными форматами дат, поэтому писать сложные триггеры или процедуры для форматирования дат нет необходимости.

Большинство проблем, связанных с датами и временем, возникают при неправильном использовании одной из половин пары дата/время. Работа с временными полями может оказаться довольно неприятным процессом, если не учесть ряд обстоятельств, касающихся использования времени в Developer/2000 и ORACLE.

Прежде всего, помните: время и дата — сиамские близнецы. Тип дат DATE широко применяется для элементов и полей Developer/2000, переменных PL/SQL и столбцов ORACLE7; этим типом определяются как даты, так и время. Большая часть неприятностей происходит при попытке разделить дату и время. Представим себе ситуацию, когда необходимо разделить поля времени и дат, позволяющие устанавливать или просматривать текущее время. Это невозможно сделать без PL/SQL-программирования в триггерах Pre-Insert, PreUpdate, Pre-Delete и Post-Query для объединения или отделения фрагментов даты при помощи функций преобразования To-Char или To-Date. Чтобы сберечь нервы, не пытайтесь для удобства применения разделить время и дату, а лучше воспользуйтесь в элементе Date Developer/2000 маской формата, такой, например, как MM/DD/YYYY" "НН:М1.

Компоненты масок формата, относящиеся к годам Таблица 3.6

Компоненты

Описание

A.D.

Отображает "B.C." для дат до нашей эры и "A.D." для дат нашей эры

AD

Отображает "ВС" для дат до нашей эры и "AD" для дат нашей эры

B.C.

Отображает "B.C." для дат до нашей эры и "A.D." для дат нашей эры

ВС

Отображает "ВС" для дат до нашей эры и "AD" для дат нашей эры

RR'

Год в виде двух цифр, относящийся по умолчанию к "правильному" веку (не рекомендуется, поскольку здесь понятие "правильный" век определяется личным мнением пользователя)

RRRR

Год в виде четырех цифр, аналогичен YYYY (как и RR, не рекомендуется; к тому же этот вариант отсутствует в документации "Forms Reference")

SYYYY

Год в виде четырех цифр со знаком "минус" для дат до нашей эры

Y

Год в виде одной цифры (не рекомендуется)

Y.YYY

Год в виде четырех цифр с запятой, отделяющей тысячи

YY

Год в виде двух цифр (не рекомендуется)

YYY

Год в виде трех цифр (не рекомендуется)

YYYY

Год в виде четырех цифр (рекомендуется)

Использование маски формата в Developer/2000 не оказывает влияния на фактическую точность 'даты и времени, которая никогда не изменяется. В результате то, что вы видите на экране, вовсе не 'Обязательно должно соответствовать тому, что записывается в базу данных, и ничего с этим поделать -нельзя. Например, если вы не видите время в элементе даты формы, это не означает, что время отсутствует или что оно равно 00:00, хотя это может быть и справедливо. Конкретное время устанавливается при помощи операции PL/SQL:

:ПОСТАВКИ.ДАТА := To_Date(To_Char(:ПОСТАВКИ.ДАТА, 'MM/DD/YYYY') II' 12:00', 'MM/DD/YYYY HH:MI');

С помощью этой операции всем датам, вводимым через элемент ПОСТАВКИ.ДАТА, присваивается значение 12 часов пополудни, а не 12 часов ночи (значение по умолчанию).

В таблице 3.5 представлены компоненты масок формата Developer/2000, которые относятся к годам и которые можно комбинировать в масках формата дата/время.

• В таблице 3.6 представлены различные временные компоненты, которые можно использовать в масках формата Developer/2000.

 

Компоненты масок формата, относящиеся к часам Таблица 3.7

Компонент

Описание

А.М.

"А.М." для времени до полудня и "P.M." для времени после полудня

AM

"AM" для времени до полудня и "РМ" для времени после полудня

НН

Час дня в 12-часовом формате (1 — 12)

НН12

Час дня в 12-часовом формате (1 — 12)

НН24

Час дня в 24-часовом формате (0 — 23)

MI

Минута часа (0 — 59)

P.M.

"А.М." для времени до полудня и "P.M." для времени после полудня

РМ

"AM" для времени до полудня и "РМ" для времени после полудня

Ss

Секунда минуты (0 — 59)

Sssss

Число секунд после полуночи (0 — 86399)

 

В таблице 3.7 представлены относящиеся к дням недели и месяцам компоненты, которые можно использовать в масках формата.

Компоненты масок формата, относящиеся к дням недели и месяцам Таблица 4.5

Компонент

Описание

D

День недели в цифровом выражении: 1 — 7, 1 — воскресенье (Sunday), если только текущий язык NLS не определяет его по-другому, например понедельник (Monday)

DAY

Название дня в виде 9-символьной строки ("SUNDAY","MONDAY' и т.д.) День месяца (1 — 31) День года (1 — 366) 3-буквенное название дня (SUN, MON, TLJE и т.д.)

DYJ

Число дней с 1 января 4712 года до нашей эры (день юлианского календаря); используется только в специальных приложениях сортировки

MM

Месяц в цифровом выражении (1 — 12)

MON

3-буквенное название месяца (JAN, FEB и т.д.)

MONTH

Название месяца в виде 9-символьной строки ("JANUARY',"FEBRUARY" и т.д.)

В любом месте маски формата разрешается указывать знаки пунктуации — Developer/2000 воспроизводит их в отображаемой строке. В маску можно вставить, показав отображающую строку, любую текстовую строку символов, заключив ее в двойные кавычки. Например, маска "MONTH""DD","YYYY" выводит строку "APRIL 18,1997". Обратите внимание, что при использовании компонента маски фиксированной длины (MONTH) в названии месяца появляются лишние пробелы. Для удаления этих пробелов можно воспользоваться префиксом FM: маска "FMMONTH""DD","YYYY" отображает строку "APRIL 18,1997". В компоненте формата можно указать регистр символов, например "Month" или "MONTH".

Ограничители (delimiters) — это пунктуационные знаки, которые отделяют день, месяц и год в датах. Обычно это дефис или косая черта (слеш), например 18-APR-1997 или 4/18/1997. Когда эти символы применяются в качестве части маски формата, пользователь может установить другую пунктуацию (скажем, 4.18.1997), причем маска поймет ее так, как нужно. Для реализации конкретной пунктуации и указания пользователю на необходимость введения всех чисел и символов в дату или время служит префикс FX. Например, маска FXDD-MON-YYYY НН:ММ заставляет пользователя ввести 01-JAN-1997 12:00 именно в таком формате, с указанием начального 0 и дефиса.

Для того чтобы сократить область действия префикса FX и применять его только по отношению к ограничителям, укажите FX и FM одновременно. Например, маска FM FXDD-MON-YYYY разрешает пользователю ввести 1-JAN-1997, но не 1.JAN. 1997.



Используются технологии uCoz