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

         

Ключевые слова


DEFAULT имя_поля := значение

Область применения: без ограничений.

На время выполнения формулы присваивает полю с именем имя_поля

соответствующее значение по умолчанию. Данная конструкция устанавливает, что если в документе не задано поле с именем имя_поля, то до конца формулы или до присвоения этому полю другого значения будет считаться, что оно содержит соответствующее значение. Если же поле с именем имя_поля

в документе присутствует, то конструкция не оказывает никакого воздействия.

ENVIRONMENT переменная_окружения

:= "значение"

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

Присваивает значение текстовой строки переменной_окружения

(среды). Данные переменные сохраняются либо в файле NOTES.INI (для операционных систем Windows, OS/2 и UNIX), или в Notes Preferences файле (для Macintosh). Действие ключевого слова аналогично выполнению встроенной @-функции @SetEnvironment.

Для возврата значений таких переменных используется функция @Environment:

FIELD FieldName := @Environment( "EnvVariable" )

В Web-приложениях, используя предопределенные имена полей, с помощью функций работы с переменными окружения можно получить пользовательские Web-переменные окружения. В данном случае используется механизм CGI (Common Gateway Interface).

J FIELD имя_поля := значение

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

Присваивает значение полю с именем имя_поля. Данное поле сохраняется в документе (в отличие от временных переменных). Может быть использовано как для создания новых, так и для изменения существующих полей. При создании новых полей разработчик должен сам следить за тем, чтобы имя_поля

было уникально в пределах текущего документа.

В R 6 язык снято ограничение, запрещающее использование ключевого слова FIELD


в качестве параметров других функций (например, @Do или @If). Соответственно допускается и вложенное использование FIELD. Для предыдущих версий (включая R5) это ограничение действительно.



Пример. В R 6 полю a1 и временной переменной c присвоится значение “123”, а полю a2 - “12345”.

Field a2 := @Do( c:= Field a1 := "123"; c + "45");

В документации на данное ключевое слово приведено два замечания. Первое - рекомендует внутри других функций использовать вместо ключевого слова FIELD функцию @SetField. Во втором говорится, что в определенных случаях формула должна возвращать некое значения (например, формула кнопки). Поэтому для предупреждения возникновения ошибки типа "No Main or Selection expression in formula" (нет главного выражения или оператора отбора в формуле) рекомендуется добавить после оператора с ключевым словом FIELD новый оператор возвращающий значение (например, "" или Select @All).

Строгое следование данным замечаниям действительно на 100% избавит от описываемых ошибок. Однако с другой стороны, в R 6 снято ограничение, запрещающее использование ключевого слова FIELD в качестве параметров других функций, и кроме этого ключевое слово FIELD теперь возвращает значение. Помимо этого при сохранении формул, требующих возвращаемого значения (например, формула кнопки), Domino обычно добавляет в конец формулы функцию @True. Данное правило выполняется не всегда, например, если определить обработчик события onLoad формы на языке @-формул в виде «FIELD a2 := "45";», то в результате как раз и получим сообщение об ошибке "No Main or Selection expression in formula".

REM [ "комментарий" ]

J REM [ { комментарий } ]

Область применения: без ограничений.

Позволяет включить в формулу одну или несколько строк комментариев. В R 6 комментарии стало можно заключать в фигурные скобки. Это достаточно удобно при отладке @-формул, когда надо закомментировать какой-то фрагмент текста, а внутри него уже встречаются двойные кавычки. Символ «\» (обратный слеш) используется внутри комментария как Esc-символ, аналогично текстовым константам.



REM "Это строка \"комментария\"!";

REM {и это строка \\комментария};

SELECT формула

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

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

Для агентов критерий отбора может так же определяться в его окне свойств (например, All unread documents in view – все непрочитанные документы в виде), а также в объекте Document Selection из объектно-событийной панели агента. Тем не менее, даже в этом случае в теле агента можно использовать ключевое слово SELECT. Критерий отбора документов для агента будет тогда определяться путем объединения перечисленных условий. При селективной репликации наблюдается похожая картина с использованием ключевого слова SELECT.

Пример 1. Выбор всех документов:

SELECT @All

Пример 2. Отбор документов в вид или при репликациях. Выбираются все документы, созданные по форме "Описание фирмы" и все их "потомки" - ответные документы всех уровней иерархии.

SELECT Form = "Описание фирмы" | @AllDescendants;

При использовании в формуле операции сравнения со значением поля, которого в документе нет, такая формула всегда возвращает значение 0 (FALSE). Для решения проблемы можно воспользоваться функциями @IsAvailable или @IsUnavailable.

Ключевое слово всегда должно быть стоять первым в операторе. При запоминании формулы ключевые слова всегда преобразуются к верхнему регистру. В операторах с ключевыми словами DEFAULT, ENVIRONMENT и FIELD значения имя_поля и переменная_окружения не должны быть текстовыми константами.


Команды для работы с почтой


@Command( [MailAddress] )

Область применения: документ должен находиться в режиме редактирования. Указатель курсора должен находиться в пределах редактируемого поля. В документе должно быть хотя бы одно поле, используемое для адресации (SendTo, CopyTo, BlindCopyTo).

Выдает диалоговое окно определения почтового адреса (Mail Address).

Пользователь может выбрать в окне адресата и при нажатии Ok выбранная информация занесется в соответствующие адресные поля документа.

Пример. Документ находится в режиме редактирования и у него имеется поле SendTo. Команда, используемая в формуле акции формы, выдает диалоговое окно определения адреса. Выбрав адресата, нажатием Ok заносим информацию в поле SendTo.

@Command( [MailAddress] )

@Command( [MailComposeMemo] )

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

Создает в почтовом ящике пользователя пустое почтовое сообщение по форме, используемой по умолчанию для почтовой базы (обычно Memo), и устанавливает фокус на него. После отправки почтового сообщения фокус возвращается в базу, из которой выполнялась команда.

J @Command( [EditQuoteSelection] )

Область применения: документ должен быть открыт в режиме редактирования, и текст должен быть выделен.

Преобразует выделенный текст к формату, принятому в письмах-ответах с использованием цитирования. Другими словами, вставляет в начало каждой строки символ больше (“>”), форматирует текст в строках по 70 символов, и удаляет из текста присоединенные файлы и другие объекты. Следует обратить внимание, что перенос осуществляется только по словам, т.е. если слово состоит более чем из 70 символов, то оно переноситься не будет.

С помощью переменных из Notes.ini можно изменить как символ, вставляемый в начало строки, (переменная QuotePrefix), так и длину строки цитирования (переменная QuoteLineLength). Обратите внимание, что во-первых, данные переменные задаются в Notes.ini без префикса «$» (например, QuoteLineLength=60), а во-вторых, значение этих переменных влияет на результат применения команды [ComposeWithReference] с ключом 8 (см. Стр. 238).


Пример. Формула, примененная в акции вида почтового ящика, позволяет создать ответ на письмо с цитирование в интернет стиле. Данный пример приведен исключительно для демонстрации команды [EditQuoteSelection]. В почтовом ящике, созданном по почтовому шаблону R 6, присутствует встроенные возможности для создания таких писем (например, кнопка Reply -> Reply with Internet-Style History).

@Command([EditDocument]; "1");

REM {открываем текущий документ на редактирование};

@Command([EditGotoField]; "Body");

REM {переключаем фокус на поле Body};

@Command([EditSelectAll]);

REM {выделяем все содержимое поля Body};

@Command([EditCopy]);

REM {копируем выделенное содержимое поля Body в

   буфер обмена};

@Command([CloseWindow]);

REM {закрываем письмо с цитатами};

@Command([Compose]; ""; "Memo");

REM {создаем новое письмо};

@UpdateFormulaContext;

REM {переключаем контекст на новый документ};

@Command([EditGotoField]; "Body");

REM {переключаем фокус на поле Body};

@Command([EditPaste]);

REM {вставляем в поле Body содержимое буфера обмена};

@Command([EditSelectAll]);

REM {выделяем все содержимое поля Body};

@Command( [EditQuoteSelection] );

REM {применяем к выделенному фрагменту функцию

   цитирования};


Команды для работы с профильными документами


J @Command( [EditProfile];

     "имя_профильного_документа";

     "уникальный_ключ" )

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

Создает новый или открывает существующий профильный документ на редактирование.

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

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

В формуле сначала выбирается имя пользователя из адресной книги, затем создается для него профильный документ с именем "User". Затем документ сохраняется и закрывается.

Ch := @PickList( [Name]:[Single] );

@Command( [EditProfile]; "User"; Ch );

@Command( [FileSave] );

@Command( [FileCloseWindow] );

J @Command( [EditProfileDocument];

                           "имя_профильного_документа";

                           "уникальный_ключ" )

Область применения: нельзя применять в формулах диалогового окна. Для создания профильного документа нужен доступ к базе данных не ниже автора.

Создает новый или открывает существующий профильный документ на редактирование. Аналогична @Command( [EditProfile] ) за тем лишь исключением, что выполняется немедленно в формуле, а не после всех остальных команд.



Команды для работы с текущим и выделенными документами


@Command( [Compose]; "сервер" : "база_данных";

      "форма"; "ширина_окна" : "высота_окна" )

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

В указанной параметрами "сервер" : "база_данных" базе данных создает новый документ по форме "форма" и переключает фокус Domino на него.

Если в качестве параметра "сервер" выступает пустая строка, считается что база является локальной. Если необходимо создать документ в текущей базе данных, то второй параметр тоже должен быть пустой строкой.

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

. . .

REM {выше код определения имени формы, пусть она присваивается временной переменной form_new}

@If(@IsNewDoc; @Return(Form); @Return(form_new));

При создании документов типа "ответ" или "ответ на ответ", БД, в которой планируется создать такой документ, должна быть открыта и на документе, на который создается ответ, должен стоять световой маркер. Так же для создания ответных документов можно воспользоваться новой в R 6 командой [ComposeWithReference].

Команда может быть использована в Web-приложениях только в формате @Command( [Compose]; "имя_формы" ).

Параметр "ширина_окна" : "высота_окна" задает соответственно высоту и ширину в дюймах окна, в котором будет создаваться документ. Параметр не имеет смысла, когда выбран MDI (Multiple Document Interface многооконный интерфейс в рамках главного окна) интерфейс, и окно имеет установленной свойство - максимальный размер. В случае если этот параметр опущен или равен нулю, то окно имеет размеры, сохраненные последним пользователем.


Пример 1. Создает в текущей базе данных документ по форме "First".

@Command( [Compose]; ""; "First" )

Пример 2. Создается документ по форме "People" в базе данных "News\People.nsf", лежащей на сервере "Leda/Center_TV/RU".

@Command( [Compose]; "Leda/Center_TV/RU" :

   "News\\People.nsf"; "People" )

J @Command( [ComposeWithReference]; "сервер" :

       "база_данных"; "форма"; флаги )

Область применения: БД должна быть открыта, на документе, на которой создается ответ, должен стоять световой маркер или документ должен быть открыт в режиме чтения/редактирования.

Создает ответный документ для документа, на котором стоит световой маркер, и переключает фокус на него. Под ответным здесь понимается не обязательно документ, содержащий ссылку на родителя в поле $Ref, просто создаваемый документ может содержать информацию из документа родителя (более напоминает наследование).

Параметры "сервер" : "база_данных" и "форма" имеют тот же смысл, что и для команды [Compose]. Единственное отличие состоит в том, что если в новый документ требуется передать какие-либо данные из родительского документа, то в "форме" обязательно должно присутствовать RTF-поле с именем Body (данная информация отсутствует в Help). В противном случае (т.е. указан параметр флаги, и у формы отсутствует RTF-поле с именем Body) выдается сообщение об ошибке «Inherit rich text field does not exist» (RTF-поля для наследования не существует).

По аналогии с командой [Compose], если [ComposeWithReference] используется в акции формы или кнопки панели инструментов при открытом виде с определенной формулой формы, то следует изменить формулы формы как в описание к [Compose].

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


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

1 – включает в поле Body ссылку (Doclink) на родительский документ. В Web-приложениях не поддерживается; 2 - включает в поле Body содержимое родительского документа. Требует наличие флага 1. В Web-приложениях в акции формы (но не вида) корректно передается только текстовая информация из родительского документа. Даже если поле Body отображается в Web с помощью апплета, графические изображения из родительского документа передаются некорректно; 4 - включает в поле Body содержимое родительского документа в виде свертываемой секции. Требует наличие флага 1 и 2. В Web-приложениях не поддерживается; 8 - включает в поле Body содержимое родительского документа в виде интернет копии (т.е. «такой-то и тогда-то написал» в заголовке, а далее текст из родительского документа, предваряемый символами больше «>». Все остальные объекты удаляются с соответствующим сообщением). В Web-приложениях не поддерживается. Требует наличие флага 1 и 2. Неявно применяет флаг 16; 16 - включает в поле Body содержимое родительского документа, удаляя из последнего присоединенные файлы, графические изображения и другие большие объекты, заменяя их на текст об удалении, заключенный в квадратные скобки. В Web-приложениях не поддерживается. Требует наличие флага 1 и 2; 32 – включает перед наследуемым текстом подформу с именем $ForwardSep, если таковая в БД имеется (в стандартном почтовом шаблоне mail6.ntf такая форма присутствует). В Web-приложениях не поддерживается. Требует наличие флага 1 и 2. Пример 1. Открывает в текущей БД форму с именем Resp, которая имеет RTF-поле с именем Body. В поле Body копируется информация в виде свертываемой секции из документа, который был текущим на момент выполнения формулы,. Данная функциональность достигается использованием в акции вида следующей формулы:

@Command([ComposeWithReference]; "" : ""; "Resp"; 1 + 2 + 4)



Пример 2. Открывает в почтовой БД текущего пользователя форму Reply, в поле Body которой копируется информация из документа, который был текущим на момент выполнения формулы. Информация копируется в виде свертываемой секции с интернет стилем. Данная функциональность достигается использованием в акции формы следующей формулы:

@Command([ComposeWithReference]; @MailDbName; "Reply"; 1 + 2 + 4 + 8)

@Command( [EditDocument] )

@Command( [EditDocument]; "режим_документа";

                         "режим_отображения" )

Область применения: в виде/папке на документе должен стоять световой маркер, или документ открыт в режиме чтения/редактирования. Можно использовать в Web-приложениях в акциях формы (но не в акциях видов) без параметров. При использовании данной команды могут не работать формулы видимости объектов в форматируемых полях. Используйте команду @Command( [OpenDocument] ), которая поддерживает работу всех формул видимости объектов.

При использовании команды, когда на документе стоит световой указатель в виде/папке, происходит открытие документа в указанном режиме. Если параметр "режим_документа" опущен, то вызывается режим редактирования.

При задании параметра "режим_документа" равным "1" переводит текущий документ в режим редактирования, соответственно "0" - чтения.

При задании параметра "режим_отображения" равным "1", текущий документ переходит в режим редактирования в панели предварительного просмотра.

Может использоваться для редактирования текущего документа. Однако в случае использования в формулах акций формы и видов предпочтительней пользоваться предопределенными акциями "Edit Document".

Пример. При использовании в формуле акции вида/папки или формы переводит текущий документ в режим редактирования.

@Command( [EditDocument]; "1" )

J @Command( [EditRestoreDocument] )

Область применения: на документе стоит световой маркер или документы выд??/??????.??À???ÿA?A?го «мягко» удаленные документы, или документ находится в режиме чтения.



Выполняет команду меню Edit -> Restore. Другими словами восстанавливает «мягко» удаленные документы. Команда по своему действию похожа на функцию @UndeleteDocument (см. Стр. 127). Из отличий можно назвать, что @Command( [EditRestoreDocument] ) на уровне вида с «мягко» удаленными документами может восстанавливать не только выбранный, но и выделенные документы, в то время как @UndeleteDocument восстанавливает только выбранный документ. На уровне формы @UndeleteDocument корректно работает с документами как в режиме чтения, так и редактирования, а @Command( [EditRestoreDocument] ) – только в режиме чтения.

Пример. Формула, примененная в акции вида, содержащего «мягко» удаленные документы, восстанавливает все присутствующие в этом виде документы.

@Command( [EditSelectAll] );

@Command( [EditRestoreDocument] )

@Command( [ViewSwitchForm] ; "имя_формы" )

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

Изменяет форму, по которой отображается текущий документ, на форму с именем или алиасом "имя_формы". В случае если параметр "имя_формы" опущен, то выдается диалоговое окно со списком всех доступных для текущей базы данных формы.

J @Command( [SwitchForm] ; "имя_формы" )

Область применения: документ должен находиться в режиме чтения или редактирования, или он должен находиться в панели предварительного просмотра, и фокус должен находиться в этой панели. Команда не работает если в виде/папке, из которого был открыт документ, определена формула формы.

Изменяет форму, по которой отображается текущий документ, на форму с именем или алиасом "имя_формы". В случае если параметр "имя_формы" опущен, то выдается диалоговое окно со списком всех доступных для текущей базы данных формы. Аналогична @Command( [ViewSwitchForm] ) за тем лишь исключением, что выполняется немедленно в формуле, а не после всех остальных команд.



@Command( [FileSave] )

Область применения: документ или элементы дизайна (форма/подформа, вид/папка, навигатор и т.д.) должны находиться в режиме редактирования. Можно использовать в Web-приложениях при условии, что у базы установлено свойство "Web access: Use JavaScript when generating pages" (использовать Javascript при создании Web-страниц).

Выполняет команду File -> Save (Файл - Сохранить).

В Web-приложениях, если в свойствах БД поднят флаг "Web access: Use JavaScript when generating pages" (использовать Javascript при создании Web-страниц) и за командой [FileSave] следует команда [FileCloseWindow] или [CloseWindow], то такая связка транслируется как Submit формы.

Команда часто применяется в акциях формы для сохранения редактируемого документа.

Пример 1. При использовании в акции формы сохраняет текущий редактируемый документ.

@Command( [FileSave] )

Пример 2. При использовании в кнопке формы в Web-приложении организует действие типа Submit формы. У БД должен быть поднят флаг поднят флаг "Web access: Use JavaScript when generating pages".

@Command([FileSave]);

@Command([CloseWindow])

@Command( [FileCloseWindow] )

Область применения: можно использовать в Web-приложениях при условии, что у базы установлено свойство "Allow Javascript on the Web" (использовать Javascript при создании Web-страниц). Не закрывает окно с рабочим пространством. Всегда выполняется последней в формуле.

Закрывает текущее окно LN, за исключением главного окна.

В случае если в окне присутствует не сохраненный отредактированный документ или элемент дизайна выдает диалоговое окно с вопросом о сохранении изменений.

Команда достаточно часто применяется в приложениях в акциях форм, как самостоятельно, так и в паре с командой [FileSave]. В Web-приложениях, если команда предваряется командой [FileSave], то такая конструкция транслируется как Submit формы.

J @Command( [CloseWindow] )

Область применения: можно использовать в Web-приложениях при условии, что у базы установлено свойство "Allow Javascript on the Web" (использовать Javascript при создании Web-страниц). Не закрывает окно с рабочим пространством.



Закрывает текущее окно LN, за исключением главного окна. Аналогична @Command( [FileCloseWindow] ) за тем лишь исключением, что выполняется немедленно в формуле, а не после всех остальных команд.

J @Command( [EditClear] )

Область применения: в R 6 всегда выполняется последней в формуле. Для корректной работы необходимо выполнения одного из условий:

в виде/папке документ(ы) должны быть выделены (помечены или на документе стоит световой маркер) или документ должен находиться в режиме редактирования; документ должен находиться в режиме редактирования, и данные для удаления (текст, присоединенные файлы, объекты и т.д.) должны быть выделены. В этом контексте нельзя использовать команду следом за командой [EditGotoField]; элементы дизайна (форма, подформа, вид, папка и т.д.) должны находиться в режиме редактирования и данные для удаления (поля, столбцы и т.д.) должны быть выделены; в рабочем пространстве иконки баз данных должны быть выделены. Выполняет команду меню Edit - Clear (Правка - Очистить).

Соответственно для пунктов области применения удаляет (устанавливает/снимает пометку об удалении для документов) выбранные документы, выделенный фрагмент в документе или элементе дизайна, находящихся в режиме редактирования, или иконку баз данных (без удаления самой базы данных).

Применять команду в Web-приложениях можно только в контексте удаления текущего (а не помеченных) документа. Нельзя использовать в Web-приложениях в акциях видов/папок, только в акциях формы.

Часто применяется для удаления (установки/снятия пометки на удаление) текущих документов.

Обратите ВНИМАНИЕ!!!, что в R 6 (в отличие от предыдущих версий, включая R 5) всегда выполняется последней в формуле.

Пример. При использовании в формуле акции вида/папки устанавливает/снимает пометку на удаление для выбранных документов.

@Command( [EditClear] )

J @Command( [Clear] )

Область применения: необходимо выполнения одного из условий:

в виде/папке документ(ы) должны быть выделены (помечены или на документе стоит световой маркер) или документ должен находиться в режиме редактирования;


документ должен находиться в режиме редактирования, и данные для удаления (текст, присоединенные файлы, объекты и т.д.) должны быть выделены. В этом контексте нельзя использовать команду следом за командой [EditGotoField]; элементы дизайна (форма, подформа, вид, папка и т.д.) должны находиться в режиме редактирования и данные для удаления (поля, столбцы и т.д.) должны быть выделены; в рабочем пространстве иконки баз данных должны быть выделены. Выполняет команду меню Edit - Clear (Правка - Очистить). Аналогична @Command( [EditClear] ) за тем лишь исключением, что выполняется немедленно в формуле, а не после всех остальных команд.

@Command( [MoveToTrash] )

Область применения: работает в акциях видов и формы В Web-приложениях работает только в акциях видов, у которых установлено либо свойство Use applet in the browser (использовать апплет при отображении вида в Web), либо Allow selection of documents (разрешить выделение документов) в этом контексте помечает документ к удалению, но не удаляет его.

По действию аналогична команде [EditClear]. Помечает к удалению текущий (выделенные) документы.

