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

Цей розділ призначений для програмістів бізнес-логіки в рамках СКА "Оберон" і є довідковим посібником, а в жодному разі не підручником. Тому при його складанні ми вважаємо, що читач знайомий з основними поняттями, якими оперує СКА "Оберон".

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

Тригерні точки входу визначаються в АРМі технолога в описах сутностей системи. У кожній сутності може бути передбачено кілька подій, у разі виникнення яких викликається відповідний Програмний модуль. Існує обмеження реалізації: всі макропроцедури, що стосуються тригерним точкам входу однієї сутності повинні знаходитися в одному макрофайлі.

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

У будь-якому випадку, точці входу в систему відповідає деякий програмний модуль(написаний на одній з мов для інтерпретації) і макропроцедура цього модуля. У точці входу описується: ім'я файлу, що містить програмний модуль, та ім'я процедури, що знаходиться в цьому файлі. У СКА "Оберон", файл, що містить текст програмного модуля називається макрофайлом, а процедура, що знаходиться в цьому макрофайлі - макропроцедурою. Програмні модулі, станом зараз, можуть бути розроблені на вибір прикладного програміста мовою 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 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 Встановити заголовок поточного екрану

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