•  Readers - поле аналогичное Authors, которое контролирует кто имеет доступ к документу на чтение. Если поле такого типа содержит, пустую строку, то к документу имеют доступ ВСЕ, обладающие доступом к базе от Reader и выше.

•  Password - поле, которое при вводе отображает вместо текста - звездочки, а внутри хранит текст. Надо иметь в виду, что поле в форме, это лишь способ визуализации информации. Если обратиться к одноименному полю документа, то там пароль будет представлен в виде текста. Аналогично этот текста можно увидеть из окна со свойствами документа. Для этого надо щелкнуть правой кнопкой мыши, стоя на документе в представлении, и выбрать «Document properties». Откроется окно свойств документа, в нем на второй закладке список полей документа. Встав на поле, в правой части окна вы увидите описание его типа, значения и других атрибутов.

1.7.1. Хранение списков.

Поля могут содержать массивы значений. Для того чтобы сделать поле «многозначным» используется опция на первой закладке свойств «Allow multiple values». Эта опция включается не для всех типов полей. Вместе с этой опцией идут опции ввода и отображения списковых значений. То есть то, что является разделителем элементов списка при вводе данных и при их отображении. Это включается на третьей закладке свойств:

Списки могут состоять из строк, чисел, дат и т. д.

1.7.2. Значения полей по умолчанию.

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

В приведенном примере, при создании документа в это поле будет вставлено имя пользователя, который создает документ. Используется вызов языка формул @UserName, который выдает имя текущего пользователя в сессии Lotus Notes.

Для полей, содержащих список значений, в качестве значения по умолчанию можно задать список. Например, в созданной форме, введем поле, которое регулирует права доступа на редактирование. Назовем поле «editors», у него будет включена опция «Allow multiple values», тип поля будет «Authors» и значением по умолчанию будут роли, которые обладают правом на редактирование документа участника голосования - то есть"[MemberEdit]":"[Supervisor]". Обратите внимание, что названия ролей в поле пишутся в квадратных скобках. Списковые значения объединяются через двоеточие. Названия ролей ЧУВСТВИТЕЛЬНЫ к регистру.

ЧАСТО встречающаяся ошибка. Если вписать в качестве значения по умолчанию список, а флаг многозначности НЕ поставить, то после сохранения документа все элементы списка «СЛИПНУТСЯ» в одну строку.

Это поле не является частью интерфейса пользователя и его надо скрыть, то есть в закладке свойств этого поля, отвечающей за скрытие, будут стоять опции скрытия от Notes клиента и от web.

1.7.3. Типы полей. Редактируемые и вычисляемые поля.

Самый простой вид полей - поля, которые можно редактировать. В них вводятся значения, и они имеют тип «Editable». В рассматриваемой подформе поле, в котором хранится автор документа, должно показывать автора, но эту информацию никто редактировать не должен. Полям, которые отображают информацию, но не дают ее редактировать, может быть присвоен один из типов «Computed *». Таких полей три вида:

1.  «Computed» - это вычисляемое по формуле поле, которое будет вычисляться каждый раз при открытии и пересчете документа. Это поле сохраняется в документе. То есть, если сделать поле с автором документа этого типа и поставить формулу @UserName, то при каждом редактировании и пересчете в этом поле будет вписано имя пользователя, который в данный момент открыл этот документ.

2.  «Computed for display» - это поле аналогично предыдущему за одним исключением - оно существует только при открытии документа. Оно не сохраняется в документе. Такие поля применяются, когда создается интерфейс, в котором разным ролям доступны на редактирование разные фрагменты формы. Тогда для каждого элемента информации нужно создать два поля - одно актуальное редактируемое поле, в которое эта информация вносится той ролью, которая может ее редактировать. Второе поле - типа «Computed for display», которое показывает эту информацию тем ролям, которые не могут редактировать актуальное поле. На эти поля устанавливаются противофазные формулы скрытия, то есть могу редактировать - вижу поле «А», не вижу «Б». Не могу редактировать - вижу «Б» и не вижу «А». Для рассматриваемого случая это поле не подходит.

3.  «Computed when compose» - Это поле вычисляется при инициализации. Это означает, что при создании документа в него будет записан и сохранен автор. В данном случае это поле надо использовать для автора и для даты создания.

НЕ нашли? Не то? Что вы ищете?

