триггеры, точки расширения и их подписчики
Модераторы: m0p3e, edward_K, Модераторы
триггеры, точки расширения и их подписчики
Проблеема такая. Требуется добавить доп поля. Например в 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.
Может кто продвинут в этом и может мне помочь. За ранее всем большое спасибо.
Я так понял что должно выглядеть примернотак:
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.
Может кто продвинут в этом и может мне помочь. За ранее всем большое спасибо.
-
- Слесарь-системщик
- Сообщения: 304
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
- Контактная информация:
Подписчик на точку расширения не может содержать логической таблицы и, соответственно, не может выполнять никакой работы с базой данных. То же, как я понимаю, касается и подписчика на триггер - модификация таблицы в нем производится при помощи специальных функций. Зато из любого подписчика можно вызывать методы объектных интерфейсов!
Виталий
-
- Местный житель
- Сообщения: 370
- Зарегистрирован: 28 сен 2006, 15:43
- Откуда: Санкт-Петербург
- Контактная информация:
Раз вы с точками расширения разобрались, может подскажете, как использовать вот эту системную:
Как понять, что указатель этот именно на необходимый мне интерфейс?
Код: Выделить всё
extensionPoint epBeforeInterfaceClose (aClientSelf: longInt);
Уведомляет о начале закрытия интерфейса.
Параметры:
aClientSelf - указатель на клиентскую часть интерфейса.
-
- Местный житель
- Сообщения: 370
- Зарегистрирован: 28 сен 2006, 15:43
- Откуда: Санкт-Петербург
- Контактная информация:
Ну я, собственно, описание из этого файла и скопировал, это все, что там нашел) Сделал так:
Какие фейсы только ни закрывал, мессаги нет.handler with replace InterClose_BeforeInterfaceClose on extensionPoint epBeforeInterfaceClose(aClientSelf: longInt )[100]
action
{
Message(aClientSelf)
}
Последний раз редактировалось Vik 17 ноя 2009, 11:22, всего редактировалось 1 раз.
Вызов точек расширения аналогичен вызову функций. Для вызова точки расширения обязательно должен быть описан ее прототип.
Код: Выделить всё
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.