Тема: Перехват события при снятии блокировки объекта

Подскажите как можно перехватить событие, которое происходит при разблокировке объекта. В АПИ нет таких методов, а мне нужно сменить статус объекта, когда снимается блокировка с него, или когда возвращается файл в базу при нажатии системной команды  «Сохранить и закрыть».

Re: Перехват события при снятии блокировки объекта

Почему событие Private Sub object_ObjectModified(pObject) вызывается до того, как происходит разблокировка объекта при выполнении команды "Сохранить и закрыть"? Иначе как отследить выполнение object.Unlock?

Re: Перехват события при снятии блокировки объекта

kvantstudio пишет:

Подскажите как можно перехватить событие, которое происходит при разблокировке объекта. В АПИ нет таких методов, а мне нужно сменить статус объекта, когда снимается блокировка с него, или когда возвращается файл в базу при нажатии системной команды  «Сохранить и закрыть».

События на снятие блокировки нет. Но есть события поднятия файла

Sub Object_BeforeCheckIn(Obj, Cancel)
End Sub

Sub Object_CheckedIn(Obj)
End Sub

Re: Перехват события при снятии блокировки объекта

kvantstudio пишет:

Почему событие Private Sub object_ObjectModified(pObject) вызывается до того, как происходит разблокировка объекта при выполнении команды "Сохранить и закрыть"? Иначе как отследить выполнение object.Unlock?

На вопрос "Почему" я не смогу ответить. Так как специального события для отслеживания блокировок нет, отследить object.Unlock можно только нестандартно, например, повесив "задачу". В событии CheckedIn взведите флаг в словаре. Системное событие, запускаемое по таймеру, может проверить этот флаг. Если объект (ключ) из словаря разблокирован, а флаг (значение) стоит "Заблокирован" - это ваш случай.

Будет выполняться с некоторым запозданием, но работать. Но я не очень хорошо понимаю, почему вам нужно менять статус строго после снятия блокировки? Поменяйте во время блокировки в событии CheckedIn или Modified, у пользователя блокировавшего объект, есть на него права. Ну или через права администратора.

(изменено: kvantstudio, 10 июля 2013г. 14:00:49)

Re: Перехват события при снятии блокировки объекта

Получается программно никак не отследить, когда снимается блокировка с объекта?

А по поводу события Sub Object_CheckedIn(Obj)
End Sub

все бы хорошо, если бы оно срабатывало только на команду СОХРАНИТЬ и ЗАКРЫТЬ, а то оно срабатывает также и на команду СОХРАНИТЬ.

Просто отсутствие события перехвата разблокировки файла, не позволяет реализовать смену статуса объекта, когда его файлы возвращаешь в базу и соответственно нельзя сделать разный набор пользовательских команд, которые отображались бы на обьекте до блокировки и во время блокировки. Это большой минус. Хотя вопрос наверняка решается очень просто )))

Единственное, что приходит на ум, это в зависимости от блокировки удалять те или иные команды из контекстного меню при его вызове.

(изменено: McZag, 11 июля 2013г. 09:23:45)

Re: Перехват события при снятии блокировки объекта

kvantstudio пишет:

Единственное, что приходит на ум, это в зависимости от блокировки удалять те или иные команды из контекстного меню при его вызове.

Возможно вы правы.

Скажу честно, вы первый, кто обратился с такой проблемой. Меня заинтересовал бизнес-процесс, в рамках которого вы автоматически меняете статус после сохранения файлов и снятия блокировки. Что делает этот процесс? Автоматизация перевода в PDF? Распознавание? Синхронизация с внешним хранилищем?

(изменено: kvantstudio, 12 июля 2013г. 06:02:16)

Re: Перехват события при снятии блокировки объекта

McZag пишет:

Возможно вы правы.

Скажу честно, вы первый, кто обратился с такой проблемой. Меня заинтересовал бизнес-процесс, в рамках которого вы автоматически меняете статус после сохранения файлов и снятия блокировки. Что делает этот процесс? Автоматизация перевода в PDF? Распознавание? Синхронизация с внешним хранилищем?