Самые нижние свойства первой закладки («Tab Key») определяют порядок обхода полей. При нажатии клавиши Tab курсор будет перемещаться в поле в заданном порядке. Порядок задается цифрами 1,2,3... Там же можно указать в каком поле при открытии документа будет находиться курсор «по умолчанию».

Далее надо оформить поле «дата создания документа», в значении которого «по умолчанию» используется формула, определяющая дату создания документа.

Теперь из подформы необходимо перейти в форму и посмотреть, что получилось – «Design > Preview in Notes» (не забыть вставить подформу в форму):

Вычисляемые поля в рамках можно сделать не Native OS Style, а Notes style. Кроме того, надо это поле перенести на строку вниз. Это можно сделать, выделив его, и нажать «Ctrl+X» и «Ctrl+V».

Далее создается поле для того, кто последний раз изменил документ и поле даты последнего изменения. Поле, в котором будет показан последний отредактировавший документ, будет называться «Editor». Для его заполнения будет использовано стандартное поле $UpdatedBy, в котором в хронологическом порядке сохраняются все когда-либо редактировавшие этот документ. То есть, последний в этом списке и есть последний редактировавший. Очевидно, что значение этого поля определяется каждый раз заново. Не имеет смысла перегружать документ информацией из него же взятой, поэтому поле будет типа «Computed for display», то есть информация не будет сохраняться в документе.

Для подсчета значения поля используется формула, которая возвращает указанное количество элементов списка, переданного в качестве первого параметра. «-1» означает возврат одного элемента списка с конца. В качестве списка передано поле «$UpdatedBy». При обращении к полю по имени, в формулу подставляется его значение.

Поле «Дата последнего изменения». Оно будет «Computed for display». Это поле вычисляется по формуле @modified.

Следующее поле будет редактируемым. Необходимо дать пользователям возможность вкладывать в него различные объекты. Поэтому его тип будет «Rich text», «Editable». Вложение объектов делается из меню File->Attach (Import). Для удобной работы рядом с полем необходимо создать две кнопки, которые помогут пользователям с вложением объектов.

Лабораторная работа №4. Создание и свойства кнопок.

2.Hotspots.

Для создания кнопки необходимо поставить курсор в то место где предполагается ее разместить, и далее в меню «Create > Hotspot > button».

2.1. Action hotspot

Эту процедуру можно выполнить, используя в том же меню «Create >Hotspot >Action hotspot». При этом к кнопке может быть привязан исполняемый код.

Эта процедура выполняется в следующей последовательности.

1.  Пишется текст или из библиотеки картинок загружается картинка (Create > Image resource), которая будет представлять кнопку.

2.  Далее картинка выделяется мышкой и выделенной картинке присваиваются свойства кнопки «action hotspot». Потом, поставив курсор, на созданный объект кнопка, необходимо задать его свойства «Hotspot properties».

На приведенной картинке присутствуют две кнопки - плюс для присоединения и стрелка для импорта файлов. С каждой картинкой надо работать отдельно. Начинаем с присоединения:

Теперь картинке присвоено свойство кнопки - «hotspot»:

Надо снять галочку с «Show border around hotspot» - чтобы убрать розовый квадрат.

Остальные закладки свойств регулируют стиль отображения. В нижнем правом окне задается код, который выполняется по щелчку мышкой на Hotspot. Здесь может использоваться язык формул, Lotus script & simple action - для программирования под Lotus, а также Java script для программирования под web. Предлагается использовать команду из языка формул, которая откроет диалог выбора файла и вложит выбранный, в указанное РТФ поле, на которое первая команда установит курсор

:

Для импорта файла также создается hotspot, только используется другая команда:

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

@Command( [FileImport] )

Теперь на закладке параметров скрытия свойств этих hotspots надо указать, что они не видны открытия на чтение в режиме чтения. Редактировать можно только в режиме редактирования. Нажатие на эти кнопки в режиме чтения вызовет появление сообщения об ошибке.

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

Теперь перейдите в форму и сделайте ее preview в клиенте Notes. Понажимайте на кнопочки.

Различаются следующие кнопки «hotspots».

Button.

Это обычная серая кнопка - у нее можно задать параметры отображения, подпись, скрытие и т. п. Кнопка программируется на языке формул, lotus script, simple action или java script

Link hotspot.

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

Text Pop-up.

При наведении курсора на элемент формы с такими свойствами «всплывает» текстовая подсказка.

Formula Pop-up.

При наведении курсора на элемент формы с этими свойствами «всплывает» формульное окно, в котором можно считать текст в окне по формуле.

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

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

