В помощь прикладному программисту СКА "Оберон"

Данный раздел адресован программисту бизнес-логики в рамках СКА "Оберон" и является справочным пособием, а ни в коем случае не учебником. Потому, при его составлении имелось ввиду, что читатель знаком с основными понятиями, которыми оперирует СКА "Оберон".

Программист бизнес-логики в рамках СКА "Оберон" имеет две основные точки приложения усилий: триггерную и процедурную точки входа в систему.

Триггерные точки входа определяются в АРМе технолога при описании сущностей системы. В каждой сущности может быть предусмотрено несколько событий, при возникновении которых вызывается соответствующий программный модуль. Существует ограничение реализации: все макропроцедуры, относящиеся к триггерным точкам входа одной сущности, должны находиться в одном макрофайле.

Процедурные точки входа определяются в АРМе администратора, путем описания пункта меню типа "Макрос".

В любом случае, точке входа в систему соответствует некоторый программный модуль, написанный на одном из интерпретируемых языков, и макропроцедура этого модуля. В точке входа так и описывается: имя файла, содержащего программный модуль, и имя процедуры, находящейся в этом файле. Применительно к СКА "Оберон", файл, содержащий текст программного модуля, называется макрофайлом, а процедура, находящаяся в этом макрофайле - макропроцедурой. Программные модули, по состоянию на сейчас, могут быть разработаны по выбору прикладного программиста на языке Visual Basic Script или Java Script. Макрофайлы на языке Java Script имеют расширение ".js". Файлы с другими расширениями считаются макрофайлами, написанными на языке Visual Basic Script.

На каком бы языке ни был написан макрофайл, СКА "Оберон" расширяет возможности, которые предоставляет этот язык.

Первым средством расширения является директива ###include###, позволяющая расширять макрофайл за счет виртуального включения в него содуржимого других макрофайлов, что способствует структурированности макрофайлов и повторному использованию кода. Директива ###include### обрабатывается препроцессором, а потому не подчиняется синтаксису языка программирования, на котором написан макрофайл. в качестве параметров директивы, разделяемых запятыми, используются имена макрофайлов без кавычек, но с расширениями. Действие директивы распространяется до конца строки, комментариев в строке директивы не предполагается. Директива ###include### в одном макрофайле может встречаться несколько раз, она может встречаться и в виртуально включаемых макрофайлах. Если один макрофайл встречается в директивах ###include### несколько раз (в том числе и во вложенных файлах), то реально он будет включен в окончательный текст макрозадания только один раз - там, где он встретился впервые.

Вторым и главным средством расширения являются объекты, функции и константы, экспортированные СКА "Оберон" в язык программирования. Синтаксис вызова экспортированных объектов соответствует синтаксису используемого языка программирования, а перечню этих объектов и их семантике посвящена оставшаяся часть данного раздела. Но прежде, чем перейти к этому материалу, следует заметить следующую особенность использования в СКА "Оберон" макрозаданий. СКА "Оберон" выполняет кеширование контекстов макрозаданий. Это значит, что при первом обращении к корневому макрофайлу, система производит сборку текста макрозадания, компиляцию этого текста и выполнение кода, находящегося вне процедур, после чего переходит к выполнению указанной процедуры. После выполнения макропроцедуры, контекст не уничтожается, а сохраняется для повторного использования. При повторном обращении к любой из процедур макрофайла, используется уже готовый контекст. Сделано это для оптимизации быстродействия системы, но, в то же время, дает полезный побочный эффект: позволяет сохранять значения глобальных переменных от вызова к вызову. Однако, чтобы пользоваться этим побочным эффектом, следует понимать особенности реализации механизма кеширования. Их, основных, две. Во-первых, кешируются контексты макрозаданий, а не макрофайлов, то есть, если один и тот же макрофайл включен посредством директивы ###include### в несколько различных макрофайлов, то описанные в нем глобальные переменные после компиляции окажутся в нескольких различных контекстах и будут видны только внутри контекста. Во-вторых, реализация интерпретаторов скриптовых языков в большинстве систем нереентерабельна. Это приводит к тому, что при реккурсивном обращении к макрозаданию (например, если внутри макропроцедуры происходит сохранение объекта системы, а для сохранения объектов этого класса в АРМе технолога указана триггерная макропроцедура, находящаяся в том же макрофайле) создается второй контекст того же макрозадания. Поэтому прежде чем пользоваться этими возможностями, убедитесь, что приведенный выше текст Вам полностью понятен и самоочевиден.

