Язык @-формул в LotusDomino R 6.

         

Операции с документом


@UndeleteDocument

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

В 5-ой версии Domino у базы данных появилось новое свойство - "мягкая" отметка об удалении (soft deletion). В случае если оно установлено функция @UndeleteDocument снимает с текущего документа пометку о таком удалении.

Рис. 6.2 Окно свойств базы данных с отметкой о разрешении "мягких" отметок об удалении (Allow soft deletions)

Для того чтобы «увидеть» документы со свойством «мягких» отметок об удалении, необходимо создать вид, имеющий тип «Shared, contains deleted documents» (Общий, содержащий удаленные документы).

Рис. 6.3   Вид, содержащий «мягко» удаленные документы

Пример. Формула агента восстанавливает документы, у которых в поле Subject присутствует строка "Hello".

@If( @Contains( Subject; "Hello" ); @UndeleteDocument; "" )

@DeleteDocument

Область применения: разрешается использовать только в формулах агентов. В Web-приложениях не работает.

Функция @DeleteDocument удаляет или ставит "мягкую" отметку об удалении для документа, обрабатываемого агентом. Что конкретно делает функция (удаляет или ставит "мягкую" отметку об удалении) определяется одноименным свойством текущей базы данных.



@DeleteDocument наиболее часто применяется в фоновых и поисковых агентах. Для пометки документа на удаление из формул акций и кнопок панели инструментов используйте функцию @Command( [EditClear] ).

Пример. Удаляет только те документы, поле Status которых содержит "Closed". 

FIELD Status := @If( Status = "Closed"; @DeleteDocument; Status );

@HardDeleteDocument

Область применения: в DOMINO R 6.0.1 ДОКУМЕНТИРОВАНА НЕ ПОЛНОСТЬЮ. Предназначена для использования только в формулах агентов. Не работает в Web-приложениях.

Немедленно удаляет документ из базы данных, в отличие от функций @DeleteDocument и @UndeleteDocument, которые имеют возможность работать с "мягкими" отметками об удалении документов.


J @DocLock( флаги )

Область применения: нельзя использовать в формулах отбора, колонок, полей, формы и навигатора. Не работает в Web-приложениях.

В 6-ой версии Domino появился новый механизм позволяющий осуществлять блокировку/разблокировку как документов пользователей, так и элементов дизайна. Для того чтобы БД могла поддерживать блокировку документов пользователя необходимо определить для БД основной блокирующий сервер (Master Lock Server), а также поднять флаг Allow document locking в окне свойств БД. Первое достигается в ACL БД на закладке Advanced. Обратите внимание, что Master Lock Server

совпадает с административным сервером для БД (Administration server):



Рис. 6.4 Закладка Advanced ACL БД с установленным значением для Master Lock Server

После установки для БД блокирующего сервера для возможности блокировки необходимо еще поднять флаг Allow document locking, который расположен на закладке Database Basics окна свойств БД.



Рис. 6.5 Закладка Database Basics окна свойств БД с поднятым флагом Allow document locking

После выполнения указанных действий можно осуществлять блокировку/разблокировку документов пользователей. На уровне интерфейса клиента Lotus в виде или папке это достигается использованием меню Action -> Lock Document

