Следует отметить, что хранимые процедуры для объектов Ultima-S пишутся не на чистом Transact-SQL (хотя и так можно), а с использованием макросов. Специальная программа CASP раскрывает макросы в TSQL и компилирует процедуры в сервер, также облуживает версионность процедур. Макросы в основном скрывают и облегчают работу через объектные протоколы обмена, т.е. реально за ними стоят команды типа insert/update Detailed и т.д.
Каждая процедура обработчик события содержит три параметра, из которых наиболее важен @p1. Он играет роль self-указателя (UDN), чтобы обработчик мог узнать с каким именно экземпляром объекта он работает.
Приведен пример простейшего объекта с двумя полями, который может использоваться как элемент справочника. Обратите внимение, что данный пример иллюстрирует как объект работает с собственной таблицей данных SocratData. Естественно пример искусственный для демонстрации технологии. Такой объект в Ultima-S можно создать без программирования (пользователь может из интерфейса создавать производные классы существующих объектов и добавлять к ним новые поля).
---Install
create procedure InstallSocrat
-- Процедура установки объекта. Создает таблицу для его данных и регистриует сам объект.
as
create table SocratData( UDN int, Data varchar(255))
exec ObjCreateClass 'Socrat', 'Socrat', 'Doc', 0,0,0,0,0 -- Объект унаследован от класса 'Doc'
print 'Объект Socrat успешно установлен'
go
CREATE PROCEDURE edit_gets_Socrat_
@p1 integer, @p2 integer, @p3 integer
-- Обработчик события "Get Schema", которое возвращает экранный вид объекта при его
-- создании (Ultima-S.exe делает exec GetSchema @DocClass='Socrat', @Folder)
AS
BeginDetail -- Подготовка объектного протокола обмена с клиентом БД в буферной таблице Detailed
WindowTitle({'Новый Socrat'}) -- Заголовок окна
EditString 'Name', 'sName', '' -- Поле редактирования типа String с лейблом "Name".
EditString 'Data', 'sData', ''
GO
CREATE PROCEDURE edit_cre_Socrat_
@p1 integer, @p2 integer, @p3 integer
-- Обработчик события "Create" вызывается после gets при записи вновь созданного объекта (Ultima-S.exe делает exec PutDown @UDN, @Folder, @newUDN output)
AS
declare @cnt integer
-- Name записываем в Docs
update Docs set Name=
GetString({'Name'}) -- Извлекаем поле из таблицы обмена объектного протокола с клиентом Detailed
where UDN=@p2
insert SocratData(UDN, Data)
select @p2, GetString({'Data'})
GO
CREATE PROCEDURE edit_getp_Socrat_
@p1 integer, @p2 integer, @p3 integer
-- Событие "Get Properties" выдает набор свойств объекта, которые отображаются как popup-меню объекта в клиенте БД
-- (Ultima-S.exe делает exec GetProperties @UDN)
AS
BeginProperties
ViewProperty 'view','Просмотр Socratа'
EditProperty 'edit','Редактирование Socratа'
GO
CREATE PROCEDURE edit_read_Socrat_
@p1 integer, @p2 integer, @p3 integer
-- Событие "read for edit", считывает на редактирование объект в клиент
-- (Ultima-S.exe делает exec DoDetail @UDN, @ViewMode='edit', @Folder integer)
AS
BeginDetail
WindowTitle({'Socrat'})
EditString 'Name', 'sName', Name
from Docs where UDN=@p1
EditString 'Data', 'sData', Data
from SocratData where UDN=@p1
GO
CREATE PROCEDURE edit_put_Socrat_
@p1 integer, @p2 integer, @p3 integer
-- Событие "Put down" вызывается при записи объекта пользователем после его редактирования
-- (Ultima-S.exe делает exec PutDown @UDN)
AS
declare @ret int, @name varchar(128), @Data varchar(128)
VarString({@name},{'Name'})
VarString({@Data},{'Data'})
update Docs set Name=@name where UDN=@p1
Syncronize({@p1}) -- Указание клиенту БД на необходимость синхронизации полей объекта отображаемых в его списках объектов с новыми значениями в БД
update SocratData set Data=@name where UDN=@p1
GO
CREATE PROCEDURE view_read_Socrat_
@p1 integer, @p2 integer, @p3 integer
-- Событие "read for view", считывает на просмотр объект в клиент
-- (Ultima-S.exe делает exec DoDetail @UDN, @ViewMode='edit', @Folder)
AS
BeginDetail
WindowTitle({'Socrat'})
ViewString 'Name', 'sName', Name
from Docs where UDN=@p1
ViewString 'Data', 'sData', Data
from SocratData where UDN=@p1
GO