Объясню всю задачу.
Мне необходимо записывать в специальную таблицу номера отчетов, название отчетов, кто-вызывал отчет и когда вызывал отчет. То есть вести лог вызова отчетов.
Все отчеты (за которыми необходимо следить) - указываются в созданной мной таблице.
Есть два типа отчетов, которые работают у клиента - 1. это отчеты созданные в Navision 2.это отчеты которые выгружаются в Excel.
Если запускать отчет 1-типа - то при каждом вызове такого отчета запускается функция FindPrinter из кодюнита1. При вызове этой функции указывается параметр функции ReportID. Таким образом логирование за 1 - тпиом отчетов осуществляется очень легко.
Если запускать отечет 2 - типа - то функция FindPrinter не запускается. Но, постоянно запускается функция GetGlodalTableTriggerMask. И вот теперь возникает проблема с логированием таких отчетов, так как не известно номер запускаемого отчета.
Для этого я использую CODECOVERAGELOG.
При запуске формы "Главного меню" - запускается функция из CU1.LogInStart. В это функции я добавил код CODECOVERAGELOG(TRUE); Таким образом я слежу за каждым действием пользователя.
Когда пользователь запускает отчет 2 типа - запускается GetGlodalTableTriggerMask. Из него запускается мой кодюнит. Внутри моего кодюнита происходит следующее -
CoverageLine.RESET;
CoverageLine.SETRANGE(CoverageLine."Object Type",CoverageLine."Object Type"::Report);
IF CoverageLine.FIND('-') = TRUE THEN BEGIN
Object.SETRANGE(Object.Type,Object.Type::Report);
Object.SETRANGE(Object.ID,CoverageLine."Object ID");
IF Object.FIND('-') = TRUE THEN BEGIN
"ChangeLogSetup(Report)".RESET;
"ChangeLogSetup(Report)".SETRANGE("ChangeLogSetup(Report)"."Report No.",Object.ID);
IF "ChangeLogSetup(Report)".FIND('-') = TRUE THEN
MESSAGE(Object.Name + ' Отчет добавлен в таблицу логирования.'); // здесь будет происходить запись данных в таблицу для логирования
END;
END;
CODECOVERAGELOG(FALSE);
CoverageLine.RESET;
CoverageLine.DELETEALL;
CODECOVERAGELOG(TRUE);
// удаление делаю обязательно по двум причинам - 1. что бы база не увеличивалачь до гигагнских размеров в течении все го рабочего дня; 2. В CoverageLine должна быть только одна строка с типом Report, так как определить какой отчет был запущен последним и записать про него данные в таблицу для логирования - не получается , не получается из-за того что данные в CoverageLine сортируются по типу, а, потом по своему уникальному ID номеру.
Проблема в том, что после удаления данные из таблицы удаляются !!!!! Я снова запускаю CODECOVERAGELOG. Но, после того как данные были удаленны из CoverageLine, там появляются новые записи. И В ЭТИХ ЗАПИСЯХ УКАЗЫВАЮТСЯ ВСЕ объекты КОТОРЫЕ УЖЕ БЫЛИ ЗАПУЩЕННЫ ДО запуска CODECOVERAGELOG(TRUE)( Хотя должно быть по другому - все объекты которые были запущенны до CODECOVERAGELOG(TRUE) - не должно попасть CoverageLine).
Таким образом там появляется отчет который я уже добавил в лог таблицу. и при следующем запуске другого отчета, в таблице CoverageLine - появляется две записи с типом REPORT. И выяснить - какой именно отчет был запущен последним невозможно.
Поэтому я и спрашиваю - возможно ли доступиться до тригерра OnInsert таблицы Code Coverage №=2000000049, для того чтобы при добавлении записи производить пр определенных услових удаление записей с типом REPORT.
Вот такая простая задача.
|