21.07.2004, 16:13 | #1 |
Участник
|
Глобальное отслеживание изменений в базе...
В Кодеюните 1 - ApplicationManagement есть функции:
OnGlobalInsert, OnGlobalModify, OnGlobalDelete, OnGlobalRename. Все они отрабатывают тогда, когда происходит соответственно Вставка, Изменение, Удаление или Переименование одной из записей таблиц, для которых в настройке Журнала Изменений (Финансы/Настройка/Журнал Изменений Настройка) установлено Все Поля либо Некоторые Поля (со списком полей) в соотвествующем поле, т.е. для запуска функции OnGlobalInsert должно быть заполнено поле Журнал Создания, для запуска OnGlobalModify - Журнал Изменения и т.д. Естественно при этом должен стоять флаг Журнал Изменений Активен в Финансы/Настройка/Журнал Изменений Настройка. Хотелось бы узнать, каким образом система отслеживает настройки Журнала Изменений, поскольку запуск этих функций не из каких других объектов не осуществляется. В то же время, если не поставить флаг в поле Журнал Изменений Активен и не указать таблицу, в которой необходимо отслеживать изменения, эти функции не запускаются вовсе. Все это было проверено как Debugger-ом, так и с помощью функции Выполнение кода: Если настройки есть, то функции запускаются, если нет - не запускаются и вызов этих функций не осуществляется ни из какого другого объекта. Если кто в курсе, помогите!!! :-) |
|
21.07.2004, 17:07 | #2 |
Участник
|
Я тоже достаточно долго пытался понять откуда происходит вызов этих функций.
Пришел к выводу, что в Нави существуют "скрытые" триггера таблиц или же скрытые части кода стандартных триггеров. То, что существует скрытые механизмы вызова функций - давно известно (на примере функций 1-го кодеюнита). Интересно, когда-нибудь будут открыты для доступа все возможности Navision? |
|
22.07.2004, 10:26 | #3 |
Участник
|
мои наблюдения:
в Codeunit 1 есть функция GetGlobalTableTriggerMask, которая запускается всегда при изменении данных в любой таблице. Если она вернет не 0, то выполнится OnGlobalInsert..OnGlobalRename (Change Log Management, GetTableTriggerMask). причем это все работает только при ручном изменении таблиц, т.е. из кода ( например при GLEntry.INSERT(TRUE) ) функцию GetGlobalTableTriggerMask надо вызывать отдельно. |
|
22.07.2004, 10:45 | #4 |
Участник
|
Цитата:
Изначально опубликовано AlexVB
мои наблюдения: в Codeunit 1 есть функция GetGlobalTableTriggerMask, которая запускается всегда при изменении данных в любой таблице. Если она вернет не 0, то выполнится OnGlobalInsert..OnGlobalRename (Change Log Management, GetTableTriggerMask). причем это все работает только при ручном изменении таблиц, т.е. из кода ( например при GLEntry.INSERT(TRUE) ) функцию GetGlobalTableTriggerMask надо вызывать отдельно. Попробую поковырять в этом направлении |
|
22.07.2004, 10:58 | #5 |
Участник
|
Да, так оно и есть. После входа в Нави при изменении любого поля любой таблицы запускается GetGlobalTableTriggerMask в 1-м Кодеюните, но после прохода через функцию GetTableTriggerMask 423-го Кодеюнита возвращается 0 в случае, если не активен Журнал изменений либо в нем не активна изменяемая таблица или поле. Второй раз GetGlobalTableTriggerMask вызывается лишь при повторном запуске Нави, даже если поставить флаг активности Журнала Изменений и настроить таблицу на отслеживание. То есть выходит, что для работы Журнала Изменений необходимо переоткрывать базу после Настройки Журнала Изменений?
P.S.: Дело в том, что я и Rom вместе работаетм и вмесе над данной проблемой боремся. Нам необходимо отслеживать изменения в таблицах для других целей, но хотелось бы подвязаться к готовому функционалу, раз уж такой имеется... |
|
22.07.2004, 12:13 | #6 |
Участник
|
Да, все так и есть
Спасибо за информацию!!!
Хочешь отследить изименения в базе - переоткрой фирму! |
|
22.07.2004, 12:16 | #7 |
Участник
|
GetTableTriggerMask вызывается для каждой таблицы, к которой происходит обращение, но только 1 раз за сессию. Т.к. codeunit 423 имее SingleInstance = Да, то к таблице Change Log Setup обращение действительно происходит 1 раз за сессию.
Если необходимо вызывать свой код из OnGlobalInsert..OnGlobalRename можно в GetTableTriggerMask сделать так, чтобы возвращаемое значение всегда было 15 |
|
23.07.2004, 09:28 | #8 |
Участник
|
Цитата:
Изначально опубликовано AlexVB
GetTableTriggerMask вызывается для каждой таблицы, к которой происходит обращение, но только 1 раз за сессию. Т.к. codeunit 423 имее SingleInstance = Да, то к таблице Change Log Setup обращение действительно происходит 1 раз за сессию. Если необходимо вызывать свой код из OnGlobalInsert..OnGlobalRename можно в GetTableTriggerMask сделать так, чтобы возвращаемое значение всегда было 15 P.S.: Вот только одна проблемка - если GetTableTriggerMask всегда будет возвращать 15, то Журнал изменений будет заполняться для всех полей при любых настройках Журнала... Хотя нет, все ок, спасибо еще раз!!! |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Не пойму по Демо базе | 4 | |||
Журнал Изменений | 7 | |||
Пароль на демо-базе диска Attain | 3 |
|