В клиенте Notes может применяться как в акциях видов/папок, так и акциях форм. Основное предназначение команды для использования в Web-приложениях. К сожалению, документация на команду оставляет желать лучшего. Далее идет информация, полученная из личного опыта.

В Web-приложениях команда корректно работает только в акциях видов (но не формы), и только для видов, у которых  на закладке Advanced установлено либо свойство Use applet in the browser (использовать апплет при отображении вида в Web), либо Allow selection of documents (разрешить выделение документов).

В первом случае (вид отображается апплетом) помечаются к удалению текущий либо выбранные документы. Во втором случае (вид отображается с возможностью выбора документов) - только выбранные документы. Повторное применение команды в обеих случаях к документам с отметкой на удаление снимает эту отметку.

Для реального удаления документов, помеченных к удалению, можно в другой акции применить команду [EmptyTrash]. Совместное применение в одной формуле [MoveToTrash] и [EmptyTrash] работает в R 6.0.1 для видов с установленным свойством Allow selection of documents, но не работает для апплетов вида. В последнем случае никаких действий не выполняется.



Пример. Вид имеет свойство Allow selection of documents, для пометки на удаление используется акция вида с формулой:

@Command( [MoveToTrash] )

@Command( [EmptyTrash] )

Область применения: без ограничений.

Удаляет документы из предопределенной папки ($Trash) и обновляет индекс вида.

С версии 5 с помощью этой команды можно также программно воздействовать на апплеты видов. Данную команду удобно использовать совместно с [EditClear] для немедленного удаления документов из базы. Также можно использовать ее в акции папки ($Trash) для очистки корзины.

Пример. Данная формула при использовании ее в акции вида и в случае наличия в базе данных предопределенной папки ($Trash) помечает выделенные документы к удалению, и сразу их удаляет из базы данных.

@Command( [EditClear] );

@Command( [EmptyTrash] )

@Command( [FilePrint]; "число_копий";

    "начальная_страница"; "конечная_страница";

    "черновик"; "печать_вида"; "форма";

    "разделитель_страниц"; "нумерация";

    "дата_начала"; "дата_окончания" )

Область применения: вид/папка должны быть открыты, или документ должен находиться в режиме чтения/редактирования.

Печатает текущий/выбранные документы или содержимое вида/папки целиком.

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

При использовании команды без параметров выдает диалоговое окно File Print (для Macintosh диалоговое окно выбора принтера).

Параметр "число_копий" может принимать значения "" или "N". Соответствует числу выводимых на печать копий.

Параметры "начальная_страница" и "конечная_страница" могут принимать значения "" или "N". Позволяют осуществить вывод на печать только определенных листов результирующего документа.



"Черновик" может принимать значения "draft" (соответствует черновой печати) или "". Определяет качество печати.

Аргумент "печать_вида" при значении "printview" осуществляет печать содержимого вида/папки, при значении "" в виде печатаются выбранные документы. При печати открытого документа данный аргумент игнорируется.

"Форма" определяет имя формы, по которой будут печататься документы из вида/папки. При печати открытого документа данный аргумент игнорируется.

"Разделитель_страниц" определяет при печати нескольких документов, как они будут отделены друг от друга. При значении "pagebreak" указывает, что каждый документ будет начинаться с новой страницы, при "line" разделителем документов будет пустая строка. При печати открытого документа данный аргумент игнорируется.

"Нумерация" определяет нумерацию страниц в результирующем документе. При значении "resetpages" для каждого документа будет своя нумерация страниц, при пустой строке будет сквозная нумерация. При печати открытого документа данный аргумент игнорируется.

Параметры "дата_начала" и "дата_окончания" применяются только при печати содержимого вида, который имеет календарный стиль. Они определяют с какой и по какую дату печатать содержимое представления. При задании им значений пустой строки даты определяются из первого и последнего документа вида.

Пример 1. При использовании в акции формы печатает текущий документ.

@Command( [FilePrint]; "" );

Пример 2. При использовании в акции вида/папки печатает соответственно содержимое вида/папки.

@Command( [FilePrint]; ""; ""; ""; ""; "printview" )

J @Command( [Folder]; "папка"; "флаг")

Область применения: документ должен быть открыт, либо документы выделены в виде. Документ(ы) должен быть уже сохранен на диске (не новый документ). В R 6 всегда выполняется последней в формуле.



Копирует или копирует с удаление документ(ы) в папку.

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

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

"Флаг" определяет режим копирование/перемещение, при "1" выполняется соответственно перемещение, при "0" - копирование.

Начиная с пятой версии Domino, в дополнении к команде [Folder] можно пользоваться функцией @AddToFolder. Учтите только, что она работает только с текущим, но не выделенными документами.

В версии 5 и выше с помощью команды [Folder] можно также программно воздействовать на апплеты видов.

Пример 1. При использовании в акции папки перемещает выбранные документы из текущей папки в папку "Moscow".

@Command( [Folder]; "Moscow"; "1" )

Пример 2. При отборе документов с использованием полнотекстового индекса, при отображении в виде/папке пропадают категории. Для отображения отобранных документов с категориями можно воспользоваться нижеследующей формулой, применив ее, например, в кнопке панели инструментов. Формула сначала выделяет все отобранные документы, а затем копирует их в папку "Moscow", имеющую тот же дизайн, что и у текущего вида/папки и переходит в нее.

@Command( [EditSelectAll] );

@Command( [Folder]; "Moscow"; "0" );

@Command( [OpenView]; "Moscow" )

J @Command( [FolderDocuments]; "папка"; "флаг")

Область применения: документ должен быть открыт, либо документы выделены в виде. Документ(ы) должен быть уже сохранен на диске (не новый документ).

Копирует, или копирует с удаление документ(ы) в папку. Аналогична @Command( [Folder] ) за тем лишь исключением, что выполняется немедленно в формуле, а не после всех остальных команд.



@Command( [RemoveFromFolder] )

Область применения: в папке документ(ы) должны быть выделены ( помечены или на документе стоит световой маркер) или документ должен находиться в режиме чтения/редактирования.

Удаляет текущий документ(ы) из текущей папки.

В случае, когда формула состоит из одной команды [RemoveFromFolder], предпочтительней пользоваться предопределенными акциями формы или папки.

С версии 5 эта команды можно использоваться для программного воздействия на апплеты видов.

@Command( [EditCopy] )         @Command( [EditCut] )

Область применения: необходимо выполнения одного из условий:

в виде/папке документ(ы) должны быть выделены (помечены или на документе стоит световой маркер); документ должен находиться в режиме редактирования или чтения, и данные для копирования (текст, присоединенные файлы, объекты и т.д.) должны быть выделены; элементы дизайна (форма, подформа, вид, папка и т.д.) должны находиться в режиме редактирования, и данные для копирования (поля, столбцы и т.д.) должны быть выделены. Выполняют команды меню для [EditCopy] - Edit - Copy (Правка - Копировать), и для [EditCut] - Edit - Cut (Правка - Вырезать).

Соответственно для пунктов области применения копируют в буфер обмена ([EditCut] копирует с удалением) выбранные документы, или выделенный фрагмент в документе или элементы дизайна, находящихся в режиме редактирования.

Пример. При использовании в формуле акции вида/папки копирует в буфер обмена выбранные в текущей базе данных документы, и затем вставляет их в новую локальную базу "My_sec.nsf", открывая ее при этом по виду "View1".

@Command( [EditCopy] );

@Command( [FileOpenDatabase]; "" : "My_sec.nsf";

   "View1" );

@Command( [EditPaste] )

@Command( [EditPaste] )

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



Выполняет команду Edit - Paste (Правка - Вставить). Соответственно либо вставляет в вид/ папку скопированные ранее документы, либо вставляет информацию в поля, либо вставляет элементы дизайна.

@Command( [EditSelectAll] )

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

Выполняет команду Edit - Select All (Правка - Выделить все).

Для документа находящегося в режиме чтения, команда выделяет все содержимое формы, включая поля, статичный текст, графику и т.д.

Для документа находящегося в режиме редактирования, команда выделяет все содержимое текущего поля.

Для вида/папки выделяются все входящие в них документы.

Для формы/подформы, находящихся в режиме редактирования, выделяются все элементы дизайна, включая области размещения (в документации сказано, что области размещения не выделяются).

Для листа рабочего пространства выделяются все находящиеся на нем иконки баз данных.

Пример 1. Формула, при использовании ее в акции вида/папки, помечает к удалению все находящиеся соответственно в виде/папке документы.

@Command( [EditSelectAll] );

@Command( [EditClear] );

Пример 2. При отборе документов с использованием полнотекстового индекса, при отображении в виде/папке пропадают категории. Для отображения отобранных документов с категориями можно воспользоваться нижеследующей формулой, применив ее, например, в кнопке панели инструментов.

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

@Command( [EditSelectAll] );

@Command( [ViewShowOnlySelected] );

@Command( [ViewShowOnlySearchResults] );

@Command( [EditSelectByDate] )

Область применения: вид/папка должны быть открыты в текущем окне.



Выдает диалоговое окно отбора документов по дате (Select by Date).

В диалоговом окне можно определить интервал дат и тип даты или создания, или последнего изменения документов. После нажатия клавиши Ok помечаются документы, удовлетворяющие введенным условиям.

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

@Command( [EditSelectByDate] );

@Command( [EditCut] );

@Command( [FileOpenDatabase]; "" : "Archive.nsf";

    "View1" );

@Command( [EditPaste] )

@Command( [EditDeselectAll] )

Область применения: необходимо выполнения одного из условий:

в виде/папке документы должны быть выделены; документ должен находиться в режиме редактирования или чтения, и данные для снятия с них отметки выделения (текст, присоединенные файлы, объекты и т.д.) должны быть выделены; элементы дизайна (форма, подформа, вид, папка и т.д.) должны находиться в режиме редактирования, и данные для копирования (поля, столбцы и т.д.) должны быть выделены; в рабочем пространстве иконки баз данных должны быть выделены. Выполняет команду меню Edit - Deslect All (Правка - Снять все выделение). Снимает все выделения в перечисленных в области применения объектах.

@Command( [ToolsMarkAllRead] )

@Command( [ToolsMarkAllUnread] )

Область применения: документ должен быть открыт в режиме чтение/редактирование, или в текущем окне должен быть открыт вид/папка.

Помечает все документы в базе данных для команды [ToolsMarkAllRead] соответственно как прочтенные, а [ToolsMarkAllUnread] - как непрочтенные.

Результат работы команд “виден” только в случае, если разработчики предусмотрели возможность отображения непрочтенных документов.

@Command( [ToolsMarkSelectedRead] )

Область применения: в текущем окне должен быть открыт вид/папка, и документы должны быть помечены, или на документе стоит световой маркер.

Помечает текущий или выбранные документы в базе данных как прочтенные.

Результат работы команд “виден” только в случае, если разработчики предусмотрели возможность отображения непрочтенных документов.

@Command( [ToolsMarkSelectedUnread] )

Область применения: в текущем окне должен быть открыт вид/папка, и документы должны быть помечены, или на документе стоит световой маркер, или документ должен быть открыт в режиме чтения/редактирование.

Помечает текущий или выбранные документы в базе данных как непрочтенные.


Команды для работы с видами и папками


@Command( [ViewChange]; "вид" )

Область применения: в R 6 всегда выполняется последней в формуле. Вид/папка должны быть открыты в текущем окне. Может использоваться в Web-приложениях с обязательным указанием второго параметра.

Осуществляет переход в указанный вид/папку текущей базы данных.

Аргумент "вид" задает имя или алиас вида/папки, если он опущен, то выдается диалоговое окно для определения требуемого вида/папки.

В отличие от [OpenView], команда [ViewChange] всегда переключается в вид/папку только в текущем окне.

Пример. Команда переходит в вид "View1" текущей базы данных.

@Command( [ViewChange]; "View1" )

J @Command( [SwitchView]; "вид" )

Область применения: вид/папка должны быть открыты в текущем окне. Может использоваться в Web-приложениях с обязательным указанием второго параметра.

Осуществляет переход в указанный вид/папку текущей базы данных. Аналогична @Command( [ViewChange] ) за тем лишь исключением, что выполняется немедленно в формуле, а не после всех остальных команд.

Аргумент "вид" задает имя или алиас вида/папки, если он опущен, то выдается диалоговое окно для определения требуемого вида/папки.

@Command( [ViewCollapse] )

@Command( [ViewExpand] )

@Command( [ViewExpandWithChildren] )

Область применения: вид/папка должны быть открыты в текущем окне. Можно использовать в Web-приложениях.

Для текущей строки-категории команда [ViewCollapse] соответственно свертывает все категории и документы ниже ее, [ViewExpand] раскрывает один уровень категории или документов ниже ее, а [ViewExpand] раскрывает все уровни категории или документов ниже ее.

С версии 5 с помощью этих команд можно также программно воздействовать на апплеты видов.

@Command( [ViewCollapseAll] )

@Command( [ViewExpandAll] )

Область применения: вид/папка должны быть открыты в текущем окне. Можно использовать в Web-приложениях.

Команда [ViewCollapseAll] соответственно свертывает, а [ViewExpandAll] раскрывает все категории и документы в текущем виде/папке.


С версии 5 с помощью этих команд можно также программно воздействовать на апплеты видов.

@Command( [ViewShowOnlyCategories] )

Область применения: вид/папка должны быть открыты в текущем окне.

Отображает в виде только категории без документов. Работает как переключатель.

@Command( [ViewShowOnlySearchResults] )

Область применения: вид/папка должны быть открыты в текущем окне. Поиск с использованием полнотекстового индекса должен быть произведен.

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

@Command( [ViewShowOnlySelected] )

Область применения: вид/папка должны быть открыты в текущем окне.

Отображает в виде только выбранные документы. Работает как переключатель.

@Command( [ViewShowOnlyUnread] )

Область применения: вид/папка должны быть открыты в текущем окне.

Отображает в виде только непрочтенные документы. Работает как переключатель.

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

@Command( [EditSelectAll] );

@Command( [ToolsMarkSelectedUnread] );

@Command( [ViewShowOnlySearchResults] );

@Command( [ViewShowOnlyUnread] );


Команды обновления отображаемой информации


J @Command( [ReloadWindow] )

Область применения: в R 6 всегда выполняется последней в формуле. Работает в формулах акций форм и кнопок. В акциях видов для клиента Notes команда работает только в случае, если вид входит в набор фреймов. Может использоваться в Web-приложениях.

"Перезагружает" или обновляет содержимое текущего окна LN. Для набора фреймов обновляет содержимое всех входящих в него фреймов.

J @Command( [RefreshWindow] )

Область применения: работает в формулах акций форм и кнопок. В акциях видов для клиента Notes команда работает только в случае, если вид входит в набор фреймов. Может использоваться в Web-приложениях.

"Перезагружает" или обновляет содержимое текущего окна LN. Для набора фреймов обновляет содержимое всех входящих в него фреймов. Аналогична @Command( [ReloadWindow] ) за тем лишь исключением, что выполняется немедленно в формуле, а не после всех остальных команд.

J @Command( [RefreshFrame]; "фрейм" )

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

"Перезагружает" или обновляет содержимое указанного "фрейма". Если перед командой [RefreshFrame] следует функция @SetTargetFrame, то значение параметра "фрейм" игнорируется, и осуществляется обновление фрейма, заданного функцией @SetTargetFrame. В рамках клиента Notes, если параметр "фрейм" опущен и функция @SetTargetFrame в формуле отсутствует, то [RefreshFrame] не выполняет никаких действий. Если команда выполняется во вложенном наборе фреймов с одноименными фреймами, на один из которых указывает параметр "фрейм", то обновление осуществляется только для одноименного фрейма самого верхнего уровня.

В Web-приложениях команда обновляет только текущий фрейм, при этом игнорируется параметр "фрейм". Функция @SetTargetFrame не оказывает влияния на команду [RefreshFrame] в Web-приложениях.

Пример. Команда, примененная в кнопке страницы, обновляет фрейм с именем «Right» для набора фреймов, отображаемых в клиенте Notes.


@Command( [RefreshParentNote] )

@Command( [ToolsRefreshAllDocs] )

Область применения: в текущем окне должен быть открыт вид/папка.

Перевычисляет все формулы во всех документах текущего вида/папки и сохраняет изменения.

Следует обратить внимание на область применения команды, исходя из определения, она напрямую не работает в формулах, входящих в форму (в частности, в акциях формы).

Пример. Формула, используемая в акции формы, сначала сохраняет текущий документ. Затем открывает вид "View1" и обновляет все документы в нем.

@Command( [FileSave] );

@Command( [OpenView]; "View1" );

@Command( [ToolsRefreshAllDocs] );

@Command( [ToolsRefreshSelectedDocs] )

Область применения: в текущем окне должен быть открыт вид/папка, хотя бы один документ должен быть выделен или на документе должен стоять световой маркер.

Перевычисляет все формулы в текущем или выделенных документах текущего вида/папки и сохраняет изменения.


Команды открытия объектов


