6. Создание тела объекта

Типичным примером объекта является образец, описанный в файле SAMPLE.SQL. В нем следует заменить {class} на латинское название класса, {rus} на его русское имя, а {field} на название его имени (для сотрудника это ФИО’)

После этих замен возникает объект c работающим циклом создания, редактирования и удаления.

Разработка процедур обслуживания событий:

getp

Свойства вставляются так: вначале используется макрос BeginProperties. У него нет параметров, но вызвать его следует обязательно. После этого перечисляются макросы типа

ViewProperty метод,название

EditProperty метод,название

OperProperty sqlпроцедура,название

Свойства бывают трех указанных видов, и каждый макрос задает латинское название метода и русское описание, которое и появится в меню. Внимание: эти макросы частичные, и содержат два SQL оператора. В OperProperty указывается имя SQL процедуры-обработчика.

Если свойства образуют смысловую группу, то ее можно задать явно скобками, что приведет к появлению подменю

BeginGroup название_группы

EndGroup

По нажатию Enter или double-click отрабатывается property с названием методом view. Для того, чтобы операция отрабатывалась таким образом, надо ее указать с помощью макроса OperDefProperty.

Указанные свойства могут быть изъяты ядром, если на них нет привилегий.

Процедура производного класса может изъять методы предыдущих классов или переименовать их, работая напрямую с таблицей Properties.

read

Процедура должна начинаться с макроса BeginDetail. После она формирует описание полей с помощью макросов вида (View,Edit,Cycl)* (Int,String,Date,Float,Money) [то есть 15 вариантов]. Суффикс указывает тип поля, а префикс - отображение для чтения без возможности модификации (view), с таковой (edit), с recycle (Cycl).

Если у поля стоит Recycle, то при всяком его изменении (а для строко-заполняемых данных по потере фокуса, а не по нажатию каждого символа) будет вызываться событие cycl. Так делаются зависимые поля.

Процедура для property-просмотра не должна использовать макросы Edit и Cycl.

Макросы из двух SQL операторов, неполные. Использование (на примере ViewString):

ViewString id,format,value

где id - идентификатор, по которому надо будет ссылаться, format - форматная строка, а value - значение. Примеры:

ViewString ‘Name’,’sФИО’, ‘Иванов’

ViewString ‘Tel’, ’s’, No from Docs where UDN=@p1

Во втором макросе используется то, что он на самом деле является оператором select, поэтому такой вариант использован вместо:

ViewString ‘Tel’, ’s’, (select No from Docs where UDN=@p1)

В форматной строке макросов игнорируется параметр def=. Для ViewInt при запросе документа можно не указывать параметр home=

Процедура может указать имя окна макросом

WindowTitle({‘название’})

при этом производные классы смогут это неоднократно переопределить.

После указанных полей и полного отработки события read добавляются расширения. Это делается для методов view,edit,viewext,editext и не делается для других. Чтобы это переопределить, следует воспользоваться макросами EnableExt и DisableExt без аргументов. Переопределяется производными классами.

О формировании списков сказано в отдельной главе

О том, как процедура детализации может использовать ранее введенные параметры, см. описание события detp

Чтобы документ поддерживал переименование из Explorerа, на метод ‘edit’ по событию read должно детализироваться строковое поле с id ‘Name’ для редактирования, которое потом должно записываться по событию put в базу в Docs.Name. Выглядеть детализация может так:

EditString ‘Name’,’sНаименование’, Name from Docs where UDN=@p1

Форматная строка конечно может быть другой. НЕЛЬЗЯ хранить наименование не в таблице Docs в поле Name - иначе после переименования на экране ничего не изменится.

gets

отрабатывается аналогично событию read для редактирования. Не должна использовать recycle-формы. (ограничение). Не может использовать запрос параметров, так как параметры при создании не запрашиваются.

put

Отрабатывается при записи результатов редактирования. Делает update на свои таблицы и еще какие либо действия. Как получить результаты редактирования? Для этого есть макросы Get*(Int,String,Date,Float,Money) и Var*(Int,String,Date,Float,Money). Первый читает с помощью subquery значение поля по id, а второй это делает оператором в указанную переменную, например пусть по событию edit предоставлено поле для редактирования:

EditMoney ‘mon’,’$Сумма’,$0.00

Коррекция данных в MyTab делается так:

update MyTab set Fld1= GetMoney({‘mon’}) where UDN=@p1

или так

declare @m money

VarMoney({@m},{‘mon’})

update MyTab set Fld1=@m where UDN=@p1

Если изменяются поля таблицы Docs, то надо обязательно вызвать макрос Syncronize, который приведет в соответствие значения полей Name,No и Dat и объекта и возможный shortcut на него:

Syncronize({@p1})

Так как элементы списков имеют одинаковые идентификаторы, то доставать значения из них придется напрямую через таблицу Detailed.

Процедура может выдать ошибку, и тогда ничего не запишется. Но нет ничего страшного: окно остается на экране, и можно исправить информацию и попытаться записать еще.

cre

Аналогично событию put по макросам, но так как вызывается при создании, создает записи в таблицах, и возможно, изменяет Docs. В примере с MyTab это бы выглядело так:

insert into MyTab (UDN,Fld1) select @p2, GetMoney({‘mon’})

Обратите внимание, что в данном случае используется @p2, а не @p1 (см описание cre)

Процедура может выдать ошибку, и тогда ничего не запишется. Но нет ничего страшного: окно остается на экране, и можно исправить информацию и попытаться записать еще.

detp

Формирует запрос параметров для данного метода. Вначале должен быть вызван макрос

DelProcParam({@p1})

после чего надо для запроса каждого параметра вызвать макросы вида Ask *(Int,String,Date,Float,Money) с параметром id и спецификация запроса, например,

AskString ‘nam’,’sФИО^def=Иванов’

Используются введенные значения параметров в процедурах read макросами VarDet *(Int,String,Date,Float,Money), например:

declare @s varchar(80)

VarDetString({@s},{‘nam’})

cycl

Вызывается при recycle. Может поменять значения полей, но не может создать новые или удалить старые. Правда, количество полей в списке изменить можно.

Процедуры

У OperProperty указывается имя процедуры, которая получает UDN документа. Если она должна запросить параметры, то надо написать процедуру с таким же именем и подчеркиванием в конце. Ей также передается UDN. Параметры заполняются также, как в процедуре события detp, (но первый макрос DelProcParam вызывается с параметром UDN:

DelProcParam({@UDN})

Чтение же параметров в собственно процедуре осуществляется макросами VarParInt, VarParString etc...