Теперь перейдем к форме.

Форму предлагается разбить на две области. Это зона заголовка и зона основного тела документа, в виде таблицы с закладками. На первой закладке будет размещена основная информация формы, а на второй закладке, созданная подформа с дополнительной информацией.

Заголовок оформляется в виде простого текста - КАРТОЧКА УЧАСТНИКА ГОЛОСОВАНИЯ. Надо отметить, что часть такого текста является статической, а часть - вычисляемой. Для вычисляемой части можно использовать поле типа «computed for display», которое будет считаться по значению полей Фамилия, Имя, Отчество.

2.2. Вычисляемый текст.

Возможно также использовать другой тип поля, который называется «Computed Text». Это поле со свойствами текста и формулой, по которой этот текст вычисляется. Здесь использована формула, которая выбирает значение из поля «FirstName», добавляет после него пробел. Потом, если в поле «MiddleName» не пустая строка, то добавляет его значение после пробела и опять добавляет после него пробел. В заключение, после пробела, добавляется значение поля «Lastname».

FirstName + " " + @If(@Trim(MiddleName)!="";MiddleName + " ";"") + LastName

Текст создается через меню «Create > Computed text».

После создания заголовка можно создать под заголовком таблицу с закладками. Обратите внимания, что в такой таблице каждая закладка - это строка таблицы. Эта таблица будет с двумя строками и одним столбцом. Для этого используется пункт меню «Create >Table».

На предпоследней закладке свойств таблицы необходимо указать текстовую метку для закладки. Закладка - это одна ячейка для таблицы этого вида. В данной форме для каждой ячейки поставлена нулевая ширина границы. На первой закладке указано свойство таблицы «Fit to Window».

В итоге она будет выглядеть так:

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

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

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

ВНИМАНИЕ. При вставке таблицы в таблицу с закладками будут заданы два вопроса. Первый вопрос, это копировать? На него надо ответить «ДА» и второй - при копировании. На него надо ответить «НЕТ». Тогда новая таблица вставится в ячейку существующей. Это пригодится при переносе данных одного фрагмента таблицы в другой. Если таблицы будут идентичной топологии, тогда можно копировать содержимое ячеек исходной таблицы в соответствующие ячейки копии. В итоге должно получиться следующее:

После этого можно переименовать поля и перепрописать их свойства.

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

Теперь нужно сделать контроль ввода значений для полей имени и фамилии.

2.3. Проверка значений полей и их трансляция.

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

Первое событие - трансляция происходит при сохранении документа и его пересчете - здесь можно что-то сделать со значением, введенным в поле, и результат вашей операции запишется в поле при сохранении или пересчете. Ну, например, обрезать с начала и конца пробелы @trim(FirstName), @trim(Lastname) & @Trim(MiddleName) или наоборот присоединить префикс и постфикс.

Событие «Validation» - это проверка значения поля на корректность. Здесь если проверка не прошла успешно можно предусмотреть выдать предупреждение и сохранение или пересчет остановятся.

У полей есть связанная с этой опцией свойство на первой закладке свойств – «compute after validation» - эта опция включает вычисление значения поля только после того, как проверены на корректность значения других полей формы.

Раньше было предусмотрено, что в процедуру трансляции входило обрезание пробелов на конце и в начале введенного значения, а на событие «Validation» предлагается вписать следующую формулу:

Формула построена с использованием оператора @if (условия; что делать, если условие выполнено; что делать, если условие не выполнено). Все параметры и вызов формулы от вызова отделяются точкой с запятой. Формула предназначена для проверки пустое поле или нет. Если поле не заполнено, то вызывается формула @Failure, которая выдает сообщение "Имя участника должно быть указано!" и возвращает не успешное выполнение команды. А если значение поля не пусто, то выполнится команда @Success, которая даст знать системе, что «Validation»прошла успешно. Внесите аналогичный код для поля LastName. Далее необходимо перейти к полю с именем, зарегистрированным в системе (это NotesNames). Оно редактируемое и у этого поля должна быть опция включения диалога из адресной книги:

После этого надо включить на второй закладке опцию «display entry helper button». Далее можно включить «preview» формы в клиенте на шестой вкладке и попробовать выбрать в это поле значение из адресной книги.

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

Следующее поле – статус. Оно не должно редактироваться вручную. Его тип должен быть не редактируемый «Radio button».