@Command( [FileOpenDatabase]; "сервер" :

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

@Command( [FileOpenDatabase]; "сервер" :

     "база_данных"; "навигатор";

     "окно_навигатора"; "окно"; "флаг" )

Область применения: нельзя применять в формулах диалогового окна. Можно использовать в Web-приложениях при условии, что параметр "сервер" есть пустая строка. Если используется синтаксис с третьим параметром "вид", то следующей командой в формуле обязательно должна быть [OpenDocument].

Открывает указанную базу данных с использованием заданного вида или навигатора.

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

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

Параметр "база_данных" задает имя файла базы данных. Если он:

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

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

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

"Ключ" задает значение, которое должно соответствовать значению в первой отсортированной колонке вида. В случае такого соответствия на первый такой документ устанавливается световой маркер вида. Если параметр опущен, то никакой документ не выбирается.


При задании параметру "окно" значения "1" указанная база будет открываться в новом окне, даже в случае, если она уже была открыта с использованием указанного вида.

Параметр "флаг" при значении "1" запрещает добавлять иконку для открываемой базы на рабочее пространство, при условии, что ее там раньше не было.

Аргумент "навигатор" задает имя навигатора, которые должны отображаться при открытии базы данных, "окно_навигатора"

равное "1" заставляет его открываться в полноэкранном режиме.

Пример 1. Команда открывает локальную базу данных "D:\Book\123\Glossary.nsf" по виду с алиасом "Rusterm", который в первой отсортированной колонке имеет документ со значением "Вид личный".

@Command( [FileOpenDatabase]; "" :

   "D:\\Book\\123\\Glossary.nsf"; "Rusterm";

   "Вид личный" )

Пример 2. Открывается эта же база, но по навигатору "Main", который открывается в полноэкранном режиме.

@Command( [FileOpenDatabase]; "" :

   "D:\\Book\\123\\Glossary.nsf"; "Main"; "1" )

@Command( [FileOpenDBRepID];

     "идентификатор_реплики"; "сервер"; "вид";

     "ключ"; "окно"; "флаг" )

@Command( [FileOpenDBRepID];

     "идентификатор_реплики"; "сервер";

     "навигатор"; "окно_навигатора"; "окно";

     "флаг" )

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

Открывает базу, указанную идентификатором реплики, с использованием заданного вида или навигатора.

Все параметры, за исключением ключевого слова, являются необязательными.

Параметры "вид", "ключ", "окно", "флаг", "навигатор"

и "окно_навигатора" имеют такой же синтаксис и семантику, что и в команде [FileOpenDatabase].



Параметр "идентификатор_реплики"

определяет идентификатор реплики нужной базы данных, "сервер"

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

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

@Command( [OpenDocument]; "флаг"; UNID;

                        "ширина_окна" : "высота_окна" )

Область применения: вид/папка базы данных должны быть открыты в текущем окне. В открытом виде/папке должен присутствовать открываемый документ.

Открывает документ на чтение/редактирование по его универсальному идентификатору.

Все параметры, кроме ключевого слова, необязательны.

Параметр "флаг" при значении "1" вызывает требуемый документ в режиме редактирования, при "0" - в режиме чтения. Значение по умолчанию "0".

Аргумент UNID задает универсальный идентификатор документа. В случае если он опущен, то открывается текущий документ в виде/папке.

Параметр "ширина_окна" : "высота_окна"

задает в дюймах соответственно высоту и ширину окна, в котором будет создаваться документ. Параметр не имеет смысла, когда выбран MDI (Multiple Document Interface многооконный интерфейс в рамках главного окна) интерфейс, и окно имеет установленное свойство - максимальный размер. В случае если этот параметр опущен или равен нулю, то окно имеет размеры, сохраненные последним пользователем.

Следует обратить особое внимание на область применения команды, исходя из определения, она напрямую не работает в формулах, входящих в форму (в частности, в акциях формы).

В Web-приложениях [OpenDocument] может быть использована исключительно без параметров UNID и "ширина_окна" : "высота_окна", и только если ей предшествует команда [OpenView] или [FileOpenDatabase] с определенным набором параметров:

для [FileOpenDatabase] (см. стр. 254) применим только вариант синтаксиса с параметром "вид", но не "навигатор", причем должен быть еще задан параметр "ключ", и "сервер" в виде пустой строки. Остальные параметры должны быть опущены;



для [OpenView] (см. стр. 258) должны быть заданы параметры "вид" и "ключ". Остальные параметры должны быть опущены.

В обоих случаях параметр "вид"

должен быть задан явно (т.е. не в виде пустой строки), а в качестве "ключа"

может быть использован псевдоидентификатор $first, который соответствует первому документу в виде.

Пример 1. В виде с именем "View1" четвертый столбец определяется по формуле @Text( @DocumentUniqueID ), а первый столбец сортировочный. Тогда формула, примененная в акции вида, сначала запросит значение ключа из первой колонки вида, затем найдет по ключу UNID этого документа, и, наконец, откроет этот документ на редактирование.

ch := @Prompt( [OkCancelEdit]; "Введите искомое

   значение"; "Введите значение для поиска документа";

   "" );

ch1 := @DbLookup( "" : "NoCache"; ""; "View1"; ch; 4 );

@Command( [OpenDocument]; "1"; ch1 )

Пример 2. В Web-приложении следующая формула открывает первый документ в виде People базы данных Domino Directory текущего сервера:

@Command([FileOpenDatabase]; "" : "names.nsf"; "People"; "$first");

@Command([OpenDocument]; "0")

Пример 3. В текущей БД имеется скрытый вид «(By UNID)», первая колонка которого имеет сортировку и определяется по формуле @Text( @DocumentUniqueID ). В Web-приложении формула, примененная в акции формы, откроет на редактирование родительский документ по отношению к текущему.

@Command([OpenView]; "(By UNID)"; @Text( $Ref ));

@Command([OpenDocument]; "1")

@Command( [OpenView]; "вид"; "ключ"; "окно" )

Область применения: БД должна быть открыта или ее иконка должна быть выделена в рабочем пространстве. Можно использовать в Web-приложениях.

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



Аргумент "вид" задает имя или алиас вида/папки, если он опущен, то открывается либо вид по умолчанию, либо вид, которым последний раз открывал текущий пользователь. Параметр "ключ"

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

При задании параметру "окно"

значения "1" вид будет открываться в новом окне, даже в случае, если он уже был открыт в другом окне.

Для использования команды в Web-приложениях параметр "окно" должен быть опущен, а "ключ"

может иметь значение псевдоидентификатора $first, который соответствует первому документу в виде.

Пример. Формула, при использовании в акции формы, в процессе выполнения открывает вид для того, чтобы возможно стало выполнить команду [OpenDocument] (см. пример к этой команде).

ch := @Prompt( [OkCancelEdit]; "Введите искомое

   значение"; "Введите значение для поиска документа";

   "" );

ch1 := @DbLookup( "" : "NoCache"; ""; "View1"; ch; 4 );

@Command( [OpenView]; "View1" );

@Command( [OpenDocument]; "1"; ch1 )

@Command( [OpenFrameset];

      "имя_набора_фреймов" )

Область применения: предназначена для использования в акциях формы и видов. Можно использовать в Web-приложениях.

Открывает определенный набор фреймов текущей базы данных.

Параметр "имя_набора_фреймов"

обязательный. Он определяет имя или алиас открываемого набора фреймов.

Пример. Команда, используемая в акции вида, открывает набор фреймов с именем "Main" для текущей базы данных.

@Command( [OpenFrameset]; "Main" )

@Command( [OpenNavigator]; "навигатор";

          "окно_навигатора" )

Область применения: БД должна быть открыта или ее иконка должна быть выделена в рабочем пространстве. Можно использовать в Web-приложениях при опущенном третьем параметре.



Открывает указанный навигатор в текущей базе данных.

Аргумент "навигатор" задает имя или алиас навигатора, а "окно_навигатора" равное "1" заставляет его открываться в полноэкранном режиме.

@Command( [OpenPage]; "страница" )

Область применения: БД должна быть открыта или ее иконка должна быть выделена в рабочем пространстве. Предназначена для использования в акциях формы и видов. Можно использовать в Web-приложениях.

Открывает определенную страницу текущей базы данных.

Параметр "страница" обязательный. Он определяет имя или алиас открываемой страницы.

Пример. Команда, используемая в акции вида, открывает страницу с именем "First" для текущей базы данных.

@Command( [OpenPage]; "First" )

@Command( [HelpAboutDatabase] )

@Command( [HelpUsingDatabase] )

Область применения: БД должна быть открыта или ее иконка должна быть выделена в рабочем пространстве.

Открывают соответственно документы "О базе данных" и "Об использовании базы данных" для текущей базы данных.

Данные команды иногда применяются в приложениях в формулах навигаторов и акций.

@Command( [OpenHelpDocument]; "сервер" :

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

@Command( [OpenHelpDocument];

     [тип_справочника]; "вид"; "ключ" )

Область применения: справочная БД должна быть одна на сервере или в локальной директории. Первый столбец указанного вида должен быть сортировочным. Можно использовать в Web-приложениях в формулах кнопок.

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

Все параметра за исключением ключевого слова необязательны.

В первом варианте явно задается местоположение справочной базы данных. Параметр "сервер" задает имя сервера, если это пустая строка, то считается, что справочная БД расположена локально. "База_данных"

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



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

[ClientHelp] - для справочной базы о программном обеспечении рабочей станции;

[DesignerHelp] - для справочной базы о программном обеспечении разработчика приложений;

[AdminHelp] - для справочной базы о программном обеспечении администратора системы.

Аргумент "вид" задает имя или алиас вида/папки, которые должны открыться первыми при открытии базы данных.

"Ключ" задает значение, которое должно соответствовать значению в первой отсортированной колонке вида. В случае такого соответствия на первый такой документ устанавливается световой маркер вида.

Пример. Формула запрашивает у пользователя тип справочной базы, затем интересующий его термин, и после этого выдает справочную информацию по нему из соответствующей базы по индексу "Index".

Ch := @Prompt( [OkCancelCombo]; "Выбор базы";

   "Выберите справочную базу данных.";

   "Справка по клиенту"; "Справка по клиенту" :

   "Справка по дизайнеру":

   "Справка по администрированию" );

ch1 := @Prompt( [OkCancelEdit]; "Введите искомое

   значение"; "Введите значение для поиска  документа";

   "" );

@If( ch = "Справка по клиенту";

   @Command( [OpenHelpDocument];[ClientHelp];

   "Index"; ch1 ); ch = "Справка по дизайнеру";

   @Command( [OpenHelpDocument]; [DesignerHelp];

   "Index"; ch1); @Command( [OpenHelpDocument];

   [AdminHelp]; "Index"; ch1 ))

@Command( [FileExit] )

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

Выполняет команду File - Exit (Файл - Выход из Notes).

В случае если в каком-либо окне присутствует не сохраненный отредактированный документ или элемент дизайна выдает диалоговое окно с вопросом о сохранении изменений.

В приложениях данная команда иногда применяется в главном полноэкранном навигаторе для выхода в операционную систему.

J @Command( [ExitNotes] )

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

Выполняет команду File - Exit (Файл - Выход из Notes). Аналогична @Command( [FileExit] ) за тем лишь исключением, что выполняется немедленно в формуле, а не после всех остальных команд.


Команды запуска приложений


@Command( [ToolsRunMacro]; "имя_агента" )

Область применения: БД должна быть открыта или ее иконка должна быть выделена в рабочем пространстве. Всегда выполняется последней в формуле, за исключением Web-приложений, где все @-команды выполняются последовательно.

Выполняет в текущей базе указанного агента.

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

Пример 1. Формула запускает в текущей базе агента по имени "Proba".

@Command( [ToolsRunMacro]; "Proba" )

Пример 2. Формула запускает в текущей базе данных скрытого агента "MyHidden".

@Command( [ToolsRunMacro]; "(MyHidden)" )

J @Command( [RunAgent]; "имя_агента" )

Область применения: БД должна быть открыта или ее иконка должна быть выделена в рабочем пространстве.

Выполняет в текущей базе указанного агента. Аналогична @Command( [ToolsRunMacro] ) за тем лишь исключением, что выполняется немедленно в формуле, а не после всех остальных команд.

@Command( [Execute]; "имя_файла_приложения";

                      "аргументы_командной_строки" )

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

Запускает внешнее приложение операционной системы.

Параметр "аргументы_командной_строки"

может быть как строкой, так и текстовым списком.

Пример 1. Команда, используемая в формуле акции формы, загружает стандартную программу калькулятора операционной системы Windows 95.

@Command( [Execute]; "C:\\Windows\\Calc.exe" )

Пример 2. Команда загружает текстовый процессор MS Word и подгружает в него два файла документов. Следует заметить, что когда третий аргумент в данной команде был текстовым списком, то загружался только первый файл.

@Command( [Execute];

   "C:\\MSOffice\\Winword\\Winword.exe";

   "D:\\Book\\Glava_06.doc D:\\Book\\Glava_07.doc" )



Константы


В формулах можно использовать константы трех типов: текстовые, числовые и типа дата-время. Список значений также может использоваться в качестве константы.

Текстовые

константы в формулах заключаются в двойные кавычки: "Text constant". В R 6 текстовые константы можно заключать в фигурные скобки. {Text constant}.

Чтобы многократно повторить один и тот же символ используйте функцию @Repeat.

Обратный слеш «\» внутри текстовой константы служит Esc-символом. Таким образом, если текст в константе, заключенной в двойные кавычки, должен содержать символы «"» или «\» перед ними нужно вставлять добавочный символ «\». В некоторых случаях после сохранения формулы с фигурными скобками, выступающими в качестве ограничителей текстовой константы, последние преобразуются к «\"».

Числовые

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

первый символ «+» или «-» определяет знак числа, соответственно положительное значение, или отрицательное;

целые числа состоят только из символов цифр, неразделенных пробелами;

нецелые числа могут быть представлены в обычной и математической нотации. Для обычной нотации десятичная точка может находиться перед, после или внутри последовательности символов цифр, неразделенных пробелами. Для математической нотации – число может содержать суффикс из символа «Е» и следующих за им чисел, определяющих показатель степени со знаком или без.

Например, 123, -123, 1.23, -0.123, 1.23E-12.

Дата-время

(Time-date) константы должны быть заключены в квадратные скобки. Например, [5:30], [30.3.93] или [30.3.93 5:30]. Формат представления даты и времени (порядок следования, разделители и т.д.) должен соответствовать стандартам, установленным в операционной системе. При использование сокращенного формата даты для года, например, [dd.mm.yy], если yy < 50 - считается, что это 20yy год, в противном случае 19yy год. Используйте полный формат даты для года, если это необходимо.

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

@Prompt( [OK]; "Проба"; @Text( [30.3.93 5:30]- [30.3.93 5:29] ));

выдаст окно со значением 60.



Лексические элементы формул


Каждый оператор формулы может состоять из:

переменных;

констант;

операторов выполнения операций (operators), не путать с операторами формул (statements);

встроенных @-функций;

ключевых слов.



Литература


1.                          Официальная документация компании IBM.

2.                          Изучение новых возможностей IBM Lotus Domino Designer 6, - М.: Светотон, 2003., 248 стр.

3.                          Н.Н. Ионцев, Е.В. Поляков, О.Г. Таранченко, Программирование в Lotus Domino R. 5: формулы и функции, язык LotusScript, встроенные классы LotusScript и Java, - М.: Светотон, 1999 г., 935 с.

4.                          Поляков Е.В., Средства разработки приложений в Lotus Domino R5: Domino Designer. – М. Светотон, 2002., 468 стр.

5.                          Карандин С., Колосов М., Поляков Е., Краткий справочник по разработке Web-приложений на платформе Lotus Domino R5. - М: Светотон, 2001., 336 стр.

6.                          Н.Н. Ионцев, В.К. Кулаков, В.А. Панов, LotuNotes R. 4: разработка приложений, язык LotusScript, встроенные классы, М.: Научная книга, 1996 г., 575 с.


КРАТКОЕ СОДЕРЖАНИЕ

1    Введение                                                                                                                     3

2    Синтаксис формул                                                                                                5

3    Лексические элементы формул                                                                  6


3.1   Переменные....................................................................................................... 6

3.1.1 Поля.................................................................................................................. 6

3.1.2 Предопределенные поля.................................................................... 8

3.1.3 Временные переменные..................................................................... 8

3.2   Константы........................................................................................................... 9

3.3   Операторы выполнения операций.................................................. 10

3.4   Порядок выполнения вычислений................................................. 14

3.5   Ключевые слова............................................................................................ 14

3.6   Функции.............................................................................................................. 17

3.6.1 Побочные эффекты............................................................................... 19

3.6.2 Ограничения применимости @-функций и команд, налагаемые списком управления выполнением (ECL)............................................................................... 20

3.6.3 Ограничения применимости @-функций и команд для Web-приложений              24

4    Как выполняются формулы                                                                        29

4.1   Порядок выполнения................................................................................ 29

4.2   Формулы, возвращающие значения................................................ 30

4.3   Формулы, выполняющие последовательность действий 31

4.4   Выполнение формул, содержащих вызовы @-команд........ 32

5    Обработка ошибок в формулах                                                                 35

6    Описание @-функций Domino                                                                      38



6.1   Функции - базовые конструкции языка формул...................... 38

6.2   Функции выполнения циклов.............................................................. 43

6.3   Функции определения и преобразования типов данных 48

6.4   Функции для работы со строками.................................................... 60

6.4.1 Определение вхождения подстроки в строку................... 62

6.4.2 Выделение и замена части строки............................................ 67

6.5   Функции для работы со значениями типа "дата-время".... 88

6.5.1 Функции, работающие с компонентами значения типа "дата-время"        93

6.6   Функции для работы с численными значениями.................. 98

6.7   Функции для работы со списками................................................. 100

6.8   Работа с переменными окружения............................................... 110

6.9   Установка значения временной переменной....................... 112

6.10 Функции для работы с текущим документом.......................... 113

6.10.1    Определения свойств, характеристик и состояния текущего документа      114

6.10.2    Операции с полями..................................................................... 123

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

6.11 Функции для работы с паролями.................................................... 135

6.12 Функции для работы с почтой.......................................................... 137

6.12.1    Функции, определяющие почтовые настройки........ 142

6.13 Работа с идентификаторами документов................................. 145

6.14 Получение информации из баз данных Domino..................... 149

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

6.14.2    @DbLookup - выбор из колонки или поля значений по ключу   154

6.15 Получение информации из баз данных, поддерживающих ODBC-драйверы                157

6.16 Функции для работы с видами.......................................................... 166



6.16.1    Функции, используемые в формулах отбора документов            169

6.16.2    Функции, используемые в формулах колонок........... 171

6.17 Функции, работающие с именами пользователей.............. 175

6.18 Функции, работающие с правами доступа............................... 181

6.19 Функции, работающие с профильными документами...... 190

6. 20 Функция выбора требуемого фрейма........................................... 192

6.21 Диалог с пользователем....................................................................... 193

6.22 Функции, определяющие тип и характеристики используемого программного обеспечения      214

6.23 Функции, используемые в Web-приложениях........................ 220

6.24 Информационные функции................................................................. 226

6.25 Функции для обработки ошибок...................................................... 231

7    Описание @-команд Domino                                                                       237

7.1   Команды для работы с текущим и выделенными документами           237

7.2   Команды открытия объектов............................................................. 254

7.3   Команды для работы с профильными документами.......... 262

7.4   Команды обновления отображаемой информации........... 263

7.5   Команды для работы с видами и папками................................ 266

7.6   Команды запуска приложений......................................................... 269

7.7   Команды для работы с почтой.......................................................... 270

8    Алфавитный список @-функций                                                            273

9    Алфавитный список @-команд                                                               313

10  Разработка тестовых приложений                                                      385

10.1 Простые операции с документами............................................... 385

10.1.1    Создание нового документа по форме........................... 385



10.1.2    Редактирование текущего документа............................. 385

10.1.3    Удаление документа.................................................................... 386

10.1.4    Печать документа и вида.......................................................... 386

10.1.5    Упражнение...................................................................................... 387

10.2 Формулы полей........................................................................................... 387

10.2.1    Упражнение...................................................................................... 388

10.3 Получения доступа к данным, находящимся вне текущего документа         389

10.3.1    Доступ к данным вида................................................................ 389

10.3.2    Наследование.................................................................................. 389

10.3.3    Упражнение...................................................................................... 390

10.3.4    Работа с профильными документами............................. 390

10.3.5    Упражнение...................................................................................... 390

10.3.6    Работа с переменными окружения.................................. 390

10.3.7    Упражнение...................................................................................... 390

10.4 Диалог с пользователем....................................................................... 390

10.4.1    Функция @Prompt.......................................................................... 390

10.4.2    Функция @DialogBox................................................................... 391

10.4.3    Функция @PickList......................................................................... 391

10.5 Формулы скрытия информации....................................................... 391

10.5.1    Формулы скрытия абзаца формы........................................ 391

10.5.2    Формулы скрытия акций формы и вида.......................... 392



10.5.3    Формулы скрытия столбцов вида и строк аутлайна 392

10.5.4    Упражнение...................................................................................... 392

10.6 Формулы работы с видами.................................................................. 392

10.6.1    Формула отбора документов................................................. 392

10.6.2    Формулы столбцов вида........................................................... 393

10.6.3    Наложения фильтра на вид..................................................... 396

10.7 Работа с почтой.......................................................................................... 397

10.8 Работа с именами пользователей................................................. 397

10.9 Работа с уровнями доступа............................................................... 397

10.10    Блокировка документов на редактирование.................... 397

10.11    Операции с папками......................................................................... 398

10.12    Функции, используемые в Web-приложениях................. 398

10.13    Формулы по месту применения................................................ 398

10.13.1      Формулы панели инструментов - Toolbar button 398

10.13.2      Формулы агентов...................................................................... 399

10.13.3      Формула секции с управляемым доступом........... 399

10.13.4      Формула заголовка окна...................................................... 399

10.13.5      Формулы гиперобъектов и всплывающих окон.. 399

10.13.6      Формулы формы вида/папки.............................................. 400

10.13.7      Формулы навигатора и области размещения....... 400

10.13.8      Недокументированные контексты формул............. 400

10.14    Новые функции и команды в R 6.5.1 по отношению к R 6.0.1                400

10.14.1      Работа с Instant Messaging................................................ 400

10.14.2      Остальные функции................................................................ 401

11  Литература                                                                                                             402


Наложения фильтра на вид


Рассмотреть синтаксис и описание функции @SetViewInfo (см. стр. 166). Продемонстрировать пример в видах Hotel и Calend. Обратите внимание на эффект снятия фильтра при переключении между разными типами видов (Календарный – Стандартный).

Самостоятельно реализовать в виде Отели наложение/снятия фильтра по стране.



Наследование


Демонстрация на примере форм Inherit, ForInherit и вида Inherit. Поля формы могут наследовать данные из текущего документа в момент создания нового документа. Включение режима наследования осуществляется в свойствах формы на закладке Defaults в секции On Create. В клиенте Notes наследование можно выполнять как на уровне вида, так и на уровне открытого документа. В Web-приложениях наследование работает только на уровне открытого документа, даже в случае когда вид отображается с помощью апплета.

В качестве приемника наследуемых значений лучше всего использовать редактируемые и вычисляемые при создании поля.



Недокументированные контексты формул


К сожалению в документах Where does this @function work? … не упоминаются некоторые контексты применения @-формул, которые отличаются от приведенных в документации. В частности, формулы вычисляемого текста, определения графического ресурса, строк аутлайна. Показать элементы дизайна. Сказать, что, например, в формулах вычисляемого текста не работает функция @Prompt.



Обработка ошибок в формулах


Синтаксические ошибки "отлавливаются" Domino при нажатии кнопки

, требующей принять изменения в формуле, либо при закрытии окна редактирования формулы. Сообщение об ошибке выводится либо в диалоговом окне (Рис. 5.1), либо в нижнем колонтитуле окна с формулой (Рис. 5.2). Затем в формуле выделяется фрагмент, вызвавший ошибку. Вот некоторые примеры:

No main or selection expression in formula (в формуле нет "главного" выражения) - случается, если последний оператор в формуле, которая по своему назначению должна возвращать значение (подробности в разделе "4.2"), не может этого делать (например, оператор с ключевым словом). Самое простое "формальное" решение такой проблемы - добавить в формулу в качестве последнего оператора константу "" (пустую строку).

Пример. В формуле поля Field1 (см. ниже), значение которого не важно, должно быть изменено значение поля Field2. В результате выполнения формулы поле Field2 получит значение NewValue, а поле Field1 - "".

FIELD Field2 := NewValue;

"";

An operator or semicolon was expected but non was encountered - здесь должен быть оператор (арифметический, логический и т. п.) или точка с запятой.

@If must have an odd number of arguments - функция @If должна иметь нечетное число аргументов.

Unknown [KeyWord] for @Function... - неизвестное ключевое слово в качестве аргумента функции.

Рис. 5.1 Сообщение о синтаксической ошибке: конец формулы достигнут ранее конца текстовой константы или константы типа дата/время

Рис. 5.2 Сообщение о синтаксической ошибке: неизвестное ключевое слово для @-функции: '[WindowCascade);@Prompt([OK]'

Ошибки во время выполнения формулы (Run-time) могут быть поделены на три группы:

Неожиданные ошибки проектирования, которые не должны встречаться пользователю. Например, если вызов функции содержит недостаточное число параметров, во время выполнения будет выведено сообщение: "Insufficient arguments for @function".

Ошибки проектирования, которые не отслеживает Domino, также не должны влиять на работу пользователя. Например, если вы пытаетесь показать с помощью @Prompt значение числового типа, @Prompt работает, но показывает пустое значение.


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

Для отладки Run-time ошибок в Domino не предусмотрен соответствующий механизм, аналогичный отладчику LotusScript. Предлагаемые пути решения:

для организации точек останова и вывода результирующих значений использовать функцию @Prompt, которую после успешной отладки удалить из тела формулы. Следует помнить, что @Prompt применим не везде (например, в формуле отбора документов). В этом случае предлагается записать отлаживаемую формулу в элемент дизайна, в котором функция @Prompt работает (например, кнопку-акцию или кнопку панели инструментов). После отладки - перенеси формулу в нужный вам объект дизайна;

в качестве альтернативы функции @Prompt, можно создать в форме поля, куда будут записываться промежуточные результаты выполнения формулы. После отладки удалить эти поля.

Следующие функции помогают обрабатывать ошибки периода выполнения:

@IsError( value ) - возвращает 1 (True), если значение value, которое содержится в поле или переменной, или получается в результате вычисления выражения, содержит ошибку;

@IfError( выражение1, выражение2 ) – возвращает значение выражения1, если выражение1 не содержит ошибки, и значение выражения2 или пустую строку, если в при вычислении выражения1 произошла ошибка;

@Error - генерирует ошибку, например, чтобы сделать "ошибочным" значение поля;

@Failure( message ) - показывает сообщение в окне при проверке значения поля (используется только в формулах проверки редактируемых полей);

@Success - всегда возвращает значение 1 (True) (используется только в формулах проверки редактируемых полей);

@Return( value ) - прерывает выполнение формулы и возвращает значение value, например, в случае положительного результата проверки на какую-либо ошибку.

Domino генерирует состояние ошибки в случае, когда пользователь вводит в поле значение, не соответствующего предусмотренного разработчиком типа данных. Например, в числовое поле вводится нечисловое значение. Ситуация ошибки генерируется при попытке сохранения такого документа. При этом выдается сообщение "Cannot convert text to a number" (не могу преобразовать текст в число). Разработчик может изменить текст сообщения с помощью функции @Failure, использую ее в формуле проверки значения поля.

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


Ограничения применимости @-функций и команд, налагаемые списком управления выполнением (ECL)


Список управления выполнением (ECL) влияет на работу ряда @-функций. Ниже приводится таблица, где по горизонтали перечисляются эти функции, а по вертикали указаны флаги доступа ECL. Если на пересечение соответствующей строки и столбца стоит символ "+", это говорит о том, что данная функция при отсутствии соответствующего флага выполняться не будет.

Функция

Доступ к текущей базе данных (Access to current database)

Доступ к переменным окружения (Access to environment variables)

Доступ к базам данных сторонних фирм (Access to non-Notes databases)

Доступ к внешним программам (Access to external programs)

Возможность отправки почты (Ability to send mail)

Доступ к ECL рабочей станции (Access to Workstation Security ECL)

Доступ на чтение к другим базам данных (Ability to read other database databases)

Доступ на модификацию к другим базам данных (Ability to modify other database)

@DbColumn

+

@DbColumn (ODBC)

+

@DbCommand

+

@DbLookup

+

@DbLookup (ODBC)

+

@DDEExecute

+

@DDEInitiate

+

@DDEPoke

+

@DDETerminate

+

@DeleteDocument

+

@DeleteField

+

@EditECL

+

@EditUserECL

+

ENVIRONMENT

+

@Environment

+

@GetProfileField

+

@MailSend

+

@RefreshECL

+

@SetDocField

+

@SetEnvironment

+

@SetProfileField

+

@Unavailable

+

@UpdateFormulaContext

+

+

+

@URLGetHeader

+

@URLOpen

+

<
Аналогичные ограничения существуют и для @-команд:

Команда

Доступ к файловой системе  ( Access to the file system)

Доступ к текущей базе данных (Access to current database)

Доступ к базам данных сторонних фирм (Access to non-Notes databases)

Доступ к коду внешних программ (Access to external code)

Доступ к внешним программам (Access to external programs)

Возможность отправки почты (Ability to send mail)

Возможность экспорта данных  (Ability to export data)

AdminSendMailTrace

+

AgentEnableDisable

+

AgentRun

+

AgentSetServerName

+

AgentTestRun

+

AttachmentDetachAll

+

AttachmentLaunch

+

Clear

+

DesignRefresh

+

EditClear

+

EditCopy

+

EditCut

+

EditDetach

+

EditInsertFileAttachment

+

EditInsertObject

+

EditOpenLink

+

EditPaste

+

EditPasteSpecial

+

EditUntruncate

+

EmptyTrach

+

ExchangeUnreadMarks

+

Execute

+

FileDatabaseCompact

+

FileExport

+

+

FileImport

+

FileOpenDatabase

+

FileOpenDbRepID

+

FilePrint

+

FileSave

+

FileSaveNewVersion

+

Folder

+

FolderDocuments

+

FolderMove

+

FolderRename

+

MailForward

+

MailForwardAsAttachment

+

MailRequestCrossCert

+

MailRequestNewName

+

MailRequestNewPublicKey

+

MailSend

+

MailSendCertificateRequest

+

MailSendEncryptionKey

+

MailSendPublicKey

+

ObjectOpen

+

OpenDocument

+

RemoveFromFolder

+

ReplicatorReplicateHigh

+

ReplicatorReplicateNext

+

ReplicatorReplicateSelected

+

ReplicatorReplicateWithServer

+

ReplicatorSendMail

+

ReplicatorSendReceiveMail

+

ReplicatorStart

+

RunAgent

+

+

RunScheduledAgents

+

+

SetCurrentLocation

+

ToolsCategorize

+

ToolsReplicate

+

ToolsRunBackgroundMacros

+

+

ToolsRunMacro

+

+

ToolsScanUnreadSelected

+

ViewRefreshUnread

+


Ограничения применимости @-функций и команд для Web-приложений


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

Функция

Комментарии

@Certificate

@DbCommand

В Web работает только с первым параметром "Domino"

@DDEExecute

@DDEInitiate

@DDEPoke

@DDETerminate

@DocMark

@DeleteDocument

@HardDeleteDocument

@DocLock

@DocChildren

@DocDescendants

@DocLevel

@DocNumber

@DocParentNumber

@DocSiblings

Работают только в формулах столбцов.

@IsCategory

В документации сказано, что в Web не работает, однако исходя из личного опыта – функция работает в колонках видов.

@IsExpandable

@Responses

@DialogBox

@PickList

@Prompt

@IsModalHelp

@GetPortsList

@GetFocusTable

@FontList

@Environment

@SetEnvironment

ENVIRONMENT

Для получения информации о пользовательских Web-переменных окружения необходимо использовать запросы к Common Gateway Interface (CGI) с предопределенными именами полей.

@MailSend

В Web не работают флаги [Encrypt] и [Sign].

@Domain

@MailDbName

@MailEncryptSavedPreference

@MailEncryptSendPreference

@MailSavePreference

@MailSignPreference

@IsAgentEnabled

@IsDocBeingMailed

@Unique

@URLGetHeader

@URLHistory

В документации сказано, что @Unique не поддерживается в Web-приложениях. Однако из опыта функция работает как в случае генерации случайных текстовых строк, так и при удалении из списка повторяющихся значений (правда, возможно не во всех контекстах)

@UserPrivileges

@UpdateFormulaContext

@Platform

Возвращает только платформу для сервера. Для того, чтобы различать пользователей Notes и Web используйте функцию @ClientType.

Аналогичные ограничения существуют и для @-команд. Большинство из них нельзя применять в Web-приложениях, т.к. @-команды ориентированы на интерфейс рабочей станции Lotus Notes. Исключение составляют команды:

[CalendarFormat]


[CalendarGoTo]

[Clear]

[CloseWindow]

[Compose]

[EditClear]

[EditDocument]

[EmptyTrash]

[FileCloseWindow]

[FileOpenDatabase]

[FileSave]

[Folder]

[FolderDocuments]

[MoveToTrash]

[NavigateNext]

[NavigateNextMain]

[NaviagtePrev]

[NavigatePrevMain]

[NavNext]

[NavNextMain]

[NavPrev]

[NavPrevMain]

[OpenDocument]

[OpenFrameset]

[OpenHelpDocument]

[OpenNavigator]

[OpenPage]

[OpenView]

[RefreshFrame]

[RemoveFromFolder]

[RunAgent]

[SwitchView]

[ToolsRunMacro]

[ViewChange]

[ViewCollapse]

[ViewCollapseAll]

[ViewExpand]

[ViewExpandAll]

[ViewRefreshFields]

[ViewShowSearchBar].

Некоторые из перечисленных выше команд (например, [ViewExpand] или [Folder]) могут использоваться при программировании под Web только в контексте апплетов видов.


Олучения доступа к данным, находящимся вне текущего документа


До настоящего момента мы получали данные только из текущего документа. Существуют возможности получения доступа к другим данным в рамках языка @-формул. Рассмотрим некоторые из них.



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


@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)))