Нет идея в другом, возникла необходимость выгружать файлы объекта на редактирование в папку скажем C:\Проекты\Имя проекта. Возникла эта необходимость потому, чтобы путь выгрузки был простым и понятным без GUID и прочих идентификаторов. Много где читал, что если не использовать GUID  и прочие идетификаторы, то ТДМС не будет знать как вернуть ей файл в объект - это все вымыслы, есть куча способов дать понять ТДМС как и откуда вернуть файл. Плохо что свойства выгрузки в объекте они только для чтения и програмным способом их не поменять и это только лишь усложняет работу и не дает гибкости разработчикам. А информацию о путях выгрузки можно хранить или в атрибуте объекта, или в словаре во время сеанса работы, или сделать так, чтобы путь выгрузки был жестко привязан к структуре папок на диске и повторял структуру дерева ТДМС.

Удалось сделать, чтобы системные команды СОХРАНИТЬ, СОХРАНИТЬ И ЗАКРЫТЬ загружали файл из папки C:\Проекты\Имя проекта обратно в объект. Это было сделано вот таким способом.

'============================================================================
==
' Процедура Object_BeforeCheckIn.
' Выполняется перед возвращением файлов в TDMS.
'============================================================================
==
Sub Object_BeforeCheckIn(Obj, Cancel)  
  ' Получаем путь путь выгрузки файлов карточки документа.
  LocalPath = ThisApplication.ExecuteScript("CMD_PROJECT_DLL", "GetProjectLocalPath", ThisObject)  
  
  ' Возвращаем файлы в TDMS.
  For each File in ThisObject.Files
    File.checkIn LocalPath & File.FileName
  Next  
End Sub

Далее возникла необходимость, чтобы в зависимости от статуса объекта (документ в разработке, документ взят на редактирование) были доступны на объекте разные команды. Пользователь на заблокированном объекте должен видел только то, что ему в данном статусе объекта видеть положено, а не портянку команд ))) Соответственно, когда файл объекта возвращается в ТДМС и снимается блокировка сразу же хотелось поменять статус - это вроде бы как логично, чтобы было такое событие. Много чего можно было бы приделать, к этому событию, когда снимается блокировка и не использовать таймеры. Но как оказалось отследить по событию снятие блокировки нельзя, получается и нельзя разделить когда была нажата просто команда СОХРАНИТЬ, а когда СОХРАНИТЬ И ЗАКРЫТЬ. Проблем бы не было если бы событие Object_Modified вызывалось после разблокировки ))) или в Command_Completed можно было бы отследить нажатие системных команд.

Пока принял вот такое решение отказаться от использования системных команд СОХРАНИТЬ, СОХРАНИТЬ И ЗАКРЫТЬ, когда файл взят на редактирование и объект заблокирован. Удалось скрыть системные команды если в статусе "документ взят на редактирование" запретить редактирование файлов. Сделал свои команды аналоги системным СОХРАНИТЬ, СОХРАНИТЬ И ЗАКРЫТЬ из которых ничего не мешает обратно поменять статус и разблокировать объект.

А вообще хотелось бы управлять видимостью системных команд в контекстном меню, хотя бы на уровне профилей или события ContextMenu_BeforeShow - это давало бы больше гибкости при настройке системы.

Re: Перехват события при снятии блокировки объекта

kvantstudio пишет:

Нет идея в другом, возникла необходимость выгружать файлы объекта на редактирование в папку скажем C:\Проекты\Имя проекта. Возникла эта необходимость потому, чтобы путь выгрузки был простым и понятным без GUID и прочих идентификаторов.

Имхо, GUID полезная вещь. Так TDMS поддерживает относительные пути, позволяет смотреть файлы с одинаковыми именами (например, версии одного документа). Длинный путь с идентификатором базы и пользователя, - да это не есть хорошо, но от этого TDMS избавится в следующей версии. Переделывать системные вещи довольно опасно. Интерфейсы, например, которые скоро выйдут, не будут работать.

kvantstudio пишет:

Пока принял вот такое решение отказаться от использования системных команд СОХРАНИТЬ, СОХРАНИТЬ И ЗАКРЫТЬ, когда файл взят на редактирование и объект заблокирован.

Ну решили и решили. Хотя по мне так не стоит оно того.

kvantstudio пишет:

А вообще хотелось бы управлять видимостью системных команд в контекстном меню, хотя бы на уровне профилей или события ContextMenu_BeforeShow - это давало бы больше гибкости при настройке системы.

5-я версия вам в помощь. И то не сразу, а когда устаканится внутренний API