Для этого поля должны быть варианты выбора «Черновик», «Активный», «Неактивный». Эти варианты будут переключаться из кода кнопок. Эти свойства задаются на второй вкладке. Значение поля по умолчанию «Черновик». Так как поле вычисляется само от себя, то значение по умолчанию задается формулой @if(status="";"Черновик";status) в нижнем правом окне.

2.4. Создание кнопки изменения статуса.

При создании кнопок необходимо, как минимум, решить - где расположить кнопку и где хранить иконку кнопки. Поскольку действие кнопки относится ко всему документу, в данном случае, кнопку изменения статуса предлагается разместить на панели вверху формы. Иконки кнопок могут храниться в конкретной форме или в библиотеке кнопок. Если кнопка относится только к конкретной форме, и не будет использоваться в других формах, то рациональнее поместить ее в форме. Если кнопка используется в других формах, то ее НЕЛЬЗЯ хранить в форме. В данном конкретном случае изменение статуса участника, это процедура, которая выполняется только в форме участника. Поэтому кнопки изменения статуса создаются в форме. Для этого надо перейти в правое верхнее окошко. Поставьте курсор на список кнопок, потом, используя пункты меню «Create > Action», добавьте новую кнопку. В списке кнопок появится еще одна кнопка «Untitled» и откроется окно ее свойств. Имя кнопки задается на первой вкладке (если в названии использовать слеш - то кнопка будет открываться каскадом). Там же задается номер ее позиции в списке кнопок, формулы скрытия, открытия и свойства отображения рисунков на кнопке (см. рис.). В Lotus имеется набор стандартных иконок. Можно также внести в библиотеку картинок иконки для кнопок из дизайна стандартного почтового ящика и использовать их. Для этого надо в дизайнере открыть почтовый ящик «Database > Mail». Далее в левом окне открыть иконки кнопок почтового ящика «Resources > Images», в правом окне найти, например, иконку с именем «act_participantactions. GIF». Кликнуть на ней правой кнопкой. Выбрать «COPY». Открыть создаваемую базу. Далее в левом окне открыть Resources > Images этой базы. В правом окне кликнуть правой кнопкой на свободном пространстве и выбрать «Paste». После этого, иконка будет доступна для формы. Опция «Graphic» на первой закладке. Для того чтобы вставить иконку надо нажать на значок папки рядом с окном «Image» выбрать иконку в окне «Insert Image Resource».

Вторая закладка с формулами скрытия. Сначала необходимо понять, в каких ситуациях данная кнопка необходима. В режиме чтения она не нужна, значит, нужно скрыть кнопку для чтения и «preview» для чтения. Если документ находится в состоянии «Активный», то кнопка перехода в это состояние не нужна. Следовательно, в окно формул надо внести формулу, при выполнении которой кнопка будет скрыта status="Активный" - то есть если в поле статус стоит такая строка, то кнопка скроется.

После выполнения всех операций форма приобретет вид:

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

FIELD status:=”Активный”;

tmp:=history;

tmp1:=@Text(@Now)+” ”+@Name([CN];@UserName) + “ изменил(а) состояние карточки на \’Активный\””;

FIELD history:=tmp:tmp1;

@Command([RefreshHideFormulas])

В первой строке полю status присваивается новое значение, для обозначения того, что речь идет не о переменной, а о поле - при присвоении используется ключевое слово «field». Присвоение значения делается оператором «:=». Все операторы отделяются точкой с запятой. В переменную «tmp» сохраняется текущее содержимое поля «history». В переменной «tmp1» формируется строка для новой записи в «history». Строка состоит из сконвертированного в строку текущего дата\время, приведенного к приемлемому для восприятия виду имени текущего пользователя @Username и поясняющей информации. Далее в поле «history» (оно было определено как многозначное, то есть содержащее списки) необходимо внести список, состоящий из предыдущего значения этого поля и новой сформированной исторической записи. После этого достаточно обновить документ, чтобы все изменения отобразились на экране. Теперь сделайте Preview вашей формы с кнопкой «Изменить статус» и нажмите на нее. Посмотрите на поле статус, на поле история и на видимость самой кнопки, которая должна стать не доступной при статусе «Активный».

Теперь по аналогии надо сделать кнопку для перевода в неактивный статус. Вторую кнопку не трудно сделать, скопировав первую и выполнив необходимые изменения в формулах скрытия и коде. Если сохранить картинку, обе кнопки будут выпадать из одной кнопки верхнего уровня (так как кнопка была сделана каскадной):