Операции с папками


Рассмотреть синтаксис и описание функции @AddToFolder (см. стр. 133) и команд [Folder] (см. стр. 248), [FolderDocuments] (см. стр. 249), [RemoveFromFolder] (см. стр. 249) и [EditSelectAll] (см. стр. 251). Продемонстрировать пример с папкой Leningrad.

Самостоятельно создать две папки. В первой создать три акции, каждая из которых реализует одну функций/команд: @AddToFolder, [Folder] и [RemoveFromFolder].



Операции с полями


J @SetField( поле; значение )

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

Присваивает значение полю в текущем документе. В R 6 не требуется перед использованием @SetField определить в формуле поле, если его не существует в документе. Для предыдущих версий (включая R5) это было необходимо, иначе при выполнении @SetField последует сообщение об ошибке. Поле существует, если оно определено в форме, по которой открыт документ. Если поля нет, его можно создать, используя имя поля в выражении присваивания с ключевым словом FIELD, например, указав в начале формулы:

FIELD Имя_поля

:= Имя_поля;

Имя поля в @SetField должно задаваться как текстовая строка. Значение должно иметь тот же тип данных, что и поле.

Пример. Формула проверяет значение в поле Priority. Если в нем содержится "низкий" или "средний", то в поле Status помещается "Закрыт". В противном случае в поле Status помещается "Открыт". Обратите внимание, что перед использованием поля Status в формуле @SetField это поле было определено с помощью ключевого слова FIELD.

FIELD Status: = Status;

@If(

    Priority = "низкий" | Priority = "средний";

    @SetField( "Status"; "Закрыт" );

    @SetField( "Status"; "Открыт" )

   )

J @ThisName

Область применения: предназначена для применения в формулах полей.

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

J @ThisValue

Область применения: предназначена для применения в формулах полей.

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


Пример. Формула проверки правильности введенных значений поля Cost не нужно исправлять для поля Cost_1, полученного копированием из Cost через буфер обмена.

@If( @IsNull(@ThisValue);

       @Failure("Цена не введена");

     @ThisValue <= 0;

       @Failure("Цена не может быть отрицательной");

       @Success)

J @GetField( имя_поля )

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

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

Данная функция совместно с @ThisValue и @ThisName может использоваться в рамках формул полей для создания переносимого (т.е. независимого от имени поля) кода.

Пример. Некая компания занимается продажей стульев трех типов. На форме заявки на покупку имеются редактируемые поля, отвечающие за цену (суффикс в имени поля "_Price") и количество (суффикс - "_Quantity"), а так же вычисляемые поля общей цены (суффикс - "_Total"). Тип стульев определяется префиксом в имени поля (например, FoldingChairs, StackingChairs, RecliningChairs). В этом случае поля формула поля общей цены будет одинакова для всех трех типов стульев, и имеет следующий вид:

chairName := @Left(@ThisName; "_");

(@GetField(chairName + "_Quantity"))*(@GetField(chairName +

"_Price"))

@DeleteField

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

Использованная в агенте, функция @DeleteField удаляет поле, которому присваивают возвращаемое функцией значение.

@DeleteField наиболее часто применяется в фоновых и поисковых агентах. Работает и в кнопках формы, но только для полей, которые не были определены в форме статически.

Пример. Удаляет поле RoutingList из каждого документа, обрабатываемого агентом.

FIELD RoutingList := @DeleteField;



@Unavailable

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

Аналогична по синтаксису и смыслу функции @DeleteField. Удаляет поле, которому присваивают возвращаемое функцией значение.

Пример. Удаляет поле RoutingList из каждого документа, обрабатываемого агентом.

FIELD RoutingList := @Unavailable;

@DocFields

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

Возвращает текстовый список, содержащий имена всех полей в текущем документе. После того как документ сохранен, функция возвращает список всех полей документа, включая служебные (например, Form, $UpdatedBy и т.д.).

@IsAvailable( имя_поля )

@IsUnavailable( имя_поля

)

Область применения: нельзя использовать в формулах навигатора. В формуле колонок и отбора может использоваться только с полями, имеющими флаг SUMMARY.

Проверяют наличие в документе поля с указанным именем. @IsUnavailable( имя_поля ) тождественна равна отрицанию @IsAvailable( имя_поля

). Функция @IsAvailable возвращает 1 (TRUE), если поле содержится в документе, в противном случае 0 (FALSE). Обратите ВНИМАНИЕ!!!, что имя_поля

не берется в кавычки, это достаточно распространенная ошибка для этих функций.

Несколько слов о флаге SUMMARY. Наличие данного флага у поля сигнализирует о том, что значение этого поля может быть показано в виде или папке. При создании документа по форме без использования программного кода на LotusScript или Java, у полей типа Rich Text этот флаг не установлен, а у полей типа Text, Date/Time, Number и т.д. он установлен. Программным путем с использованием LotusScript или Java можно принудительно установить или изменить данный флаг. Посмотреть наличие или отсутствие данного флага у поля можно в окне свойств документа.



Рис. 6.1   Поле my_num имеет установленный флаг SUMMARY

Пример 1. Возвращает значение поля Dept, если оно имеется в документе. В противном случае возвращает "Консультант".

@If( @IsAvailable( Dept ); Dept; "Консультант" )

Пример 2. Возвращает "Консультант", если нет поля Dept; если такое поле есть, возвращается значение, содержащееся в нем.

@If( @IsUnavailable( Dept ); "Консультант"; Dept )


Операторы выполнения операций


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

Оператор

Название, описание

Приоритет

Если операнды - списки

:=

Присваивание. В R 6  допустимы вложенные операторы присваивания

-

[]

Выделение элемента списка. Новый оператор в R 6

1

:

Объединение списков

2

-, +

Изменение знака

3

*

**

/

*/

Умножение

Умножение

Деление

Деление

4

Попарно

Все со всеми

Попарно

Все со всеми

+

*+

-

*-

Сложение, конкатенация

Сложение, конкатенация

Вычитание

Вычитание

5

Попарно

Все со всеми

Попарно

Все со всеми

=

*=

<>, !=, =!, ><

*<>

*<

*>

<=

*<=

>=

*>=

Равно

Равно

Не равно

Не равно

Меньше

Меньше

Больше

Больше

Меньше или равно

Меньше или равно

Больше или равно

Больше или равно

6

Попарно

Все со всеми

Попарно

Все со всеми

Попарно

Все со всеми

Попарно

Все со всеми

Попарно

Все со всеми

Попарно

Все со всеми

!

&

|

Логическое ОТРИЦАНИЕ

Логическое И

Логическое ИЛИ

7

В R 6 стали допустимы вложенные операторы присваивания. Например,

Categories := @UpperCase((Country := "Египет") + "\\" + Town := "Хургада");

@Prompt([Ok]; "Categories"; Categories); - выдаст ЕГИПЕТ\ХУРГАДА

@Prompt([Ok]; "Country"; Country); - выдаст Египет

@Prompt([Ok]; "Town"; Town); - выдаст Хургада

Если бы в первом операторе формулы не взять в скобки (Country := "Египет"), то значение переменной Country было бы Египет\Хургада. Более наглядно последовательность выполнения вложенных операторов видна из следующего примера:

A := 2;

B := 3;

C := 4;


D := 5;

E := @Text( A * B := C + D );

@Prompt([Ok]; "A"; @Text(A)); - выдаст 2

@Prompt([Ok]; "B"; @Text(B)); - выдаст 9, т.к. 4+5 = 9

@Prompt([Ok]; "C"; @Text(C)); - выдаст 4

@Prompt([Ok]; "D"; @Text(D)); - выдаст 5

@Prompt([Ok]; "E"; E); - выдаст 18, т.к. 2*9 = 18

В левой части от оператора присваивания как префикс перед переменной типа поля (но не временной переменной) могут стоять ключевые слова DEFAULT, ENVIRONMENT, или FIELD. Для вложенных операторов присваивания допустимо только ключевое слово FIELD.

FIELD Categories := @UpperCase(FIELD Country := "Египет" + "\\" + "Хургада");

Оператор двоеточие «:» используется для объединения двух значений одного типа данных в список. Каждый из операндов сам может быть списком. Результат содержит все элементы первого операнда, затем все элементы второго. При многократном использовании в одном выражении можно объединить в список несколько значений:

"Moscow" : "London" : "New York" : "Tokyo"

В R 6 появился новый оператор квадратные скобки «[]», который позволяет выделить N-й элемент списка по его индексу:

my_list := "Moscow" : "London" : "New York" : "Tokyo";

@Prompt([Ok]; "Информация"; my_list[2]) – выдаст London

В качестве индекса может выступать константа, переменная или выражение, имеющие числовое значение (десятичные числа округляются до ближайшего целого). Первый элемент списка имеет индекс – 1. При выходе значения индекса за границы слева и справа, возвращается сообщение об ошибке «Array index out of bounds» («Индекс массива выходит за границы»).

Оператор выделения элемента списка может применяться для любых типов данных, которые могут принимать значение списков (текст, числа, дата/время), даже если значение скалярно (т.е. не список). Для типов данных, которые не могут принимать значение списков (Rich text поля), допустимо использование только индекса 1. Bозвращаемое значение в этом случае равно текущему уже сохраненному значению Rich text поля без изменений.



Rem "поле my_date имеет тип Data/Time содержит значение 26.04.1964, и не допускает принятие множественных значений типа список «Allow multiple values»";

@Prompt([Ok]; "Информация"; @Text(my_date[1])); - выдаст 12.04.1964

