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...