Тема: Работы с журналом событий

Возможно ли фильтровать события сразу по нескольким объектам?
В объекте TDMSEventsFilter есть только свойство Object, т.е. один объект. Но мне необхоимо отфильтроват не поодному объекту. Если конкретно, то по выбранному объекту + по всему его составу. Возможно ли такое?

TDMS 2.0.184

Re: Работы с журналом событий

Вроде сам додумался..
Получается нжуно так:

For Each obj In ThisObject.ContentAll
obj.Events
...
Next

Так просто немного дольше получится...

Было бы проще, если бы у TDMSEventsFilter было свойство Objects

Re: Работы с журналом событий

chekalin пишет:
For Each obj In ThisObject.ContentAll

obj.Events

...

Next

Да, так правильно. Сейчас действительно нельзя фильтровать коллекцию событий по нескольким объектам.

chekalin пишет:

Так просто немного дольше получится...
Было бы проще, если бы у TDMSEventsFilter было свойство Objects

Это не факт. Даже если бы у фильтра было свойство Objects, надо было бы делать ThisApplication.Events.Filter.Objects = ..., а работа с коллекцией событий приложения может занимать ооочень много времени. Например, операция применения фильтра к ThisApplication.Events (особенно если работают много пользователей - накапливаются сотни тысяч событий), может занять десяток-другой секунд. Так что Ваше решение скорее всего оптимальное.

Re: Работы с журналом событий

stargazer пишет:

Да, так правильно. Сейчас действительно нельзя фильтровать коллекцию событий по нескольким объектам.
Это не факт. Даже если бы у фильтра было свойство Objects, надо было бы делать ThisApplication.Events.Filter.Objects = ..., а работа с коллекцией событий приложения может занимать ооочень много времени. Например, операция применения фильтра к ThisApplication.Events (особенно если работают много пользователей - накапливаются сотни тысяч событий), может занять десяток-другой секунд. Так что Ваше решение скорее всего оптимальное.

Если говорить о быстроте.... Стличается ли по скорости

Obj.Events

от

ThisApplication.Events.Filter.Object = Obj

? Я имею ввиду само время выбора событий из всей коллекции. Как я понимаю, выполняется примерно такой SQL-запрос:

SELECT *
FROM dbo.TEvent
WHERE F_OBJID = ObID

Но тогда ведь если использовать ThisApplication.Events.Filter.Objects, то получится примерно

SELECT *
FROM dbo.TEvent
WHERE F_OBJID = ObID1 And F_OBJ_ID =ObID2 .... And F_OBJ_IDn

Т.е. скорость выполнения запроса увеличится в разы?
Может  я и ошибаюсь..

Спасибо сказали: KudrjashovAI1

Re: Работы с журналом событий

chekalin пишет:

Если говорить о быстроте.... Стличается ли по скорости

Obj.Events

от

ThisApplication.Events.Filter.Object = Obj

? Я имею ввиду само время выбора событий из всей коллекции. Как я понимаю, выполняется примерно такой SQL-запрос:

SELECT *
FROM dbo.TEvent
WHERE F_OBJID = ObID

Но тогда ведь если использовать ThisApplication.Events.Filter.Objects, то получится примерно

SELECT *
FROM dbo.TEvent
WHERE F_OBJID = ObID1 And F_OBJ_ID =ObID2 .... And F_OBJ_IDn

Т.е. скорость выполнения запроса увеличится в разы?
Может  я и ошибаюсь...

В одном случае вы будете выполнять столько запросов, сколько у вас объектов, в другом - только 1 более сложный запрос. СУБД устроены так, что за очень редким исключением второй способ всегда [значительно] быстрее.

Кстати, второй запрос у вас это нечто  ;) Правильное решение - вложенный запрос или внешнее объединение (что по сути одно и то же). Но в любом случае, это будет намного быстрее, чем много раз вызывать obj.Events

Re: Работы с журналом событий

