триггеры, точки расширения и их подписчики

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Hmyrii
Постоянный гость
Сообщения: 62
Зарегистрирован: 07 июн 2006, 08:23

триггеры, точки расширения и их подписчики

Сообщение Hmyrii »

Проблеема такая. Требуется добавить доп поля. Например в BaseDoc. На версиях 711 и 712 делалось просто. Менялись эти таблицы и все прекрасно работало. Галактика 8.0 собрана на атлантисе 5.1.33 и там сплошь и рядом стали юзать буферы таблиц. Теперь если меняю стандартне таблицы то возникает необходимость пересбора всей галактики и всех патчей под новый словарь. Это хлопотно. Так вот. Решил сделать проще. Добавляю свою таблицу AdditionalBaseDoc, а в неё уже толкаю свои поля и поле cBaseDoc для связи с BaseDoc. Так вот проблемма теперь в том, как их синхронизировать то. В пятом атлантисе появились такие понятия как тригеры, точки расширения и подписчики, но как то скудно про это написано в хелпе.
Я так понял что должно выглядеть примернотак:

ExtensionPoint epInsertAdditionalBaseDoc(BaseDocNrec: comp);

handler with replace InsertAdditionalBaseDoc on ExtensionPoint epInsertAdditionalBaseDoc (BaseDocNrec: comp)
action
{
if GetFirst AdditionalBaseDoc where ((BaseDocNrec == AdditionalBaseDoc.cBaseDoc)) != tsOk
insert AdditionalBaseDoc set AdditionalBaseDoc.cBaseDoc := BaseDocNrec;
result := true;
}

handler with replace tAfterInsertAdditionalBaseDoc on trigger BaseDoc after insert [99]
action
{
var BuffBaseDoc : record as table BaseDoc;
GetTableBuffer(BuffBaseDoc);
epInsertAdditionalBaseDoc(BuffBaseDoc.Nrec);
result := true;
}

но вот токо компилятор не хавает это. Ругается на GetFirst и insert.
Пробовал не делать точек расширения и ее подписчика и писать все непосредственно в подписчике тригера. Тоже ругается на GetFirst и insert.
Может кто продвинут в этом и может мне помочь. За ранее всем большое спасибо.
Hmyrii
Постоянный гость
Сообщения: 62
Зарегистрирован: 07 июн 2006, 08:23

Сообщение Hmyrii »

Жаль что не кто не знает и не смог помочь Видно восьмерка с пятым атлантисом еще не широко вошла в массы.
Ну да ладно, разобрался уже с этим.
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

Подписчик на точку расширения не может содержать логической таблицы и, соответственно, не может выполнять никакой работы с базой данных. То же, как я понимаю, касается и подписчика на триггер - модификация таблицы в нем производится при помощи специальных функций. Зато из любого подписчика можно вызывать методы объектных интерфейсов!
Виталий
Hmyrii
Постоянный гость
Сообщения: 62
Зарегистрирован: 07 июн 2006, 08:23

Сообщение Hmyrii »

Спасибо. Я уже разобрабся с этим. :)
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

Раз вы с точками расширения разобрались, может подскажете, как использовать вот эту системную:

Код: Выделить всё

extensionPoint epBeforeInterfaceClose (aClientSelf: longInt);
Уведомляет о начале закрытия интерфейса.
Параметры:
aClientSelf - указатель на клиентскую часть интерфейса.
Как понять, что указатель этот именно на необходимый мне интерфейс?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

сия точка расширения описана в vipprogr.chm
а дальше видимо нужно использовать в cfsGetProp
типа
var wstr:string;
wstr:=''
cfsGetProp(aClientSelf,'Name',wstr);
message(wstr)
ну как перехватить уже не раз писалось
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

Ну я, собственно, описание из этого файла и скопировал, это все, что там нашел) Сделал так:
handler with replace InterClose_BeforeInterfaceClose on extensionPoint epBeforeInterfaceClose(aClientSelf: longInt )[100]
action
{
Message(aClientSelf)
}
Какие фейсы только ни закрывал, мессаги нет.
Последний раз редактировалось Vik 17 ноя 2009, 11:22, всего редактировалось 1 раз.
Hmyrii
Постоянный гость
Сообщения: 62
Зарегистрирован: 07 июн 2006, 08:23

Сообщение Hmyrii »

Вызов точек расширения аналогичен вызову функций. Для вызова точки расширения обязательно должен быть описан ее прототип.

Код: Выделить всё

extensionPoint epBeforeInterfaceClose (aClientSelf: longInt);

handler with replace InterClose_BeforeInterfaceClose on extensionPoint epBeforeInterfaceClose(aClientSelf: longInt )[100]
action
{
  Message(aClientSelf)
} 

interface Test;

HandleEvent
cmInit:
{
  epBeforeInterfaceClose(0);
}

end;

end.
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

Описание прототипа у меня естественно было (#include epSystem - там описаны все системные точки расширения) В общем, дело не в этом (я подписаться хочу на точку, а не вызов ее сделать). Да и я уже без точек расширения обошелся, спасибо всем, кто ответил.
Ответить