и Action -> Unlock Document. С точки зрения функциональности блокировка осуществляет добавление в документ двух служебных полей:

  • $Writers – кто выполнил блокировку;


  • $WritersDate – дата/время осуществления блокировки.


  • Разблокировка соответственно удаляет эти поля из документа.

    Функция @DocLock позволяет оперировать с механизмом блокировок на программном уровне в рамках языка @-формул. В качестве флагов допускает использовать следующие значения:

    • [LOCK] – блокирует текущий документ;


    • [UNLOCK] – разблокирует текущий документ;


    • [STATUS] – возвращает текстовый список пользователей, заблокировавших текущий документ, или пустую строку в противном случае;


    • [LOCKINGENABLED] – возвращает 1 (@True) если в БД включена поддержка механизма блокировки, и 0 (@False) в противном случае.




    • Попытка использования функции @DocLock с флагами [LOCK], [UNLOCK] и [STATUS] над БД с опущенным флагом Allow document locking

      приводит к предупреждающему окну с текстом «Attempted a lock operation on a DB that doesn't support locking» ( попытка выполнения операции блокировки над БД, которая не поддерживает механизм блокировки). Для тех же флагов документ должен находиться в режиме чтения (но не редактирования) или быть текущим на уровне вида/папки. В противном случае выдается предупреждающее окно с текстом «@Function is not valid in this context» (@-функция недопустима в данном контексте). Кроме этого применение флага @DocLock [LOCK] над ранее уже заблокированными документами также приводит к предупреждающему окну либо с текстом «You already have the document locked» («Вы уже заблокировали данный документ» - если данный документ был ранее заблокирован Вами), либо «The document is already locked by someone else» («Документ уже заблокирован кем-то еще» - при предшествующей блокировке другим пользователем). Разблокировка ранее заблокированного документа доступна либо пользователю, выполнившею её, либо пользователю с уровнем доступа Менеджер по ACL. В противном случае получаем предупреждающее окно с текстом «The document is not locked by you» (данный документ не был заблокирован Вами).

      Пример. Формула, используемая в акции вида, сначала проверяет поднят ли у БД флаг Allow document locking. Далее проверяет, не заблокирован ли уже текущий документ, и если нет – то блокирует его.

      @If(

      !@DocLock([LockingEnabled]);

             @Prompt([Ok];"Предупреждение"; "Текущая БД не поддерживает механизм блокировок");

      @DocLock([Status]) = "";

             @DocLock([Lock]);

      @Prompt([Ok];"Предупреждение";"Текущий документ уже заблокирован пользователями:" + @Implode(@DocLock([Status]); ","))

      )

      @AddToFolder( имя_папки_1; имя_папки_2 )

      Область применения: разрешается использование в формулах кнопок панели инструментов, кнопок и гиперобъектов, акций формы и видов, а так же агентов. Не работает для еще не сохраненных на диске документов.



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

      • первого аргумента, то не осуществляется добавления в папку;


      • второго аргумента  - соответственно, удаления из папки;


      • двух аргументов - не выполняются ни какие действия.


      • Пример 1. Формула добавляет текущий документ в папку с именем "Work"

        @AddToFolder( "Work"; "" )

        Пример 2. Формула добавляет текущий документ в папку с именем "Moscow", удаляя его при этом из папки "Washington"

        @AddToFolder( "Moscow"; "Washington" )

        Пример 3. Формула удаляет текущий документ из папки с именем "Washington"

        @AddToFolder( ""; "Washington" )

        J @GetFocusTable( флаг )

        Область применения: разрешается использовать только в формулах кнопок панели инструментов, акций формы и полей. Не работает в Web-приложениях. Документ должен находиться либо в режиме редактирования, либо чтения, в этом случае текст или входящий в таблицу объект должен быть выделен.

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

        • [CellRow] – в этом случае возвращается номер текущей строки таблицы. Первая строка имеет номер "1". Если таблица не в фокусе – возвращается "0";


        • [CellColumn] – возвращает номер текущей колонки таблицы. Первая колонка имеет номер "1". Если таблица не в фокусе – возвращается "0". Когда фокус находится на закладке табулированной таблицы, то использование данного флага приводит к возвращаемому значению - "0";


        • [TableName] – возвращает имя таблицы, определенное в свойствах таблицы в поле Name/Id на последней закладке свойств. Если таблица не в фокусе или значение поля не определено – возвращается пустая строка.




        • Рис. 6.6 Определение имени таблицы в ее окне свойств

          В R 6.0.1 функция корректно работает только в обработчике события onHelp. В остальных контекстах (автор разумеется не проверял все) не зависимо от флагов функция возвращает 1, как число (а не текст).

          Пример. Формула, примененная в обработчике события onHelp, вернет номера текущих позиций по строке и колонке, а также программное имя таблицы.

          row := @GetFocusTable([CELLROW]);

          @If(row = "0"; @Prompt([OK]; "*No table*"; "Not in a table");

          @Do(

          column := @GetFocusTable([CELLCOLUMN]);

          name0 := @GetFocusTable([TABLENAME]);

          name := @If(name0 = ""; "No name"; name0);

          @Prompt([OK]; "*" + name + "*";

          "Row " + row + ", column " + column)))


          Содержание раздела