Оператор выделения элемента списка не может быть использован в левой части оператора присваивания. Таким образом нельзя изменить значение списка присваиванием нового значения оператору выделения элемента списка (т.е. VariableName[1] := "New Value” – приведет к состоянию ошибки ). В правой части оператора присваивания оператор выделения элемента списка допустим.

my_list := "Moscow" : "London" : "New York" : "Tokyo";

my_list := my_list[3] : "Volgograd" : my_list[1];

@Prompt([Ok]; "Информация"; @Implode(my_list; "-")) – выдаст New York-Volgograd-Moscow

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

Операции (и операторы) со списками возможны двух типов:

Попарно (Pair-wise) - первый с первым, второй со вторым и т.д. Если один из списков короче, вместо недостающих элементов используется последний.

Все со всеми (Permuted) - каждый с каждым - перебираются все комбинации в следующем порядке: первый элемент первого списка со всеми элементами второго, затем второй элемент первого списка со всеми второго и т.д. Обозначение: перед обычным знаком операции вставляется символ «*».

При операциях сравнения списков в обоих случаях для получения положительного результата всей операции достаточно положительного результата в одной паре.

Пример. Сравнение двух списков на равенство и неравенство может привести к одинаковому результату!

"A":"B"  = "A":"C"  - Истина, т.к. "A" = "A"

"A":"B" != "A":"C"  - тоже Истина, т.к. "B" != "C"


Описание @-функций Domino


Мы подробно рассмотрим около 200 наиболее часто используемых при разработке приложений @-функций Domino. Всего же @-функций Domino более 250. Полный список всех @-функций, с кратким их описанием дан в приложении 8. В описание @-функций указывается на их область применения или контекст. Это достаточно важный момент, т.к. не все функции работают в определенных элементах дизайна. В документации имеются специальные документы, которые содержат сводные таблицы области применения для @-функций. Следует, однако, заметить, что в этих таблицах присутствуют не все функции из вновь появившихся. В этом случае, если к тому же в описании конкретной функции не указано никаких ограничений, то в области применения в настоящей книге будет указано: «В DOMINO R 6.0.1 НЕ ДОКУМЕНТИРОВАНА», и далее возможно дополнительная информация о контексте, почерпнутая из других источников или личного опыта автора.



Описание @-команд Domino


Мы подробно рассмотрим около 70 наиболее часто используемых при разработке приложений @-команд Domino. Всего же @-команд в Domino более 380 . Полный список всех  @-команд с кратким их описанием дан в разделе "9".

При описании синтаксиса в этом разделе мы всегда будем указывать @-функцию @Command, хотя данный синтаксис справедлив и для @PostedCommand.



Определение вхождения подстроки в строку


@Begins( строка; подстрока )

@Begins( строка; список_подстрок

)

Область применения: без ограничений.

Определяет, является ли заданная подстрока

(или хотя бы один из элементов списка_подстрок) началом строки. Возвращает 1 (TRUE), если подстрока содержится в строке, начиная с первого символа, или 0 (FALSE), если нет. Учитывает регистр. Допустимо также использование в качестве первого аргумента списка строк. В этом случае проверяется, начинается ли хотя бы какой-нибудь элемент списка строк с подстроки

или элемента списка_подстрок.

Пример 1. Возвращает 1.

@Begins( "Привет всем"; "Привет" )

Пример 2. Возвращает 0.

@Begins( "Привет всем"; "привет" )

Пример 3. Проверяет поле Topic. Если это поле начинается со строки "объявление", возвращает строку "Объявление". В противном случае возвращает строку "В первую очередь".

@If( @Begins( topic; "объявление" ); "Объявление"; "В первую очередь" )

Пример 4. Возвращает 1.

@Begins( "Hello" : "world" : "Привет всем"; "Bye" : "Привет" )

@Contains( строка; подстрока )

@Contains( строка; список_подстрок )

Область применения: без ограничений.

Определяет, является ли подстрока (или хотя бы один из элементов списка_подстрок) частью строки. Возвращает 1 (TRUE), если подстрока содержится в строке; в противном случае возвращает 0 (FALSE). Учитывает регистр. Допустимо также использование в качестве первого аргумента списка строк. В этом случае проверяется, содержится ли в хотя бы каком-нибудь элементе списка строк подстрока

или элемента списка подстрок.

Пример 1. Возвращает 1.

@Contains( "Привет всем"; "вс" )

Пример 2. Проверяет, содержит ли поле Topic одно из словосочетаний "Я хочу", "Мне нужно", или "Я должен иметь". Если да, возвращает строку "Требуется вежливый отказ", в противном случае возвращает "Не медлить с ответом".


@If( @Contains( Topic; "Я хочу" : "Мне нужно" : "Я должен иметь" ); "Требуется вежливый отказ"; "Не медлить с ответом" )

Пример 3. Возвращает 1.

@Contains( "Hello" : "world" : "Пока и привет всем"; "Bye" : "привет" )

@Ends( строка; подстрока )                       

@Ends( строка; список_подстрок

)

Область применения: без ограничений.

Определяет, находится ли заданная подстрока

( или хотя бы один из элементов списка_подстрок) в самом конце строки. Возвращает 1 (TRUE), если да, или 0 (FALSE), если нет. Учитывает регистр. Допустимо также использование в качестве первого аргумента списка строк. В этом случае проверяется, заканчивается ли хотя бы какой-нибудь элемент списка строк с подстроки или элемента списка_подстрок.

Пример 1. Возвращает 1.

@Ends( "Привет всем"; "ем" )

Пример 2. Возвращает 0.

@Ends( "Привет всем"; "" )

Пример 3. Проверяет, имеются ли строки "Уланов" или "Туликов" или "Никонов" в конце содержимого поля Signature. Если да, возвращает строку "Подпись удостоверена"; в противном случае, возвращает строку "Подпись не удостоверена".

@If( @Ends( Signature; "Уланов" : "Туликов" : "Никонов");

 "Подпись удостоверена"; "Подпись не удостоверена" )

Пример 4. Возвращает 1.

@Ends( "Hello" : "world" : "Пока и привет всем";

"Bye" : "orld" )

@Matches( строка; образец )

Область применения: без ограничений.

Проверяет строку на соответствие строке образцу. Строка образец может содержать ряд символов обобщения и знаков логических операций. @Matches возвращает 1 (TRUE), если строка

соответствует образцу, или 0 (FALSE), если не соответствует.

Допустимо также использование в качестве первого и второго аргумента списка строк. В этом случае возвращается 1 (TRUE), если хотя один элемент списка строк  соответствует образцу или одному из элементов списка образцов.



Перечень допустимых символов обобщения и знаков логических операций:

Символ

Использование

C

Соответствует любому такому же символу С, но не самому символу "С"

?

Соответствует любому одному символу

*

Соответствует любой строке (любому количеству символов)

{ABC}

Соответствует любому символу из набора ABC

{А-КМ-П}

Соответствует любому символу из набора "от А до К" и "от М до П"

+C

Соответствует любому количеству символов C

!

Логическое НЕТ. Изменяет логическое значение образца на обратное

|

Логическое ИЛИ двух образцов

&

Логическое И двух образцов

Примеры соответствия образцу:

Образец

Соответствие

ABC

"ABC"

A?C

Любая строка из 3 символов, начинающаяся на "A" и заканчивающаяся "C"

???

Любая строка из 3 символов

\*\\

Только строка "*\"

+?

Любая строка, включая пустую

+?{А-Я}

Любая строка, заканчивающаяся заглавной буквой

+{!А-Я}

Строка, не содержащая заглавных букв

Пример 1. Возвращает 0.

@Matches( "Большая проверка"; "?проверка" )

Пример 2. Возвращает 1.

@Matches( "Большая проверка"; "????????проверка" )

Пример 3. Преобразует содержимое поля State в нижний регистр и возвращает 1 для любого значения в поле, содержащего "монт", например, "Вермонт" или "Монтана".

@Matches( @LowerСase( State ); "*монт*" )

Пример 4. Формула возвращает число 224, если в поле Division содержится "Центр" или "Урал". Если содержимое поля Division иное, формула возвращает число 124.

@If( @Matches( Division; "Центр|Урал" ); 224; 124 )

@Like( строка; образец )

@Like( строка; образец; строка_индикатор )

Область применения: без ограничений. Функция поддерживается драйвером NotesSQL ODBC.

Проверяет указанную строку на соответствие строке образцу. Строка образец может содержать ряд символов обобщения. @Like возвращает 1 (TRUE), если строка



соответствует образцу, или 0 (FALSE), если не соответствует. Третий параметр строка_индикатор не обязателен, он необходим в том случае, если в строке образце нужно указать для поиска символ, входящий в список символов обобщений. В этом случае такой символ предваряется в строке-образце строкой_индикатором.

Допустимо также использование в качестве первого и второго аргумента списка строк. В этом случае возвращается 1 (TRUE), если хотя один элемент списка строк соответствует образцу или одному из элементов списка образцов.

Перечень допустимых символов обобщения:

Символ

Использование

C

Соответствует любому такому же символу С,  но не самому символу "С"

_

(символ подчеркивания) Соответствует любому одному символу

%

Соответствует любой строке (любому количеству символов)

Пример 1. Возвращает 0.

@Like( "Большая проверка"; "_проверка" )

Пример 2. Возвращает 1.

@Like( "Большая проверка"; "%проверка" )

Пример 3. Возвращает 1.

@Like( "Count of people"; "/C%"; "/" )


Определения свойств, характеристик и состояния текущего документа


@Created

Область применения: нельзя использовать в формулах навигатора. При использовании в формулах полей, возвращаемое значение определяется по часам сервера, если БД не является локальной. Функция "чувствительна" к часовому поясу.

Возвращает время и дату создания документа.

Пример 1. Возвращает [15.02 93 14:01:00] для документа, созданного 15 февраля 1993 г. в 14:01.

@Created

Пример 2. Возвращает [04.08.93 13:10:00] для документа, созданного 4 апреля 1992 г. в 13:10.

@Adjust( @Created; 1; 4; 0; 0; 0; 0)

@Modified

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

Возвращает величину дата/время, показывающую, когда документ в последний раз редактировался и сохранялся.

Пример 1. Возвращает [30.9.92 11:00:00], если документ в последний раз сохранялся 30 сентября 1992 г. в 11:00.

@Modified

Пример 2. Возвращает строку, составленную из содержимого поля Topic, пробела, текста "Последнее изменение: " и значения "дата-время" последнего сохранения документа, преобразованного в текст.

Topic + " " + "Последнее изменение: " + @Text( @Modified )

@Accessed

Область применения: нельзя использовать в формулах отбора и навигатора. Функция "чувствительна" к часовому поясу.

Возвращает величину дата/время последнего доступа (для чтения или записи) к документу. Величина, возвращаемая @Accessed, указывает время последнего доступа к документу в данной реплике базы данных; каждая реплика хранит свое собственное значение для одного и того же документа. Эта величина "точна до дня" - при очередном обращении к документу в течение дня она не изменяется.


@Accessed чаще всего используется в формулах полей, формулах отбора, акциях и агентах. Будьте осторожны, используя @Accessed в видах (в формулах колонок или формулах выбора), так как она форсирует обновление вида при каждом его открытии. Если БД хранится на CDROM, использование @Accessed не имеет смысла, т.к. доступ к базе для записи или чтения не контролируется Domino.

Эта функция может быть полезна для определения, не "застрял" ли документ в процессе обработки. Например, Вы можете написать агент, который проверяет дату последнего доступа к документам, и напоминает о тех документах, к которым длительно не обращались. @Accessed также может использоваться в агенте для архивирования документов, к которым отсутствовал доступ на протяжении определенного периода времени.

Пример. Возвращается [30.09.94 11:00:00], если документ был последний раз прочитан или редактирован 30 сентября 1994 в 11:00.

@Accessed

@Author

Область применения: нельзя использовать в формулах навигатора.

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

в документе ищется поле типа "Авторы", если оно одно возвращается его значение. Если таких полей несколько - возвращается значение первого из найденных полей этого типа;

если поле типа "Авторы" не найдено, ищется поле с именем "From", и если оно найдено, то ищется поле "FromDomain". Если оба поля найдены, то возвращаемое значение есть объединение значений этих полей через символ "@". Например, Evgeny V. Polyakov/ITDept/Technics/CenterTV/RU@CenterTV . Если найдено только поле "From", то возвращается оно;

если поле "From" не найдено, то ищется поле "$UpdatedBy". Если оно одно, то возвращается его значение;

если поле "$UpdatedBy" не найдено, и документ является новым (еще ни разу не сохраненным), то возвращается имя текущего пользователя;



если все предыдущие шаги закончились неудачей - возвращается пустая строка.

Пример. Возвращается "Evgeny V. Polyakov/ITDept/Technics/CenterTV/RU@CenterTV" для документов, отправляемых почтой автором этих строк.

@Author

@DocLength

Область применения: нельзя использовать в формулах навигатора.

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

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

размер базы данных всегда изменяется блоками по 64 байта, и документ не обязательно задействует целиком все блоки.

Так же результат работы функции может зависеть от того, открыт ли документ на чтение или редактирование (в этом случае он обычно занимает больше памяти), или закрыт (например, показывается в виде). Функция может быть использована для оценки заполнения базы данных и необходимости ее архивации.

J @DocOmittedLength

Область применения: нельзя использовать в формулах навигатора.

Возвращает приблизительный размер “усеченной“ при репликации части документа в байтах. Все что было сказано про “приблизительность“ для @DocLength справедливо и для @DocOmittedLength.

Пример. Для «усеченных» документов выводит диалоговое окно с размером «усеченных» данных.

@If(

@IsDocTruncated;

@Prompt([Ok];"Предупреждение"; {Документ "усечен"} +

@Char(13) + "Отсутствует порядка: " +

@Text(@DocOmittedLength) + " байт");

"")

@Attachments

Область применения: нельзя использовать в формулах навигатора.

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

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

@If( @Attachments; 5; 0 )

J @AttachmentModifiedTimes

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



Возвращает дату/время соответствующую дате/времени модификации присоединенного к документу файла. Если файлов несколько, то возвращается список значений типа дата/время. В этом случае порядок следования значений соответствует следованию имен этих файлов, возвращаемых функцией @AttachmentNames. Если у документа нет присоединенных файлов, то возвращается пустая строка.

Пример. Формула примененная в акции формы вернет дату/время (или список) модификации присоединенного файла.

@Prompt([Ok]; "Дата/время модификации";  

         @Implode(@Text(@AttachmentModifiedTimes); "~"))

@IsNewDoc

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

Возвращает 1 (TRUE), если редактируемый документ еще не сохранялся на диске, или 0 (FALSE), если документ был сохранен.

Пример 1. Использованная в формуле заголовка окна, функция возвращает "Новый документ", если документ создается. Если документ вновь открыт после его сохранения, эта формула возвращает значение поля Subject.

@If( @IsNewDoc; "Новый документ"; Subject )

Пример 2. Если создается новый документ, в заголовке окна появляется строка "Новые общие сведения". Если же открывается существующий документ, в заголовке окна появляется строка "Общие сведения о", затем содержимое поля EmpName, обратная косая черта и содержимое поля EmpNumber.

@If( @IsNewDoc; "Новые общие сведения";

    "Общие сведения о" + EmpName + "/" +EmpNumber )

@IsResponseDoc

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

Возвращает 1 (TRUE), если документ является документом-ответом (Response), в противном случае возвращает 0 (FALSE). Признаком документа-ответа является наличие в нем предопределенного поля $REF, содержащего универсальный идентификатор родительского документа. Документ-ответ может быть создан либо:

по форме типа Response to document (Ответ на документ) или Response to response (Ответ на ответ);



по форме, учитывающей отслеживания версий документов;

программным путем.

Пример. Возвращает "Ответ", если документ является документом-ответом; в противном случае возвращает "Тема".

@If( @IsResponseDoc; "Ответ"; "Тема" )

@IsDocBeingEdited

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

Возвращает 1 (True), если текущий документ находится в режиме редактирования, иначе возвращает 0 (False).

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

@Prompt( [OK]; "Информация"; "Последний редактор: " +

  @Name( [Abbreviate];

    @If( @IsDocBeingEdited;

      @UserName;

      @Subset( $UpdatedBy; -1 ))))

@IsDocBeingRecalculated

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

Возвращает 1 (TRUE), если в настоящее время текущий документ пересчитывается, в противном случае возвращает 0 (FALSE).

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

Пример 1. Возвращает 1 во время вычисления и пересчитывания документа.

@IsDocBeingRecalculated

Пример 2. Возвращает 0 перед, и после вычисления и пересчитывания документа.

@IsDocBeingRecalculated

Пример 3. Может использоваться в поле типа дата/время, чтобы при различных обстоятельствах показывать различные даты. Формула вызывает отображение текущих времени и даты во время пересчитывания документа; в противном случае отображается дата создания документа.

@If( @IsDocBeingRecalculated; @Now; @Created )

@IsDocBeingLoaded

Область применения: предназначена для использования только в формулах полей и формы.

Возвращает 1 (TRUE), если текущий документ в настоящее время загружается в память для последующего отображения; в противном случае возвращает 0 (FALSE).



Пример 1. Возвращает 1, когда документ загружается в память.

@IsDocBeingLoaded

Пример 2. Возвращает 0, если документ был сохранен.

@IsDocBeingLoaded

Пример 3. Формула для вычисляемого поля Editors. Вычисляемое поле Editors показывает содержимое поля $UpdatedBy, когда документ загружается. Когда же пользователь пересчитывает поле (нажимая клавишу F9), вычисляемое поле Editors показывает имя пользователя как текущего редактора, а вслед за ним имена предыдущих редакторов. Наконец, когда документ сохраняется, значение в поле Editors остается без изменения.

@If( @IsDocBeingLoaded; $UpdatedBy;

   @IsDocBeingRecalculated; ( "Текущий редактор -" + 

   @UserName ) : $UpdatedBy;

    Editors )

@IsDocBeingSaved

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

Возвращает 1 (TRUE), если в настоящее время текущий документ сохраняется, в противном случае возвращает 0 (FALSE).

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

Пример 1. Возвращает 1 во время сохранения документа.

@IsDocBeingSaved

Пример 2. Возвращает 0 перед или после сохранения документа.

@IsDocBeingSaved

Пример 3. Эта формула возвращает "Администраторы" во время сохранения документа. В противном случае возвращает значение поля Readers.

@If( @IsDocBeingSaved; "Администраторы"; Readers )

@IsDocBeingMailed

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

Возвращает 1 (TRUE), если в настоящее время текущий документ отправляется почтой, в противном случае возвращает 0 (FALSE).

Функция обычно используется для подсчета, сколько раз пользователь отправлял документ, включая пересылки. Может применяться также для изменения документа во время отправки. Например, во время отправки можно изменить форму документа.



Пример 1. Возвращает 1, когда документ отправляется.

@IsDocBeingMailed

Пример 2. Возвращает 0 перед и после отправления документа.

@IsDocBeingMailed

Пример 3. Может использоваться как формула в поле для подсчета количества отправок документа. Если эта формула определяет вычисляемое поле TimesMailed, первоначально в поле устанавливается 0 (пока документ не отправлялся). Затем содержимое TimesMailed увеличивается при каждой отправке почтой, т.е. если документ был отправлен один раз, его содержимое становится равным 1, и далее увеличивается на 1 после каждой последующей отправки документа.

@If( @IsUnavailable( TimesMailed ); 0; TimesMailed + @IsDocBeingMailed )

@Responses

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

Возвращает количество ответных документов (response) на текущий документ в текущем виде.

Пример 1. Возвращает 5, если имеется пять документов-ответов на текущий документ.

@Responses

Пример 2. Возвращает строку "На этот документ нет ответных документов", если на текущий документ нет документов-ответов; в противном случае возвращает пустую строку.

@If( @Responses = 0; "На этот документ нет ответных документов"; "" )


Ормулы полей


У объекта поле в Domino/Notes R 6, в зависимости от типа поля, может присутствовать от одного до четырех подобъектов, значение которых определяется на языке @-формул. Это:

Default value formula (значение поля по умолчанию). Результат должен быть пригоден для сохранения в данном поле;

Input translation formula (формула преобразования значения поля). Результат должен быть пригоден для сохранения в данном поле;

Input validation formula (формула проверки значения поля). Результат - истина или ложь;

Input enabled formula

(формула разрешения ввода значения в поле). Результат - истина или ложь;

Computed field formula (формула вычисляемого поля). Результат должен быть пригоден для сохранения в данном поле;

Keyword field formula (формула ключевых слов). Результат – значение или список значений, пригодный для сохранения в данном поле.

Начнем рассмотрение с Input validation formula. Запретим сохранять документ с некоторым пустым полем. Данную функциональность можно реализовать с использованием функций @Failure (см. стр. 231), @Success (см. стр. 232) и @If (см. стр. 38). Продемонстрировать форму Country.

@If(Country=""; @Failure("Поле Country не должно быть пустым"); @Success)

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

@Adjust(@Today;0;0;2;0;0;0)

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

@SetField("Dline";@Today);

@Trim(@ThisValue)

Демонстрация на примере формы Chair. В рамках формул полей в 6-й версии Notes/Domino можно использовать новые команды: @ThisValue (см. стр. 124), @ThisName (см. стр. 123) и @GetField (см. стр. 124). Эти функции позволяет писать переносимый код, очень часто без явного указания в формуле конкретных имен полей. Модифицируем пример со стульями из примера к функции @GetField. В нашем случае формула вычисляемых полей общей цены будет следующая:

chairName := @Left(@ThisName; "_");

@IfError(@ToNumber(@GetField(chairName + "_Quantity")) ; 0) * @IfError(@ToNumber(@GetField(chairName + "_Price"));0)

Демонстрация на примере формы DeadLine. Формула разрешения ввода значения в поле применима только к полям типа NativeOS style. Если эта формула возвращает значение истина (1), то поле доступно для ввода в клиенте Notes, в противном случае поле недоступно для ввода. Например,

@IsMember("[admin]";@UserRoles)

Формулы ключевых слов будут рассмотрены в следующем параграфе.



Ормулы скрытия информации


В рамках Domino R6 может применяться формулы, которые осуществляют скрытие информации. Это формулы скрытия: абзаца формы/подформы/страницы, акций форм/видов, строк аутлайна столбцов вида. Во всех случаях формулы должны возвращать 1 (Истина) для скрытия информации, и 0 (Ложь) – в противном случае. Следует обратить внимание, что формулы скрытия информации не являются дополнительным уровнем безопасности, т.к. к «скрытой» информации можно добраться другим путем (показать окно свойств документа).



Остальные функции


J @TemplateVersion

Область применения: В DOMINO R 6.5.1 НЕ ДОКУМЕНТИРОВАНА.

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

J @ViewShowThisUnread( флаг )

Область применения: В DOMINO R 6.5.1 НЕ ДОКУМЕНТИРОВАНА.

При значении флага равном "1" отображает только непрочтенные документы в виде/папке. При любом другом значении флага отображает все документы вида/папки.

Продемонстрировать пример с видом AllDocs.



Печать документа и вида


Для печати в рамках клиента Notes используется команда [FilePrint] (см. стр. 247).

Для печати содержимого вида можно использовать следующую команду в акции вида:

@Command( [FilePrint]; ""; ""; ""; ""; "printview" )

Для печати открытого документа можно использовать следующую команду в акции формы:

@Command( [FilePrint]; "" );

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

@Command( [SwitchForm] ; "новая_форма" );

@Command( [FilePrint]; "" );

@Command( [SwitchForm] ; "старая_форма" )

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



Переменные


Переменные бывают двух типов: поля и временные переменные (также называемые временными полями).



Побочные эффекты


Некоторые функции при выполнении вызывают «побочные эффекты». Основное предназначение @-функции произвести некоторые вычисления и возвратить определенное значение. Если функция помимо этого выполняет еще  какие-либо действия, например, выводит диалоговое окно, то говорят что это функция с "побочным эффектом". Ниже приводится таблица с такими функциями.

@-функция

Побочный эффект

@Command, @PostedCommand

Чаще всего выполняется команда меню Domino

@DbColumn, @DbCommand,

@DbLookup

Доступ в текущую или другую базу для поиска и получения данных

@DDEInitiate, @DDEExecute,

@DDEPoke, @DDETerminate

DDE - диалог с другим приложением.

@MailSend

Текущий документ отправляется почтой Domino или создается и отправляется почтовое сообщение.

@Prompt, @PickList @DialogBox

Открывается диалоговое окно, результат возвращается функцией только по окончании диалога.

Если установлена переменная окружения NoExternalApps = 1, то не будет работать ни одна формула, содержащая функции из этого списка. Пользователь не увидит сообщения об ошибке, формула просто не будет выполняться.



Поля


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

При использовании полей в качестве переменных в формулах, наиболее часто встречаются ошибки для полей типа RichText и полей с множественными значениями (multi-values field).

RichText-поля, как правило, не могут использоваться как переменные. Тем не менее, в формуле агента можно присвоить значение такому полю с помощью ключевого слова FIELD, а функция @DbLookup может получить содержимое RichText-поля из другого документа.

Функцию @IsAvailable( FieldName ) можно использовать для установления факта наличия в документе поля (в том числе RichText) с таким именем.

Для multi-values-полей следует помнить, что только достаточно ограниченное число @-функций и операторов работают со списками. Для определения является ли значение поля списком можно воспользоваться функцией @Elements( FieldName ). Если возвращаемое значение больше единицы, это говорит о том, что значение поля действительно список.

Формулы могут модифицировать значение полей в документе только в том случае, если эти действия не противоречат списку управления доступом к текущей БД.

Имена полей в формулах могут использоваться различными путями:

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

в выражениях для получения новых значений с помощью операторов. Например, формула в колонке вида: FirstName + " " + LastName, где FirstName и LastName - поля в документах, содержащие фамилию и имя;


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

название поля используется для ссылки на значение, содержащееся в поле, например, @Text( BirthDate );

название поля используется как текстовая строка, например формула возвращает содержимое поля Status в документе, найденном по ключу "Virus Check":

@DbLookup( "" : "NoCache"; "RESEARCH" : "SMITH\\PROJECTS.NSF";

          "In Progress"; "Virus Check"; "Status" )

для задания значения поля:

FIELD FieldName := Value;

(например, FIELD Status := "На контроле";)

или

@SetField( "FieldName"; Value );

(например, @SetField( "Status"; "На контроле" );

Оператор с ключевым словом FIELD присваивает значение полю, если оно уже существует в документе, в противном случае создается новое поле с таким именем. Его тип данных определяется типом присваиваемого значения. Таким же образом можно и удалить поле из документа:

FIELD FieldName := @DeleteField;

Поля, значения которых не определены, имеют значение пустой строки (""). Это правило справедливо для полей любых типов, включая и нетекстовые поля. В связи с этим возникает достаточно много ошибок несовместимости типов данных. Для решения этой проблемы рекомендуется для нетекстовых полей определять формулу значения поля по умолчанию.


Получение информации из баз данных, поддерживающих ODBC-драйверы


В Domino с версии 4 существуют три функции - @DbColumn, @DbLookup и @DbCommand - позволяющие извлекать информацию из баз данных, поддерживающих ODBC-драйверы. Обратите внимание, что первые две функции (@DbColumn, @DbLookup) позволяют только извлекать данные, но не добавлять, удалять или изменять их. Извлекается при этом из таблицы не более чем одна колонка значений. @DbCommand - позволяет выполнять команды, поддерживаемые конкретным ODBC-драйвером (в частности и удаление, и модификацию данных), и возвращать полученный результат.

ODBC (Open DataBase Connectivity) - интерфейс, который позволяет приложениям получать данные от систем управления базами данных (DBMS).

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

если возвращается текст: 2 + (2 * количество возвращенных записей) + общий размер текста во всех записях. Каждая текстовая строка имеет максимальную длину 511 байт; если возвращается только одна текстовая строка, она может иметь длину до 64 Кб.

если возвращаются числа или даты: (10 * количество возвращенных записей) + 6 .

J @DbColumn( "ODBC": "тип_кеша";

    "источник_данных"; "ID_1":"ID_2"; "пароль_1":

    "пароль_2"; "таблица"; "колонка":

    "нуль_поддержка"; "Distinct": "сортировка" )

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

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


Обратите ВНИМАНИЕ!!!, что @DbColumnn может только «извлекать» данные из сторонних источников, но не изменять их (удалять, добавлять, редактировать).

Параметр "ODBC" указывает, доступ к "чужой" (не Notes) базе данных должен осуществляться с помощью ODBC-драйверов. Это обязательный параметр.

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

пустая строка или опущено – в этом случае результаты будут "кэшированы", т.е. сохранены в виртуальной памяти для повторного использования. Каждое последующее обращение за этой информацией в рамках одной сессии (пока база данных, использующая формулу, остается открытой) будет адресовано к именно этим сохраненным данным;

"NoCache" заставляет каждый раз извлекать текущую информацию из базы;

"ReCache" позволяет обновить кеш с момента последнего кеширования (добавлено в R 6).

Параметр "источник_данных" задает имя внешнего источника данных. Источник данных содержит сведения о типе и местонахождении одной или нескольких таблиц базы данных. Имя источника данных должно задаваться, как текстовая строка и может содержать до 32 алфавитно-цифровых символов. @DbColumn обеспечивает доступ только к уже зарегистрированным источникам данных. Регистрация и модификация источников данных производится приложением настройки ODBC-драйверов, которое в MS Windows, Windows 95, Windows 98 и Windows NT имеется в контрольной панели (Control Panel), для Windows 2000 (Control Panel -> Administrative Tools).

 


Рис. 6.9 Пиктограмма и окно приложения настройки ODBC-драйверов

Параметр "ID_1" : "ID_2"

представляет собой текстовый список, содержащий идентификаторы пользователя, осуществляющего доступ к источнику данных. Параметр "пароль_1" : "пароль_2" является текстовым списком, содержащим пароли соответственно для идентификаторов "ID_1" и "ID_2". В зависимости от того, к источнику какого типа Вы обращаетесь, может потребоваться как ни одного, так и один или два идентификатора и соответствующее количество паролей. Если идентификатор вообще не нужен, укажите в качестве значений для параметров "ID_1" : "ID_2" и "пароль_1" : "пароль_2" пустую строку (""). Если необходим только первый идентификатор, можно опустить элемент списка "ID_2". Соответственно, при этом нет необходимости задавать и второй пароль. Если какой-либо идентификатор или пароль необходим, но Вы укажете для него значение "", пользователь получит диалоговое окно для ввода недостающего идентификатора и/или пароля.



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

Параметр "таблица" задает таблицу, к которой осуществляется доступ. Это текстовая строка. Для некоторых типов источников параметр "таблица" может задаваться в формате "имя_владельца.имя_таблицы". Параметр "таблица" может также ссылаться не реальную таблицу, а на представление (виртуальная таблица, строки которой в базе данных не существуют, но основаны на данных реально существующей таблицы базы данных - термин View в DBMS [DataBase Managment System]).

Колонка, из которой следует извлечь данные, указывается параметром "колонка". Это тоже текстовая строка.

Параметр "нуль_поддержка"

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

"Fail" (Ошибка) - если встретится пустое значение, будет сгенерировано сообщение об ошибке "Null values found - canceling @Db function". Работа функции на этом завершится, и никакие данные не будут ею возвращены;

"Discard" (Отбросить) - если встретится пустое значение, оно должно быть отброшено. Если при работе функции @DbColumn были отброшены какие-либо пустые значения, в строке состояния Notes "промелькнет" сообщение "Warning: NULL values discarded from @Db list". Работа функции завершится нормально, и она возвратит список без отброшенных значений;



"Заменяющее значение" - если встретится пустое значение, оно должно быть заменено на указанное. Заменяющее значение по смыслу должно соответствовать типу данных колонки; например, для числовой колонки допустимо значение "311", но недопустимо "ABC". При этом заменяющее значение формально задается как текстовая строка (даже если заменяющее значение - число или дата). Если при работе функции @DbColumn происходили замены, в строке состояния Notes "промелькнет" сообщение "Warning: NULL value replaced with user-defined value in @Db list". Работа функции завершится нормально, и она возвратит список, в котором вместо пустых значений присутствуют их заменяющие. Учтите только следующий момент. Если в формуле запрошена сортировка, ODBC-драйвер сортирует список возвращаемых значений перед выполнением в нем замен. Во время сортировки все пустые значения обычно попадают в начало или конец списка. Они заменяются уже по окончании сортировки. Иногда это может привести к неправильной сортировке в возвращаемом функцией списке. Например, если было указано заменяющее значение "ххх", все "ххх" будут находиться в начале списка, если последний отсортирован в порядке возрастания.

Если необходимо устранить повторяющиеся значения из списка перед его возвратом Notes, используйте параметр "Distinct".

Ключевое слово "Distinct" является аналогом функции Domino @Unique, за исключением того, что повторяющиеся значения удаляются ODBC-драйвером перед возвратом данных в Domino. Использование "Distinct"

вместо @Unique имеет два преимущества:

формула выполняется быстрее, поскольку дополнительные операции выполняются вне Domino;

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

Не все ODBC-драйверы поддерживают режим "Distinct". Если это так, указав "Distinct", Вы можете иногда получить одно нулевое значение.



Параметр "сортировка" задает способ сортировки значений ODBC-драйвером. Однако не все ODBC- драйверы его поддерживают. Можно использовать один из следующих вариантов:

"" - отсутствие сортировки;

"Ascending" - сортировка в порядке возрастания;

"Descending" - сортировка в порядке убывания.

На возвращаемые значения @DbColumn в формате ODBC существует аналогичное БД Domino ограничение в 64 Кбайт. Порядок расчета числа возвращаемых записей так же аналогичен @DbColumn с БД Domino

Пример. Источник данных "DBASE Files" содержит несколько баз данных формата dBase IV. Идентификатор и пароль не требуются. Выбираются только уникальные названия фирм из колонки Company в таблице из файла Customer.dbf. Пустые значения отбрасываются. Возвращаемые значения отсортированы по возрастанию.

@DbColumn( "ODBC"; "DBASE Files"; ""; "";

   "Customer"; "Company" : "Discard"; "Distinct" :

   "Ascending" )

J @DbLookup( "ODBC": "тип_кеша";

    "источник_данных";"ID_1": "ID_2"; "пароль_1":

    "пароль_2"; "таблица"; "колонка":

    "нуль_поддержка"; "ключевая_колонка"; ключ;

    "Distinct" : "сортировка")

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

Использует соответствующий указанному источнику данных ODBC-драйвер для доступа к соответствующей таблице и колонкам. Извлекает и возвращает значения из указанной колонки, принадлежащие к тем записям, у которых значение в ключевой колонке совпадает с указанным параметром ключ. Если значений несколько, возвращает их как список. Дополнительно можно указать, должен ли возвращаемый список значений быть сортированным, следует ли удалять в нем повторяющиеся значения и как необходимо поступать с пустыми значениями. @DbLookup предназначена для выбора значений из записей, содержащих указанный ключ.



Параметры "ODBC": "тип_кеша"; "источник_данных";  "ID_1": "ID_2";  "пароль_1": "пароль_2"; "таблица"; "колонка": "нуль_поддержка" и параметр  "Distinct": "сортировка" синтаксически и семантически эквивалентны соответствующим параметрам функции @DbColumn (ODBC). Единственное отличие - из колонки выбираются не все, а только требуемые значения.

Параметр "ключевая_колонка"

указывает, в какой колонке следует искать заданный ключ. Имя ключевой колонки должно задаваться как текстовая строка. Значения в ключевой колонке не обязательно должны быть сортированы. Ключ может быть величиной любого типа: текстовой строкой, числом, значением типа дата/время, любым списком. Значение даты и времени следует задавать в формате, который поддерживает база данных-источник и конкретный ODBC-драйвер, а не Domino; например для DB2 нужно указать "1996-01-31-12.00.00", а не "1996-01-31-12:00:00". Ключевая колонка и ключ вместе составляют как бы часть WHERE ("где") в выражении на языке SQL для выбора записей:

SELECT "колонка" FROM "таблица" WHERE "ключевая_колонка" = ключ

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

Пример. Источник данных "dBASE Files" содержит несколько баз данных формата dBase IV. Идентификатор и пароль не требуются. Данные выбираются из таблицы в файле Customer.dbf. Приведен фрагмент этой таблицы. Необходимо по названию фирмы (Company) определять сотрудника, отвечающего за контакты с этой фирмой (Contact).

Custmr_id



Company



Contact



ALWAO

Always Open Quick Mart

Melissa Adams

ANDRC

Andre's Continental Food Market

Heeneth Ghandi

BLUEL

Blue Lake Deli & Grocery

G.K.Chattergee

CACTP

Cactus Pete's Family Market

Murray Soderholm

FAMIC

Family Corner Market

April Cienkewicz

<


Ключевой колонкой является Company, а информация выбирается из колонки Contact. Выбираются только уникальные имена сотрудников. Пустые значения отбрасываются. Возвращаемые значения отсортированы по возрастанию. Ключ берется из поля Key. Если Key = "Andre's Continental Food Market", будет возвращено "Heeneth Ghandi". Если Key = "Andre's Continental Food Market": "Family Corner Market", будет возвращено "April Cienkewicz": "Heeneth Ghandi".

@DbLookup( "ODBC"; "dBASE Files"; ""; ""; "Customer";

   "Contact" : "Discard"; "Company"; Key; "Distinct":

   "Ascending" )

J @DbCommand( "ODBC" : тип_кеша;

       "источник_данных"; "ID_1" : "ID_2"; "пароль_1" :

       "пароль_2"; "командная_строка" :

       "нуль_поддержка" )

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

равной 1.

Передает обслуживающему источник данных ODBC-драйверу указанную в командной строке команду. ODBC-драйвер находит соответствующую указанному источнику данных DBMS, передает ей указанную команду для обработки и возвращает (или нет) данные, извлеченные с помощью этой команды. Если в результате выполнения командной_строки

возвращаемых значений больше чем одна колонка данных (например, SELECT * FROM Table), то в Notes передается только первая колонка как список. Возвращаемое значение может и отсутствовать, если командная строка отлична от оператора SELECT.

Параметры "ODBC": тип_кеша; "источник_данных"; "ID_1": "ID_2"; "пароль_1": "пароль_2"

и параметр "нуль_поддержка" синтаксически и семантически эквивалентны соответствующим параметрам функции @DbColumn (ODBC).



"Командная_строка" может быть одним из следующих:

запрос на языке SQL ( при этом нужно использовать синтаксис SQL, "понятный" целевой DBMS);

выражение на языке управления целевой DBMS (если целевая DBMS имеет собственный язык управления);

имя хранимой в целевой DBMS процедуры.

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

В документации приводится такое предупреждение: “Обратите ВНИМАНИЕ !!!, что если вы используете результат работы @DbCommand в качестве формулы ключевых слов для поля с интерфейсом типа CheckBox или Radio button, то документ будет обновляться только при либо при создании документа, либо при его загрузке на редактирование, в отличие от стандартного интерфейса для списков, когда осуществляется обновление поля при пересчете полей документа“. Однако из опыта можно сказать следующее, что при выборе опции "NoCache"

или "ReCache" в @DbCommand, и установке свойства Refresh choices on document refresh (Обновлять пункты меню при обновлении документа) у соответствующего поля, происходит реальное обновление значений независимо от типа интерфейса поля (автор, разумеется, не проверял это утверждение на всех доступных драйверах ODBC, но для FoxPro и DBASE – это так).

Пример 1. Используется база данных "pubs", которая включена в качестве примера в комплект поставки Microsoft SQL Server. Формула использует ODBC-драйвер для доступа к источнику данных PUBLISHERS, находит таблицу "authors", принадлежащую пользователю "dbo", а затем извлекает список имен из колонки "au_lname" для авторов, проживающих в Калифорнии (state='CA'), с которыми был подписан контракт (contract=1). Заметьте, что строка CA, заключенная в командной строке в апострофы, передается в DBMS ODBC-драйвером заключенной в кавычки, как того требует синтаксис SQL.

@DbCommand( "ODBC"; "PUBLISHERS"; "dbo" : ""; "vanilla" :

   ""; "SELECT au_lname FROM dbo.authors WHERE contract=1

   AND state='CA' " )

Пример 2. Источник данных "FoxPro Files" содержит базу данных ROOMS формата FoxPro 2.6. Идентификатор и пароль не требуются. Формула изменяет значения поля NAME в этой базе на '123' для тех записей, для которых значение поля CODE равно '06'. Возвращаемое значение отсутствует.

@DbCommand( "ODBC": "NoCache"; "FoxPro Files"; "";

            ""; "UPDATE ROOMS SET NAME='123' where

            CODE = '06' " );


Порядок выполнения


Domino выполняет действия в формулах слева направо, сверху вниз, завершая каждый оператор, перед тем как перейти к следующему, за исключением любого использования функции @PostedCommand и функции @Command с определенными значениями аргументов. Эти функции всегда выполняются после выполнения всех остальных операторов (более подробно рассмотрено в пункте "4.4").

(1)  Statement1;

(2)  Statement2;

(3)  Statement3;

(4)  Statement4;

(5)  Statement5;

Вы можете прервать процесс выполнения, используя функцию @Return. В R 6 язык формул стал поддерживать операторы циклов (@For, @While, @DoWhile и @Transform), которые позволяют выполнить несколько раз определенную последовательность операторов. Так же можно "пропустить" во время выполнения какие-либо операторы с помощью функции @If.

Пишите формулы в том порядке, в котором они должны выполняться. Если оператор должен работать только при выполнении некоторого условия, используйте функцию @If для проверки этого условия:

@If( Condition_1; TRUE_Statement_1;

     ...; ...;

     Condition_N; TRUE_Statement_N;

     FALSE_Statement );

    

Чтобы заставить Domino выполнить несколько операторов при заданном условии, вставьте функцию @Do внутрь @If:

@If( Condition;

     @Do( Statement_1; ...; Statement_N );

     FALSE_Statement );



Порядок выполнения вычислений


В выражении все входящие в него значения должны быть одного типа. Порядок вычислений соответствует общепринятому в математике. Сначала вычисляются выражения в скобках (при наличии вложенных скобок в первую очередь выполняются вычисления в самых внутренних скобках), затем выполняются операции с высшим приоритетом. При равенстве приоритетов вычисления выполняются слева направо.

Пример. В результате вычисления переменной а присвоится значение 20.

a := (12 + (24-3)*2)/3 + 6/3;

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

Пример. a := 1:2:3:4 + 1:2:-3:4; В результате вычисления переменной а присвоится значение 2:4:0:0. Дело в том, что элементы 3 и 4 сначала были объединены в список, а затем к этому списку применяется операция изменения знака. Соответственно для выражения  1:2:3:4 + 1:2:(-3):4 значение будет 2:4:0:8.



Предопределенные поля


В документах Domino могут присутствовать поля, содержащие определенную служебную информацию. Например, $UpdatedBy, $Revisions, $Ref, $Conflict, Form и т.д. Не все из этих полей (и не во всех контекстах) могут быть использованы в качестве переменных @-формул (для каждого конкретного случая необходимо обращаться к документации). Так, например, в акции формы формула @Prompt( [Ok]; "First Editor"; @Subset( $UpdatedBy; 1 )) действительно выдаст окно с именем первого автора документа, однако формула @SetField( "$UpdatedBy"; "Ivan I Ivanov" ) не изменит значения поля $UpdatedBy. Следует заметить, что сразу после выполнения данной формулы, если посмотреть значение поля $UpdatedBy (например, через окно свойств), то его значение действительно будет "Ivan I Ivanov", но по выходу из режима редактирования (даже с сохранением) Lotus сам восстановит значение указанного поля.

Наиболее часто из предопределенных полей в @-формулах используется поле Form. Данное поле содержит имя формы, по которой текущий документ должен отображаться/модифицироваться по умолчанию. Поле Form может использоваться в @-формулах так же как и любое другое не предопределенное поле.



Работа с идентификаторами документов


@DocumentUniqueID

Область применения: нельзя использовать в формулах навигатора. В формулах полей создает ссылку (DocLink) на текущий документ.

Возвращает так называемый универсальный идентификатор документа (UNID) - 32-x символьную комбинацию букв и цифр, уникально идентифицирующую текущий документ во всех репликах распределенной базы.

Рис. 6.8  Окно свойств документа

Универсальный идентификатор документа можно "увидеть" в окне свойств документа в первой строке после метки "ID:", отбросив символы OF "в начале" и ON "в середине": 0DDA10781333857EC3256776006BB487. Domino генерирует универсальный идентификатор при создании документа. Первые его 16 символов (8 байт) представляют собой дату-время создания документа с точностью до тиков, а вторые 16 символов - случайное число. Domino, тем не менее, проверяет, не оказалось ли в текущей реплике базы документа (или "окурка") с таким же идентификатором, и, если так случилось, снова случайно генерирует вторые 16 символов. После сохранения документа в базе его универсальный идентификатор не меняется. Исключение составляют случаи, когда документ копируется в базу через буфер обмена или пересылается почтой - перед помещением документа в базу проверяется, не существует ли в ней уже документ с таким же универсальным идентификатором, и, если это так, для добавляемого в базу документа генерируется новый универсальный идентификатор. С помощью LotusScript разработчик имеет возможность самостоятельно изменить UNID документа. Правда, в этом случае ему необходимо самому заботиться об уникальности UNID.

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

Многие понятия и алгоритмы Domino, в частности "дерево" документов-ответов, базируются на универсальных идентификаторах документов. Так, документ-ответ всегда содержит предопределенное поле с именем $Ref, в котором хранится универсальный идентификатор документа-родителя для данного документа-ответа.


Пример 1. Формула столбца вида "выводит" в этом столбце для некоторого документа нечто похожее на FF863D8AAB6E2210852561BD005867C7.

@Text( @DocumentUniqueID )

Пример 2. Формула в вычисляемом поле "создает" ссылку (DoсLink) на этот же документ.

@DocumentUniqueID

@InheritedDocumentUniqueID

Область применения: нельзя использовать в формулах навигатора. Предназначено для работы с документами, созданными по форме с включенной опцией наследования  полей. Если опция не включена, возвращает такое же значение, что и @DocumentUniqueID. В формулах полей создает ссылку (DocLink) на указанный документ.

Возвращает универсальный идентификатор документа, который был текущим в момент создания документа, в котором используется эта функция.

@NoteID

Область применения: нельзя использовать в формулах формы и навигатора.

Возвращает 8-и символьный идентификатор документа в базе - строку с префиксом NT, например, "NT000023DA". NoteID "уникально идентифицирует" документ только в данной базе.

@GetDocField( UNID ; имя_поля )

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

Для текущей БД возвращает значение поля с именем имя_поля

из документа, имеющего универсальный идентификатор UNID. Параметр имя_поля

является строкой (например, имя поля в кавычках). Возвращаемое значение зависит от типа поля: строка или список строк, число или список чисел, время-дата или временной диапазон. Если задан несуществующий UNID, или поле, которого нет в наличие, то возвращается пустая строка.

Из личного опыта, если при вызове функции в главном окне клиента Notes R 6.0.1 открыта страница рабочего пространства, то такая операция приводит к «падению» клиента с окном NCD. В 5-х версиях при аналогичных условиях падения клиента не было.

Пример 1. Вычисляемое поле в документе, являющемся ответом на главный документ, всегда будет содержать значение поля Subject из главного документа. Когда создается новый документ-ответ, значение в вычисляемом поле наследуется из главного документа. Впоследствии в вычисляемом поле появляется значение поля Subject из главного документа (даже если оно меняется в главном документе). Предопределенное поле $Ref содержится в каждом документе-ответе. Его значение - универсальный идентификатор главного документа.



@If( @IsNewDoc; Subject; @GetDocField( $Ref; "Subject" ))

Пример 2. Формула, выполняемого по расписанию агента, меняет в документах-ответах значение поля Project на значение одноименного поля из главного документа.

FIELD Project := @GetDocField( $Ref; "Project" ); @All

Пример 3. В базе People есть вид Fio со скрытой третьей колонкой с формулой @Text( @DocumentUniqueID ). Находясь в текущем документе, мы выбираем из вида Fio документ, соответствующий конкретному человеку, и заполняем аналогичные поля в текущем документе.

ch := @PickList( [Custom] ; "" : "People" ; "Fio" ;

       "Выбор сотрудника" ;

       "Выберите сотрудника, отвечающего за заказ" ; 3);

@SetField( "Fio" ; @GetDocField( ch ; "Fio" ));

@SetField( "Phone" ; @GetDocField( ch ; "Phone" ));

@SetField( "Email" ; @GetDocField( ch ; "Email" ));

J @SetDocField( UNID ; имя_поля ; новое_значение )

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

Для текущей БД присваивает новое значение полю с именем имя_поля

в документе с универсальным идентификатором UNID. Параметр имя_поля

является строкой. Параметр новое_значение должен соответствовать типу поля.

В R 6 снято ограничение на возможность применения данной функции к текущему документу.

Из личного опыта, если при вызове функции в главном окне клиента Notes R 6.0.1 открыта страница рабочего пространства, то такая операция приводит к «падению» клиента с окном NCD. В 5-х версиях при аналогичных условиях падения клиента не было.

Функция @SetDocField наиболее часто используется в формулах полей, кнопок и агентов.

Пример 1. Формула кнопки в документе-ответе изменяет значение поля Subject в главном документе.

@SetDocField( $Ref; "Subject"; "More people are commuting by bicycle" )

Пример 2. Формула проверки ввода редактируемого поля lastAction в документе-ответе "попутно" заменяет значение поля latestStatus в главном документе.

@SetDocField( $Ref; "latestStatus"; lastAction );

lastAction


Работа с Instant Messaging


J @GetIMContactListGroupNames

Область применения: В DOMINO R 6.5.1 НЕ ДОКУМЕНТИРОВАНА.

Возвращает список групповых имен из контактного листа службы Instant Messaging.

J @Command( [ShowHideIMContactList] )

Область применения: В DOMINO R 6.5.1 НЕ ДОКУМЕНТИРОВАНА.

Отображает/скрывает контактный список службы Instant Messaging.

J @Command( [AddToIMContactList] ; имена ; группа )

Область применения: В DOMINO R 6.5.1 НЕ ДОКУМЕНТИРОВАНА.

Добавляет в контактный лист службы Instant Messaging новых пользователей из второго параметра команды. Третий параметр необязательный. Если он опущен, то появляется диалоговое окно для определения группы, в которую следует добавить новых пользователей. Если параметр не опущен, то добавление идет без диалога. Если указанная группа отсутствует, то она создается при выполнении команды.

J @Command( [SendInstantMessage] ; имена )

Область применения: В DOMINO R 6.5.1 НЕ ДОКУМЕНТИРОВАНА.

Открывает чат с указанными во втором параметре пользователями.

Продемонстрировать пример с формой NewFunction.



Работа с переменными окружения


@Environment( переменная )

@Environment( список_переменных

)

@Environment( переменная; значение )

@Environment( список_переменных; значение )

Область применения: нельзя использовать в формулах отбора, колонок, навигатора и Web-приложениях. Ограниченно применима в формулах всплывающих окон. Для присвоения переменным окружения значения при использовании в теле других функций (таких как @If или @Do) применяйте функцию @SetEnvironment. В формулах выполняющихся на сервере, например, в теле агента по расписанию, идет обращение к переменным окружения сервера, а не рабочей станции. Возвращаемое значение всегда есть текстовая строка.

Устанавливает или возвращает значение переменной окружения. Переменные окружения хранятся в файле NOTES.INI (Windows, OS/2, UNIX) или Notes Preferences (Macintosh). Такой файл присутствует как на станции пользователя, так и на сервере. Ниже приведен фрагмент файла NOTES.INI, в котором имеются три переменные окружения: OrderNumber, ITD_SaveDUID и DocumentAdvisors и их текущие значения.

[Notes]

$OrderNumber=121

$ITD_SaveDUID=F868424364B9B286C325629700157C62

$DocumentAdvisors=Ivan I. Ivanov/IntTrust;Sem S. Sidirov/IntTrust

При использовании с одним параметром @Environment извлекает и возвращает текущее значение переменной окружения из файла NOTES.INI пользователя. Поскольку каждый пользователь имеет свой файл NOTES.INI, это значение может быть различным у каждого пользователя. Имя переменной задается как текстовая строка. Если в качестве параметра указан список имен переменных, возвращается список значений всех переменных из списка имен.

При использовании с двумя параметрами @Environment позволяет присвоить значение переменной окружения в файле NOTES.INI пользователя. Значение должно быть либо текстовой строкой (например, "PO123"), либо формулой, возвращающей текст (например, @UserName или @Text( Total )). Если в качестве первого параметра ввести список имен переменных, каждой указанной в этом списке переменной будет присвоено заданное вторым параметром значение. Но если указать вторым параметром список значений, из него будет использовано только первое значение, а остальные  будут игнорироваться.


Демонстрация на примере БД HOTEL. Для работы с переменными окружения можно использовать функции  @Environment (см. стр.110) и @SetEnvironment (см. стр. 112).



Работа с профильными документами


Демонстрация на примере БД HOTEL. Для работы с профильными документами (см. раздел 6.19) на языке @-формул можно использовать две функции: @GetProfileField (см. стр. 191), @SetProfileField (см. стр. 191) и одну из двух команд: [EditProfile] (см. стр. 262) или [EditProfileDocument] (см. стр. 263).



Разработка тестовых приложений


Разработку тестового приложения начнем с простейшего варианта. Создадим форму и реализуем функции: создания нового, редактирование, удаление и печать документа. Указанную функциональность будем реализовать через акции вида и формы.



Редактирование текущего документа


Для редактирования документа можно воспользоваться системной акцией вида. Однако, системные акции не транслируются в Web. Для реализации редактирования текущего документа можно воспользоваться одной из следующих команд [EditDocument] (см. стр. 240) или [OpenDocument] (см. стр. 256). В обоих случаях акции «напрямую» не работают в Web-приложениях на уровне вида, даже если вид транслируется в Web апплетом. Существуют и другие недостатки/достоинства этих команд по отношению друг к другу (см. их описание).

Для редактирования на уровне открытого документа можно использовать команду [EditDocument]. Следует не забыть «скрыть» акцию формы в режиме редактирования. Для Web-приложений надо использовать эту команду без параметров.



Синтаксис формул


Формула состоит из одного или более операторов (statements), разделяемых символом точка с запятой («;»). Синтаксис формул должен подчиняться следующим правилам:

формула должна начинаться с ключевого слова, вызова @-функции, переменной или константы;

формула должна заканчиваться переменной, константой или @-функцией;

аргументы @-функций отделяются друг от друга с помощью символа «;»;

список аргументов функций заключается в скобки. Если аргументы не требуются, скобки можно опустить;

допускается размещать произвольное количество пробелов и переводов строки (в том числе ни одного) между операторами формул и выполнения операций;

за ключевым словом должен следовать хотя бы один пробел;

регистр (прописные или строчные буквы) не имеет значения, кроме как внутри текстовых констант. Ключевые слова автоматически преобразуются в верхний регистр при сохранении формулы.



Создание нового документа по форме


Для создания нового документа воспользуемся @-командой Compose (см. стр. 237). В итоге акция вида будет иметь формулу: @Command([Compose];"";"Country").

Для сохранения нового документа предусмотрим акцию формы с действиями: сохранение (см. стр. 242) и закрытие текущего документа (см. стр. 243). Код акции будет следующим:

@Command([FileSave]);

@Command([FileCloseWindow])

Перед сохранением формы следует не забыть «скрыть» акцию в режиме чтения документа (на второй закладке свойств акции). Продемонстрировать форму и вид Country.



Удаление документа


Для пометки документа на удаление можно использовать команду [EditClear] (см. стр. 244). В клиенте Notes эта команда работает на уровне вида и формы. В Web-приложениях команда работает только на уровне открытого документа, и сразу удаляет (т.е. не помечает к удалению) текущий документ.

Кроме [EditClear] для удаления документов могут быть использованы команды [MoveToTrash] (см. стр. 245) и [EmptyTrash] (см. стр. 246). В частности для немедленного удаления документа(ов) на уровне вида в клиенте Notes может быть использованы следующие последовательности команд:

Вариант 1 (исправить в книге пример со страницы 246).

@Command( [Clear] );

@Command( [EmptyTrash] )

Вариант 2.

@Command([MoveToTrash]);

@Command([EmptyTrash])

В Web-приложениях для видов с установленными свойствами: Use applet in the browser (использовать апплет при отображении вида в Web), либо Allow selection of documents

(разрешить выделение документов) можно использовать команды [MoveToTrash] и [EmptyTrash]. Единственно не допускается их совместное использование в рамках одной формулы.



В рамках этого упражнения слушатели


В рамках этого упражнения слушатели должны самостоятельно реализовать рассмотренные в этом параграфе, а именно создание нового, редактирование, удаление и печать документа и
В форме Страна реализовать запрет ввода в поле Country пустого значения.


Видоизменить пример Страна – Город – Отель следующим образом. Информация о странах и городах находится в одной БД, а об отелях в другой БД. В этой же БД для обеспечения доступа к информации Страна – Город в профильном документе хранятся путь к БД с информацией о Стране – Городе.


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


В форме Отель создать поле «Название отеля по латински». Это поле должно скрываться, если в поле Страна введено значение «Россия». Создать акцию формы, выводящую значение поля «Название отеля по латински» или строку: «Название отеля по латински не введено». Акция также должна скрываться , если в поле Страна введено значение «Россия». Создать аналогичную акцию в виде Отель.

Установка значения временной переменной


J @Set( переменная; значение )

Область применения: без ограничений.

Присваивает значение временной переменной. Временная переменная определяется, существует и может использоваться только в пределах одной формулы. Имя переменной должно задаваться как текстовая строка.

В R 6 не требуется перед использованием @Set определить в формуле переменную. Для предыдущих версий (включая R5) это необходимо. Для определения переменной достаточно использовать ее в выражении присваивания, например, присвоить ей пустое значение в начале формулы:

Имя_временной_переменной := "";

Пример. Формула проверяет, является ли поле FirstName пустым. Если да, то присваивает переменной FullName конкатенацию содержимого поля Title и поля LastName. Если же поле FirstName имеет непустое значение, переменной FullName присваивается конкатенация содержимого поля FirstName и поля LastName.

FullName := "";

@If(

    FirstName="";

    @Set( "FullName"; Title + " " + LastName );

    @Set( "FullName"; FirstName + " " + LastName )

   )



Временные переменные


Временные переменные доступны только в пределах формулы, в которой они определены (от определения до конца формулы) и в течение одного выполнения этой формулы. Создание и инициализация временной переменной аналогично инициализации поля, но без ключевого слова FIELD:

VariableName := Value;

Тип данных временной переменной соответствует типу значения в правой части оператора присваивания. Этот тип может быть Text, Time, Number или Boolean. Последний - логический - возвращается некоторыми @-функциями и может принимать значения True (Истина - эквивалентно числу 1) или False (Ложь - эквивалентно числу 0).

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

VariableName := 1;

. . .

VariableName := 2;

так и :

VariableName := 1;

. . .

@Set( VariableName; 2 );



состоят из одного или более


Формулы
или @-формулы
состоят из одного или более предложений - операторов (statements), которые обычно выполняются по порядку (более подробно это будет рассмотрено в пункте "4.4"). Префикс @- происходит от частого использования в таких формулах вызовов @-функций. В приложениях Domino формулы широко используются в следующих целях:
отбор документов при селективных репликациях;
отбор документов для включения в вид;
вычисление значений для показа в документах, видах и папках;
определение видимости абзаца формы, абзаца в RichText-поле документа, объекта в области размещения, акции в форме или виде;
вычисление, преобразование и проверка значений полей документов;
добавление и удаление полей в документах;
определение формы, используемой для открытия документа в виде;
определение вычисляемых субформ в форме;
выполнение последовательности действий при запуске агента, клике по кнопке панели инструментов, акции в виде, активного участка в навигаторе, акции, кнопки или активного участка в форме.
В Notes версий 3.x @-формулы были практически единственным средством для вычислений и автоматизации обработки информации. В 4-й версии появились, по крайней мере, еще два способа: один более простой, но ограниченный - простые действия (simple actions), другой более сложный, но богатый по своим возможностям - объектно-ориентированный язык программирования LotusScript. Пятая версия Domino в дополнение к языку LotusScript дала разработчикам возможности использования объектно-ориентированного языка Java, который в последнее время стал фактически стандартом для создания Internet-приложений.
В R 6 язык @-формул значительно обновился и стал более похож на процедурный язык (появились операторы цикла, разрешено повторное присваивание значений временным переменным, операторы присваивания допускают вложенность, и т. д.). Кроме этого появились новые элементы дизайна, поддерживающие язык @-формул (например, формула поля Input Enabled [разрешить/запретить ввод в поле]).
Обратите внимание, что новые или модифицированные в версии R 6 @-функции и @-команды помечены значком  J  перед заголовками.
Java и LotusScript обеспечивают множество операций, невозможных для @-формул. Например, модификацию списка управления доступом к базе (ACL), но часто использование @-формул бывает проще и эффективнее, а во многих местах @-формулы остались единственным вариантом. Например, в кнопках панели инструментов, при селективных репликациях, для определения видимости объектов, в колонках, критериях отбора и формулах формы видов, в формулах полей.

Выделение и замена части строки


@Left( строка; число )

@Left( строка; подстрока )

@Left( список_строк; число )

@Left( список_строк; подстрока )

Область применения: без ограничений.

Если второй параметр является числом, @Left возвращает указанное количество символов от начала строки. Если число больше длины строки или отрицательное, то возвращается сама строка. Для числа равного нулю возвращается пустая строка. Если оба параметра являются строками - функция возвращает все символы из строки слева от заданной подстроки, или пустую строку, если подстрока не найдена в строке. Если первый параметр является списком, то возвращается список, создаваемый поэлементным применением функции. Функция учитывает регистр.

Пример 1. Возвращает "Лео".

@Left( "Леонард Эйлер"; 3 )

Пример 2. Возвращает "Леонард Эй", если в поле Contact содержится строка "Леонард Эйлер".

@Left( Contact; "ле" )

Пример 3. Возвращает "Али", если в поле Author содержится "Алистер Маклин".

@Left( Author; 3 )

Пример 4. Возвращает "А" : "Мак".

@Left( "Алистер" : "Маклин"; "ли" )

@LeftBack( строка; число )

@LeftBack( строка; подстрока )

@LeftBack( список_строк; число )

@LeftBack( список_строк; подстрока )

Область применения: без ограничений.

 

Если параметрами являются строка и число, то @LeftBack возвращает все символы слева, считая от указанного числа символов от конца строки. Если число больше длины строки

или отрицательное, то возвращается пустая строка. Для числа

равного нулю - возвращается сама строка. Если параметрами являются две строки, то возвращаются все символы из строки слева от подстроки или пустая строка, если подстрока не найдена в строке. Если первый параметр является списком - возвращается список, создаваемый поэлементным применением функции. Учитывает регистр.

Пример 1. Возвращает "Леонард Эй".

@LeftBack( "Леонард Эйлер"; 3 )

Пример 2. Возвращает "Леонард".


@LeftBack( "Леонард Эйлер"; " " )

Пример 3. Возвращает "Алистер Мак", если в поле Author содержится "Алистер Маклин".

@LeftBack( Author; 3 )

Пример 4. Возвращает "А" : "Мак".

@LeftBack( "Алистер" : "Маклин"; "ли" )

@Right( строка; число )

@Right( строка; подстрока

)

@Right( список_строк; число )

@Right( список_строк; подстрока )

Область применения: без ограничений.

 

Если параметрами являются строка и число, то возвращается указанное число символов, считая от конца строки. Если число больше или равно длине строки или отрицательно, то возвращается сама строка. Для числа

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

не найдена в строке. Если первый параметр является списком - возвращается список, создаваемый поэлементным применением функции.

Пример 1. Возвращает "лер", 3 крайних правых символа в строке.

@Right( "Леонард Эйлер"; 3 )

Пример 2. Возвращает "Эйлер", т.е. все символы справа от пробела.

@Right( "Леонард Эйлер";" " )

Пример 3. Возвращает "лин", если в поле Author содержится "Алистер Маклин".

@Right( Author; 3 )

Пример 4. Возвращает "акадабра".

@Right( "Абракадабра"; "бр" )

@RightBack( строка; число

)

@RightBack( строка; подстрока )

@RightBack( список_строк; число )

@RightBack( список_строк; подстрока )

Область применения: без ограничений.

 

Если параметрами являются строка и число, то функция просматривает строку слева направо, и возвращает все символы правее указанного числа символов. Если число

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



справа налево, и возвращает символы справа от подстроки. Если первый параметр является списком - возвращается список, создаваемый поэлементным применением функции.

Пример 1. Возвращает "нард Эйлер".

@RightBack( "Леонард Эйлер"; 3 )

Пример 2. Возвращает пустую строку.

@RightBack( "Леонард Эйлер"; "" )

Пример 3. Возвращает "а".

@RightBack( "Абракадабра"; "бр" )

Пример 4. Возвращает "стер Маклин", если в поле Author содержится "Алистер Маклин".

@RightBack( Author; 3 )

@Middle( строка; начальный_индекс;

                  число_символов )

@Middle( строка; начальный_индекс; подстрока )

@Middle( строка; подстрока; число_символов )

@Middle( строка; подстрока1; подстрока2 )

Область применения: без ограничений.

 

@Middle(строка; начальный_индекс; число_символов ). В этой форме синтаксиса строка является просматриваемой строкой текста, начальный_индекс определяет стартовый номер символа в строке, считая слева направо от начала строки, с которого начинается отсчет возвращаемых символов, а число_символов

указывает количество возвращаемых символов.

Если число_символов положительное, то возвращаются символы, начиная с символа с номером начальный_индекс + 1, и отсчет идет слева направо. Если число_символов

отрицательное, возвращаются символы, начиная  с символа с номером начальный_индекс, и отсчет идет справа налево. Если число_символов больше чем от начального_индекса

до (или от) границы строки, то возвращается реальное число символов до (или от) границы строки. Для отрицательного начальног_индекса

отсчет идет от конца строки справа налево. Более детально поведение функции в данном варианте синтаксиса дано в следующей таблице:

Начальный индекс

Число символов

Выполняемые действия

(здесь индекс считается от начала строки слева направо)

Пример

Положительный, лежит в интервале

[

1; длина строки ).

Положительное, меньше или равное длине строки

минус начальный индекс.

Первый индекс возвращаемого значения определяется как начальный индекс плюс 1. Длина строки возвращаемого значения равна числу символов.

@Middle("123456789"; 4; 3); - возвращает "567"

Положительный, лежит в интервале

[

1; длина строки ).

Положительное, больше чем длина строки

минус начальный индекс.

Первый индекс возвращаемого значения определяется как начальный индекс плюс 1. Длина строки возвращаемого значения равна длине строки минус начальный индекс.

@Middle("123456789"; 4; 33); - возвращает "56789"

Положительный, лежит в интервале

[

1; длина строки ).

Отрицательное, модуль меньше чем начальный индекс.

Первый индекс возвращаемого значения определяется как начальный индекс минус модуль числа символов плюс 1. Длина строки возвращаемого значения равна числу символов.

@Middle("123456789"; 4; -3); - возвращает "234"

Положительный, лежит в интервале

[

1; длина строки ).

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

Первый индекс возвращаемого значения равен 1. Длина строки возвращаемого значения равна начальному индексу.

@Middle("123456789"; 4; -33); - возвращает "1234"

Положительный, больше или равен длине строки.

Положительное

Возвращается пустая строка.

@Middle("123456789"; 10; 3); - возвращает ""

Положительный, больше или равен длине строки.

Отрицательное, модуль меньше чем длина строки.

Первый индекс возвращаемого значения определяется как длина строки минус модуль числа символов плюс 1. Длина строки возвращаемого значения равна числу символов.

@Middle("123456789"; 10; -3); - возвращает "789"

Положительный, больше или равен длине строки.

Отрицательное, модуль больше или равен длине строки.

Возвращается исходная строка.

@Middle("123456789"; 10; -33); - возвращает "123456789"

Ноль

Положительное, меньше чем длина строки.

Первый индекс возвращаемого значения равен 1. Длина строки возвращаемого значения равна числу символов.

@Middle("123456789"; 0; 3); - возвращает "123"

Ноль

Положительное, больше или равное длине строки.

Возвращается исходная строка.

@Middle("123456789"; 0; 33); - возвращает "123456789"

Ноль

Отрицательное

Возвращается пустая строка

@Middle("123456789"; 0; -3); - возвращает ""

Отрицательный, модуль лежит в интервале

[

1; длина строки ).

Положительное, меньше чем модуль начального индекса.

Первый индекс возвращаемого значения определяется как длина строки минус модуль начального индекса плюс 1. Длина строки возвращаемого значения равна числу символов.

@Middle("123456789"; -4; 3); - возвращает "678"

Отрицательный, модуль лежит в интервале

[

1; длина строки ).

Положительное, больше или равно модулю начального индекса.

Первый индекс возвращаемого значения определяется как длина строки минус модуль начального индекса плюс 1. Длина строки возвращаемого значения равна модулю начального индекса.

@Middle("123456789"; -4; 33); - возвращает "6789"

Отрицательный, модуль лежит в интервале

[

1; длина строки ).

Отрицательное, модуль меньше чем длина строки

минус модуль начального индекса.

Первый индекс возвращаемого значения определяется как длина строки минус модуль начального индекса минус модуль числа символов плюс 1. Длина строки возвращаемого значения равна числу символов.

@Middle("123456789"; -4; -3); - возвращает "345"

Отрицательный, модуль лежит в интервале

[

1; длина строки ).

Отрицательное, модуль больше или равен длине строки

минус модуль начального индекса.

Первый индекс возвращаемого значения равен 1. Длина строки возвращаемого значения равна длине строки минус модуль начального индекса.

@Middle("123456789"; -4; -33); - возвращает "12345"

Отрицательный, модуль больше или равен длине строки.

Положительное, меньше чем длина строки.

Первый индекс возвращаемого значения равен 1. Длина строки возвращаемого значения равна числу символов.

@Middle("123456789"; -10; 3); - возвращает "123"

Отрицательный, модуль больше или равен длине строки.

Положительное, больше или равное длине строки.

Возвращается исходная строка.

@Middle("123456789"; -10; 33); - возвращает "123456789"

Отрицательный, модуль больше или равен длине строки.

Отрицательное

Возвращается пустая строка

@Middle("123456789"; -10; -3); - возвращает ""

<


@Middle(строка; начальный_индекс; подстрока). В этой форме синтаксиса строка является просматриваемой строкой текста, начальный_индекс определяет стартовый номер символа в строке,

с которого начинается отсчет возвращаемых символов, а подстрока

определяет окончание возвращаемого значения.

Для отрицательного начального_индекса отсчет идет от конца строки справа налево. Если подстрока

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

Начальный индекс

Подстрока

Выполняемые действия

(здесь индекс считается от начала строки слева направо)

Пример

Положительный, лежит в интервале

[

1; длина строки ).

В строке лежит правее начального индекса.

Первый индекс возвращаемого значения определяется как начальный индекс плюс 1. Длина строки возвращаемого значения равна первый индекс подстроки

минус начальный индекс.

@Middle("123456789"; 4; "89"); - возвращает "567"

Положительный, лежит в интервале

[

1; длина строки ).

В строке не присутствует или первый индекс подстроки

меньше или равен начальному индексу.

Возвращает пустую строку.

@Middle("123456789"; 4; "777" ); - возвращает ""

@Middle("123456789"; 4; "23" ); - возвращает ""

Положительный, больше или равен длине строки.

Любая

Возвращает пустую строку.

@Middle("123456789"; 10; "89" ); - возвращает ""

Ноль

Присутствует в строке.

Возвращает строку от начала строки до первого индекса подстроки.

@Middle("123456789"; 0; "89"); - возвращает "1234567"

Ноль

Отсутствует в строке.

Возвращает пустую строку.

@Middle("123456789"; 0; "777"); - возвращает ""

Отрицательный, модуль лежит в интервале

[

1; длина строки ).

В строке лежит правее длины строки

минус модуль начального индекса плюс 1.

Возвращает строку от индекса равного (длина строки минус модуль начального индекса плюс 1) до первого индекса подстроки.

@Middle("123456789"; -4; "89" ); - возвращает "67"

Отрицательный, модуль лежит в интервале

[

1; длина строки ).

В строке отсутствует или первый индекс подстроки

больше или равен длине строки минус модуль начального индекса плюс 1.

Возвращает пустую строку.

@Middle("123456789"; -4; "23"); - возвращает ""

Отрицательный, модуль больше или равен длине строки.

Присутствует в строке.

Возвращает строку от начала строки до первого индекса подстроки.

@Middle("123456789"; -10; "89"); - возвращает "1234567"

Отрицательный, модуль больше или равен длине строки.

Отсутствует в строке.

Возвращает пустую строку.

@Middle("123456789"; -10; "777"); - возвращает ""

<


 

@Middle(строка; подстрока; число_символов).

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

Если число_символов положительное, то возвращаются символы, начиная со следующего после последнего символа из подстроки

и отсчитывая от нее слева направо. Если число_символов

отрицательное, возвращаются символы, начиная с символа перед первым символом из подстроки, и отсчитывая от нее справа налево. Если подстрока

не входит в строку, то возвращается пустая строка. Если число_символов

больше чем от первого индекса подстроки до (или от) границы строки, то возвращается реальное число символов до (или от) границы строки.

Пример 1. Возвращает "Car". Указана позиция первого пробела в строке "North Carolina", и отсчет начинается с первого символа после позиции.

@Middle( "North Carolina"; " "; 3 )

Пример 2. Возвращает "or". Указана позиция подстроки "th", и отсчет начинается с первого символа, считая справа налево, после всей подстроки.

@Middle( "North Carolina"; "th"; -2 )

Пример 3. Возвращает "акад".

@Middle( "Абракадабра"; "бр"; 4 )

Пример 4. Возвращает "Абр".

@Middle( "Абракадабра"; "акад"; -25 )

@Middle(строка; подстрока1; подстрока2).

В этой форме синтаксиса строка является просматриваемой строкой текста, а подстрока1 определяет конкретный текст, после первого вхождения которого начинается отсчет возвращаемого значения. Подстрока2

определяет окончание возвращаемого значения. Если подстрока1 и подстрока2

совпадают, то для окончания возвращаемого значения ищется второе вхождение подстроки1

в строку. Если подстрока1 не входит в строку, то возвращается пустая строка. Если подстрока2 не входит в строку

или лежит левее подстроки1, то возвращается текст с первого символа, следующего за подстрокой1, до конца строки.



Для всех вариантов синтаксиса, если первый параметр является списком, то возвращается список, создаваемый поэлементным применением функции.

Пример 1. Возвращает "акада".

@Middle( "Абракадабра"; "бр"; "бр" );

Пример 2. Возвращает "4567".

@Middle( "123,4567,8,90"; ","; "," );

Пример 3. Возвращает пустая строка.

@Middle( "123,4567,8,90"; "777"; "," );

Пример 4. Возвращает "4567,8,90".

@Middle( "123,4567,8,90"; ","; "777" );

Пример 5. Возвращает "4567,8,90".

@Middle( "123,4567,8,90"; ","; "23,4" );

@MiddleBack( строка; начальный_индекс;

                          число_символов )

@MiddleBack( строка; начальный_индекс;

                           подстрока )

@MiddleBack(строка; подстрока; число_символов )

@MiddleBack(строка; подстрока1; подстрока2 )

Область применения: без ограничений.

@MiddleBack(строка; начальный_индекс; число_символов). В этой форме синтаксиса строка является просматриваемой строкой текста, начальный_индекс определяет стартовый номер символа в строке, считая справа налево от конца строки, после которого начинается отсчет возвращаемых символов, а число_символов

указывает количество возвращаемых символов.

Если число_символов положительное, то возвращаются символы, начиная с символа с номером начальный_индекс

- 1, и отсчет идет слева направо. Если число_символов

отрицательное, то возвращаются символы, начиная с символа с номером начальный_индекс, и отсчет идет справа налево. Если число_символов больше чем от начального_индекса

до (или от) границы строки, то возвращается реальное число символов до (или от) границы строки. Для отрицательного начального_индекса

отсчет идет от начала строки слева направо. Более детально поведение функции в данном варианте синтаксиса дано в следующей таблице:

Начальный индекс

Число символов

Выполняемые действия

(здесь индекс считается от конца строки справа налево)

Пример

Положительный, лежит в интервале

[

1; длина строки ].

Положительное, меньше чем начальный индекс

минус 1.

Первый индекс возвращаемого значения определяется как начальный индекс минус 1. Длина строки возвращаемого значения равна числу символов.

@MiddleBack("123456789"; 6; 3); - возвращает "567"

Положительный, лежит в интервале

[

1; длина строки ].

Положительное, больше или равное начальному индексу

минус 1.

Первый индекс возвращаемого значения определяется как начальный индекс минус 1. Длина строки возвращаемого значения равна начальному индексу минус 1.

@MiddleBack("123456789"; 6; 33); - возвращает "56789"

Положительный, лежит в интервале

[

1; длина строки ].

Отрицательное, модуль меньше чем длина строки

минус начальный индекс плюс 1.

Первый индекс возвращаемого значения определяется как начальный индекс плюс модуль числа символов минус 1. Длина строки возвращаемого значения равна числу символов.

@MiddleBack("123456789"; 6; -3); - возвращает "234"

Положительный, лежит в интервале

[

1; длина строки ].

Отрицательное, модуль больше или равен длине строки

минус начальный индекс плюс 1.

Первый индекс возвращаемого значения равен длине строки. Длина строки возвращаемого значения равна длине строки минус начальный индекс плюс 1.

@MiddleBack("123456789"; 6; -33); - возвращает "1234"

Положительный, больше чем длина строки.

Положительное, меньше чем длина строки.

Первый индекс возвращаемого значения равен длине строки. Длина строки возвращаемого значения равна числу символов.

@MiddleBack("123456789"; 10; 3); - возвращает "123"

Положительный, больше чем длина строки.

Положительное, больше или равен длине строки.

Возвращается исходная строка.

@MiddleBack("123456789"; 10; 33); - возвращает "123456789"

Положительный, больше чем длина строки.

Отрицательное

Возвращается пустая строка.

@MiddleBack("123456789"; 10; -3); - возвращает ""

Ноль

Положительное

Возвращается пустая строка.

@MiddleBack("123456789"; 0; 3); - возвращает ""

Ноль

Отрицательное, модуль меньше чем длина строки.

Первый индекс возвращаемого значения равен модулю числа символов. Длина строки возвращаемого значения равна числу символов.

@MiddleBack("123456789"; 0; -3); - возвращает "789"

Ноль

Отрицательное, модуль больше или равен длине строки.

Возвращается исходная строка.

@MiddleBack("123456789"; 0; -33); - возвращает "123456789"

Отрицательный, модуль лежит в интервале

[

1; длина строки ).

Положительное, меньше чем длина строки

минус модуль начального индекса  минус 1.

Первый индекс возвращаемого значения определяется как длина строки

минус модуль начального индекса минус 1. Длина строки возвращаемого значения равна числу символов.

@MiddleBack("123456789"; -4; 3); - возвращает "678"

Отрицательный, модуль лежит в интервале

[

1; длина строки ).

Положительное, больше или равное длине строки

минус модуль начального индекса  минус 1.

Первый индекс возвращаемого значения определяется как длина строки

минус модуль начального индекса минус 1. Длина строки возвращаемого значения равна длине строки минус модуль начального индекса минус 1.

@MiddleBack("123456789"; -4; 33); - возвращает "6789"

Отрицательный, модуль лежит в интервале

[

1; длина строки ).

Отрицательное, модуль меньше чем модуль начального индекса плюс 1.

Первый индекс возвращаемого значения определяется как длина строки

минус модуль начального индекса плюс модуль числа символов минус 1. Длина строки возвращаемого значения равна числу символов.

@MiddleBack("123456789"; -4; -3); - возвращает "345"

Отрицательный, модуль лежит в интервале

[

1; длина строки ).

Отрицательное, модуль больше или равен модулю начального индекса плюс 1.

Первый индекс возвращаемого значения равен длине строки. Длина строки возвращаемого значения равна модулю начального индекса

плюс 1.

@MiddleBack("123456789"; -4; -33); - возвращает "12345"

Отрицательный, модуль больше или равен длине строки.

Положительное

Возвращается пустая строка.

@MiddleBack("123456789"; -10; 3); - возвращает ""

Отрицательный, модуль больше или равен длине строки.

Отрицательное, модуль меньше чем модуль числа символов.

Первый индекс возвращаемого значения равен модулю числа символов. Длина строки возвращаемого значения равна числу символов.

@Middle("123456789"; -10; -3); - возвращает "789"

Отрицательный, модуль больше или равен длине строки.

Отрицательное, модуль больше или равен модулю числа символов.

Возвращается исходная строка.

@Middle("123456789"; -10; -33); - возвращает "123456789"

<


@MiddleBack(строка; начальный_индекс; подстрока). В этой форме синтаксиса строка

является просматриваемой строкой текста, начальный_индекс

определяет стартовый номер символа в строке, считая справа налево от конца строки, с которого начинается отсчет возвращаемых символов, а подстрока определяет «хвост» возвращаемого значения.

Для отрицательного начального_индекса отсчет идет от начала строки слева направо. Если подстрока

не входит в строку или лежит правее начального_индекса, то возвращается строка от начала строки до начального_индекса

включительно. Если начальный_индекс положителен, и больше или равен длине строки, то возвращается пустая строка. Если начальный_индекс

отрицателен, и его модуль больше или равен длине строки (а так же при нулевом значении начального_индекса), отсчет идет с первого символа строки. Более детально поведение функции в данном варианте синтаксиса дано в следующей таблице:

Начальный индекс

Подстрока

Выполняемые действия

(здесь индекс считается от конца строки справа налево)

Пример

Положительный, лежит в интервале

[

1; длина строки ).

В строке лежит левее начального индекса.

Возвращает строку от последнего индекса подстроки плюс 1 до начального индекса включительно.

@MiddleBack("123456789"; 3; "23"); - возвращает "4567"

Положительный, лежит в интервале

[

1; длина строки ).

В строке не присутствует или первый индекс подстроки

меньше или равен начальному индексу.

Возвращает строку от начала строки до начального индекса плюс 1.

@MiddleBack("123456789"; 6; "67"); - возвращает "1234"

@MiddleBack("123456789"; 6; "777"); - возвращает "1234"

Положительный, больше или равен длине строки.

Любая

Возвращает пустую строку.

@MiddleBack("123456789"; 10; "67"); - возвращает ""

Ноль

Любая

Возвращает пустую строку.

@MiddleBack("123456789"; 0; "67"); - возвращает ""

Отрицательный, модуль лежит в интервале

[

1; длина строки ).

В строке лежит левее длины строки

минус модуль начального индекса плюс 1.

Возвращает строку от последнего индекса подстроки плюс 1 до (длины строки

минус модуль начального индекса плюс 1).

@MiddleBack("123456789"; -6; "23"); - возвращает "4567"

Отрицательный, модуль лежит в интервале

[

1; длина строки ).

В строке отсутствует или первый индекс подстроки

больше или равен длине строки минус модуль начального индекса плюс 1.

Возвращает строку от начала строки до (длины строки минус модуль начального индекса плюс 1).

@MiddleBack("123456789"; -6; "78"); - возвращает "1234567"

@MiddleBack("123456789"; -6; "777"); - возвращает "1234567"

Отрицательный, модуль больше или равен длине строки.

Присутствует в строке.

Возвращает строку от последнего индекса подстроки плюс 1 до конца строки.

@MiddleBack("123456789"; -33; "23"); - возвращает "456789"

Отрицательный, модуль больше или равен длине строки.

Отсутствует в строке.

Возвращает исходную строку.

@MiddleBack("123456789"; -33; "777"); - возвращает "123456789"

<


@MiddleBack(строка; подстрока; число_символов). Здесь строка является просматриваемой строкой текста, подстрока

определяет конкретный текст, после первого вхождения которого начинается отсчет возвращаемого количества символов, а число_символов указывает количество возвращаемых символов.

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

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

не входит в строку, то возвращается пустая строка. Если число_символов

больше чем от первого индекса подстроки до (или от) границы строки, то возвращается реальное число символов до (или от) границы строки.

Пример 1. Возвращает "Car". Указана позиция первого пробела в строке "North Carolina", и отсчет начинается с первого символа после позиции.

@MiddleBack( "North Carolina"; " "; 3 )

Пример 2. Возвращает "or". Указана позиция подстроки "th", и отсчет начинается с первого символа, считая справа налево, после всей подстроки.

@MiddleBack( "North Carolina"; "th"; -2 )

Пример 3. Возвращает "кадa".

@MiddleBack( "Абракадабра"; "бр"; -4 )

Пример 4. Возвращает "Абракад".

@MiddleBack( "Абракадабра"; "аб"; -25 )

@MiddleBack(строка; подстрока1; подстрока2). В этой форме синтаксиса строка

является просматриваемой строкой текста, а подстрока1 определяет конкретный текст, после первого вхождения которого начинается отсчет возвращаемого значения. Подстрока2 определяет «хвост» возвращаемого значения.

Если подстрока1 и подстрока2

совпадают, то в качестве «хвоста» возвращаемого значения ищется второе вхождение подстроки1 в строку. Если подстрока1

не входит в строку, то возвращается пустая строка. Если подстрока2



не входит в строку, или лежит правее подстроки1, то возвращается текст с первого символа, следующего за подстрокой1, до начала строки.

Для всех вариантов синтаксиса, если первый параметр является списком, то возвращается список, создаваемый поэлементным применением функции.

Пример 1. Возвращает "акада".

@MiddleBack( "Абракадабра"; "бр"; "бр" );

Пример 2. Возвращает "8".

@MiddleBack( "123,4567,8,90"; ","; "," );

Пример 3. Возвращает пустая строка.

@MiddleBack( "123,4567,8,90"; "777"; "," );

Пример 4. Возвращает "123,4567,8".

@MiddleBack( "123,4567,8,90"; ","; "777" );

Пример 5. Возвращает "567,8".

@Middle( "123,4567,8,90"; ","; "23,4" );

Пример 6. Возвращает "Мак" : "Мак" : "Кри" : "Сим", если в поле Committee содержатся четыре значения: "Алистер Маклин" : "Росс Макдональд" : "Агата Кристи" : "Жорж Сименон".

@MiddleBack( Committee; " "; 3 )

@Word( строка; разделитель; номер_слова )

@Word( список_строк; разделитель; номер_слова )

Область применения: без ограничений.

Функция просматривает исходную строку слева направо и возвращает "слово", позиция которого в строке соответствует номеру_слова. Под "словом" понимается символы, часть исходной строки, заключенные справа и слева в символы строки разделителя. Если в качестве первого аргумента выступает список_строк, возвращаемое значение есть список, получаемый поэлементным применением функции.

Пример 1. Возвращает "применения".

@Word( "Примеры применения функций"; " "; 2 )

Пример 2. Возвращает "функций" : "language", если в поле Topic содержится "Примеры<>применения<>функций" : "Notes<>formula<>language".



@Word( Topic; "<>"; 3 )

Пример 3. Возвращает "в качестве первого аргумента", если это есть третья строка в поле Describe.

@Word( Describe; @NewLine; 3 )

@ReplaceSubstring( исходный_список

; найти ;

                                     заменить_на

)

Область применения: без ограничений.

Выполняет замены в строке или списке строк исходный_список

всех вхождений слов или фраз из списка строк найти на соответствующие слова или фразы из списка строк заменить_на. Учитывает регистр. Возвращает полученную строку или список строк.

Если в списке найти больше элементов, чем в списке заменить_на, то "лишние" элементы из списка найти

заменяются на последний элемент списка заменить_на. "Лишние" элементы списка заменить_на игнорируются.

В процессе своей работы функция @ReplaceSubstring для каждого элемента из списка найти повторно пробегает исходный_список, таким образом можно выполнять циклические подстановки (см. Пример 4).

Пример 1. Возвращается "I hate apples".

@ReplaceSubstring( "I like apples" ; "like" ; "hate" )

Пример 2. Возвращается "I hate peaches".

@ReplaceSubstring( "I like apples"; "like" : "apples";

                   "hate" : "peaches" )

Пример 3. Заменяет символы перехода на новую строку в поле Description на пробелы.

@ReplaceSubString( Description; @Newline; " " )

Пример 4. Возможны "многократные" замены. В этом примере возвращается "third".

@ReplaceSubstring( "first"; "first" : "second"; "second" : "third" )

J @FileDir( строка )

Область применения: без ограничений.

Выделяет и возвращает из своего параметра-строки

имя директории или другими словами часть строки от начала до первого правого символа слеша (включая его), или если этого символа нет, то пустую строку. Если в качестве параметра выступает текстовый список, то результат действия функции будет список, полученный поэлементным применением функции.

Пример 1. Возвращает C:\

@FileDir("C:\\Database.nsf");

Пример 2. Возвращает - \

@FileDir("\\Database.nsf");

Пример 3. Возвращает путь к текущей БД.

@FileDir(@Subset(@DbName;-1));


Выполнение формул, содержащих вызовы @-команд


Функция @PostedCommand используется в 4-й и выше версиях Domino как замена для @Command 3-х с целью обеспечения совместимости, поскольку @Command 4-й и выше версии выполняется иначе. Формула с @Command, написанная в 4-й и выше версии не может быть выполнена в 3-й.

При выполнении указанных в формуле действий Domino всегда выполняет функции @PostedCommand (как @Command в 3-й версии) в последнюю очередь. Если в формуле имеется несколько вызовов функции @PostedCommand, они обрабатываются в порядке появления, но после всех остальных операторов и @-функций. Даже если для изменения порядка действий используется @Do, функции @PostedCommand выполняются в последнюю очередь.

Например, предположим, что приведенная ниже формула содержит ряд выражений, заключенных в скобки внутри функции @Do:

FIELD X :=

    @If( условие;

        @Do( @PostedCommand1; @Prompt; @PostedCommand2 );

        @Error )

При вычислении, если условие истинно, указанные в @Do действия будут выполняться в следующем порядке:

(1) @Prompt

(2) @PostedCommand1

(3) @PostedCommand2

@Do выполняет все, не относящиеся к @PostedCommand действия в порядке слева направо; а после их завершения выполняет все @PostedCommand в том же порядке.

Предположим, вы пишете формулу, которая должна выполнять @PostedCommand, проверку @If, а затем несколько других действий, за которыми следует еще одна @PostedCommand. Domino выполнит действия в такой последовательности: проверка условия и соответствующее действие, затем прочие "обычные" действия, затем обе @PostedCommand.

Программа

(4) @PostedCommand( [имя_команды]; параметр );

(1) @If( Условие; True_действие; False_действие );

(2) FIELD X := "Текст";

(3) FIELD Y := "Следующий текст";

(5) @PostedCommand( [имя_команды] )

Чтобы "заставить" Domino выполнить первую @PostedCommand перед проверкой @If и следующими за ней действиями, можно создать формулу-подпрограмму (ее нужно определить в "Run once" - агенте) и запускать ее с помощью дополнительной @PostedCommand:


Программа ( в акции, кнопке, кнопке панели инструментов, гиперобъекте, Run once - агенте)

(1) @PostedCommand( [имя_команды]; параметр );

(2) @PostedCommand( [ToolsRunMacro]; "(Subprogram)" )

(Подпрограмма) (Run once - агент, запускаемый из списка агентов, с именем Subprogram)

(3) @if( Условие;  True_действие;  False_действие )

(4) FIELD X := "Текст";

(5) FIELD Y := "Следующий текст";

(6) @PostedCommand( [имя_команды] )

Вызовы функций @Command происходят при выполнении формулы в том порядке, в котором встречаются (вместе с другими операторами и @-функциями). Однако имеются исключения из этого правила. Перечисленные ниже в таблице типы @Command выполняются аналогично @PostedCommand, то есть после всех остальных действий. В R 6 добавлен целый ряд однотипных команд, которые выполняют те же действия, но немедленно, а не после других команд:

Команда, выполняющаяся после всеx остальных @-команд

Новый аналог в R 6, выполняющийся немедленно

[EditClear]

[Clear]

[EditProfile]

[EditProfileDocument]

[FileCloseWindow]

[CloseWindow]

[FileDatabaseDelete]

[DatabaseDelete]

[FileExit]

[ExitNotes]

[Folder]

[FolderDocuments]

[NavigateNext]

[NavNext]

[NavigateNextMain]

[NavNextMain]

[NavigateNextSelected]

[NavNextSelected]

[NavigateNextUnread]

[NavNextUnread]

[NavigatePrev]

[NavPrev]

[NavigatePrevMain]

[NavPrevMain]

[NavigatePrevSelected]

[NavPrevSelected]

[NavigatePrevUnread]

[NavPrevUnread]

[ReloadWindow]

[RefreshWindow]

[ToolsRunBackgroundMacros]

[RunSheduledAgents]

[ToolsRunMacro]

[RunAgent]

[ViewChange]

[SwitchView]

[ViewSwitchForm]

[SwitchForm]