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

         

@DbColumn - выбор значений из колонки


J @DbColumn( "класс": "тип_кеша"; "сервер":

                            "база_данных"; "вид"; колонка )

Область применения: нельзя использовать в формулах отбора и колонок. Ограниченно применима в формулах всплывающих окон. Возвращаемое значение не должно превышать 64 Кбайта. Не работает при установке переменной окружения NoExternalApps равной 1.

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

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

@DbColumn может возвращать не более 64 Kб данных. Для определения количества элементов данных, которые могут быть возвращены @DbСolumn, используются следующие соотношения:

  • если возвращается текст: 2 + (2 * количество возвращаемых записей) + общий размер текста во всех элементах
  • если возвращаются числа или даты: 6 + 10 * количество возвращаемых элементов
  • "Класс" используется для указания типа базы, из которой извлекаются данные. База данных Domino указывается как ""

    или "Notes".

    Параметр "тип_кеша" может принимать следующие значения:

    • пустая строка или опущено – в этом случае результаты будут "кэшированы", т.е. сохранены в виртуальной памяти для повторного использования. Каждое последующее обращение за этой информацией в рамках одной сессии (пока БД, использующая формулу, остается открытой) будет адресовано к именно этим сохраненным данным;
    • "NoCache" заставляет каждый раз извлекать текущую информацию непосредственно из базы;
    • "ReCache" позволяет обновить кеш с момента последнего кеширования (добавлено в R 6).
    • Использование этой опции основывается на компромиссе. С одной стороны, требование, чтобы Domino каждый раз обращался к базе данных и извлекал ту же самую информацию, отнимает время и понижает общую производительность. С другой стороны, если Вы предполагаете, что данные будут периодически изменяться, стоит потратить время, но быть уверенным, что каждый раз извлекается актуальная информация.




      Параметр "сервер" : "база_данных"

      указывает имя базы данных. Существует несколько способов задать этот параметр:

      • для извлечения данных из текущей базы (той же базы, в которой выполняется формула) просто укажите в качестве параметра "";


      • для извлечения данных из локальной базы используйте ""

        для имени сервера и точно укажите имя файла базы данных, например "" : "БАЗА_ДАННЫХ.NSF"


      • для извлечения данных (с рабочей станции) из базы на сервере укажите сервер, путь и имя файла как текстовый список: "СЕРВЕР" : "БАЗА_ДАННЫХ.NSF"


      • для извлечения данных фоновым агентом из базы на том же сервере или рабочей станции, что и БД, содержащая формулу, используйте ""

        для имени сервера и точно укажите имя файла базы данных, например "" : "БАЗА_ДАННЫХ.NSF"


      • если имеются несколько реплик базы данных на станции и (или) на нескольких серверах, использование идентификатора реплики базы в качестве имени сервера и базы данных позволяет получить доступ к «ближайшей» реплике базы без указания имени сервера и самой базы. Для этого Вы задаете в качестве параметра "сервер": "база_данных" значение идентификатора реплики, например "85255CEB:0032AC04" (как одну текстовую строку, а не список из двух элементов).


      • Для поиска «ближайшей» реплики Domino использует следующий алгоритм:

        • сначала просматриваются базы из рабочего пространства. Если найдена одна реплика – то она и используется;


        • если реплик несколько, и они отображаются в виде стека, то используется реплика с вершины стека;


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


        • если предыдущие шаги закончились неудачей, то просматриваются БД с текущего сервера, а затем все базы с Вашего локального диска. При этом используется первая найденную БД с заданным идентификатором реплики. Чтобы в последующем процесс поиска происходил быстрее, эта база добавляется в рабочее пространство.




        • Чтобы избежать ошибок при вводе идентификатора реплики, выберите в меню File - Database - Design Synopsis... и отметьте опцию Replicatoin. Затем скопируйте идентификатор реплики из конспекта в буфер и вставьте его в формулу.

          Если БД хранится в подкаталоге операционных систем DOS, Windows или OS/2, например, MAIL\MINE.NSF, между именем каталога и именем базы не забывайте вставлять две обратные косые вместо одной: "MAIL\\MINE.NSF".

          Параметр "вид" задает имя вида или папки, где следует искать данные. Для достижения большей универсальности рекомендуется пользоваться алиасом. Например, если вид в окне свойств вида показан как "По авторам\Фамилия | Lname", в @DbColumn лучше использовать алиас "LName", хотя допустим и вариант "По авторам\\Фамилия".

          Параметр колонка используется для указания номера колонки в виде. Это числовая величина; заключать ее в кавычки не следует.

          Колонки вида нумеруются слева направо, и крайняя левая колонка имеет номер 1. Но, учитывая то, что вид есть представление индекса на экране, между видом и индексом имеются некоторые различия. @DbColumn выбирает информацию из индекса, при этом не каждая колонка вида учитывается в поиске. Для вычисления номера колонки используйте следующий метод:

          Рассмотрите все колонки вида слева направо. Убедитесь, что не пропустили какую-то из них. Например, колонка, применяемая для сортировки или категоризации вида, может оказаться скрытой для пользователя, но используется в индексе вида. Просмотрите вид в режиме дизайна, чтобы увидеть все его колонки;

          Исключите из рассмотрения все колонки вида, отображающие заведомо постоянную величину, например, 32 или "Выдано:". Такие колонки отсутствуют в индексе. Однако если колонка все же содержит формулу, которая возвращает одинаковый результат для всех документов, колонка не должна рассматривается как "константа", так что не исключайте ее из рассмотрения;

          Исключите из рассмотрения все колонки вида, содержащие только одну из следующих функций: @DocChildren, @DocDescendants, @DocLevel, @DocNumber, @DocParentNumber, @DocSiblings, @IsCategory, @IsExpandable. Таких колонок нет в индексе;



          Теперь пересчитайте колонки слева направо, не учитывая исключенные из рассмотрения. Полученный при этом номер колонки и будет являться величиной, которую следует указать в формуле для выбора значений.

          Поскольку Domino получает информацию из индекса вида, основываясь на номерах колонок, можно извлекать только данные, представленные в индексе вида. Если указать несуществующую колонку, Domino не сообщит об ошибке, а просто возвратит пустое значение.

          Когда @DbColumn используется в агенте, то последний должен иметь доступ к БД, к которой @DbColumn обращается (обратите внимание, что в R 6 агент может обращаться к БД, расположенным на другом (не текущем) сервере). Для получения такого доступа, тот, под чьими правами агент выполняется, должен иметь доступ «Читателя» к указанной БД.

          ЗАМЕЧАНИЕ: агенты, выполняющиеся на серверах версии R5 или ниже, могут иметь доступ к БД только текущего сервера. В рамках этих версии для возможности @DbColumn «читать» данные из другой (не текущей) БД так же можно было добавить автора агента под правами «Читателя» в ACL этой БД. Существует и другой способ - можно внести идентификатор реплики исходной БД (т.е. в той, где выполняется агент) в целевую (откуда считываются данные опять же под правами «Читателя». Для этого определите идентификатор реплики исходной базы, который выглядит, например, как 85255CEB:0032AC04. Затем, используя File - Database - Access Control..., в список управления доступом целевой базы добавьте нового субъекта с именем, представляющим собой идентификатор реплики (85255CEB:0032AC04), и назначьте этому субъекту права не ниже читателя. Таким образом, Вы отдельно предоставите агентам из исходной базы доступ к целевой базе, даже если в её списке управления доступом для -Default- указано No access. Данный механизм поддерживается и в версии R 6.

          Если же @DbColumn выполняется на рабочей станции пользователя и выбирает данные из базы на рабочей станции, она всегда имеет к этой базе необходимый доступ (даже при уровне доступа No Access – нет доступа и поднятом флаге Enforce a consistent Access Control List across all replicas of this database



          - распространять список управления доступом на все реплики текущей БД). Если @DbColumn выполняется на рабочей станции пользователя, но выбирает данные из базы на сервере Domino, доступ @DbColumn к ней определяется уровнем доступа пользователя.

          Если пользователь, под правами которого выполняется @DbColumn, не имеет доступа к "виду" на основании Read Access list (список управления доступом на чтение к виду) - закладку Security (безопасность) окна свойств вида, секция Who may use this view – кто может использовать данный вид), то функция выполнятся не будет. В этом случае возвращается сообщение об ошибке: «A view of that name cannot be found in the specified database» (вид с данным именем не найден в указанной БД).

          Пример 1. Эта формула используется как формула ключевых слов. При создании документа по форме, содержащей это поле ключевых слов, Domino извлекает список наименований изделий из колонки 2 вида "Наличный инвентарь" локальной базы данных INVENTRY.NSF.

          @DbColumn( ""; "":"INVENTRY.NSF"; "Наличный инвентарь"; 2 )

          Пример 2. Предположим, что коды изделий представляют собой "невразумительные" идентификаторы наподобие "ID1234-8765-23.003". Определить, какое изделие они представляют, затруднительно. Допустим, Вы желаете выводить в поле ключевых слов формы вместо кодов более лицеприятные описания изделий. Чтобы этого достичь, понадобится вид "По изделиям", содержащий в первой колонке список кодов изделий, в другой колонке, например, второй, описания изделий. Можно сделать эти описания доступными в Вашей форме, используя возможность указывать синонимы для ключевых слов: если любое ключевое слово содержит вертикальную черту "|", текст справа от нее является тем, что хранится в поле, а текст слева от черты - это то, что показывается пользователю. Приведенная ниже формула "поэлементно сцепляет" содержимое второй колонки (с описаниями) с содержимым первой колонки (с кодами изделий).

          @DbColumn( ""; "":"PRODPLAN.NSF"; "По изделиям"; 2 ) +

              "|" +  @DbColumn( ""; "":"PRODPLAN.NSF";

              "По изделиям"; 1 )


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