![]() |
#13 |
Участник
|
Объясню всю задачу.
Мне необходимо записывать в специальную таблицу номера отчетов, название отчетов, кто-вызывал отчет и когда вызывал отчет. То есть вести лог вызова отчетов. Все отчеты (за которыми необходимо следить) - указываются в созданной мной таблице. Есть два типа отчетов, которые работают у клиента - 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. Вот такая простая задача. |
|