Кстати, второй запрос у вас это нечто

... Ну.. не так уж и нечто.. Единственное что And с Or перептал..)

В одном случае вы будете выполнять столько запросов, сколько у вас объектов, в другом - только 1 более сложный запрос. СУБД устроены так, что за очень редким исключением второй способ всегда [значительно] быстрее.

Т.е. как я понял, более сложный запрос работает быстрее чем несколько простых? Тогда я не пойму что то... ведь это противоречит тому что Вы написали ранее

ThisApplication.Events.Filter.Objects = ..., а работа с коллекцией событий приложения может занимать ооочень много времени.

Разве это будет не более сложный запрос?
Либо это сложно в реализаци?

Re: Работы с журналом событий

chekalin пишет:

Т.е. как я понял, более сложный запрос работает быстрее чем несколько простых?

В данном случае да. Чем больше будет объектов, тем больше разница.

chekalin пишет:

Тогда я не пойму что то... ведь это противоречит тому что Вы написали ранее

Речь в первую очередь о том, что а) других средств нет, и выбранное вами вполне пригодно. б) в выбранном вами решении вы начинаете получать данные практически незамедлительно, а с получением всех событий всех объектов в большой базе придется подождать  :(. А если ждать долго - клиент "залипнет" и потеряется интерактивность.

chekalin пишет:

Либо это сложно в реализаци?

Не сложно, конечно. Но, вы первый, кому потребовался такой поиск

(изменено: McZag, 24 мая 2007г. 13:10:46)

Re: Работы с журналом событий

В общем не совсем так все оказалось  :)

Сообщение stargazer основывалось на практике, мое на теории  :)

Выяснилось, что запрос на инициализацию ThisApplication.Events.Filter строится по классической схеме через получение коллекции ThisApplication.Events. Поэтому на сегодняшний день ваш вариант однозначно более быстрый. И будет оставаться таким до выхода билда TDMS с оптимизированной инициализацией ThisApplication.Events.Filter (обращение к БД в таком случае производится только в случая явного обращения к членам коллекции - а всякие установки фильтров и пр. - игнорируются). Только это будет в TDMS 3.0  :( и про objects надо отдельно подумать

Re: Работы с журналом событий

Вроде все понял... Только вот опять работая с этим журналом, я не пойму, почему у TDMSEventsFilter нет свойства Type? :( Вроде важность и нужность этого свойства вполне очевидна, да и реализация совсем не вызовет никаких затруднений...

Re: Работы с журналом событий

chekalin пишет:

Вроде все понял... Только вот опять работая с этим журналом, я не пойму, почему у TDMSEventsFilter нет свойства Type? :( Вроде важность и нужность этого свойства вполне очевидна, да и реализация совсем не вызовет никаких затруднений...

Внесено в предложения

Re: Работы с журналом событий

McZag пишет:

Выяснилось, что запрос на инициализацию ThisApplication.Events.Filter строится по классической схеме через получение коллекции ThisApplication.Events. Поэтому на сегодняшний день ваш вариант однозначно более быстрый. И будет оставаться таким до выхода билда TDMS с оптимизированной инициализацией ThisApplication.Events.Filter (обращение к БД в таком случае производится только в случая явного обращения к членам коллекции - а всякие установки фильтров и пр. - игнорируются). Только это будет в TDMS 3.0  :( и про objects надо отдельно подумать

Здравствуйте.
Поднимаю мертвеца из могилы, ибо тема подходящая.
В 4.0 использую следующий код:

Set colEvents = Obj.Events
colEvents.Filter.Object = Obj
colEvents.Filter.Class = tdmEventClassObject + tdmEventClassFile
colEvents.Filter.TimeFrom = Obj.ModifyTime
colEvents.Filter.On = true
msgbox colEvents.Count

... и получаю количество всех событий на объекте, будто фильтр не настраивал.
Это я сделал что-то не так, или не я?