И последнее, что нужно помнить при разработке прикладных решений с использованием средств расширения макроязыков, предоставляемых СКА "Оберон" - параметры макропроцедур. Ядро СКА "Оберон" вызывает макропроцедуру, указанную в качестве точки входа с одним параметров либо без параметров. В качестве параметра передается текущий объект системы в случае вызова триггерной точки входа (описанной в АРМе технолога), а также в случае вызова процедурной точки входа (описанной в АРМе администратора) в меню на панели объекта. Во всех остальных случаях (процедурные точки входа, описанные в меню на всех остальных типах экранов, включая и главный экран системы) процедуры вызываются без параметров. Большинство реализаций интерпретаторов очень нервно относятся к несовпадению количества формальных параметров количеству параметров фактических.

Функции и константы СКА -=Оберон=-

Описанные ниже функции и константы доступны в макрозаданиях, написанных на любом макроязаке, порддерживаемом СКА "Оберон", и выполняемых под управлением АРМа пользователя системы. Ограничения по использованию, если они имеются, приведены описании соответствующей функции. Функции возвращают либо значения скалярных типов языка программирования (Int - целое число, Bool - логическое значение, Str - строка, Real - число с плавающей точкой, Date - дата и время), либо объект СКА "Оберон", описание которого доступно по соответствующей ссылке.

