Основные конструкции языка
Данные
Принято различать два вида представления данных: константы и переменные.
Константа имеет постоянное значение, не изменяемое при выполнении программы.
Переменная – это данное, значение которого может меняться в процессе выполнения программы. Переменные всегда имеют имена. Значения переменных устанавливается в операторе присваивания.
Для выделения данных с одинаковыми характеристиками вводится понятие типа данных. Тип данных определяет множество значений и операции, которые могут быть применимы к этим значениям. Каждая переменная имеет единственный тип, который можно узнать из ее описания. Любая операция требует операндов определенного типа и выдает результат тоже определенного типа. В Домино типы данных подразделяются на две группы. Первую группу составляют стандартные типы данных. Вторая группа состоит из производных типов, которые создаются на основе стандартных.
Стандартные типы данных
На рисунке показаны описания стандартных типов данных в дереве проекта.
Описания всех типов данных расположены в проекте в библиотеке ‘Системная область’ в разделе ‘Классификация значений’. Стандартные типы находятся непосредственно в папке ‘Стандарты’. В остальных папках размещены производные типы. Для описания стандартного типа данных применяется элемент проекта с типом ‘Базовый класс значения’.
- STRING (строка) - это последовательность символов произвольной длины. При вычислении выражений нужный размер строка принимает автоматически.
- INTEGER (целое) - целое число, положительное, нуль или отрицательное. Может принимать значения от -2’147’483’648 до 2’147’483’647.
- UNSIGNED (целое без знака) – положительное целое число или нуль. Может принимать значения от 0 до 4’294’967’295.
- NUMBER (число с дробной частью) - десятичное число с фиксированной дробной частью. Максимальный размер 24 цифры, включая десятичные. Если в описании не указаны ни число разрядов, ни точность, то устанавливается так называемая ‘плавающая точность’. Плавающая точность означает, что точность числа может изменяться для того, чтобы сохранить как можно больше значащих цифр после десятичной точки.
Основное преимущество чисел типа number – возможность явного указания десятичной точности результата при выполнении операций. Это позволяет избежать проблемы накопления ошибок округления. Второе преимущество - большое количество значащих разрядов.
- DATETIME (дата, время) - дата со временем c точностью до секунды.
- UID - уникальный идентификатор объекта базы данных или проектного элемента.
- BLOB – данные большого объема, хранящиеся в двоичном виде.
- UIDSET – список уникальных идентификаторов.
Остальные типы данных являются производными от этих стандартных.
Производные типы данных
В проекте описано множество производных типов данных, и этот список постоянно расширяется.
В папке ‘Объектные’ расположены производные типы, используемые для переменных, содержащих ссылки на объекты БД. Так тип ‘Объект’ может быть использован для любого из объектных типов. Если точно известен объект БД , то лучше применять типы Пользователь, Каталог, Партнер, Продукт, Документ, Строка, Проводка, Протокол, Контрольная точка. Элементы проекта, описывающие эти типы, ссылаются на соответствующие таблицы БД.
Для хранения списков объектов применяются типы, производные от стандартного типа UIDSET.
В папке ‘Системные’ находится описание типа данных ‘Код объекта БД’. Это строка длиной 20 символов. При описании параметров таблиц коды объектов имеют данный тип.
В папке ‘Проектные’ перечислены различные типы проектных элементов. Все они произведены от типа UID.
Папка ‘Данные’ содержит описания типов, с которыми работают внешние редакторы текстов (Word, Excel).
В папке ‘Числовые’ перечислены различные числовые типы. Типы различаются размером и точностью.
Строчные типы данных, помещенные в папку ‘Строчные’, различаются только ограничениями на длину (что важно при описании полей БД и при заполнении формы ввода) и форматом отображения колонки в виде просмотра.
Типы ‘Дата+Время’ и ‘Дата’ отличаются лишь форматом отображения.
Папка ‘Счета’ содержит типы, выделенные из прочих проектных типов данных.
Ограничения, наложенные на производные типы, влияют на формат создаваемых полей БД, формат отображения данных в колонках видов просмотров и на округление числовых данных при расчетах.
Значение NULL
При выполнении арифметических операций и операций преобразования типов могут происходить ошибки (переполнение, деление на 0 и т.п.). Выполнение программы при этом не должно прерваться, так как такие ошибки не фатальны. Если возникает подобная ошибка, то операция возвращает специальное значение ‘пусто’.
NULL - специальное значение ‘Пусто’.
Свойства этого значения следующие:
- такое значение может иметь переменная любого типа;
- если один из операндов арифметической/логической операции имеет значение NULL, то результат операции тоже будет NULL;
- NULL значение меньше любого значения, как строкового, так и числового;
- В булевских выражениях NULL означает FALSE.
Разработчики нередко используют NULL значение в качестве результата выполнения функций.
В ДОМИНО понятие NULL значения привнесено из SQL. В SQL значение NULL означает отсутствие значения поля, и NULL-значение может размещаться в поле любого типа.
Преобразование типов данных
Если операция производится над данными разных типов, то производится автоматическое преобразование данных к одному типу.
Правила преобразования типов следующие:
- В операторе присваивания
- значение, записываемое в переменную, преобразовывается к типу переменной;
- В арифметических операциях
- строки всегда преобразовываются к числу;
- Числа разных типов преобразовываются по правилу:
[число] операция [целое] ->> [число]
[целое] операция [число] ->> [целое]
- Если (хотя бы) один из операндов имеет значение NULL, то результатом операции будет NULL;
- В операции конкатенации (&)
- оба операнда преобразуются к строковому типу;
- В операциях сравнения
- при сравнении строки с числом строка преобразуется к числу;
- при сравнении строки со строкой преобразование не производится;
- значение NULL считается меньше любого другого значения.
Переменные
Переменная – это данное, значение которого может меняться в процессе выполнения программы. Переменные всегда имеют имена. Переменными в языке скриптов могут быть:
- Глобальные переменные
- Контекстные переменные
- Локальные переменные
Глобальные переменные
Глобальный – общий, универсальный.
В Домино имеется набор переменных, доступных в любом месте проекта. Именно по причине их общей доступности такие переменные названы глобальными. Глобальным переменным можно свободно присваивать значения и использовать их в выражениях, функциях и процедурах, расположенных в любых библиотеках и Приложении.
Область видимости глобальной переменной может быть специально ограничена настройщиком проекта.
Обычно глобальные переменные задаются либо в библиотеке ‘Системная область’, раздел ‘Параметры’, папка ‘Глобальные переменные’, либо в библиотеке ‘!Базовый набор’, раздел ‘Параметры’, папка ‘Глобальные переменные’.
Объяснение предназначения каждой из этих переменных не является целью данного руководства, поэтому лишь замечу, что элементы проекта, описывающие глобальные переменные имеют иконки разного цвета. Цвет иконки зависит от статуса проектного элемента. Если проектировщик присвоил глобальной переменной статус ‘Экспортный (Публичный’), то отображается иконка зеленого цвета. Для непубличных переменных используется иконка синего цвета.
На данном рисунке в списке глобальных переменных из библиотеки ‘!Базовый набор’ находится подстановка переменной ’Текущее ЦФО’. Определение глобальной переменной ’Текущее ЦФО’ находится выше – в библиотеке ‘Системная область’, что видно на предыдущем рисунке. Подстановку глобальной переменной применяют для назначения переменной начального значения.
Для глобальной переменной могут быть заданы следующие атрибуты:
- Начальное значение – присваивается при старте Домино. Если начальное значение не указано, то переменная имеет значение NULL.
При завершении работы Домино текущие значения глобальных переменных сохраняются в специальном файле (этот файл называют ‘профиль’). При последующем старте Домино глобальным переменным присваивают сохраненные в профиле значения. Значение из профиля имеет приоритет над значением, заданным в данном атрибуте.
- Выражение – рассчитывается при старте Домино и результат присваивается глобальной переменной
Выражение рассчитывается после присваивания начального значения, указанного в предыдущем атрибуте, и после считывания значения из профиля. Т.е. если для глобальной переменной задан атрибут ‘Выражение’, то значение глобальной переменной при старте Домино всегда будет рассчитано как результат указанного выражения.
Некоторые функции и процедуры используют глобальные переменные как неявные входные и выходные параметры. Например, функции, расположенные в библиотеке ‘Системная область’, раздел ‘Параметры’, папка ‘Стандартные’, папка ‘Функции работы с датой’, папка ‘Начало/конец дня для глобальных дат’:
Другой пример использования глобальной переменной:
Функция для расчета курса получает дату из документа. UID требуемого документа считывается из глобальной переменной ‘Документ’.
В следующем примере показано применение глобальной переменной в форме документа.
В форме описано специальное поле для глобальной переменной ‘Партнер для документа’. Это поле является скрытым, т.е. не отображается на экране. Для заполнения этого поля (и, следовательно, глобальной переменной) используется выражение, возвращающее значение предыдущего поля формы. Таким образом проектировщик копирует введенное значение контрагента документа в глобальную переменную. Далее можно использовать эту переменную в процедурах и функциях, вызываемых из формы.
Контекстные переменные
Контекст (от лат. Contextus - тесная связь, соединение) –законченный в смысловом отношении отрывок текста, необходимый для определения смысла входящего в него слова или фразы.
Замысел появления контекста в Домино заключался в том, чтобы с помощью контекста точнее понимать смысл действий программы в отношении обрабатываемых данных. Иными словами, проектировщик, анализируя контекст, понимает какие именно объекты обрабатываются в рассматриваемом месте программы. Для того чтобы контекстом было удобно пользоваться, контекст должен содержать как можно меньше частей. Этого можно добиться, если для каждого объекта завести свою переменную, в которую записывать UID текущей записи объекта.
Контекст в Домино – набор значений специальных (контекстных) переменных, содержащих идентификаторы текущих записей основных объектов БД.
Контекстные переменные перечислены в библиотеке ‘Системная область’, раздел ‘Параметры’, папка ‘Контекстные переменные’.
Список содержит контекстные переменные по всем объектам.
В папке ‘Прочие’ находятся дополнительные контекстные переменные. Дополнительные контекстные переменные были созданы до того, как в Домино появились локальные переменные и формальные параметры. В настоящее время имеются более удобные и понятные средства для реализации тех задач, в которых могут потребоваться эти переменные, поэтому использование дополнительных контекстных переменных не рекомендуется.
Для контекстной переменной могут быть заданы следующие атрибуты:
- Начальное значение – присваивается при старте Домино. Если начальное значение не указано, то переменная имеет значение NULL.
- Выражение – рассчитывается при старте Домино и результат присваивается контекстной переменной. Выражение рассчитывается после присваивания начального значения.
Контекстные переменные доступны в любом месте проекта, если только область видимости специально не ограничена проектировщиком. Контекстные переменным можно свободно присваивать значения и использовать их в выражениях, процедурах и функциях.
Контекстным переменным отводится следующая роль.
- Значения контекстных переменных (контекст) содержат идентификаторы текущих объектов БД.
- Посредством контекстных переменных осуществляется доступ к параметрам текущих записей объектов. Например, конструкция <<Продукт>>.Имя определяет наименование продукта из текущей записи продукта.
- В видах просмотра в контекстную переменную отображаемого объекта заносится идентификатор той строки, на которой находится курсор. Например, в виде просмотра партнеров заполняется переменная <<Партнер>>.
- Некоторые функции и процедуры используют контекстные переменные в качестве неявных параметров. Такие процедуры называются контекстно-зависимыми.
Несмотря на то, что на уровне ядра Домино имеется полная поддержка контекстных переменных, использование контекста не является общим для всех компонент программы. Контекстные переменные поддерживаются во всех видах просмотра. Разработчики других компонент (форм, методов акцепта, процедур и т.д.) посчитали излишним обеспечение контекста в своих компонентах.
Рассмотрим подробнее механизм формирования контекста.
Набор значений контекстных переменных, заполненных при старте Домино, называется глобальный контекст. Глобальный контекст существует автономно от начала и до конца работы программы.
При вызове компоненты (процедуры, функции, отчета), если это предусмотрено разработчиком компоненты, создается копия глобального контекста. Такая копия называется локальным контекстом. Локальный контекст присоединяется к списку локальных переменных компоненты, и, таким образом, контекстные переменные становятся доступными внутри компоненты. Компонента работает только со своей (локальной) копией контекста и не может изменить контекст других компонент или глобальный контекст.
Не рекомендуется создавать контекстные переменные без острой необходимости, поскольку обслуживание контекста требует значительных ресурсов.
Пример использования контекстной переменной:
Обычно применяется следующая цепочка вызовов: вид просмотра документов –> форма документа –> вид просмотра строк. При формировании заголовка окна, содержащего вид просмотра строк, удобно использовать контекстную переменную <<Документ>>, поскольку эта переменная содержит UID именно того документа, строки которого отображаются.
Локальные переменные
Локальная переменная – переменная действующая только внутри процедуры, функции или выражения.
При описании процедуры (функции, выражения) можно указать необходимые локальные переменные в разделах ‘Локальные переменные’ или ‘Формальные параметры’. Здесь же задаются начальные значения переменных.
При запуске процедуры (функции, выражения) ядро программы создает указанные локальные переменные и присваивает им начальные значения. По завершении процедуры все локальные переменные удаляются.
Пример описания локальных переменных для процедуры:
Для процедуры указаны четыре локальные переменные. Две переменные расположены в разделе для описания формальных параметров. Для одной переменной задано начальное значение.
Если локальные переменные расположены в разделе ‘Формальные параметры’, то это означает, что процедура имеет соответствующие параметры для вызова.
Значения формальных параметров, указанные при вызове процедуры, имеют приоритет над начальными значениями в описании. Т.е. при старте процедуры в локальную переменную (являющуюся формальным параметром) будет записано значение при вызове, а если таковое отсутствует, то будет записано начальное значение из описания.
Функция ‘День’ возвращает номер дня недели. При вызове функции требуется указать значение формального параметра ‘Дата’.
При вызове функции 'День' формальный параметр ‘Дата’ заполняется датой документа.
Операции
Операции предназначены для того, чтобы сообщить компьютеру, какое именно действие требуется выполнить. Операции в языках программирования принято делить на следующие виды:
- Операция присваивания – используется при записи значения в переменную;
- Операции, используемые в выражениях – для расчета результата выражения;
- Условные операции – содержат альтернативные ветви вычислений;
- Итеративные (повторяющиеся) операции – указывают компьютеру, что требуется повторить вычисления с указанного места;
- Вызов процедуры или функции – указывает компьютеру, что требуется выполнить набор операций, перечисленных в указанной процедуре (функции);
- Прочие операции – все те операции, которые невозможно отнести ни к одному из перечисленных видов.
В языке скриптов имеются операции всех перечисленных видов.
Оператор Присвоить
Операция присваивания применяется для записи значения в переменную. Значение может быть указано либо явно (с помощью константы), либо в виде выражения. Во втором случае сначала будет рассчитано выражение, затем полученный результат будет занесен в переменную. Также произойдет приведение типа результата выражения к типу переменной.
Разные варианты присваивания значений переменным (константы, результата выражения).
Операции, используемые в выражениях
Выражение состоит из одного или нескольких операндов и знаков операций. Операндами выражения могут быть константы, локальные переменные, глобальные и контекстные переменные, другие выражения, а также - функции. Операции выполняются над операндами в порядке их описания. Для изменения порядка выполнения операций используются вложенные выражения.
Подробнее о выражениях написано ниже.
Истинное и ложное значения операндов
Для логических операций имеются понятия истинного и ложного значений. Коротко истинное значение называют TRUE, а ложное – FALSE.
Считается, что числовой операнд имеет истинное значение, если число не равно ни 0, ни NULL. Числовой операнд имеет ложное значение в противном случае (т.е. равен либо 0, либо NULL).
Операнд типа Строка имеет истинное значение, если строка не пустая. Операнд типа Строка имеет ложное значение в противном случае. Хвостовые пробелы при сравнении строк игнорируются.
Операнд типа UID объекта имеет истинное значение, если UID не равен NULL. Операнд типа UID объекта имеет ложное значение, если UID равен NULL.
При написании выражений применяются следующие операции:
- Конкатенация строк (&) - результатом является строка, полученная добавлением второй строки к первой.
Если между строчными операндами не указать операцию, то программа выполнит такую запись как конкатенацию строк.
- Унарный плюс (+) – Не влияет на число. Преобразует строку в число.
- Сложение (+) - Результатом является сумма чисел.
- Унарный минус (-) - Результатом является число с обратным знаком. Преобразует строку в число.
- Вычитание (-) - Результатом является разность чисел.
- Деление (/) - Второй операнд воспринимается как делитель, а первый - как делимое. Результатом является частное от деления чисел.
- Умножение (*) – Результатом является произведение чисел.
Для переменных типа UIDSET (список уникальных идентификаторов) перечисленные операции имеют следующий смысл:
-
-
-
Сложение (+) – Результатом является объединение двух списков.
-
Вычитание (-) – Результатом является список, содержащий элементы, которые имеются в первом операнде, и не имеются во втором операнде.
-
Деление (/) – Результатом является список, содержащий элементы, которые либо имеются в первом операнде, но не имеются во втором операнде, либо имеются во втором операнде, но не имеются в первом операнде. Иными словами, результатом является объединение двух вычитаний, в которых операнды меняются местами.
-
Умножение (*) - Результатом является пересечение двух списков.
-
-
- Прибавление процент (+%) – К первому операнду добавляется процент от первого операнда. Количество процентов указано во втором операнде.
- Вычесть процент (-%) - Из первого операнда вычитается процент от первого операнда. Количество процентов указано во втором операнде.
- Обратный процент (/%) – Результатом является частное от деления первого операнда на процент от первого операнда. Количество процентов указано во втором операнде.
- Процент (*%) - Результатом является процент от первого операнда. Количество процентов указано во втором операнде.
- Возвести в степень (**) – Возвести операнд в указанную степень.
- Корень квадратный (SQRT) – Вычислить квадратный корень от операнда.
- ИЛИ (||) - логическое ‘ИЛИ’. Если любой из операндов имеет истинное значение, то результат тоже будет иметь истинное значение. В противном случае результат будет иметь ложное значение.
- И (&&) - логическое ‘И’. Если оба операнда имеют истинное значение, то результат тоже будет иметь истинное значение. В противном случае результат будет иметь ложное значение.
- НЕ (!) - логическое отрицание. Если операнд имеет истинное значение, то результат будет иметь ложное значение. Если операнд имеет ложное значение, то результат будет иметь истинное значение.
- Равно (==) - Результат будет иметь истинное значение, если значения операндов равны. Результат будет иметь ложное значение в противном случае.
- Не равно (<>) - Результат будет иметь истинное значение, если значения операндов не равны. Результат будет иметь ложное значение в противном случае.
- Больше (>) - Результат будет иметь истинное значение, если значение первого операнда больше значения второго операнда. Результат будет иметь ложное значение в противном случае.
- Больше или равно (>=) - Результат будет иметь истинное значение, если значение первого операнда больше или равно значению второго операнда. Результат будет иметь ложное значение в противном случае.
- Меньше (<) – Результат будет иметь истинное значение, если значение первого операнда меньше значения второго операнда. Результат будет иметь ложное значение в противном случае.
- Меньше или равно (<=) - Результат будет иметь истинное значение, если значение первого операнда меньше или равно значению второго операнда. Результат будет иметь ложное значение в противном случае.
- Оператор Выбора - Позволяет указать, какую нескольких ветвей программы выполнить в зависимости от значения указанного условия.
- Условный оператор (IF) - Позволяет указать, какую из двух ветвей программы выполнить в зависимости от значения (истинное или ложное) указанного условия.
Оператор Выбора и Условный оператор, используемые в выражениях, отличаются от операторов IF и CASE, являющихся отдельными конструкциями языка. Операторы для выражений имеют более простой синтаксис.
Условный оператор (Оператор IF)
‘Условный оператор’ позволяет указать, какую из двух ветвей программы выполнить в зависимости от значения (истинное или ложное) указанного условия.
Структура:
Условие - это переменная (выражение или функция), имеющая либо истинное, либо ложное значение.
THEN - последовательность операторов данного раздела выполняется если условие имеет истинное значение.
ELSE - последовательность операторов данного раздела выполняется если условие имеет ложное значение.
Обязательное наличие сразу обоих разделов THEN и ELSE не требуется.
Для разделов THEN и ELSE рекомендуется заполнять поле ‘Описание’, которое будет высвечено в качестве комментария к оператору IF.
Пример использования:
Если переменная ‘Устройство вывода отчетов’ имеет значение ‘В файл’, то выполняется группа операторов, расположенная в разделе THEN. В противном случае выполняются операторы раздела ELSE.
Оператор выбора (Оператор CASE)
‘Оператор выбора’ позволяет указать, какую из нескольких ветвей программы выполнить в зависимости от значения указанного условия.
Структура:
Условие - это переменная (выражение или функция), значение которой будет являться ключом для поиска подходящего варианта.
OF – значение ключа, под которым описана соответствующая ему последовательность операторов. Значения ключа последовательно сравниваются со значением условия до первого совпадения.
ELSE - Если ни одно из значений ключа не совпало со значением условием, то выполняется последовательность операторов из данного раздела.
Не рекомендуется использовать оператор CASE вместо оператора IF. Данная конструкция удобна для сравнения условия с набором явно заданных констант, классификаторов и кодификаторов.
Пример использования:
Функция ‘Месяц по дате’ возвращает название месяца. В условии оператора Выбора задан номер месяца. Значениями ключей являются числа от 1 до 12. Если номер месяца не совпадет ни с одним ключом (видимо на вход функции передана неверная дата), то функция возвращает значение NULL.
Оператор цикла (Оператор WHILE)
‘Оператор цикла’ обеспечивает многократное выполнение последовательности операторов до тех пор, пока выполняется указанное условие. Если условие имеет истинное значение, то последовательность операторов будет повторена. Как только условие примет ложное значение, то управление будет передано оператору, следующему за оператором цикла.
Циклом в языках программирования называют группу операторов, выполняемых многократно. Итерацией называют один проход через цикл.
Структура
Условие - это переменная (выражение или функция), имеющая либо истинное, либо ложное значение. Условие вычисляется в начале каждой итерации.
Блок действий – Последовательность операторов программы, выполняющаяся на каждой итерации цикла.
Блок действий не выполнится ни разу, если условие будет иметь ложное значение при первом входе в цикл.
Пример использования:
Указанный цикл будет повторен i раз. Счетчик i уменьшается на 1 в начале каждой итерации.
Изменить порядок выполнения цикла можно с помощью операторов CONTINUE, BREAK, EXIT, RETURN.
Бесконечный цикл прерывается оператором BREAK.
Оператор продолжить (Оператор CONTINUE)
‘Оператор продолжить’ изменяет последовательность выполнения операторов в зависимости от значения указанного условия. Если условие имеет ложное значение, то оператор CONTINUE не выполняет никаких действий. Если условие имеет истинное значение, то оператор выполняет действия в зависимости от места вызова:
- Если оператор CONTINUE вызван из основного блока процедуры (‘Выполнить действия’) или из блока ‘Всегда выполнять перед завершением’, то выполнение процедуры или блока прерывается.
- Если оператор CONTINUE вызван внутри оператора цикла, то запускается следующая итерация цикла. Выполнение текущей итерации прерывается.
- Если оператор CONTINUE вызван при отборе данных с сервера или из локальной таблицы, то вызывается считывание следующей записи.
- Если оператор CONTINUE вызван из вложенного блока действий, то считается, что данный оператор относится не к вложенному блоку, а к основным блокам процедуры (‘Выполнить действия’, ‘Всегда выполнять перед завершением’), к оператору цикла или к отбору данных.
В операторе CONTINUE не обязательно указывать условие. Такая форма оператора называется безусловной. Безусловные операторы выполняются всегда.
Пример использования:
Перебираются данные из таблицы. Оператор CONTINUE позволяет пропустить обработку запрещенных записей. Если считанная запись содержится в списке запрещенных, то оператор CONTINUE прерывает обработку текущей записи, и программа считывает следующую запись.
Оператор прервать (Оператор BREAK)
‘Оператор прервать’ изменяет последовательность выполнения операторов в зависимости от значения указанного условия. Если условие имеет ложное значение, то оператор BREAK не выполняет никаких действий. Если условие имеет истинное значение, то оператор выполняет действия в зависимости от места вызова:
- Если оператор BREAK вызван из основного блока процедуры (‘Выполнить действия’) или из блока ‘Всегда выполнять перед завершением’, то выполнение процедуры или блока прерывается.
- Если оператор BREAK вызван внутри оператора цикла, то выполнение цикла завершается, не дожидаясь выполнения условия выхода.
- Если оператор BREAK вызван при отборе данных с сервера или из локальной таблицы, то отбор данных завершается.
- Если оператор BREAK вызван из вложенного блока действий, то считается, что данный оператор относится не к вложенному блоку, а к основным блокам процедуры (‘Выполнить действия’, ‘Всегда выполнять перед завершением’), к оператору цикла или к отбору данных.
В операторе BREAK не обязательно указывать условие. Такая форма оператора называется безусловной. Безусловные операторы выполняются всегда.
Пример использования:
Если не удалось создать файл, то выполнение блока прерывается.
Оператор выхода (Оператор EXIT)
‘Оператор выхода’ прерывает последовательность выполнения операторов в зависимости от значения указанного условия. Если условие имеет ложное значение, то оператор EXIT не выполняет никаких действий. Если условие имеет истинное значение, то выполнение процедуры прерывается с командой возврата ’ошибка выполнения’.
В операторе EXIT не обязательно указывать условие. Такая форма оператора называется безусловной. Безусловные операторы выполняются всегда.
Пример использования:
Если не удалось открыть файл, то выполнение процедуры прерывается.
Оператор возврата (Оператор RETURN)
‘Оператор возврата’ прерывает последовательность выполнения с командой возврата ’нормальное завершение’.
Если оператор RETURN используется внутри функции, то можно под оператором указать выражение. Значение указанного выражения функция вернет в качестве результата выполнения.
Пример использования в функции:
Функция возвращает строку, содержащую имя проектного элемента.
Если оператор RETURN используется внутри процедуры, то либо оператор записывается без возвращаемого результата, либо в нем явно указывается команда возврата.
Второй вариант применяется в процедурах, вызываемых из сценария вида просмотра.
Например, если по завершении процедуры требуется обновить содержимое экрана, то следует вернуть соответствующую команду.
Процедуры установки и отмены фильтров в виде просмотра возвращают команду возврата ‘Обновить содержимое экрана’.
Оператор Отложить выполнение
Оператор ‘Отложить выполнение’ применяется в видах просмотра при отборе данных.
Данный оператор при выполнении указанного условия временно прекращает работу блока ‘Отбор данных’ вида просмотра и передает управление интерфейсу (той компоненте ядра системы, которая обслуживает запущенный вид просмотра). Это дает возможность получать данные порциями и своевременно отображать их на экране, не дожидаясь завершения отбора всех данных. Интерфейс получает столько записей, сколько поместится на экране, и приостанавливает получение следующих. Последующий вызов процедуры для получения очередной порции данных продолжит выполнение блока ‘Отбор данных’, начиная с оператора, расположенного после оператора ‘Отложить выполнение’.
Использование оператора ‘Отложить выполнение’ в других местах не рекомендуется и аналогично действию оператора RETURN.
Если условие имеет ложное значение, то оператор ‘Отложить выполнение’ не выполняет никаких действий. Если условие имеет истинное значение, то выполнение прерывается с командой возврата ‘нормальное завершение’.
В операторе ‘Отложить выполнение’ не обязательно указывать условие. Такая форма оператора называется безусловной. Безусловные операторы выполняются всегда.
Пример использования в виде просмотра:
При обычной схеме работы со списками данных применяются две компоненты программы. Источник данных (DATA SOURCE, DS) подготавливает записи, а интерфейс, в данном случае – это вид просмотра, отображает записи на экране. В приведенном примере DS считывает из базы данных записи документов. После считывания очередной записи управление передается интерфейсу (оператор ‘Отложить выполнение’). Интерфейс проверяет, заполнилось ли окно со списком записей. Если еще имеется место, то управление возвращается обратно в DS для получения очередной записи.
Применение оператора ‘Отложить выполнение’ позволяет пользователю начать работу с видом просмотра, не дожидаясь считывания всего списка из базы данных. Как только считано такое количество записей, которое достаточно для заполнения окна, так можно отображать окно на экране и позволить пользователю выполнять действия с записями. Если пользователю требуются другие записи, не поместившиеся на экране, то он сообщает об этом, нажимая соответствующие клавиши (стрелка вниз, следующая страница и т.д.). Интерфейс обрабатывает полученные команды и запрашивает у DS новые записи.
Оператор Вызова процедуры или функции
‘Оператор Вызова процедуры или функции’ запускает указанную процедуру.
Если с помощью данного оператора запускается функция, то возвращаемый функцией результат игнорируется.
Допускается рекурсивный вызов процедур, т.е. запущенная процедура может содержать вызов самой себя.
Если процедура или функция имеют формальные параметры, то необходимо указать значения этих параметров в папке ‘Значения параметров при вызове’.
Если запущенная процедура или функция завершили работу с командой возврата ’ошибка выполнения’, то соответствующее сообщение выдается в протокол.
Если для процедуры указан признак ‘Прервать при наличии ошибок’ и запущенная процедура (функция) завершилась с командой ошибки, то прерывается выполнение того блока, где данная процедура была вызвана. Это может быть либо основной блок ‘Выполнить действия’, либо блок ‘Всегда выполнять перед завершением’.
Пример вызова процедуры-метода с заполнением формальных параметров:
Это описание процедуры-метода.
Пример вызова функции с заполнением формальных параметров.
Это описание функции.
Оператор Блок
‘Оператор Блок’ применяется для группировки последовательности операторов.
Блоки могут располагаться в теле процедуры, в специальном разделе ‘Блоки действий’, а также в других блоках. Никаких ограничений по уровню вложенности блоков нет.
Применение блоков делает текст процедуры более структурным, и, следовательно, его легче прочитать и понять. Названия блоков удобно использовать для документирования кода.
Блоки, описанные в теле программы, выполняются автоматически по ходу выполнения ее операторов.
В данном примере разработчик расположил некоторые блоки непосредственно в теле процедуры (раздел ‘Выполнить действия’). Другие блоки он поместил в раздел ‘Блоки действий’. Часть блоков описана в базовой процедуре.
Оператор Выполнить блок
‘Оператор Выполнить блок’ запускает указанный блок действий. В операторе можно указать либо непосредственно блок действий, либо виртуальный блок действий.
Пример использования:
В описании функции имеется блок действий ‘Преобразование EAN13’. Этот блок вызывается на выполнение в основном блоке функции ‘Выполнить действия’.
Оператор Завершить блок
‘Оператор Завершить блок’ прерывает выполнение указанного блока в зависимости от значения указанного условия. Если условие имеет ложное значение, то данный оператор не выполняет никаких действий. Если условие имеет истинное значение, то выполнение блока прерывается.
При наличии вложенности блоков, прерывается выполнение только текущего блока. Работа того блока, из которого был запущен текущий блок, не прерывается.
В операторе Завершить блок не обязательно указывать условие. Такая форма оператора называется безусловной. Безусловные операторы выполняются всегда.
Если оператор Завершить блок применяется внутри блоков-событий в конструкциях вида ‘Отбор данных’, то данный оператор влияет только на текущий блок-событие. Текущий блок-событие прерывается. Оператор не влияет на вызов очередных блоков-событий, и отбор данных не прерывается.
Пример использования:
Оператор Завершить блок будет выполнен, если пользователь не подтвердит удаление записи.
Выражения
Выражение является, наверное, самой применяемой конструкцией языка скриптов.
Выражения встречаются и в операторах присваивания, и в условиях выполнения условных и итеративных операторов, и внутри процедур и функций.
Выражение состоит из одного или нескольких операндов и знаков операций. Операндами выражения могут быть константы, локальные, глобальные и контекстные переменные, другие выражения, а также - функции. Операции выполняются над операндами в порядке их следования. В Домино отсутствует понятие старшинства операций, и если требуется изменить порядок выполнения операций, то следует использовать вложенные выражения.
При описании выражения можно использовать следующие атрибуты:
- Результат - Возвращает константу, значение контекстной, локальной или глобальной переменных, результат вычисления другого выражения, функции, содержимое параметра объекта базы данных. Если результат возвращает объект, то с помощью проектного элемента ‘Уточняющий параметр’ получается значение нужного параметра этого объекта. При необходимости можно пройтись по цепочке связанных объектов.
- Ноль (0.0), если NULL - Возвращает значение контекстной, локальной или глобальной переменных, результат вычисления другого выражения, функции, содержимое параметра объекта базы данных. Если полученный результат имеет значение NULL, то возвращает ноль (0.0).
- NULL – Константа NULL.
- Выражение - Служит для изменения порядка выполнения операторов. Применение данной операции аналогично скобкам.
- Оператор Выбора - Позволяет указать, какую нескольких ветвей программы выполнить в зависимости от значения указанного условия.
-
-
- Условие - это переменная (выражение или функция), значение которой будет являться ключом для поиска подходящего варианта.
- То (?) – Если условие имеет истинное значение (TRUE), то выполняется последовательность операторов этого раздела и выход из оператора выбора.
- Если равно (=) , Если не равно (!=), Если меньше (<), Если меньше или равно (<=), Если больше (>), Если больше или равно (>=)- Для каждой альтернативы указываются значения-ключи. Эти значения-ключи сравниваются со значением условия по указанному правилу. Сравнение производится до первого выполнения правила. Как только между условием и значением-ключом выполняется указанное правило, то выполняется последовательность операторов, заданная в разделе соответствующего правила. Затем выполняется выход из оператора выбора.
- Иначе (:) – Последовательность операторов данного раздела выполняется в том случае, если ни одно правило сравнения условия и значений-ключей не было выполнено.
-
Не рекомендуется использовать оператор выбора вместо условного оператора IF. Данная конструкция удобна для сравнения условия с набором явно заданных констант, классификаторов и кодификаторов.
Пример использования:
Условный оператор (IF) - Позволяет указать, какую из двух ветвей программы выполнить в зависимости от значения (истинное или ложное) указанного условия.
-
-
- Условие - это переменная (выражение или функция), имеющая либо истинное, либо ложное значение.
- То (?) - последовательность операторов данного раздела выполняется если условие имеет истинное значение.
- Иначе (:) - последовательность операторов данного раздела выполняется если условие имеет ложное значение.
-
Обязательное наличие сразу обоих разделов То и Иначе не требуется.
Пример использования:
- Конкатенировать строки (&) - результатом является строка, полученная добавлением второй строки к первой.
Если между строчными операндами не указать операцию, то программа выполнит такую запись как конкатенацию строк.
- Сложить (+) - Результатом является сумма чисел.
- Вычесть (-) - Результатом является разность чисел.
- Делить (/) - Второй операнд воспринимается как делитель, а первый - как делимое. Результатом является частное от деления чисел.
- Умножить (*) – Результатом является произведение чисел.
Для переменных типа UIDSET (список уникальных идентификаторов) перечисленные операции имеют следующий смысл:
-
-
-
Сложение (+) – Результатом является объединение двух списков.
-
Вычитание (-) – Результатом является список, содержащий элементы, которые имеются в первом операнде, и не имеются во втором операнде.
-
Деление (/) – Результатом является список, содержащий элементы, которые либо имеются в первом операнде, но не имеются во втором операнде, либо имеются во втором операнде, но не имеются в первом операнде. Иными словами, результатом является объединение двух вычитаний, в которых операнды меняются местами.
-
Умножение (*) - Результатом является пересечение двух списков.
-
-
- Прибавить процент (+%) – К первому операнду добавляется процент от первого операнда. Количество процентов указано во втором операнде.
- Вычесть процент (-%) - Из первого операнда вычитается процент от первого операнда. Количество процентов указано во втором операнде.
- Обратный процент (/%) – Результатом является частное от деления первого операнда на процент от первого операнда. Количество процентов указано во втором операнде.
- Процент (*%) - Результатом является процент от первого операнда. Количество процентов указано во втором операнде.
- Возвести в степень (**) – Возвести операнд в указанную степень.
- Корень квадратный (SQRT) – Вычислить квадратный корень от операнда.
- ИЛИ (||) - логическое ‘ИЛИ’. Если любой из операндов имеет истинное значение, то результат тоже будет иметь истинное значение. В противном случае результат будет иметь ложное значение.
- И (&&) - логическое ‘И’. Если оба операнда имеют истинное значение, то результат тоже будет иметь истинное значение. В противном случае результат будет иметь ложное значение.
- НЕ (!) - логическое отрицание. Если операнд имеет истинное значение, то результат будет иметь ложное значение. Если операнд имеет ложное значение, то результат будет иметь истинное значение.
- Равно (==) - Результат будет иметь истинное значение, если значения операндов равны. Результат будет иметь ложное значение в противном случае.
- Не равно (<>) - Результат будет иметь истинное значение, если значения операндов не равны. Результат будет иметь ложное значение в противном случае.
- Больше (>) - Результат будет иметь истинное значение, если значение первого операнда больше значения второго операнда. Результат будет иметь ложное значение в противном случае.
- Больше или равно (>=) - Результат будет иметь истинное значение, если значение первого операнда больше или равно значению второго операнда. Результат будет иметь ложное значение в противном случае.
- Меньше (<) – Результат будет иметь истинное значение, если значение первого операнда меньше значения второго операнда. Результат будет иметь ложное значение в противном случае.
- Меньше или равно (<=) - Результат будет иметь истинное значение, если значение первого операнда меньше или равно значению второго операнда. Результат будет иметь ложное значение в противном случае.
Прочие атрибуты
- Допускает наследование атрибутов – при установленном признаке в описании наследника можно будет переопределить атрибуты.
- Использование – условие доступа проектировщиков к выражению.
- Округление – вариант округления результата.
- Формальные параметры – список формальных параметров для вызова выражения
- Значения формальных параметров при вызове – список значений формальных параметров. Раздел заполняется при вызове выражения.
- Локальные переменные – список локальных переменных.
- Вывести результат вычисления на экран – применяется для проверки выражений. При установленном признаке результат вычислений высвечивается на экране в отдельном окне.
- Указатель на элемент – применяется для указания специальных атрибутов выражения.