ВАЖНОЕ ЗАМЕЧАНИЕ. Когда запускается пересчет формы по факту нажатия кнопки, то происходит проверка на корректность формул полей. В написанном варианте проверка на корректность выполняется при простом нажатии кнопки перехода из состояния в состояние. Например, появляется окно о не введенных имени и фамилии (если они не введены). Такие предупреждения правильнее ограничивать только событием сохранения документа. Как это делается:

Есть ряд формул, которые возвращают «true» при происхождении некоторого события, например:

@Isdocbeingedited - знаменует, что документ редактируется;

@IsdocBeingSaved - знаменует, что происходит сохранение документа. Эту формулу целесообразно использовать в данном случае. В условие проверки заполнения полей в формуле при проверке на корректность надо вставить условие проверки того, что документ находится в процессе сохранения.

@IsDocBeingSaved & @trim(LastName)="";

2.5. Библиотека кнопок.

В каждом документе должны присутствовать кнопки, обеспечивающие основные действия при работе с документами: «Закрыть», «Редактировать», «Сохранить», «Отменить» Кнопка «Закрыть» должна быть доступна для всех ролей. Кнопка (режим) «Редактировать» должна быть доступна для ролей, обладающих правом на редактирование данного документа. Кнопка «Сохранить» должна быть доступна для тех, кто перевел документ в режим редактирования. Кнопка «Отменить» должна иметь свойства аналогичные кнопке «Сохранить».

Очевидно, что кнопки должны быть видны в разных режимах:

1.  «Редактировать» - в режиме чтения.

2.  «Сохранить» - в режиме редактирования.

3.  «Закрыть» - в режиме чтения.

4.  «Отменить» - в режиме редактирования.

Кнопку «Редактировать» можно сделать отдельно для каждой формы, если к кнопке каждый раз необходимо вписывать новую формулу скрытия для разных ролей. Можно ввести единые правила для хранения информации в списке редакторов документа. В данном случае пусть все редакторы документа хранятся в поле «editors». Тогда можно не делать 10 кнопок редактирования для 10 форм, а сделать одну, в которой формула скрытия будет выглядеть следующим образом:

Tmp1:=@trim(@replace(editors;@UserNamesList;"")); @if(@elements(editors)>@elements(tmp1);@false;@true)

Эта формула делает:

1.  Есть функция, которая возвращает список всех ролей в текущей базе текущего пользователя и всех групп в адресной книге, в которые он входит и всех видов его имени - @userNamesList

2.  В поле «editors» хранится список ролей, групп и имен, которые могут редактировать этот документ.

3.  Надо понять - есть ли непустое пересечение этих списков.

4.  Для этого надо сделать Replace значений первого списка - вторым на пустые строки - то есть при нахождении в первом списке элемента, который есть также во втором - этот элемент заменится на «»

5.  Далее на результате «replace» применяется @Trim, который на списковом параметре делает удаление всех пустых элементов списка.

6.  В тоге, если пересечение списков имело место, то количество элементов в исходном «editors» больше, чем количество элементов в результате @trim(@replace()). И тогда кнопка не скрывается, иначе ее скрываем.

Надо создать 4 кнопки в библиотеке кнопок. Поскольку такие кнопки будут присутствовать практически во всех документах их надо сделать «общими». В Lotus R5 для таких случаев предусмотрена процедура «Shared actions». Чтобы воспользоваться этой процедурой, надо открыть в левом окне вкладку «Other». В правом окне появится список «общих» документов.

Далее надо открыть документ «Общие действия» («Shared actions»).

После чего, используя пункт меню «Create > Shared Action», можно создавать действия общие для всей базы. Порядок работы с кнопкой в этом случае такой же, как при работе с кнопкой в форме.

Аналогично создаются кнопки «Сохранить», «Закрыть», «Отменить».

Для кнопок «Закрыть» и «Отменить» проставьте скрытие в режимах самостоятельно. Команда для них одна - @command([FileCloseWindow]).

Теперь можно скрыть кнопку «Редактировать» на форме и вставить кнопки из библиотеки. Для этого перейдите в форму в окно с кнопками, поставьте в него курсор и из меню «Create > Insert Shared action» и добавьте все созданные кнопки. После этого укажите последовательность расположения кнопок на панели на первой закладке.

Порядок размещения кнопок предлагается следующим «Сохранить», «Редактировать», «Изменить статус», «Закрыть» и «Отменить». Вот что должно получиться:

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

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

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4