Страница 1 из 1

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

Добавлено: 07 июн 2006, 13:26
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.
Может кто продвинут в этом и может мне помочь. За ранее всем большое спасибо.

Добавлено: 08 июн 2006, 07:46
Hmyrii
Жаль что не кто не знает и не смог помочь Видно восьмерка с пятым атлантисом еще не широко вошла в массы.
Ну да ладно, разобрался уже с этим.

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

Добавлено: 13 июн 2006, 09:23
Hmyrii
Спасибо. Я уже разобрабся с этим. :)

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

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

extensionPoint epBeforeInterfaceClose (aClientSelf: longInt);
Уведомляет о начале закрытия интерфейса.
Параметры:
aClientSelf - указатель на клиентскую часть интерфейса.
Как понять, что указатель этот именно на необходимый мне интерфейс?

Добавлено: 16 ноя 2009, 14:51
edward_K
сия точка расширения описана в vipprogr.chm
а дальше видимо нужно использовать в cfsGetProp
типа
var wstr:string;
wstr:=''
cfsGetProp(aClientSelf,'Name',wstr);
message(wstr)
ну как перехватить уже не раз писалось

Добавлено: 16 ноя 2009, 15:09
Vik
Ну я, собственно, описание из этого файла и скопировал, это все, что там нашел) Сделал так:
handler with replace InterClose_BeforeInterfaceClose on extensionPoint epBeforeInterfaceClose(aClientSelf: longInt )[100]
action
{
Message(aClientSelf)
}
Какие фейсы только ни закрывал, мессаги нет.

Добавлено: 17 ноя 2009, 04:02
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.

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