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