Руководство по написанию скриптов на языке DCL5
Примечание
Этот проект является частью большой системы проектов о CRM DCL5.
Версия 12.1.0.0
DCL5 - что это такое?
DCL5 – представляет скриптовый, интерпретируемый язык, для создания интерфейса приложения использующего какую-либо СУБД. Он описывает, что должен содержать диалог, какие действия будут производиться при нажатии описанных кнопок.
При написании приложений на этом языке Вам не надо заботиться о размещении и компоновке визуальных элементов форм, это за Вас сделает сам DCL5.
Основная часть бизнес-логики, должна быть реализована средствами самой СУБД и её хранимыми процедурами, триггерами и т.д.
Концепция DCL5, в том, что используя ограниченный набор специальных визуальных компонент, создать полноценное бизнес-приложение, притом, эти компоненты являются макро-компонентами, включающими несколько сложных действий, порою, скрытых от разработчика, дабы не отягчать его излишней черновой работой, из которых подобно блокам складывается интерфейс приложения.
Кроме интерфейсной части, язык содержит в себе средства манипуляции данных и организации простой бизнес-логики.
Код, который оперирует визуальными компонентами, отделён от кода манипуляции данных и бизнес-логики, хотя это не строгое разделение.
Структура построения предложения на языке DCL5
Предложение в DCL5 строится по принципу идущих друг за другом директив, представляющих собой пары ИмяДирективы=Значение;, они могут быть подчинены друг другу и таким образом вложены, когда одна директива заменяется значением, а та в свою очередь принимает это значение как дополнение или основное своё значение, или же просто быть в виде списка пар директив, разделённых между собой знаком разделения директив «;». Строго говоря, директивы всегда разделяются знаком разделения директив, если она не вложены. В качестве значений директив, могут выступать фиксированные значения, как упоминалось ранее, так и значения подставляемые запросами, из которых чаще всего берут одну строку, переменными, функциями, параметрами или объектами полей. Все специальные значения, такие как функции, переменные, параметры, объекты полей, всегда указываются через предшествующий префикс, в языке DCL5, нет спонтанных значений. Все предложения в DCL5 записываются в одну строку, какими длинными они бы не были. Исключения составляют, секции, в них могут помещаться многострочные значения.
Переменные
Переменные это - заранее объявленные, именованные значения в скрипте, значения которых можно подставлять в запросы и сообщения и вообще использовать где угодно.
Для объявления переменных служит предложение :
Declare=
в котором указывается выражение вида : Переменная[=значение]. Для обращения к значениям переменным осуществляется через знак «&».
Уничтожение переменных осуществляется командой
Dispose=
где параметром служат имена переменных разделённых запятыми. При повторном объявлении или использовании переменной в компоненте, её значение сбрасывается.
Пример :
Declare=OutDate="01.12.2024",DocName;
`....`
`Dispose=OutDate, DocName;`
В данном примере создаются переменные OutDate и DocName, переменной OutDate присваивается значение, затем переменные уничтожаются. В предложении Declare и Dispose допускается указывать несколько переменных через запятую.
Примечание :
При явном или неявном объявлении переменной, её значение сбрасывается.
Всегда уничтожайте ненужные переменные, что бы не запутаться.
При трансляции значения переменной, первый приоритет имеют переменные из
глобального пространства, а затем уже из локального.
Допустимо указывать переменные в тексте без отделения их от другого текста.
Системные переменные и константы
Помимо переменных, объявляемых в тексте скрипта, существую системные переменные, их не надо объявлять и задавать им значение, а после уничтожать, их значение предопределено и они всегда существуют. Это могут быть переменные, возвращающие время, дату, и т.д. Обращение к их значениям производится как к обычным переменным, через знак «&».
-
_DATE_: Возвращает текущую дату.
-
_TIME_: Возвращает текущее время без секунд.
-
_TIMES_: Возвращает текущее время с секундами.
-
_DATETIME_: Возвращает текущую дату и время с секундами.
-
_ISEMPTY_: Возвращает “1” если НД пуст, и “0” если есть хоть одна запись.
-
_VERSION_: Возвратит версию платформы.
-
_DCLINI_: Используемый DCL.ini, имя файла с путём.
-
_DCLTABLE_: Возвращает имя таблицы со скриптами.
-
_DCLNAMEFIELD_ : Возвратит поле с именем скрипта из таблицы скриптов.
-
_DCLTEXTFIELD_ : Возвратит поле с текстом скрипта из таблицы скриптов.
-
_IDENTIFYFIELD_ : Возвратит поле идентификатора из таблицы скриптов.
-
_PARENTFLGFIELD_ : Возвратит поле родителя из таблицы скриптов.
-
_COMMANDFIELD_ : Возвратит поле с командой из таблицы скриптов.
-
_NUMSEQFIELD_: Поле, содержащее идентификатор элемента меню.
-
_DBUSERNAME_ : Возвращает имя пользователя БД.
-
_DBPASSWORD_ : Возвращает пароль БД.
-
_STRINGTYPECHAR_ :Ограничитель строк.
-
_VALUESEPARATOR_ : Возвратит текущий разделитель выбранных значений.
-
_ROLESTABLE_ : Таблица ролей.
-
_ROLESMENU_ : Таблица элементов меню ролей.
-
_ ROLEIDFILED_ : Поле с идентификатором роли.
-
_ROLENAMEFIELD_ : Поле с именем роли.
-
_ROLEMENUIDFIELD_ : Поле с идентификатором роли в таблице элементов меню ролей.
-
_MENUITEMID_ : Поле в таблице элементов меню содержащее номер элемента.
-
_ROLENAME_ : Имя роли.
-
_LONGROLENAME_ : Полное имя роли, если не указанно значение параметра LongRoleNameField в файле настройке, то подразумевается что, этого поля нет.
-
_ROLEID_ : Идентификатор текущей роли.
-
_USERPASS_ : Введенный пароль пользователя.
-
_FOB_ : Возвратит «1» если начало НД.
-
_EOB_ : Возвратит «1» если конец НД.
-
_OS_ : Возвратит операционную систему (windows или posix=(Linux, BSD)).
-
_APPPATH_ : Возвратит путь к программе с разделителем папок в конце.
-
_APPNAME_ : Имя исполняемого файла приложения.
-
_APPDATAPATH_ : Возвращает путь к папке программы в %AppData%\DCL5\ для Windows и ~/.config/DCL5/ для Linux. В неё помещаются временные файлы и файлы настройки. Эта папка может быть переопределена с помощью параметра UserLocalProfile= в конфигурационном файле или в таблице глобальных параметров.
-
_USERPROFILE_ : Возвратит папку %AppData% для Windows и домашнюю директорию для Linux.
-
_USERDOC _: Возвратит папку «Мои документы» для Windows и домашнюю директорию для Linux.
-
_ENGINETYPE_ : Метод доступа к данным, (ADODB, IB, ZEOS).
-
_CURRENTSTRING_ : Возвращает номер выполняемой строки.
-
_DCL_USER_NAME_ : Возвратит имя текущего пользователя, вошедшего в программу.
-
_DCL_USERS_TABLE_ : Таблица пользователей системы.
-
_USERID_ : Идентификатор пользователя вошедшего в систему.
-
_USERNAMEACCESSLEVELS_ : Список прав пользователей.
-
_USERACCESSLEVEL_ : Числовое значение права пользователя, вошедшего в систему.
-
_ACCESSLEVEL_ : Числовое значение права текущего контекста исполнения.
-
_NOTIFYACTIONS_ : Список действий оповещения.
-
_YESNO_ : Список вида: «Нет, Да».
-
_DSSTATE_ : Числовой индекс статуса набора данных.
-
_DSSTATENAME_ : Название статуса набора данных.
-
_ROLEACCESSLEVEL_ : Уровень прав роли.
-
_FULLRAIGHTS_ : Полное право текущего пользователя, в соответствии с правом роли.
-
_LASTDIALOGRESULT_ : Результат последнего диалога (Да\Нет, Диалог ввода). Для диалога Да\Нет значения будут “1”"0" соответственно. Для диалога ввода “1” будет в случае принятия ввода и “0” если был отказ.
Пример :
Setvalue=Today=&_DATE_;
В указанном примере переменной OutDate присваивается значение текущая дата.
Интерфейс
Главное меню
Язык DCL5 позволяет создавать меню и назначать события на него.
Пункты меню, объявляются непосредственно в базе скриптов, в виде записей, надпись заносится в поле SCR_NAME, в поле IDENT указывается идентификатор пункта, он не должен повторятся. В поле PARENT, идентификатор родительского элемента, либо null если пункт меню верхнего уровня. Для меню используются идентификаторы от 1 до 20000 включительно. Таким образом можно создать многоуровневое меню.
Командный скрипт, может задаваться в поле имени скрипта (поле COMMAND) определяя имя запускаемого скрипта.
Идентификатор с номером 0 используется для окна меню, надпись в поле определяемым параметром SCR_NAME, будет являться его заголовком.
Строки для добавления к заголовку
Идентификаторы начиная с 20051 до 20100 включительно предназначены для задания текста прибавляемого к заголовку окна.
Диалоги
Диалоги, это окна с набором визуальных компонент просмотра и редактирования данных. Хотя бывают диалоги и без компонент для просмотра НД. Только с одними кнопками.
Диалоги так же могут содержать в себе вкладки, для того что бы разместить на них несколько наборов данных. В них, может содержаться табличные части, в которых размещаются компоненты просмотра НД.
Создание главного НД диалога
Для определения данных набора данных диалога служит предложение :
Query=
Содержит текст в одну строку. О подробностях построения запросов рассказывается в соответствующем разделе “Запросы”.
Атрибуты и свойства диалогов
Caption=
- Устанавливает заголовок диалога.
OnTop=
- Всплывающий поверх остальных диалог. Логическое (0, 1).
NoButtonsPanel;
- Не создает панель с кнопками, если их нет.
NoCloseButton;
- Не создаёт кнопку Закрыть.
PrintTool;
- Показывать кнопку печати содержимого таблицы в инструментальной панели.
MultiSelect=
- Разрешает или запрещает множественный выбор в таблице. Логическое (0, 1).
Style=
- Устанавливает тип отображения компонентов отображения данных. Принимает следующие значения :
0 - Поля в столбцы.
1 - Поля в строки.
2 - Таблица (по умолчанию).
Ограничение редактирования данных
Для того что бы ограничить редактирование НД, используется предложение :
DataReadOnly=
Принимает значения «1» - включено. Таким образом делая набор данных не редактируемым. Аналогично команде AddNotAllowOperation=
с добавлением всех опций.
Режим одного экземпляра диалога
Для предотвращения открытия второго экземпляра диалога, в скрипте диалога ставиться директива
Single;
Режим запрещения закрытия диалога
Запретить закрытие диалога, до выполнения определённых действий, можно с помощью директивы:
NoCloseable=
Она принимает значения 1 или 0, при значении 1, диалог закрыть невозможно, но можно зарыть программу. При значении 0, закрытие диалога становится возможно.
CloseQuery=
Показывает вопрос при закрытии диалога. В значении указывается текст вопроса, если он не будет указан, то будет выводится “Закрыть диалог?”.
События диалогов
События набора данных назначаются в предложении Events=
.
События набора данных
Close=
Определяет события на закрытие формы диалога, через запятую указываются имена командных скриптов, предназначенные для выполнения.
AfterPost=
Определяет события после сохранение данных в БД, через запятую указываются имена командных скриптов, предназначенные для выполнения.
Cancel=
Определяет события на отмену сохраненных данных в БД, через запятую указываются имена командных скриптов, предназначенные для выполнения.
Scroll=
Определяет события на перемещение по записям в БД, через запятую указываются имена командных скриптов, предназначенные для выполнения.
AfterInsert=
Определяет события после вставки новой записи в БД, через запятую указываются имена командных скриптов, предназначенные для выполнения.
Delete=
Определяет события после удаления записи в БД, через запятую указываются имена командных скриптов, предназначенные для выполнения.
События табличных частей
События табличных частей назначаются в предложении PartEvents=
и имеют те же директивы.
События визуальных компонент
LineDblClick=
События двойного щелчка по строке таблицы. Через запятую указываются командные скрипты.
Интерфейсные компоненты диалогов
Для создания элементов в диалогах служат следующие команды.
Navigator=
Элемент управления и навигации по набору данных. Принимает значения 1 - включен или 0 - скрыт. Может размещаться на каждой вкладке основного НД, а так же на Табличных частях и Таблицах просмотра. Содержит директивы. Директива Buttons=
. Определяет состав кнопок навигатора, указанных через запятую.
Допустимы следующие значения:
First
- Переход в начало НД.
Prior
- Переход на одну запись назад.
Next
- Следующая запись.
Last
- В конец списка.
Insert
- Вставить пустую запись и остаться в редактировании.
Delete
- Удалить.
Edit
- Перейти в режим редактирования.
Post
- Зафиксировать изменения.
Cancel
- Отменить не зафиксированные правки.
Refresh
- Обновить НД.
Директива Flat=
позволяет выбрать плоский стиль навигатора.
Статус панели
В диалоге в нижней его части имеется статус панель, которая содержит в себе несколько секций, используемых для вывода системной информации и сообщений. Секции можно добавлять и удалять только добавленные. Для этого существуют специальные команды, которые поддерживаются в обеих типах скриптов.
Первые три секции не могут быть удалены и в первые две невозможно внести текст с помощью команд платформы, они используются для системных нужд: отображение количества записей в НД и вывод состояния НД, соответственно. В третью секцию возможно помещение текста коротких сообщений.
Вкладки
Вкладки это способ разместить на одном диалоге несколько страниц с разными НД. Если вкладка одна, то явно её не видно, все элементы размещаются в ней. Непосредственно страницы появляются при создании более одной вкладки. Вкладки создаются в разметке диалога. Каждая секция вкладки может содержать свои элементы и свой набор данных.
Для их создания необходимо, перед запросом, создающим НД помещается секция ‘[Page]’. Далее все запросы и директивы относящиеся к созданному НД, будут действовать только на этот НД, до следующего объявления секции ‘[Page]’. Так же, командные кнопки будут создаваться на текущей странице.
Директивы :
Title=
- Определяет заголовок закладки. Предложение используется после секции [Page] и указывает заголовок той страницы, внутри которой оно находится.
Пример :
[Page]
Title=Клиенты;
Query=select * from Clients;
[Page]
Title=Заказы;
Query=select * from Orders;
Командные кнопки
Командные кнопки запускают пользовательские скрипты, заранее назначенные на них в разметке диалога.
Командные кнопки вызывают скрипты в контексте диалога.
Для создания командных кнопок используется предложение
CommandButton=
Директивы :
CommandName=
- Определяет имя скрипта, выполняемой команды, в этом случае параметр Action= должен отсутствовать. Допускается указание только командных скриптов.
ForEach=
- Выполнить скрипт для каждой выделенной записи. Работает если режим просмотра Таблица Style=2; и включено множественное выделение MultiSelect=1;. В конце иттерации всегда вызывается ‘Refresh;’. Логическое (1, 0).
ExecAfter=
- Скрипт для выполнения после выполнения цикла по выделению для ‘ForEach=’.
Label=
- Заголовок кнопки.
Hint=
- Всплывающая подсказка.
Host=
- При запуске скрипта, отмеченного этой директивой, создаётся изолированное пространство, в котором могут существовать такие же переменные, как и в соседнем, таком же пространстве, но не в главном, не изолированном. Логическое (1, 0).
Width=
- Задаёт ширину кнопки в пикселях. Число. При значении -1, автоматически подгоняет ширину кнопки под ширину надписи.
AutoSize=
- Если равно 1, то ширина кнопки задаётся автоматически, и игнорирование директивы Width=.
_Default=
- Если равно 1 то кнопка активируется по нажатию Enter.
_Cancel=
- Если равно 1 то кнопка активируется по нажатию Escape.
FontStyle=
- Задает стиль шрифта кнопки.
Параметры :
-
Bold – Жирный шрифт.
-
Italic – Курсив.
-
UnderLine – Подчеркнутый.
Параметры могут комбинироваться через запятую.
AccessLevel=
- Уровень прав для отображения кнопки, указывается число соответствующее уровню прав пользователя. Учитывается уровень права, действующего в пределах текущего диалога.
Pict=
- Устанавливает картинку. Не применяется совместно с директивой Action=. Картинки можно загружать из хранилища двоичных значений, указывая имя значения. Картинки должны быть в формате BMP или PNG. Цвет левого верхнего пикселя, указывает прозрачный цвет.
Action=
- Назначает предопределенное действие или выполняет одну команду (команды см. ниже).
Действия :
Refresh
- Позволяет обновить НД, методом Refresh.
Delete
- Удаляет текущую запись.
DeleteConf
- Удаляет текущую запись, но с подтверждением.
Post
- Сохранение правки поля, если не было перехода на другую запись.
Cancel
- Отменить не сохранённые изменения.
CancelClose
- Закрытие и отмена не сохранённых изменений.
Insert
- Вставляет пустую запись.
Append
- Добавляет пустую запись.
Version
- Возвращает версию платформы.
Close
- Закрывает диалог.
Пример :
CommandButton=Label=Пометить;CommandName=DeleteDoc;Pict=Delete;
В этом примере создается кнопка с заголовком “Пометить” и при ее нажатии будет выполнятся скрипт с именем “DeleteDoc” и устанавливает картинку в значении Delete из хранилища двоичных объектов.
Кнопки табличных частей
Создаются на странице табличной части. Описание следующее за объявлением текущей табличной части создаст в ней кнопки.
TablePartToolButton=
Все директивы аналогичны предложению CommandButton=.
Представление основного набора данных
Каждый диалог может содержать основной набор данных. Он отображается в виде таблицы или в виде набора полей. К нему может быть назначен элемент навигатора.
Компоненты отображения основного НД
Таблица
Если в разметке диалога установлен стиль отображения Таблица, то данные будут показываться в виде таблицы, с заголовками полей. Отдельные столбцы таблицы можно скрыть в настройках диалога. Щелчок по заголовку таблицы отсортирует этот столбец, повторный щелчок по отсортированному столбцу, обращает порядок сортировки. Щелчок по другому столбцу, сбрасывает сортировку со всех и сортирует текущий. Для сортировки по нескольким столбцам нужно выбирать столбцы с зажатой клавишей Ctrl. Для снятия признака сортировки, следует нажать на отсортированный столбец с зажатой клавишей Shift.
Поля сортировки
Существуют запросы, в которых невозможно упорядочивать результат по некоторым полям, и нужно ограничить набор полей для сортировки для этого служит предложения:
OrderByFields=
- через запятую указываются поля для сортировки по текущему запросу.
NoOrderByFields=
- через запятую указываются поля, не доступные для сортировки по текущему запросу.
Таблица итогов
Таблицей итогов называется строка под основной таблицей и отображающая результаты выполнения агрегатных функций над основным набором данных. Например, можно вывести сумму и количество всех документов, содержащихся в таблице, причём итог будет зависимым от условий поиска.
Пример :
SummQuery=Count(*) CountDocs, Sum(d.doc_sum) SumDocs;
Данное предложение выведет итоговую таблицу с количеством и суммой по указанным полям.
Директивы :
Columns=
- Указываются колонки для принудительного задания им ширины. Колонки пишутся парами Имя/Размер, разделённых запятыми. Для этого они должны быть поименованы в предложении. При этом порядок следования колонок в таблице перестраивается как в списке.
Пример :
Columns=CountDocs/80, SumDocs/120;
Поля (обычные)
Показываются в режиме отображения полей. Простые поля служат для простого отображения и изменения данных из набора данных, и только из него. Для разных типов данных служит одно и тоже поле. Создаются в секции описания полей, если не указан какой либо компонент просмотра данных.
У полей существуют директивы, которые указываются через знак "" после заголовка поля в секции полей основного НД.
Width=
- Ширина компонента. Число.
Height=
- Высота. Действует только на определённые компоненты. Число.
Disabled=
- Компонент будет недоступен. Логическое (1, 0).
NoDataField=
- Позволяет отсоединить компонент от набора данных. Логическое (1, 0).
Hint=
- Всплывающая подсказка.
ReadOnly=
- Компонент только для чтения. Логическое (1, 0).
VariableName=
- Имя связанной переменной.
HidePassword;
- Режим отображения пароля под ****, при щелчке с зажатым Ctrl показывает скрытый текст.
RequiredValue=
- Поля является обязательным для заполнения или выбора. Логическое (1, 0). Однако директива не обрабатывается для полей с признаком ReadOnly=1
или Disabled=1
.
Примечание :
Запрещается использовать в именах полей и в их заголовках следующие символы
«\», «;», «,» .
Пример :
[Fields]
3
Роль\ReadOnly=1;
RoleName
Пароль\Width=100;HidePassword;
RolePass
Примечание :
Все директивы полей указываются после подписи поля. Через знак «\».
Влияние перечисленных директив распространяется по возможности, на все типы полей и на все компоненты отображения данных и поля ввода.
Примечание :
В конце директив обязательно должен присутствовать символ «;» (точка с запятой).
Типы данных
Для явного указания того, как отображать поле с данными служат директивы :
Директивы :
As_Graphic; – отобразит поле как содержащее графические данные.
As_Date; -– установит тип поля в тип Дата.
As_Memo; – отобразит поле как содержащее большой объем текста.
As_RichText; – отобразит поле как содержащее форматированный текст.
As_Logic; – отображает поле как содержащее данные типа Boolean. По умолчанию в базу будут передаваться значения 1 и 0. Для явного указания, какие значения будут передаваться при взведённом и снятом переключателе служат директивы ValueChecked= и ValueUnChecked=.
Пример :
Проведен
Status\As_Logic;ValueChecked=1;ValueUnChecked=0;
Директивы указываются через знак «\\» после имени поля.
Компоненты полей (сложные)
Так же как и простые поля могут быть созданы только при типе отображения Поля. Сложные поля позволяют отображать и вводить данные не только из НД. Могут быть использованы для ввода значений в переменные или их отображения. В них можно поместить значение из SQL выражения. Создать условие вывода значения если значение пусто или не пусто.
Перечисленные в разделе поля директивы так же действуют и на сложные поля. Существует несколько разновидностей компонентов полей. Они различаются возможностью двухсторонней связи с источником данных.
InputBox=
- Только ввод.
OutBox=
- Только вывод данных.
EditBox=
- Двухстороннее взаимодействие.
Директивы :
VariableName=
- Связанная с компонентом переменная.
ComponentName=
- Имя компонента для обращения к нему по имени.
CharCase=
- Регистр выводимого текста. Селектор (LowerCase\UpperCase).
Format=
- Формат вводимых данных. Селектор (float\digit\trim).
MaxLength=
- Ограничение длины вводимого текста. Число.
_Value=
- Предопределённое значение. Произвольная строка.
_ValueNotInput=
- Предопределённое значение если в _Value=
пустое значение.
_ValueIfEmpty=
- Предопределённое значение если в поле нет значения.
_ValueIfNull=
- Предопределённое значение если в связанном поле нет значения.
_ValueIfNotNull=
- Предопределённое значение если в связанном поле значение.
SQL=
- SQL выражение возвращающее значение.
Пример :
[Fields]
2
Документов\OutBox=SQL=select Count(t1.OUTSUM) from DOCS t1, DatesOD t2 where t1.DateOD=t2.DateOD and t2.CurrentFlag=1;Disabled=1;
OUTSUM1
Сумма\OutBox=SQL=select SUM(t1.OUTSUM) from DOCS t1, DatesOD t2 where t1.DateOD=t2.DateOD and t2.CurrentFlag=1;Disabled=1;
OUTSUM
Примечание :
При изменении или вводе значений в поля ввода изменяются только связанные с ними переменные и наоборот.
Предложения InputBox=, OutBox=, EditBox= могут использоваться совместно с предложением GetValue= для использования диалога выбора.
Поле Дата
DateBox=
Поле служит для ввода и отображения дат. Относится к типу сложных полей. Может быть использовано без НД.
Поле списка выбора из НД
Lookup=
Директивы :
SQL=
Используется для создания набора данных для подстановки к ключевым значениям.
Key=
Указывает ключевое поле в таблице выбора, для сопоставления полей просмотра с полями основного НД.
List=
Список значений таблицы выбора, отображаемый на значения поля указанного в параметре Key=.
VariableName=
Необязательный параметр, определяет имя переменной в которую будут помещается значения ключевого поля при его выборе. Объявлять переменную не требуется. Совместно с директивой NoDataField= может использоваться для выбора значений из списка не в редактируемый набор данных, а в переменную.
NoDataField=
Использует поле только для выбора значений в переменную, без занесения их в БД. Логическое (1, 0).
KeyValue=
Позволяет выставлять значение списка в отсутствии основного набора данных или если данные не определены. В предложении пишется значение ключевого поля НД для списка. Поддерживается использование переменных. Возможно указание запроса, первый столбец которого будет присвоен параметру.
Необязательные параметры :
ModifyingEdit=
Имя компонента куда будет заноситься значение выбора, помимо изменяемого поля или вместо него.
Примечание :
Директива ModifyingEdit= имеет больший приоритет.
Таблица в полях
По сравнению с полями выбора, таблицы в полях позволяют просматривать сразу весь НД, но не имеют возможности подстановки значений.
LookupTable=
Директивы :
SQL=
- Является обязательным параметром и содержит запрос, строящий таблицу просмотра, в запросе допускается использовать переменные. Запрос для таблицы должен соответствовать быть построен по следующим правилам.
В качестве значения для отбора должен стоять параметр - знак двоеточия и имя поля содержащее значение отбора :
select * from MAILS where PartnerID=:ID
где :ID имя поля в главной таблице.
DependField=
- Поле, связанное с основным набором данных.
VariableName=
- Ключевое значение из мастер НД, при отсутствии НД, если указана директива ‘NoDataField=’.
NoDataField=
- Отключает от НД. Если указана переменная в ‘VariableName=’, привязка будет осуществлятся к значению в переменной из ‘VariableName=’.
Navigator=
- Видимость навигатора. Логическое (1, 0).
NavigatorButtons=
- Видимость кнопок навигатора. Параметры аналогичны директиве ‘Buttons=’ в диалоге.
Columns=
- Позволяет именовать столбцы таблицы произвольно, задавая список полей в виде:
ИмяПоля1[=Длина]/Подпись Поля 1, ИмяПоля2/Подпись Поля 2, ИмяПоля3/Подпись Поля 3.
Поле Переключатель
Поле Переключатель, может отображать состояние Включено\Выключено. Существует несколько разновидностей полей Переключателя:
DBCheckBox=
- Компонент работающий только с НД и полем в нём.
SimplyCheckBox=
- Компонент работающий только с переменными, без НД.
CheckBox=
- Алиас для двух предыдущих компонентов, выбор производится автоматически.
Директивы :
ValueChecked=
- Значение при состоянии “Включено”.
ValueUnChecked=
- Значение при состоянии “Выключено”.
_OnCheck;
- Создаёт переключатель включены.
_OffCheck;
- Создаёт переключатель выключенным.
_Value=
- Исходное значение. Только для ‘SimplyCheckBox=’.
Так же для того что бы указать тип поля как логическое, можно использовать директиву после имени поля:
As_Logic;
Пример :
[Fields]
2
Статус\ CheckBox= VariableName=Status;_OnCheck;
Stat
Список выбора
Список выбора представляет собой выпадающий список в режиме Полей. При выборе элемента из него в переменную или поле, заносится текст этого элемента или его индекс, если режим выбора индекса включен.
DropListBox=
Директивы :
SQL=
- Параметром для его построения является запрос, возвращающий набор данных из одного столбца.
List=
- Содержит список значений через запятую.
SetIndexValue=
- Устанавливает индекс начального значения. Работает только если не подключен НД, т.е. с опцией ‘NoDataField=1’.
UseIndex=
- Если параметр имеет значение «1», то в поле таблицы заносится индекс выбранного элемента, а не его строковое значение. Логическое (1, 0).
Примечание :
Допускается совместное использование обоих параметров (SQL=, List=), список будет дополнятся, список указанный в предложении будет иметь больший приоритет и займёт место в начале.
Используя системные переменные _USERACCESSLEVEL_ и\или _NOTIFYACTIONS_ в директиве ‘List=’, можно получить список прав пользователей и список действий оповещений, соответственно.
Пример :
Язык\DropListBox=List=<Нет>,Английский,Немецкий,Французкий,Японский,Арабский;
INOSTR
Язык\DropListBox=List=<Нет>,Английский,Немецкий,Французский,Японский,Арабский;UseIndex=1;
LANG_CODE
Контекстная кнопка поля
Для совершения каких-либо действий, рядом с полем можно поместить контекстную кнопку, она может помещаться рядом с любым полем или компонентом поля.
ContextButton=
Директивы :
CommandName=
- Скрипт исполняемых действий.
ButtonHint=
- Всплывающая подсказка.
Выделение цветом
Для удобочитаемости таблиц, данные в них можно разгруппировать по цветам, для этого служит предложение Color=. Оно содержит цвет для раскраски. Условие для срабатывания записывается в директиве Condition=. Для подробного ознакомления с логическими выражениями следует посетить раздел [Логические выражения].
Директивы :
Condition=
- Логическое выражение записанное на языке логических выражений DCL. Поле НД всегда должно находится в левой части выражения, далее следует какое либо условие.
Цвета :
Цвета пишутся обычными словами например, clRed, clGreen…, с префиксом cl, или числами выражающими RGB пространство, как десятичными так и шестнадцатеричными с ведущей буквой h в начале шестнадцатеричных значений.
Пример :
Color=clRed;Condition=CoastSum<=2400;
В данном примере будет производится раскраска тех записей, значение которых в поле CoastSum, меньше 2400, в красный цвет.
Color=h45DD0C;Condition=CoastType (4, 6, 7);
Здесть в цвет RGB (45DD0C hex) раскрасятся строки если в поле CoastType будут значения 4, 6, или 7.
Элемент управления «Календарь»
Используется для передачи даты в запрос посредством переменной. Для этого в предложении Query= должна стоять переменная и ей должно быть присвоено значение, посредством предложения Calendar= до выполнения запроса, для этого, «Календарь» должен быть объявлен до запроса.
Календарь располагается на панели с фильтрами. Для создания календаря используется следующее предложение :
Calendar=
Директивы :
Label=
- Задает надпись над элементом.
VariableName=
- Имя переменной куда будет помещаться значение, если не заданно то будет формироваться автоматически по правилу, Calendar_<DialogName>+<Номер компонента>. Заранее объявлять переменную не требуется.
ParamName=
- Имя параметра в запросе, куда будет помещаться значение. Имеет более высокий приоритет над параметром VariableName=.
DefaultValue=
- Определяет исходное значение, если нет, то ставится текущая дата.
ReOpen=
- Значение 1 параметра указывает на то, что необходимо переоткрыть запрос при выборе даты. Логическое (1, 0).
Пример :
Calendar=Label=Дата;VariableName=CDE;ReOpen=1;
Query=select * from call_stat s where s.DateCall='&CDB';
Примечание :
Переменная в запросе, так как она является безтиповой, то с целью соблюдении типов в запросе она взята в кавычки, так как поле DateCall имеет тип Дата.
Фильтры основного НД
В диалоге возможно разместить компоненты фильтрации и поиска в НД. Существуют несколько разновидностей фильтров, работающих по разному принципу.
Все виды фильтров
Простые фильтры
Простые фильтры берут значения для списка значений посредством указания SQL запроса. Выбирать можно только из этих значений. Кроме того, для сброса фильтра в состояние “не отфильтровано”, в набор данных представляющий список значений должна быть введена запись с ключом -1 и какой либо подписью.
DBFilter=
Директивы :
Label=
- Надпись.
SQL=
- Создает НД, который будет использоваться как набор значений для фильтрации.
List=
- Указывает то поле, значения которого будут видны в списке для фильтрации.
Key=
- Указывает поле со значениями фильтра.
FilterField=
- Указывает поле в фильтруемом НД, по которому будет осуществляться фильтрация.
FilterMode=
- режим совпадения вводимого образца со строками фильтра.
Параметры :
- Partial - Поиск похожих.
Допустимо объединение режимов фильтрации.
VariableName=
- Имя переменной в которую при каждом изменении фильтра, будет заносится значение ключевого поля.
Примечание :
Параметр может отсутствовать, если указана переменная в параметре
VariableName=
.Тогда запрос не будет изменяться, а при выборе значений из фильтра, переменная будет заполняться ключевыми значениями.
VariableName=
- Имя переменной, в которую при каждом выборе фильтра, будет заносится значение ключевого поля.
KeyValue=
- Позволяет установить начальное значение фильтра, для этого параметром указывается значение ключевого поля. Возможно указание как переменных так и запроса, первый столбец которого будет присвоен параметру.
Between=
- Указывает (значение “1”) что предыдущий и настоящий фильтры образуют выборку между своими значениями. Первое значение берётся из предыдущего фильтра.
Пример :
DBFilter=List=DateOD;Key=DateOD;FilterField=DateOD;Label=Дата нач.; DBFilterQuery=select * from "DatesOD";
DBFilter=List=DateOD;Key=DateOD;FilterField=DateOD;Label=Дата конца; DBFilterQuery=select * from "DatesOD";Between=1;
DBFilter=List=State;Key=Num;FilterField=State;Label=Статус;DBFilterQuery=select * from "State";
DBFilter=List=AccType;Key=TypeNum;FilterField=TypeAcc;Label=Тип счета;DBFilterQuery=select * from "AccTypeBook";Between=1;
Простой фильтр со списком
Фильтр со списком. Список определяется в самом предложении. Параметры аналогичны DBFilter=
, но нет SQL=
, а список задаётся в параметре List=
. Он представляет из себя набор пар Ключ/Значение, разделённых запятыми. Для сброса состояния, так же используется ключевое значение равное -1.
Пример :
ComboFilter=Label=Не состоявшиеся;List=-1/Все,0/Не состоявшиеся;FilterField=WATCHERS;
Контекстные фильтры
Для поиска произвольного значения может быть использован контекстный фильтр. Он аналогичен обычному фильтру, только позволяет не выбирать значения из списка, а вводить их с клавиатуры.
ContextFilter=
Директивы :
Label=
- Надпись над фильтром.
FilterField=
- Указывает поле, по которому будет осуществляться фильтрация в НД.
Примечание :
Параметр может отсутствовать, если указана переменная в параметре
VariableName=
.Тогда запрос не будет изменяться, а при изменении фильтра, образец для поиска будет помещён в переменную.
FilterMode=
Параметры :
-
Case - Будет регистрочувствительный поиск.
-
NotLike - Точное совпадение.
-
Partial - Поиск похожих.
Допустимо объединение режимов фильтрации.
VariableName=
- Имя переменной в которую при каждом изменении фильтра, будет заносится значение ключевого поля.
_Value=
- Начальное значение.
MaxLength=
- Задает максимальную длину вводимого текста.
WaitForEnter=
- Если параметр равен 1, то ожидает нажатия клавиши Enter для применения фильтрации.
ComponentName=
- Задает имя компонента для дальнейшего обращения к нему по имени. Если же имя не будет заданно то оно формируется по следующему принципу: ContextFilter_N, где N номер фильтра по порядку.
Пример :
ContextFilter=FilterField=LASTNAME;Label=Фамилия;
В данном примере создается фильтр по полю LASTNAME.
Примечание :
Контекстные фильтры так же возможно объединять в группы для задания способа фильтрации, аналогично обычным фильтрам.
Between=
Указывает (значение “1”) что предыдущий и настоящий фильтры образуют выборку между своими значениями. Первое значение берётся из предыдущего фильтра.
Табличные части
Табличная часть показывает связанные с основным НД данные. При переходе по записям основного НД, будет меняться состав данных в табличной части. Во вкладке может размещаться произвольное количество табличных частей. У табличных частей могут быть свои кнопки вызова действий.
TablePart=
Директивы :
SQL=
- Является обязательным параметром и содержит запрос, строящий таблицу. Запрос для таблицы должен быть построен по следующим правилам:
В запросе должно быть указано условие для связи с основным НД, для этого по этому полю нужно выбирать по значению из поля в основном НД с символом “:” перед ним.
select * from MAILS where PartnerId=:ID
где :ID имя поля в главной таблице.
DependField=
- Поле в табличной части, содержащее значение для связи с главным НД.
MasterDataField=
- Поле в основном НД с его ключом.
VariableName=
- Переменная со значением связующего поля из главного НД. Используется совместно с ‘NoDataField=’.
NoDataField=
- Отсоединяет таблицу от мастер-НД. Принимает значение ‘1’, в этом случае.
Columns=
- Позволяет именовать столбцы таблицы произвольно, задавая список полей в виде:
ИмяПоля1[=Длина]/Подпись Поля 1, ИмяПоля2/Подпись Поля 2, ИмяПоля3/Подпись Поля3.
Navigator=
- Если параметр имеет значение 0, то навигатор не показывается.
NavigatorButtons=
- Определяет набор кнопок навигатора. Аналогичен параметру ‘Buttons=’ предложения ‘Navigotor=’.
Title=
- Определяет заголовок страницы с Табличной частью.
Style=
- Аналогично такой же директиве в основном диалоге, задаёт способ отображения.
MultiSelect=
- Если равно 1, то разрешает множественный выбор строк в ТЧ.
ReadOnly=
- Если равно 1, то запрещает редактирование таблицы.
Командные и визуальные скрипты
В DCL5 существуют несколько видов скриптов, одни создают диалоги и описывают их поведение, другие предназначены для исполнения команд при нажатии на кнопки или при наступлении некоторых событий.
Визуальные скрипты, являются также, диалогами, в них возможно создание визуальных компонент, в них поддерживается ограниченный набор команд, а упор сделан на визуальную часть. Они могут исполнятся только линейно, однонаправлено вперёд. Командные скрипты, напротив, поддерживают ограниченный набор визуальных команд, основным в них является исполнение команд манипуляции данных или логических выражений и могут использовать переходы по условиям и возврат к прежней точке исполнения.
Вызов диалогов
Вызывать диалоги можно только из командных скриптов. Для вызова диалога используется предложение
Dialog=
где, параметром служит имя визуального скрипта.
Директивы :
NoContext=
- Указывает на то, что вызываемый диалог, не будет дочерним для вызывающего и не унаследует его контекст. Логическое (1, 0).
TablePart=
- Передаёт НД из указанной табличной части. Указывается её номер или 0 если текущей. Не обязателен. Игнорируется при вызове диалога из табличной части.
ModalOpen=
- Модальное открытие диалога, исполнение скрипта при этом, приостанавливается. Логическое (1, 0).
Управление диалогами
Открытыми диалогами можно управлять, выводя их на передний план, закрывая, скрывая и т.д. Для этого предусмотренна команда :
DialogByName=
В команде можно управлять только открытыми диалогами. Формат команды предусматривает указания имени диалога и через точку, действия намеренного совершить с ним.
Действия :
Hide
- Скрыть. Show
- Показать. Close
- Закрыть. Refresh
- Обновить все данные на диалоге. Top
- Вынести на передний план.
Выбор значения из диалога
Для работы механизма выбора из диалоги, необходимо описать минимальные параметры в команде ‘Dialog=’. Для выбора значения удобнее всего создать контекстную кнопку поля и назначить на неё команду вызова диалога с необходимыми параметрами.
Директивы :
ChooseMode=
- Тип варианта выбора значения.
Варианты : 1 - “Выбрать и закрыть” 2 - “Выбрать и продолжить”
KeyField=
- Ключевое поле выбираемого НД. Которое возьмётся как ключевое значение.
ValueField=
- Указывает поле, представления данных, из которого возьмётся значение подписи.
KeyEditName=
- Компонент, куда запишется ключевое значение.
ValueEditName=
- Указывается имя компонента поля ввода для занесения в него значения.
KeyVariable=
- Переменная с выбранным ключевым значением.
ValueVariable=
- Переменная со выбранным значением.
KeyModifyField=
- Указывает поле, куда будет заноситься выбранное ключевое значение.
ValueModifyField=
- Указывает поле, куда будет заноситься подпись выбранного значения.
MultiSelect=
- Пежим множественного выбора. Для множественного выбора, должна быть указана директива ‘BatchScript=’. Переменные в ‘KeyVariable=’ и ‘ValueVariable=’ будут каждый раз принимать новые текущие значения. Логическое (1, 0).
InitScript=
- Указывается имя скрипта. Скрипт запускающийся перед ‘BatchScript=’, во время выбора.
BatchScript=
- Скрипт, запускающийся при выборе значения. Если указана директива ‘MultiSelect=’, то скрипт запустится столько раз, сколько выбрано значений. При этом директивы: ‘KeyEditName=’, ‘ValueEditName=’, ‘KeyVariable=’, ‘ValueVariable=’, ‘KeyModifyField=’, ‘ValueModifyField=’ отработают один раз.
FinishScript=
Скрипт запускающийся после перебора всех выбранных элементов.
Вызов командных скриптов
Из любого скрипта можно вызвать командный скрипт, он выполнится и вернётся в вызвавший его скрипт. Команда состоит из одного параметра, имени командного скрипта.
ExecCommand=
Запросы
Запросы в визуальных скриптах, создают НД, который в дальнейшем, может быть отображён с помощью визуальных компонентов.
Query=
Запрос для основной таблицы. Не допускается указания запросов, не возвращающих данных, таких как insert into, delete from, update, create index и т.д..
ExecQuery=
Позволяет выполнить произвольный запрос изменяющий данные.
Пример :
ExecQuery=insert into Parts(Name,PartIndex) Values('Independent Part','647744');
В данном примере производится добавление в таблицу Parts новой записи.
UpdateQuery=
Предложение, включающее в себя директивы определения запросов для удаления, редактирования, вставки, а так же ключей для однозначного определения записи.
Директивы :
ModifySQL=
Запрос использующийся в процессе изменения.
InserSQL=
Запрос использующийся в процессе вставки новой записи.
DeleteSQL=
Запрос использующийся в процессе удаления.
Вместо директив ModifySQL, InserSQL, DeleteSQL можно использовать:
UpdateTable=
Указывается одна таблица, которая будет изменяться.
Директивы :
UpdateFields=
Список полей, через запятую, для изменения.
KeyFields=
Список ключевых полей, через запятую.
Использовать не запросы, а директиву UpdateTable=
, более просто и быстро, а использование запросов, позволяет сделать изменение таблиц более гибким. Без этой директивы, изменяемой будет считаться первая таблица в запросе.
Примечание :
Для сервера Firebird и InterBase запросы строятся автоматически, без использования каких либо параметров, из SQL запроса берётся первая по счёту таблица и из неё берутся поля для построения запросов, если только структура таблиц построена правильно и указаны первичные ключи.
Форматы запросов должны быть следующими :
Modifysql=update ТАБЛИЦА set Поле1=:Поле1, Поле2=:Поле2, ПолеN=:ПолеN where Поле_с_уникальным_значением=OLD_ Поле_с_уникальным_значением;
Insertsql=insert into ТАБЛИЦА(Поле1, Поле2, ПолеN) values (:Поле1, :Поле2, :ПолеN);
Deletesql=delete from ТАБЛИЦА where Поле_с_уникальным_значением=OLD_ Поле_с_уникальным_значением;
Примечание :
Назначение запросов и возможность редактирования, зависит от кнопок навигатора.
Параметры запросов
В DCL5 существуют параметры запросов, они используются для изъятия какого либо значения из основного набора данных. Обращение к ним производится через знак «:» и имя поля просматриваемой таблицы, вместо него интерпретатор DCL5 подставит из нее значение. Параметры не могут быть использованы в запросе основного НД, но могут быть использованы в запросах табличных частей и таблиц в полях.
Примечание :
Параметры являются безтиповыми, при их использовании следите за типами данных с которыми они применяются.
Пример :
SetValue=variableName=:CALL_DATE;
В результате выполнения этой строки, в переменную занесётся значение поля CALL_DATE.
Команды командных скриптов
В командных скриптах исполняются команды манипуляции с данными, а так же визуальными компонентами в ограниченном режиме.
Exit;
- Закрывает приложение.
Break;
- Завершение выполнения текущего скрипта.
SetMainFormCaption=
- Устанавливает заголовок на главной форме.
ApplicationTitle=
- Устанавливает заголовок приложения в панели задач.
CloseDialog;
- Закрывает текущий диалог.
DisableAutoRefresh;
- Отключает автоматическое обновление диалогов после команд ‘ExecQuery=’. При исполнении скриптов по кнопке с директивой ‘ForEach=’, всегда включена.
Исполнение запросов
ExecQuery=
Позволяет выполнить произвольный запрос изменяющий данные.
Команды управления НД
При вызове командного скрипта из визуального, ему передаётся контекст, т.е. команды командного скрипта оперируют визуальными компонентами вызвавшего диалога и вызвавшим его набором данных.
Insert;
- Вставляет пустую запись.
Insert_Part;
- Вставляет пустую запись в табличную часть.
Delete;
- Удаляет текущую запись.
Delete_Part;
- Удаляет текущую запись в табличной части.
DeleteConf;
- Удаляет текущую запись, но с подтверждением.
DeleteConf_Part;
- Удаляет текущую запись в табличной части, но с подтверждением.
Append;
- Добавляет в конец НД новую запись.
Append_Part;
- Добавляет в конец БД новую запись в табличной части.
Edit;
- Переводит БД в состояние редактирование
Edit_Part;
- Переводит БД табличной части в состояние редактирование
Post;
- Сохранение изменений.
Post_Part;
- Сохранение изменений в поле в табличной части.
First;
- Переход на начало НД.
First_Part;
- Переход на начало НД в табличной части.
Prior;
- Переход на предыдущую запись.
Prior_Part;
- Переход на предыдущую запись в табличной части.
Next;
- Переход на следующую запись.
Next_Part;
- Переход на следующую запись в табличной части.
Last;
- Переход в конец НД.
Last_Part;
- Переход в конец НД в табличной части.
Cancel;
- Отменяет все не сохранённые командой Post изменения.
Cancel_Part;
- Отменяет все изменения в табличной части.
Refresh;
- Обновить НД из контекста.
RefreshDialog;
- Основной и каскадно все НД на диалоге.
Refresh_part;
- Обновляет все табличные части на форме.
SetFieldValue=
- Присваивает полю значение, значение должны быть следующего вида, Поле=Значение.
Директивы :
Post=
Может принимать значение 1 или 0. Если 1 то происходит автоматическая фиксация изменений в БД.
TablePartNum=
Устанавливает номер табличной части, счет ведётся с единицы.
Примечание :
Работает всегда с привязкой к диалогу, т.е. если команда вызовится из скрипта, вызванного из ТЧ, то она всё равно будет перировать основным НД.
Соблюдение типов для команды не требуется.
Данная команда будет работать тогда, когда НД является редактируемым или используется предложение UpdateSQL=. Для иных случаев используется предложение ModifyingQuery= с переменными и/или параметрами и/или с полями ввода.
SetValue=
- Присваивает переменной значение. Если же переменной требуется присвоить значение, возвращаемое запросом из таблицы, тогда используются директивы :
Директивы :
SQL=
- Запрос возвращающий требуемое значение.
ReturnField=
- Поле с возвращаемым значением, если не указанно, то используется первое по счету поле.
Примечание :
Допускается использование параметров и переменных.
Внутри этого предложения можно использовать только одну пару Переменная=Значение.
TablePart=
- Если данные требуется брать из табличной части, то в этой директиве указывается номер табличной части или 0 если данные нужно брать из текущей.
Примечание :
Допустимо присвоение значений параметров переменным, но не наоборот.
Параметры и переменные являются безтиповыми, поэтому следите за
соблюдением типов при использовании переменных в SQL выражениях.
При изменении значения переменной меняется соответствующее ей поле ввода и наоборот.
GotoKey=
- Переход на значение в таблице, заданное в предложении и полем заданным в параметре. Указывается список значений через запятую.
Директивы :
KeyField=
Список ключевых полей, через запятую.
Команды хранилища двоичных данных
В платформе есть механизм управления абстрактным хранилищем двоичных данных, в него можно поместить небольшие объекты: файлы, картинки, документы. Их можно сохранять из файлов или в файлы, сжимать в базе. Использовать в отчётах как шаблоны.
GetFromDB=
- Извлекает данные из хранилища в файл. Параметром команды служит либо индекс либо имя данных в хранилище.
Директивы :
FileName=
- имя файла с сохраняемыми данными.
PutToDB=
- Помещает данные в хранилище из файла. Параметром команды служит либо индекс либо имя данных в хранилище.
Директивы :
FileName=
- имя файла с сохраняемыми данными.
Compress=
- Сжимать данные. Логическое (1, 0).
ClearData=
- Очищает данные, при этом запись в хранилище остаётся. Параметром команды служит либо индекс либо имя данных в хранилище.
DeleteData=
- Удаляет данные полностью. Параметром команды служит либо индекс либо имя данных в хранилище.
CompressData=
- Сжимает данные в хранилище на месте. Параметром команды служит либо индекс либо имя данных в хранилище.
DeCompressData=
- Распаковывает данные в хранилище, без извлечения. Параметром команды служит либо индекс либо имя данных в хранилище.
MD5Data=
- Высчитывает MD5 хеш данных из хранилища в переменную.
Директивы :
VariableName=
- Переменная для помещения результата.
У всех этих команд есть ещё одна директива
ByID=
это логическое значение, переключающее тип поиска данных, по имени или индексу.
Диалоги открытия и сохранения файла
OpenFileDialog=
- Вызывает стандартный диалог открытия файла, результат выбора попадает в переменную указанную в параметре.
Директивы :
Ext=
Задаёт расширение по-умолчанию.
SaveFileDialog=
Вызывает стандартный диалог сохранения файла, результат выбора попадает в переменную указанную в параметре.
Директивы :
FileName=
Определяет имя файла, заносимое по умолчанию.
Ext=
Задаёт расширение по-умолчанию.
OpenFolder=
- Открывает указанную папку.
Управление системой хранения настроек
WriteConfig=
Производит запись параметра в ТГП (Таблица глобальных параметров). Сразу после равно указывается имя параметра.
ReadConfig=
Читает настройку из ТГП.
Директивы :
UserID=
- Не обязательный параметр, позволяет читать и записывать параметры привязанные к конкретному пользователю.
Value=
- Значение параметра, допустимо указывать любые символы.
Примечание :
Все команды без параметров оканчиваются знаком «;» точка с запятой.
Запуск внешних приложений
Запуск приложений
Execute=
Запуск приложения указанного в предложении.
Директивы :
WorkDir=
- Рабочая папка.
Wait=
- Ожидание завершения запущенного процесса. Если директива присутствует и имеет значение «1», то после запуска внешнего приложения, происходит ожидание завершения запущенного приложения. Может использоваться для ожидания получения, каких либо данных или совершения, каких либо действий.
Открытие документов
Для открытия документов используется команда.
OpenDocument=
Она открывает файл в зарегистрированном приложении, можно использовать для открытия URL адресов.
Открытие URL ссылок
Для открытия web-ссылок в браузере, используется команда.
OpenURL=
Работа с пакетами
Подробнее о пакетах рассказано в соответствующем разделе, а сейчас будут команды работы с пакетами.
OpenPackage;
- Интерактивная команда загрузки пакета. Произойдёт вызов системного диалога открытия файла, в котором следует выбрать файл с пакетом. Если пакет подписан для этой конфигурации, то произойдёт его загрузка и запуск скрипта помеченного к автозапуску скрипта.
OpenPackage=
- Не интерактивная команда загрузки пакета. Параметром служит путь к самому файлу пакета, если логический параметр Run=
будет иметь значение 1
, то произойдёт его запуск.
LoadPackage;
- Просто интерактивно загружает пакет в систему.
LoadPackage=
- Загружает пакет в систему в командном режиме. Параметр файл пакета.
Команды визуальных компонент
CurrentPage=
- Переключает на страницу в диалоге с заданным номером в параметре.
CurrentTablePart=
- Устанавливает активной табличную вкладку с номером заданным в параметре. Счёт ведётся с 1. При значении равном -1, делает текущей последнюю ТЧ. Команда действует для текущей страницы в визуальном скрипте и для текущей открытой в командном.
Обращение к полям ввода по имени
Для произведения действий над явным полем ввода используется предложение
EditByName=
После имени поля ввода, через точку, указывается действие над ним. В качестве полей ввода могут выступать следующие поля ввода: EditBox, InputBox, OutBox. Для этого при их описании должна быть использована директива ComponentName= явно задающее имя компонента ввода.
Директивы :
EditByName=Имя_Поля_Ввода.Действие;
Действия :
-
Hide – скрыть.
-
Show – показать.
-
SetFocus – передать фокус ввода.
-
Clear – очистить.
-
Enable – Сделать доступным.
-
Disable – Сделать не доступным.
-
Select – Выделить текст.
-
SetText – Установить текст. Текст помещается в директиве _Value=.
Пример :
EditByName=ClientPhoneBox.SetText;_Value=&Phone;
Здесь в поле ввода с именем ClientPhoneBox помещается значение переменной Phone.
Статус панели
Что такое статус-панели, описано в разделе “Интерфейсные компоненты диалогов”.
Status=
- Выводит текст в панель информации.
AddStatus=
- Добавляет статус панель с текстом в параметре.
Директивы :
Width=
- Ширина панели в пикселях. Не обязательный параметр.
DeleteStatus=
- Удаляет статус панель с номером указанным после равно. Счет ведется с 1. Вместо номера можно указать слово Last, означающее последнюю панель.
DeleteAllStatus;
- Удаляет все созданные статус-панели.
SetStatusText=
- Устанавливает текст и ширину статус панели. Сразу после равно указывается текст, а следующие параметры задают номер и ширину панели.
Директивы :
Status=
- Указывает номер панели.
Width=
- Указывает ширину. Не обязательно.
Сообщения и диалог выбора
Message=
Показывает окно с сообщением, работа программы при этом приостанавливается. Допускается использование переменных и параметров.
Директивы :
Flags=
- Указывает тип окна сообщения.
Значения параметра :
-
YesNo – будет появляться диалог выбора да или нет.
-
Input – Стандартное окно ввода.
DefaultValue=
Исходное значение для окна ввода значения.
VariableName=
- Обязательный параметр, указывает переменную для помещения результата выбора. Если было выбрано «Да», тогда в переменную занесётся «1», и «0» если ответ был «Нет». Если же используется флаг Input, тогда в переменную заносится введенное значение.
Оператор условного выполнения
В языке DCL есть оператор условного выполнения, в качестве условия в нём выступает логическое выражение на специальном языке. Результатом обработки логического выражения в конструкции If является Да либо Нет.
В целом логическое выражение должно иметь следующий вид :
If (Значение[<знак>]Значение) then
<Блок действие если "Да",
выражение верно>
Else
<Блок действие если "Нет",
выражение не верно>
EndIf
Пример :
If (&DateOD=&DATE) then
Dialog=InputNewDocs;
Else
Message=Дата ОД не соответствует сегодняшней дате!;
EndIf
Примечание :
Выражение, задающее условие, должно непременно, содержаться только в одной строке.
Логические выражения могут исполнятся, только из командных скриптов, для запуска их из визуальных используйте предложение ExecCommand= содержащее вызов скрипта с логическим выражением.
Логические выражения
Под логическими выражениями в DCL5 понимается выражение возвращающее результат сравнения по какому либо условию. Результатом является либо ДА, либо НЕТ.
В DCL используется специальный синтаксис для логических выражений.
(ЗНАЧЕНИЕ|ПОЛЕ) [‘=’|‘<>’|‘>=’|‘<=’|‘<’|‘>’] [‘!’] [‘(’|‘[’]ЗНАЧЕНИЕ[‘)’|’]’] [‘&’|‘|’]
В них возможно проверка на (не)включение во множество, (не)вхождение в диапазон, просто проверка значений на равно, не равно, больше, меньше и т.д.
Проверка включения во множество
Осуществляется указанием значений в круглых скобках, значения разделяются между собой запятыми, строковые значения могут быть заключены в одинарные кавычки. Для проверки на не вхождения во множество, перед открывающей скобкой ставиться восклицательный знак.
Проверка диапазона
Для проверки вхождения в диапазон используется два значения заключённые в квадратные скобки, если нужно поставить условие НЕ, то перед открывающей скобкой ставиться восклицательный знак.
Другие операции сравнения
Другие операции сравнения осуществляются с помощью знаков ‘=’, ‘<>’, ‘>=’, ‘<=’, ‘<’, ‘>’.
Специальные значения
Пробелы в выражении игнорируются, если нужно сравнить два значения с пробелами, значения должны быть целиком ограничены одинарными кавычками.
Пример :
'&Value'='Не входит'
Циклы
Циклы используются для исполнения какого либо блока кода до тех пор пока будет выполняться определённое условие, заданное в выражении цикла.
Цикл с предусловием
Цикл с предусловием сначала проверяйт условие а потом входит в блок иттерации, если условие ложно то исполнение переходит за блок иттерации.
Для построения цикла с предусловием используется следующая конструкция:
while (Логическое выражение) do
Блок иттерации
EndWhile
Цикл с пост условием
Цикл с пост условием, проверяет условие выполнение каждый раз после исполнения блока иттерации и если оно оказывается ложно, продолжает исполнение дальше.
Для построения цикла с постусловием используется следующая конструкция:
Do
Блок иттерации
While (Логическое выражение);
Функции
Для конвертации значений в DCL5, используются функции. Вызов функций осуществляется через префикс «!!», за ним сразу идёт название функции и в скобках значение. Допускаются вложение функций. После обработки функции остаётся преобразованное значение.
Пример :
Message=!!YearOf(&_DATE_)
покажет год.
Файловые функции
DeleteNonFilesSimb(аргумент)
- удаляет из переданного значения все символы не используемые в именах файлов.
GetFileNameToTranslite(ИмяФайла\С\Путём.txt)
- Преобразовывает имя файла русскими буквами в транслит, путь к файлу остаётся нетронутым.
GetTempFileName(расширение)
- Возвращает имя временного файла.
MD5File(ИмяФайла)
- Возвращает MD5 хэш файла.
Функции преобразования даты
DaysInMonth(Номер_месяца, Год)
- Возвращает количество дней в указанном месяце.
MonthByDate(Дата)
- Возвращает название месяца в составе даты.
DaysInMonth(Номер_месяца, год)
- Возвращает количество дней в месяце.
GetMonthName(Номер_месяца)
- Возвращает название месяца.
YearOf(дата)
- Извлечь год из даты.
MonthOf(дата)
- Извлечь месяц из даты.
DayOf(дата)
- Извлечь день из даты.
Функции форматирования
ToFloat(Число)
– Преобразует целое число к формату с двумя знаками после запятой.
Пример :
ToFloat(42,4)
– до преобразования.
42.40 после.
ToFloat(42)
– до преобразования.
42.00 после.
MoneyToString(Число)
- Выводит сумму прописью, копейки выводятся цифрами, денежная единица рубли.
LeadingZero(Число, Длина)
- Возвращает Число дополненное до требуемой Длинны, нулями вначале.
Функции работы с данными
IndexOf(образей_поиска, Строка_значений_разделённых_запятыми)
- Возвращает элемент во множестве значений, счёт ведётся с 1, разделённых запятыми. Допустимо указание нескольких множеств из переменных так и совместно, непосредственно прописывая их как параметры.
ByIndex(Образец для поиска, Множество или переменная содержащая множество)
- Возвращает индекс элемента во множестве, счёт с 1. Допустимо указание нескольких множеств из переменных так и совместно, непосредственно прописывая их как параметры. Множества переданные из переменных или иным способом, должны быть разделены запятыми.
Примечание :
В функциях IndexOf и ByIndex может быть произвольное количество параметров, разделённых запятыми.
NVL(ИМЯ_ПОЛЯ, Значение подстановки)
- Производит подстановку значения во втором параметре, если значение поля в первом параметре оказалось NULL. Имя поля должно быть указано с предшествующим знаком $.
IIF(Условие, Значение если условие истинно, Значение если условие не соблюдено)
- Производит подстановку значений в зависимости от условия.
Строковые функции
MD5String(Произвольная строка)
- Возвращает MD5 хэш строки.
Upper(строка)
- преобразует строку к верхнему регистру.
Lower(СТРОКА)
- преобразует строку к нижнему регистру.
Функции работы с настройками
В DCL5 есть возможность хранить настройки в таблице глобальных параметров], для удобства обращения с ней, существуют функции чтения и записи этих параметров. Параметры представляют собой пары из имени и значения настройки, всегда строкового.
ReadConfig(Имя_параметра[, ID_ПОЛЬЗОВАТЕЛЯ])
- производит чтение значения из ТГП и подстановку его вместо функции.
WriteConfig(Имя_параметра, Значение_параметра[, ID_пользователя])
- производит запись параметра, функция из текста вырезается.
Параметр ID_ПОЛЬЗОВАТЕЛЯ, является не обязательным, если он опущен, то происходит чтение или запись параметра без учёта этого признака.
Функции преобразования
GetAccessLevelByName(НАЗВАНИЕ_УРОВНЯ_ПРАВ)
- Преобразует псевдоним уровня доступа к числовому значению, пригодному для употребления в выражениях оперирующими с правами доступа.
Примечание :
Сначала произойдет трансляция переменных, а потом
трансляция функций.
Поддерживаются вложение функций.
Математические операции и функции
В DCL5 имеется поддержка вычисления математических выражений, в том числе и со скобками и встроенными базовыми математическими функциями. Для этого без всяких операторов указывается выражение которое присваивается переменной.
Например:
Amount=(&price/&count)*.68+&commission
где ‘Amount’ объявленная переменная, значения с & переменные, содержащие соответствующие значения.
Так же таким образом можно присвоить переменной любое значение, и строковое тоже.
Поддерживаемые математические функции
SQRT
- Извлечение квадратного корня.
ABS
- Абсолютное значение.
TRUNC
- Отбрасывание дробной части.
ROUND
- Математическое округление.
LOG
- Вычисление логарифма.
EXP
- Вычисление экспоненты.
Команды инициализации
Непосредственно после запуска приложения, иногда требуется выполнить какие либо команды. Для этого используются идентификаторы от 40001 по 40100 включительно. Команды должны быть только командными скриптами.
Примечание :
Недопустимо использовать в этих скриптах команды, оперирующие с визуальными компонентами или использовать НД визуальных форм. Например, команды GlobQuery, ExecQuery.
Команды момента завершения
Иногда, требуется выполнить какую либо команду непосредственно перед закрытием приложения, для этого служат скрипты с идентификаторами от 40101 до 40200. все описанное в теме Команды инициализации относится так же и к текущей теме.
Оповещения
Уведомления могут использоваться для оповещения пользователя или все пользователей одновременно и(или) для завершения их работы.
Для назначения оповещений служит системная таблица оповещений, содержащая сами оповещения и их атрибуты.
Атрибуты оповещений :
-
Время наступления оповещения;
-
Действие;
-
Статус;
-
Идентификатор пользователя в таблице ролей;
-
Текст оповещения/Запускаемая программа;
Значением поля «Действие» задаёт действие системы при оповещениях.
Коды действий :
0 – Оповещение исполнено.
1 – Запуск скрипта.
2 – Просто оповещение. Показ его в форме оповещений.
3 – Запуск приложения с ожиданием завершения.
4 – Запуск приложения без ожидания.
5 – Завершение работы через 30 сек. С выдачей сообщения.
Статусом оповещения является признак, того, доставлено или ещё не доставлено оповещение, потому что его время ещё не наступило или пользователь не вошёл в систему. При создании оповещения числовой код его статуса должен быть не равен 0.
Выполняются оповещения в порядке, приведённом в списке, сначала выполнятся оповещения с наименьшим номером.
Текстовые отчёты
DCL5 позволяет создавать текстовые печатные формы. Для описания отчета используются специальные структуры, размечающие область запроса, повторяющегося печатного образа, заголовка и т.д. Для отчетов зарезервированы идентификаторы от 30000 до 40000.
Секции
[INIT REP]
[END INIT]
Секция содержит начальные действия во время запуска отчета, здесь возможно объявить переменную, и вызвать диалог для ввода ее значения. В секции разрешены следующие команды:
Команды :
DeclareVariable=
Объявляет переменную с именем указанным после равно. Допускается указывать только одну переменную в одном предложении.
GrabValue=
Позволяет вводить произвольные значения переменной, указанной после знака равно.
Параметры :
Long=
Определяет максимальную длину вводимого текста.
DefaultValue=
Исходное значение. Возможно указывать переменные.
GrabDate=
Позволяет выбрать дату с помощью календаря.
GrabValueFromBase=
Вызывает форму для выбора значения переменной из базы.
Параметры :
SQL=
Содержит запрос для построения НД и использования его для выбора
значений. Для отображения значений берется первое по счету поле, а для подстановки следующее, если поле одно, то оно используется дважды.
GrabValueList=
Позволяет выбрать значение из заранее определенного списка.
Параметры :
ListValues=
Через запятую перечисляются значения списка. Для всех команд существует директива Label=, определяющая текст надписи, если она отсутствует, тогда будет выводится имя переменной.
[GLOBALQUERY]
Текст запроса
[END GLOBALQUERY]
Создает НД, из которого будут браться данные для построения отчета. Является необязательной секцией и в случае ее отсутствия в качестве НД берется основной.
Допустимо использование переменных.
[PARAMS]
:ИМЯ_ПАРАМЕТРА
SQL=Текст запроса
:ИМЯ_ПАРАМЕТРА
SQL=Текст запроса;{ReturnField=Поле с результатом}
:ИМЯ_ПАРАМЕТРА
ReturnValue=Возвращаемая строка.
[END PARAMS]
Секция параметров, если в отчете встречается параметр, то он заменятся на соответствующее значение. Возможно создание изменяемых параметров, для этого отчету присваивается идентификатор в диапазоне от 30000 до 40000, а параметры создается непосредственно в таблице скриптов с указанием в поле принадлежности к родителю, идентификатора отчета. А секция параметров в этом случае может отсутствовать или содержать не изменяемые параметры.
С помощью параметров с предложением SQL= можно выводить таблицы целиком, будут выведены все поля и записи созданного НД.
[HEADLINE]
Текст
* заголовка*
[END HEADLINE]
Секция помещается в качестве заголовка.
[BODY]
Тело отчета
[END BODY]
Эта секция в зависимости от режима печати (см. ниже) может повторятся n количество раз или быть основным массивом данных отчета, только здесь возможна подстановка данных из НД.
[FUTER]
Содержит текст который добавится в конец отчета.
[END FUTER]
[CLOSE REP]
Содержит только команды уничтожения переменных.
[END CLOSE]
Команды :
DisposeVariable=
Уничтожает одну переменную.
Режимы печати
Существуют пять режимов печати отчетов, режим задается параметром ViewMode:
0 – Производится печать отчета используя данные единственной записи, при этом секция BODY повторится один раз.
1 – Печатаются все записи НД, секция BODY повторится n раз, где n – число записей.
2 – Будут печататься только те записи отчета которые помечены в таблице, для этого в скрипте диалога должна стоять директива MultiSelect=1.
3 – Будут печататься все записи НД и помещаться в разные файлы.
4 – Будут печататься только те записи отчета, которые, помечены в таблице и помещаться в разные файлы.
Порядок описания структуры отчета
Для правильной интерпретации отчета необходимо описать его в соответствии с некоторыми соглашениями.
Для извлечения данных из НД, следует описать их в виде директив вида:
:ИМЯ_ПОЛЯ[(длинна символов[выравнивание])]
Имя поля должно непременно иметь перед собой знак «:» двоеточие.
Где, выравнивание обозначается символами (L-(по умолчанию) выравнивание относительно левого края, M-посередине, R-по правому краю, I –вставка (производится вырезание строки с параметром на длину заполняемого значения)). Число в скобках, определяет длину дополнения пробелами до заданной ширины или обрезаемое в случае превышения длинны строки свыше указанного диапазона. Объявленная директива будет заменена на значение из соответствующего поля с именем директивы из набора данных, сформированного с помощью секции [GLOBALQUERY].
Например :
:ACCOUNTNAME(30L)
Команды для вызова отчета
Report=
Служит для печати отчета.
Параметры :
ReportName=
Определяет имя отчета для извлечения его из БД скриптов. Допускается
использовать переменные.
FromFile=
Если директива не пуста и присутствует то значение ReportName= игнорируется и
отчет берется из файла указанного в директиве.
QueryMode=
Определяет, будет ли запрос из секции [GLOBALQUERY] отображаться или нет. По умолчанию нет. Если да, то принимает значение BkMode. Если же требуется выполнение только запроса из секции [GLOBALQUERY] то ставится значение Isolate. Для использования запроса НД в отчёте он должен принять значение Main, равнозначно отсутствию директивы;
ViewMode=
Режим печати отчета (см. выше).
FileName=
Имя файла отчета. Допускается использовать переменные. Из значения в директиве удаляются следующие символы : /, ", *, &, >, <.
Пример :
SetValue=EP;ReturnQuery=select gb.param_value from params gb where gb.param_name='PathToReports';
Report=ReportName=ReportToClient2;QueryMode=Isolate;ViewMode=1;FileName=&EP/CallsStat_&CliName.txt;NoPrint=&PrintStat;
В примере после переменной содержащей путь к папке, стоит один из удаляемых символов, он нужен для разделения имён переменных, а за ним имя файла.
NoPrint=
Если равно 1, то происходит просто сохранение в файл, без вывода на просмотр. Допустимо подставлять значение из переменных.
Viewer=
Позволяет указать другую программу просмотра.
Примечание :
Имя отчета должно быть уникально.
Создание отчётов в офисных пакетах Microsoft Office или Open Office
Платформа DCL5 поддерживает создание отчётов в обеих офисных пакетах, притом разработчику не нужно знать заранее, какой офисный пакет будет установлен на рабочем месте пользователя, создание отчёта будет производиться в имеющимся офисном пакете. Хотя можно указать явно в каком офисном пакете созвать отчёт.
При использовании офисного пакета Open Office, формат шаблонов и сохраняемых документов может быть разный и указывается в глобальных настройках или в ini файле.
Все команды формирования отчётов запускаются из командных скриптов.
Табличный отчёт в Excel и OpenOffice.Calc
Для табличного отчёта в Excel и OpenOffice.Calc используется, предложение :
ReportOfficeSheet=
Если на ПК, где формируется отчёт, не установлен пакет Microsoft Office, то отчёт будет формироваться в OpenOffice.Org, если не указан явный тип офисного пакета.
Директивы :
OfficeType=
- Тип офисного пакета, указывается латинскими буквами: oo – OpenOffice, mso – Microsoft office.
FillStrategy=
- Стратегия заполнения таблицы документа, только OfficeType=mso`. Может быть выбрана стратегия замещения ячеек - Replace, либо вставки (по умолчанию).
Template=
- Путь к файлу шаблону, им может быть и обычная книга. В случае использования имени шаблона, он указывается через директиву :
Директивы :
TemplateName=
- Имя шаблона в таблице шаблонов. Используется совместно с Template=
.
FileName=
- Имя выходного файла.
Save=
- Сразу сохранять документ после формирования. Логическое (1, 0).
Close=
- Сразу закрывать документ после формирования, может быть использован совместно с параметром Save. Логическое (1, 0).
Примечание :
При установки значений
Save=
иClose=
во включено, окно офисной программы показываться не будет, формирование документов будет производиться в фоновом режиме.
SQL=
- Запрос, определяющий положение столбцов и создающий собственно НД который помещается в книгу. Если параметр будет не указан то, будет использоваться запрос из просматриваемого НД.
FieldsSet=
- Если отсутствует директива SQL=
, то в запрос, взятый из основного НД, будут подставлены поля из этой директивы.
ToPDF=, ToHTML=
- Если в качестве значения параметра стоит «1», то производится экспорт в соответствующие форматы. Логическое (1, 0).
AlternationRowBackColor=
- Используется для указания цвета фона чередования строк, цвет указывается в шестнадцатеричном формате вида ККЗЗСС.
AlternationColBackColor=
- Используется для указания цвета фона чередования колонок, цвет указывается в шестнадцатеричном формате вида ККЗЗСС.
Файл шаблона должен содержать ячейку с именем DATA, в неё будет выеден левый верхний угол НД.
Построение отчётов в MS Word и OpenOffice.Writer
В качестве платформы построения отчётов в DCL5 возможно использовать текстовые редакторы MS Word и OpenOffice.Writer. В качестве шаблонов используются документы в формате MS Word с расширением .docx и OpenOffice.Writer с расширением .odt, формат можно указать в настройках модуля. В местах, где предполагается вывод значений, следует расставить закладки с именами, в точности повторяющие имя поля в НД, создаваемом через директиву SQL=.
ReportOfficeText=
Директивы :
OfficeType=
- Тип офисного пакета, указывается латинскими буквами: oo – OpenOffice, mso – Microsoft office.
Template=
- Путь к файлу шаблону. В случае использования имени шаблона, он указывается через директиву :
TemplateName=
Имя шаблона в таблице шаблонов. Используется совместно с Template=
.
Save=
- Сразу сохранять документ после формирования. Логическое (1, 0).
Close=
- Сразу закрывать документ после формирования, может быть использован совместно с параметром Save. Логическое (1, 0).
OneDoc=
- Не добавлять номер документа к имен сохраняемого файла. Логическое (1, 0).
SQL=
- Запрос, определяющий положение столбцов и создающий собственно НД который помещается в соответствующие метки документа. Если параметр будет не указан то, будет использоваться запрос из просматриваемого НД.
Layot=
- Принудительное указание стиля шрифта при заполнении метки. Формат задаётся в следующем виде:
ИмяМетки/СтильШрифта/Размер/Прописью
Секции должны обязательно разделяться знаком “/”.
ИмяМетки – задаётся имя замещаемой метки.
СтильШрифта – Указываются стили начертания шрифта по следующие правилам:
B -- **жирный**;
I -- *курсивный*;
U -- *подчёркнутый*;
S -- зачёркнутый;
C -- по центру;
Стили можно компоновать, указывая их вместе, например так: BI.
Размер – указывается размер шрифта.
Прописью – Если число следует написать прописью то ставиться буква W.
Пример :
Layot=SumPay/BI/14/W;
Выведет в метку SumPay текст суммы прописью, жирным, курсивным шрифтом, размером 14.
ToPDF=, ToHTML=
- Если в качестве значения параметра стоит «1», то производится экспорт в соответствующие форматы. Логическое (1, 0).
Роли и права доступа
Для разделения функций приложения между пользователями в DCL5 введены роли. Роли – это средство разграничения доступа и упорядочивания элементов меню между пользователями. Для введения ролей в приложение нужно создать соответствующие таблицы. Описание структуры таблиц в разделе [Структуры таблиц].
Для использования расширенного режима назначения ролей, когда несколько ролей могут быть назначены одному пользователю. Это позволяет, например, определить несколько базовых интерфейсов и совмещать их для получения нужного результата.
Пример :
Например, имеется интерфейс «Базовый» и интерфейс «Операции», совместив их в одном пользователе, получится полноценный интерфейс рабочего места Оператора.
Для указания пользователя, используется параметр DCLUserName=, указанное в файле DCL.ini, в разделе [Настройка модуля].
Право доступа определено для каждого пользователя числом от 0 до 8 (см. таблицу).
Права с Уровень 1 по Уровень 4, являются дополнительными для права 3 и не дают пользователю никакого преимущества над Полными правами. Они предназначены для расширения диапазона прав пользователей с полными правами, посредством логики языка DCL5. Право Разработчик, так же не даёт дополнительных возможностей, за исключением того, что позволяет запускать Средство записи скриптов, и создавать пакеты скриптов и подписывать их.
Таблица с описанием прав:
Число | Символьное | Название | Описание |
---|---|---|---|
0 | ulUndefined | Не определено | Права не установлены, берётся право ulExecute. |
1 | ulDeny | Запрет входа | При этом праве, при попытке входа, пользователю выдаётся сообщение, «Вам запрещён вход в систему». |
2 | ulReadOnly | Только чтение | Позволяет только просматривать данные и запускать отчёты. Запуск приложений из системы запрещён. |
3 | ulWrite | Правка | Позволяет только редактировать таблицы, редактировать которые разрешено стандартными средствами. Выполнение SQL-запросов, под любым предлогом запрещено. |
4 | ulExecute | Полные права | Можно всё. |
5 | ulLevel1 | Уровень 1 | То же что и право ulExecute. |
6 | ulLevel2 | Уровень 2 | То же что и право ulExecute. |
7 | ulLevel3 | Уровень 3 | То же что и право ulExecute. |
8 | ulLevel4 | Уровень 4 | То же что и право ulExecute. |
9 | ulSigner | Оператор пакетов | Право позволяет создавать и подписывать пакеты запуская утилиту для разработки, но не даёт возможности изменять конфигурацию. |
10 | ulDeveloper | Разработчик | Позволяет запускать конфигуратор и подписывать пакеты. |
Системная переменная встроенного языка _FULLRAIGHTS_, возвращает полный уровень пользователя в соответствии с правами роли, чем выше право роли, тем выше право пользователя с тем же уровнем прав, что у пользователя с правами роли пониже. Права роли, хранятся в соответствующем поле таблицы ролей. Уровень прав роли можно задать только в таблице ролей.
Примечание :
При запуске с зажатой клавишей Shift, происходит показ окна авторизации, даже если имя пользователя и пароль предопределены в файле DCL.ini.
Что можно и нельзя разделить с помощью ролей?
С помощью ролей явно можно разделить следующие вещи:
-
Элементы меню.
-
Элементы интерфейса основного окна приложения.
-
Параметры отчетов.
-
Команды инициализации и завершения.
-
Права на редактирование данных.
Не явно можно разделить. С помощью директив и команд.
-
Диалоги (только ограничение).
-
Кнопки в диалоге.
Разные ограничения можно организовать условным оператором.
Ограничение операций набора данных
Для ограничения некоторых операций с набором данных, без понижения прав пользователя, используется предложение :
AddNotAllowOperation=
Параметры :
delete - запрещает удаление.
insert - вставку новой записи.
edit - редактирование.
в которое подставляются значения запрещающих действий, например:
AddNotAllowOperation=delete,insert;
Произведут запрещение операций удаления и вставки.
Ограничение доступа к диалогам
Для ограничения доступа к диалогу на уровне прав доступа пользователя, используется следующая директива:
UserAccessRaight=
Она указывается в визуальном скрипте, в ней указывается уровень прав пользователя на открытие этого диалога. Открывать диалог смогут пользователи, у которых право равно или больше указанного значения. Значение можно указывать как символьное, так и числовое из Таблицы Значений Прав.
Установка прав у диалога
Для установки нужного права у диалога, не только понижения, но и повышения, используется команда:
SetAccessLevel=
Она устанавливает нужное право у диалога в котором она объявлена, и на все цепочки вызовов из него.
Пакеты скриптов
Пакетами в DCL называются файлы содержащие в себе несколько, или даже один, скриптов запакованные и подписанные. Такие пакеты можно создавать и управлять ими в “Средстве записи скриптов”. Правом создания таких файлов обладает пользователь с правами Оператор пакетов или Разработчик. Пакеты имеют расширение .dsp. При смене пароля пользователя, подписавшего пакет, выполнение его станет невозможным, тогда пакет нужно будет переподписать с помощью инструмента разработки. Пакет загружается в систему локально, и в дальнейшем образует дополнительное расширение (подсистему), его скрипты можно вызывать из других скриптов, как если бы они были в конфигурации. При пересечении имён скриптов со скриптами конфигурации, главнее считаются скрипты из пакета. Это позволяет модифицировать существующие конфигурации. С помощью пакетов, так же доступно, создание меню. Пересечение номеров идентификаторов в меню, так же вызовет замену элементом из пакета.
Запустить или загрузить пакет можно с помощью команд платформы, которые написаны в командном скрипте или из командной строки при запуске.
Список загруженных пакетов виден в окне “О программе.”.
Запуск пакета при старте платформы
Что бы запустить пакет при старте платформы нужно указать в параметрах запуска приложения параметр RunPackage=
со значением файла пакета. Просто загрузить пакет в систему используется команда LoadPackage=
. Загруженные и запущенные скрипты остаются в платформе пока не будет закрыта программа.
Информация о конфигурации
В таблице скриптов в элементе с кодом 60000 хранится текстовая информация о конфигурации, она заноситься в поле текста скрипта. В элементе с кодом идентификатора равным 60001 в поле имени скрипта, храниться версия или иное представление о версии конфигурации.
Структура таблиц
Для работы платформы, необходимо, что бы структура таблиц скриптов и ролей соответствовала определенным требованиям:
-
у таблиц очень рекомендуется делать поле уникального идентификатора.
-
поле числового типа, должно помещать отрицательные числовые значения.
-
строковое поле должно вмещать до 50 символов, в некоторых случаях до 1000.
-
поле с текстом скрипта, всегда должно иметь текстовый или тип Memo или любой другой тип вмещающий текст с символами переноса строк.
Таблица скриптов
Имя : DCL_SCRIPTS
Название поля | Тип | Размерность | Назначение |
---|---|---|---|
ID_SCR | Число, Уникальное | может быть использовано для ролей | |
SCR_NAME | Строка, Уникальное | 50 | поле имени скрипта |
SCR_TEXT | Текст | поле с текстом скрипта | |
COMMAND | Строка | 50 | поле, содержащее команды |
IDENT | Число | идентификатор элемента меню | |
PARENT | Число | идент. род. объекта | |
UPDATES | ДатаВремя | последнее обновление записи |
Таблица пользователей
Имя : DCL_USERS
Название поля | Тип | Размерность | Назначение |
---|---|---|---|
UID | Число, Уникальное | уникальный идентификатор | |
DCL_USER_NAME | Строка, Уникальное | 30 | имя пользователя |
DCL_LONG_USER_NAME | Строка | 50 | полное имя пользователя |
DCL_USER_PASS | Строка | 35 | пароль |
SHOW_IN_LIST | Число | показывать в списке (если значение поля «1» то показывать) | |
ACCESS_LEVEL | Число | Значения: От 0 до 8. (см. таблицу уровней прав доступа) | Определяет права пользователя. |
LAST_UPDATE | ДатаВремя | Момент последнего обновления данных |
Таблица ролей
Имя : DCL_ROLES
Название поля | Тип | Размерность | Назначение |
---|---|---|---|
ID_ROLE | Число, Уникальное | уникальный идентификатор роли | |
ROLE_NAME | Строка, Уникальное | 30 | имя роли |
LONG_ROLE_NAME | Строка | 50 | полное имя роли |
LAST_UPDATE | ДатаВремя | Момент последнего обновления данных |
Таблица меню ролей
Имя : DCL_ROLESMENU
Название поля | Тип | Размерность | Назначение |
---|---|---|---|
RM_ID | Чмсло | уникальный идентификатор | |
ROLEID | Число | поле для связи с таблицей ролей | |
MENUITEM_ID | Число | поле, содержащее идентификатор из таблицы скриптов |
Таблица связи пользователей с ролями
Имя : DCL_ROLES_TO_USERS
Название поля | Тип | Размерность | Назначение |
---|---|---|---|
RU_ID | Число | уникальный идентификатор | |
RU_ROLEID | Число | идентификатор роли | |
RU_USERID | Число | идентификатор пользователя |
Таблица хранилища шаблонов/двоичных данных
Имя по умолчанию : DCL_TEMPLATES
Название поля | Тип | Размерность | Назначение |
---|---|---|---|
TEID | Число | уникальный идентификатор | |
TEMPL_NAME | Строка | 50 | имя шаблона |
TEMPL_DATA | Двоичные данные | двоичные данные шаблона | |
LAST_UPDATE | Дата и время | Дата последнего обновления |
Таблица глобальных параметров
Имя : DCL_GLOBAL_PARAMS
Название поля | Тип | Размерность | Назначение |
---|---|---|---|
PARAM_ID | Число | уникальный идентификатор параметра | |
PARAM_NAME | Строка | 50 | имя параметра |
PARAM_VALUE | Строка | 150 | значение параметра |
PARAM_USERID | Число | идентификатор пользователя (не обязателен) | |
PROGRAMM_PARAM | Число | вспомогательное поле, содержит 1 если параметр относится к пользовательской части конфигурации | |
LAST_UPDATE | ДатаВремя | Момент последнего обновления данных |
Таблица оповещений
Имя : DCL_NOTIFYCATIONS
Название поля | Тип | Размерность | Назначение |
---|---|---|---|
NOTIFY_ID | Число | уникальный идентификатор | |
NOTIFY_TIME | Дата/Время | время наступления оповещения | |
NOTIFY_ACTION | Число | действие | |
NOTIFY_STATE | Число | статус | |
USER_ID | Число | идентификатор пользователя в таблице пользователей | |
NOTIFY_TEXT | Строка | 255 | текст оповещения |
Рекомендации по написанию скрипов
Сначала, как правило, описываются все запросы.
Остальные визуальные компоненты.
Обязательно, что бы все таблицы имели поле с уникальным значением в каждой записи, это нужно для однозначного определения записи с помощью SQL запроса.
Все команды должны быть написаны без отступа и не должны переносится на новую строку. Знаком комментария являются две косые черты подряд //.
Во избежание ошибок все директивы предложений завершайте символом «;» точка с запятой. Так же этим символом оканчиваются команды без параметров, такие как Insert;, Next;, Last; и т.д.
Именуйте скрипты начиная с названия подсистемы, потом названия диалога или действия, затем типа скрипта (диалог, командный скрипт). Такое соглашение по именованию позволит в дальнейшем, легко находить нужные скрипты.
Параметры командной строки
С помощью параметров командной строки можно запускать платформу с желаемыми параметрами.
Параметры :
-ini ИмяФайла.ini
Альтернативный файл конфигурации.
-user ИмяПользователя
Перекрывает имя пользователя в ini файле, но не в таблице параметров.
-password Пароль
Перекрывает пароль в ini файле.
Параметры для автоматизации из командной строки
Так же из командной строки можно объявлять переменные, запускать визуальные и командные скрипты.
Dialog= - Открыть диалог и именем в параметре.
Script= - Открыть командный скрипт с именем в параметре.
RunPackage= - Загрузить и запустить пакет (файл с расширением .dsp).
LoadPackage= - Загрузить пакет (файл с расширением .dsp), можно указать несколько файлов через запятую, прямо в параметре, без пробелов.
Variables= - Объявить переменные и со значением в виде пар Переменная=Значение разделённых запятыми.
MainMenu= - Отключает главное меню. Логический (1, 0).
Терминологический словарь
Предложение – ключевое слово и следующий за ним набор из нескольких директив. Предложением может так же являться и одна единственная директива, стоящая на одной строке.
Директива – какое либо ключевое слово в предложении, с присвоенным значением. Присвоение осуществляется через знак «=» равно.
БД – база данных.
ТГП – таблица глобальных параметров, подробно описана в разделе Структура таблиц.
НД – набор данных. Результат выполнения запроса возвращающего данные. Не стоит понимать под этим термином, таблицу.
Платформа – Исполняемый модуль (программа), исполняющий скрипты на языке DCL5.
Диалог – форма (окно) на котором располагаются визуальные элементы отображения данных.
Отчёт – скрипт, содержащий шаблон для текстового вывода и команды его построения.
Скрипт – текст сценария для выполнения каких либо действий или для построения диалога.
Контекст – область действия запроса и визуальных компонентов, которыми можно оперировать с помощью команд. Или, область действия команд оперирующих запросом или компонентами на диалоге и им самим.
Набор параметров – набор значений, какой либо директивы, разделенных запятыми.
Параметр запроса – имя поля таблицы, перед которым стоит символ «:», при выполнении запроса, параметр заменяется на соответствующее значение этого поля.
Переменная – заранее объявленное с помощью предложения Declare= слово с префиксом «&» подставляемое в выражение или запрос.
Секция – блок текста скрипта, начинающийся от конструкции следующего вида [Служебное слово]. В DCL5 не существует явного конца секции, поэтому она может продолжаться до следующего такого же объявления, например как секция [Page], или ее конец определяется предназначением секции, секция [Fields] .
Настройка модуля в файле DCL.ini
Для обеспечения работы модуля, ему необходимо передать некоторые параметры, такие как: параметры подключения к БД, пользователь в системе, параметры интерфейса и т.д. Для этого имеется файл DCL.ini в нем указываются все эти параметры. Если же требуется указать другой файл конфигурации, не тот, что находится в каталоге программы и имеет имя DCL.ini, а другой, то его имя передается через командную строку первым параметром или через параметр -ini. Файл должен иметь следующее содержание:
Параметры соединения
UserName= - Используется для передачи имени пользователя для подключения к БД.
Password= - Пароль от БД.
ServerName= - Используется для сервера IntrBase/FireBird.
DSN= - DSN (Data Source Name) имя источника данных в ODBC соединения.
DBPath= - Определяет путь к локальным таблицам. Если используется этот параметр, то значение UserName= не должно быть пустым.
DBTypeIB= - Принимает значение «1» - Да. Указывает на то, что подключение происходит к серверу InterBase, FireBird, Yaffi и их клонам.
CodePage= - В параметре задаётся кодовая страница для подключения к БД, если параметр не задан, то берётся текущая кодировка системы.
StringTypeChar= - Определяет символ, использующейся в качестве символа ограничивающего значения полей строк и дат. Может принимать значения: " или ’. Если ни чего не указанно, то по умолчанию будет (").
SQLDialect= - Определяет SQL диалект базы данных. Используется с сервером Firebird.
LibPath= - Путь к библиотеке соединения сервером БД. Параметр читается если используется версия приложения с механизмом доступа ZEOS.
LibPath_x64= - Путь к библиотеке соединения сервером БД. Параметр читается только если используется 64х битная версия приложения.
Параметры для среды разработки
DisableLoad= - Логический (1, 0). Запрещает загрузку скриптов в базу, а значит изменение рабочей конфигурации.
DisableUnload= - Логический (1, 0). Запрещает выгрузку конфигурации в файлы.
ScriptDir= - Папка со скриптами конфигурации, может быть указан полный путь.
Настройка модуля
DCLUserName= - Имя пользователя в системе для входа.
DCLUserPass= - Пароль для пользователя из системы (не обязателен), если не указан то будет запрашиваться.
HashPassword=
Позволяет хранить хешированные пароли в MD5. По умолчанию отключена.
DialogsSettings= - Если равно 1 (по умолчанию), то происходит автоматическое сохранение положение окон и полей.
DisableColors= - Запрещает применение цветов, предложения Color=.
MainFormCaption=
Текст, добавляемый к заголовку основной формы.
ConfirmExit=
Подтверждение выхода из приложения.
MenuType=
тип главного меню. Селектор: (0 - классическое; 1 - Панели, на рабочем столе).
UserLocalProfile= - Путь к папке локального профиля пользователя для хранения файлов программы, если значение не задано, то используется следующий путь: %AppData%\DCL5\ для Windows и ~/.config/DCL5/ для Linux. При задании пути, символ разделителя папок, должен быть в конце. В качестве значений можно использовать системные переменные, например _APPPATH_, которая вернёт путь к папке с программой, однако такой путь не рекомендуется и применим только для совместимости со старыми версиями или для приложений не могущими работать с национальными символами в пути.
UseMessages= - Использовать сообщения пользователям. По умолчанию включено.
OneCopy= - При значении равном 1, не позволяет запустить вторую копию приложения с одним и тем же методом доступа к данным, при значении 2 - не возможно запустить две копии с одной и той же базой.
Viewer= - Указывает программу просмотра.
OfficeType= - Тип офисного пакета по умолчанию. Принимает значения: «MSO»-Microsoft Office, «OO»-Open Office.
OfficeDocumentFormat= - Формат шаблонов и сохраняемых документов офисных пакетов, может принимать значения «MSO»-Microsoft Office, «OO»-Open Office. По умолчанию равно MSO.
Цветовое оформление
MainColor= - Цвет шлавного окна приложения и цвет диалогов.
TablePartColor= - Цвет окружения табличных частей.
GridColor= - Цвет таблицы.
GridAlternateColor= - Цвет чередования строк таблиц.
DisableColorScheme= - Отключение цветовой схемы. Логическое (1, 0).
Настройки формата даты и времени
DateFormat=
Если требуется задать какой-то специфичный формат даты, его можно прописать в этом параметре. По умолчанию представление даты имеет вид «ДД.ММ.ГГГГ».
DateSeparator=
Разделитель формата даты, по умолчанию «.».
TimeFormat=
Всё что было сказано о формате даты выше, относиться и к формату времени, с той лишь разницей, что представление времени по умолчанию имеет вид «ЧЧ.ММ.СС».
TimeSeparator=
Разделитель формата времени, по умолчанию «:».
Файл Interface.ini (только Windows)
Переключение интерфейса
Для выбора типа интерфейса MDI или SDI используется файл interface.ini содержащий строку с названием интерфейса. Включение MDI интерфейса, можно добиться, если запустить приложение с параметром MDI=1.
Описание
Документация платформы DCL5