ABL блоки
Эта тема очень важна, так как в ABL именно к блокам языка привязаны области видимости элементов языка, включая области видимости буферов записи.
К блокам также привязана обработка транзакций и ошибок.
Ошибки в ABL возникают на уровне операторов и затем обрабатываются ближайшим охватывающим блоком.
Способ обработки определяется свойствами блока по умолчанию и опциями, заданными в заголовке блока. Ошибки в ABL возникают на уровне операторов и затем обрабатываются ближайшим охватывающим блоком. Способ обработки определяется свойствами блока по умолчанию и опциями, заданными в заголовке блока.
Таким образом, понимание свойств и характеристик блоков является критически важным для программирования на ABL.
Типы блоков
Блок ABL – это набор операторов ABL, выполняющийся как единое целое. Блок состоит из оператора (заголовка) блока, тела блока (набор операторов ABL) и оператора END. Выполнение блока определяется типом блока, свойствами блока по умолчанию и действующими опциями блока. Все операторы ABL находятся внутри какого-либо блока.
Блоки ABL могут быть сгруппированы по типам:
- Базовые блоки
- Конечные блоки
- Процедурные блоки
- Блоки классов
Базовые блоки предоставляют основную функциональность обработки. Хотя они и имеют возможности передачи управления, они не являются вызываемыми (процедурными). К базовым блокам относятся блоки DO, FOR и REPEAT. Эти блоки имеют богатый набор опций, позволяющих определять разнообразные их вариации. Ниже приведена некоторая важная информация о базовых блоках:
- Передача управления в базовых блоках определяется метками блоков.
- Только базовые блоки могут быть итерационными.
- Только базовые блоки позволяют изменять обработку ошибок по умолчанию с помощью фразы ON ERROR.
- Блок DO без опций не имеет свойств по умолчанию и называется простым DO блоком. Такой блок не имеет свойств обработки ошибок по умолчанию.
Конечные блоки (End Blocks) – это блоки, определяющие обработку окончания блока, который их содержит. Конечные блоки всегда являются частью другого блока, называемого связанным. Конечные блоки располагаются в связанном блоке между последним исполняемым оператором и оператором END. К конечным блокам относятся блоки CATCH и FINALLY.
- Блок CATCH определяет пользовательский блок обработки ошибки и является элементом только структурной обработки ошибок.
- Блок FINALLY содержит код, который должен быть выполнен при завершении связанного блока, не зависимо от возникновения ошибок. Являясь элементом структурной обработки ошибок, блок FINALLY также может быть полезен при традиционной обработке ошибок. Использование его при традиционной обработке ошибок не изменяет поведение обработчика.
- Если блок FINALLY используется, он должен быт последним конечным блоком.
Процедурные блоки – это блоки (модули) кода, которые могут быть вызваны (выполнены) из другого блока (модуля) по имени. К процедурным блокам относятся:
- Процедура (внешняя процедура, файл .p)
- Внутренняя процедура
- Функция, определенная пользователем
- Триггер базы данных (файл .p) и триггерный блок базы данных (ON database-event)
- Триггер пользовательского интерфейса
- Метод класса (пользовательский), конструктор, деструктор, методы доступа к свойствам (GET, SET)
Вызов процедурного блока в ABL может быть осуществлен различными способами:
- Оператором RUN
- Как реакция на событие базы данных или событие пользовательского интерфейса
- Указанием в присваивании или выражении
- Доступом через handle объекта
- Триггеры пользовательского интерфейса могут быть «вызваны» с помощью оператора APPLY.
Важная информация, относящаяся к процедурным блокам:
- Файл процедуры имеет неявный блок, содержащий весь код процедуры. То есть имеется неявный заголовок и неявный оператор END. Конечные блоки должны быть расположены в конце файла процедуры.
- Хотя внутренние процедуры и функции определяются внутри процедуры, во время выполнения они становятся частью кода (суб-блоком) вызывающей процедуры.
- Триггер базы данных – это блок с явным заголовком и неявным оператором END. Конечные блоки должны быть расположены в конце файла процедуры.
Блоки классов (.cls) являются основой объектно-ориентированного программирования в ABL. Они не являются исполняемыми в том же смысле, как другие блоки ABL, являющиеся процедурными по природе. Блок класса определяет абстрактный объект и его членов. В пределах блока класса следующие типы членов класса являются исполняемыми процедурными блоками:
- Методы, определенные пользователем
- Конструкторы
- Деструкторы
- Методы доступа к свойствам (GET и SET)
В следующей таблице (Таблица 3) приведены названия, типы и операторы определения для блоков ABL, включая и некоторые вариации.
Таблица 3. Блоки ABL
Название блока |
Тип |
Определение |
Простой блок DO | Basic | Оператор DO без TRANSACTION или ON ERROR |
Блок DO TRANSACTION | Basic | Оператор DO с опцией TRANSACTION |
Блок DO ON ERROR | Basic | Оператор DO с фразой ON ERROR |
Блок FOR | Basic | Оператор FOR |
Блок REPEAT | Basic | Оператор REPEAT |
Блок CATCH (только структурная обработка ошибок) | End | Оператор CATCH |
Блок FINALLY (традиционный или структурный обработка ошибок) | End | Оператор FINALLY |
Procedure (Процедура, Внешняя процедура) | Routine-level (File) | Неявный окаймляющий весь код блок |
Внутренняя процедура | Routine-level | Оператор PROCEDURE |
Функция (User Defined Function) | Routine-level | Оператор FUNCTION |
Процедура триггера базы данных | Routine-level | Оператор TRIGGER PROCEDURE в файле процедуры |
Блок триггера базы данных | Routine-level | Оператор ON database-event |
Триггер пользовательского интерфейса | Routine-level | Оператор ON UI-event |
Пользовательский метод класса | Routine-level | Оператор METHOD |
Конструктор класса | Routine-level | Оператор CONSTRUCTOR |
Деструктор класса | Routine-level | Оператор DESTRUCTOR |
Доступ к свойствам класса | Routine-level | Оператор PROPERTY и определения GET или SET |
Блок класса | Class (File) |
Оператор CLASS в файле класса |