Тип Имя Описание
Int OwnNode RO: Номер текущего узла
Int ArmName RO: Название текущего АРМа
Str UserId RO: Id (числовой) текущего пользователя
Int UserName RO: текущего пользователя
- ShowMessage Вывести сообщение на экран
Bool AskTrue Задать вопрос (на "Да"/"Нет")
Int AskInt Запросить с экрана целочисленное значение
Str AskStr Запросить с экрана строку
Real AskReal Запросить с экрана число
Date AskDate Запросить с экрана дату
Date AskMonth Запросить с экрана месяц и год
Date AskTime Запросить с экрана время
PBar ProgressBar Объект типа "ползун"
TxtRep TxtReport Объект типа "отчет в текстовом представлении"
ActRep Report Объект типа "активный отчет"
Dialog UserDialog Объект типа "пользовательский диалог"
SysDlg OpenDialog Объект типа "системный диалог" для открытия файлов
SysDlg SaveDialog Объект типа "системный диалог" для сохранения файлов
XMLDoc XML Объект типа "документ XML"
Int Transaction Начать транзакцию СУБД
Int Commit Завершить транзакцию СУБД
Int Rollback Откатить транзакцию СУБД
Int InTrn Возвращает "глубину" транзакции СУБД
- SetErrorMessage Установить расшифровку ошибки
- GetErrorMessage Возвращает расшифровку ошибки
- ClearErrorMessage Очистить расшифровку ошибки
- ShowError Выдать сообщение об ошибке
- Printf Форматирует строку по шаблону (аналог функции printf языка "С") и выводит ее на экран по завершении работы макропроцедуры в специальном экране просмотра результатов выполнения макроса
Str SPrintf Форматирует по шаблону и возвращает строку
- LPrintf Форматирует строку по шаблону и записывает ее в системный протокол
Str DateFormat Форматирует дату и время в строку по шаблону с написанием месяцев на русском языке
Str DateUkrFormat Форматирует дату и время в строку по шаблону с написанием месяцев на украинском языке
Str AmountToStr Формирует строку "сумма прописью"
Str ValueToStr Формирует строку "число прописью"
Str OemToAnsi Перекодирует строку из DOS-кодировки (CP.866) Win-кодировку (CP.1251)
Str AnsiToOem Перекодирует строку из Win-кодировки (CP.1251) DOS-кодировку (CP.866)
Str GetInit Взять значение параметра файла конфигурации (Oberon.Ini)
Str FullPath Получить полный путь по относительному
Bool FileExists Существует ли файл
Bool FileCopy Копировать файл
Bool FileMove Перенести файл (копировать и удалить исходный)
Bool FileDelete Удалить файл
FindFile FindFile Поиск файлов по маске
Class GetClass Возвращает объект, описывающий класс сущностей
Enum Enumerate Возвращает объект, описывающий перечисление
Object Object Возвращает объект класса системы
- ShowGrid Выводит экран типа "Грид сущности" в модальном или немодальном режиме
Object EnterObject Выводит экран типа "Грид сущности" в модальном режиме и организует на нем пользовательский диалог с целью выбора одного из объектов
Str EnterObjects Выводит на экран в модальном режиме окно, содержащее список объектов с возможностью пометки каждого, и организует на нем пользовательский диалог с целью выбора из списка группы объектов
- ShowHierarchy Выводит экран типа "Иерархия сущностей" в модальном или немодальном режиме
Object EnterHierarchy Выводит экран типа "Иерархия сущностей" в модальном режиме и организует на нем пользовательский диалог с целью выбора одного из объектов "листьевой" сущности
Int RunDisp Вызвать функцию плагина
DataSet Grid Возвращает объект, репрезентующий набор объектов заданной сущности
Str DateToPodl Перевести дату в строчный формат, понимаемый СУБД
Date DateFromPodl Взять дату из строчного формата, понимаемого СУБД
Int GateSendSeans Отправить на узел очередной сеанс в файловом формате
Int GateRepeatSeans Повторить отправку сеанса на узел в файловом формате
Int GateRecSeans Принять сеанс, пришедший от узла в файловом формате
Int AddPodp Добавить подписку узла
Int DelPodp Удалить подписку узла
Int CodeIdForNode Перекодировать Id объекта для отправки на узел
Int CodeIdFromNode Перекодировать Id объекта, пришедшего от узла
- AddEncodeId Добавить в список перекодировок
- NeedClose Закрыть окно после завершения работы макропроцедуры
- UnNeedClose Отменить закрытие окна после завершения работы макропроцедуры
- NeedRefresh Перерисовать содержимое окна после завершения работы макропроцедуры
- NeedEnter После завершения работы макропроцедуры закрыть окно и выбрать текущую запись
Str MenuId Возвращает идентификатор пункта меню, вызвавшего макропроцедуру
Str MenuItemId Возвращает идентификатор меню, из которого вызвана макропроцедура
Object CurrentAtGrid Возвращает объект, текущий в списке на панели
- SetRO Установить атрибут "Только для чтения" полю панели
Int GetField Возвращает идентификатор поля ввода, текущего на панели
- SetField Установить идентификатор поля ввода, текущего на панели
Int GetSheet Возвращает идентификатор поля, соответствующего текущей закладки на панели
- SetSheet Установить идентификатор поля, соответствующего текущей закладки на панели
Object Current Возвращает объект, текущий на экране
Object CurrentAtTreeView Возвращает объект, текущий на древовидной панели экрана
Int SelectedCount Возвращает количество помеченных объектов на экране
Object Selected Возвращает объект, помеченный на экране
Int GetParam Возвращает значение параметра экрана типа "Грид"
- SetParam Установить значение параметра экрана типа "Грид"
Str GetFilter Возвращает фильтр, установленный на экране типа "Грид"
Str GetFilterName Возвращает имя именованного фильтра, установленного на экране типа "Грид"
- SetFilter Установить фильтр на экране типа "Грид"
Str GetCaption Возвращает заголовок текущего экрана
- SetCaption Установить заголовок текущего экрана

© СКА -=Оберон=-