Войти
 
 
   
 
  
Новости Notes.ру Библиотека Биржа труда Вопрос - ответ Форум Регистрация Поиск О проекте
Разделы
О Notes
Советы
Шаблоны и примеры
Литература
Презентации
 
Всё о задаче AdminP. Часть вторая   Во второй части мы завершаем рассмотрение AdminP. В ней рассмотрены запросы междоменного администрирования и способы управления функциями AdminP с помощью настроек документа сервера, команд консоли сервера, файла Notes.ini и интервалов очистки базы данных. В этой статье предполагается, что вы опытный администратор Domino и прочитали первую часть
О Notes Читать статью
 
Всё о задаче AdminP. Proxy-действия в R5 и Domino 6   Приложение к статье об административном процессе
О Notes Читать статью
 
Всё о задаче AdminP. Часть первая   Перевод классической статьи 2003-его года о задаче административного процесса (AdminP). Очень полезна для понимания работы механизма этой задачи. В первой части статьи описаны компоненты задачи AdminP, как они работают, и как их использование помогает сделать работу администратора Domino проще. Задача AdminP (сакращённо от Administration Process, Административный процесс) работает с базой административных запросов (Administration Requests, admin4.nsf)
О Notes Читать статью
 


Советы

Главная   Библиотека   Советы

Интерфейс приложения. Часть пятая. Сервисные действия панели действий. Продолжение


Интерфейс приложения

Часть первая >>> Часть вторая >>> Часть третья >>> Часть четвёртая >>> Часть пятая Часть шестая >>>

Ещё несколько примеров интерфейсных элементов, которыми можно снабдить приложение



Переслать документ. Создаёт почтовое сообщение с копией документа в теле сообщения
Реализация предусматривает несколько возможностей
Самая простая - использование системного действия Forward. Её недостаток - невозможность обработать ошибки:
  • документ защищён от копирования (пересылки) полем $KeepPrivate
  • клиент Lotus Notes не настроен на почтовый ящик пользователя Notes (настроен на ящик другого пользователя, настроен на несуществующий почтовый ящик) - в документе Местоположения (Location) неверно заполнены поля Mail server и/или Mail file, или используется неверный документ местоположения
Первую из этих ситуаций можно обработать, если реализовать код посредством @-формулы (кстати, подобную обработку стоило бы также включить в действие Печать документа, которое описывалось в предыдущей части):
@If(@IsAvailable($KeepPrivate); @Prompt([Ok]; "Выполнение пользовательского действия прервано"; "Документ защищён от копирования, пересылки, печати"); @Command([MailForward]))

Вторую ситуацию проще разрулить, используя LotusScript:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim uiview As NotesUIView
Dim uidoc As NotesUIDocument

Dim session As New NotesSession
Dim mailbox As New NotesDatabase("", "") ' Инициализация объекта почтовой базы пользователя
Dim curdb As NotesDatabase

On Error Resume Next ' Включение обработки ошибки
Call mailbox.openmail ' Получение объекта почтовой базы пользователя
On Error Goto 0 ' Выключение обработки ошибки
If Not mailbox.isOpen Then Messagebox "Выполнение действия прервано", 48, "Нет настройки на почтовую базу или недоступен почтовый сервер" : Exit Sub

Set uiview = ws.currentView ' Попытка получения текущего представления

If uiview Is Nothing Then ' Код выполняется не в интерфейсе представления
Set uidoc = ws.currentDocument ' Получение текущего документа
If uidoc Is Nothing Then Messagebox "Выполнение действия прервано", 48, "Не выбран документ" : Exit Sub
Set doc = uidoc.document
If doc.hasItem("$KeepPrivate") Then Messagebox "Выполнение действия прервано", 48, "Документ защищён от копирования, пересылки, печати" : Exit Sub
Call uidoc.forward ' Создание почтового сообщения пересылки
Else
Set curdb = session.currentDatabase
Dim noteID As String
noteID = uiview.caretNoteID ' Получение текущего курсора - NoteID текущего документа представления
If noteID = "" Then Messagebox "Выполнение действия прервано", 48, "Не выбран документ" : Exit Sub
On Error Resume Next
Set doc = curdb.getDocumentByID(noteID) ' Получение документа по NoteID
On Error Goto 0
If doc Is Nothing Then Messagebox "Выполнение действия прервано", 48, "Не выбран документ" : Exit Sub
If doc.hasItem("$KeepPrivate") Then Messagebox "Выполнение действия прервано", 48, "Документ защищён от копирования, пересылки, печати" : Exit Sub
On Error Resume Next
Set uidoc = ws.editDocument(False, doc)
Call uidoc.forward ' Создание почтового сообщения пересылки
End If
End Sub

Отправить ссылку на документ. Казалось бы, неплохой альтернативой предыдущей возможности будет вместо содержания документа отправить респонденту ссылку на документ. Кроме снижения объёма передаваемого (и хранимого респондентом) сообщения это позволит пользователю:
  • получить доступ к актуальному (со всеми внесёнными изменениями) оригиналу документа
  • получить доступ к документу в среде приложения с возможностью работы с этим документом, предусмотренной функционалом приложения
К сожалению, есть два большие НО пользовательского интерфейса, связанные
во-первых, с управлением доступом к документу
во-вторых, с распределённым характером приложений
В первом случае респондент, попытавшись открыть документ по ссылке, будет предупреждён о том, что ему этот документ недоступен
Во втором случае, если письмо попадёт в почтовый ящик раньше, чем документ в используемую реплику базы данных, пользователю выдастся сообщение об отсутствии документа
И тот, и другой случай в зависимости от характера приложения и конфигурации распределённой сети могут оказаться довольно часты и потребовать дополнительных решений, как то:
  • ограничение выбора респондентов списком имеющихся в полях доступа
  • добавление респондентов в доступ к документу
  • использование для маршрутизации сообщения (специфического документа приложения) до сервера респондента механизма репликаций с последующей обработкой серверным агентом и доставкой почтовым механизмом до почтового ящика
Все три эти решения не универсальны, не решают всех проблем, поэтому разумным видится иной путь, предусматривающий следующий компромисс:
вместо пересылки целого документа или ссылки на документ отправлять почтовое сообщение, содержащее некоторую информацию о документе, позволяющую "утолить любопытство" респондента (снабдить его определённой информацией по документу) и о процедуре получения доступа к документу
Благо, для подобного решения много сил разработчику не потребуется:
нужно создать форму, содержащую необходимый набор полей (для унификации можно использовать имя формы Скрытые/для пересылки с алиасом forForward),
разместить в ней вычисляемое поле для ссылки (в двух вариантах: с формулой @DocumentUniqueID для ссылки в виде стандартной жёлтой иконки-прямоугольника или текстовой ссылки вида Notes:// - "Notes:///" + @Text(@ReplaceSubstring(@ReplicaID; ":"; "")) + "/0/" + @Text(@DocumentUniqueID))
в код пересылки, приведённый выше, ввести функционал смены формы
...
Call doc.replaceItemValue("form", "forForward")
Set uidoc = ws.editDocument(False, doc)
Call uidoc.forward
...

Добавить событие в календарь. Для приложений, оперирующих с данными типа дата, неплохой возможностью представляется связать документы приложения с пользовательским календарём. Действия, размещённые в приложении, предоставят пользователю создать документы-записи в собственной почтовой базе, установить режим напоминания о приближении события
Ниже приведён код двух действий
Действие Создание календарной записи Годовщина. Действие размещается в базе, содержащей сведения о датах рождения сотрудников (поле dtEvent)
Sub Initialize
Dim ws As New NotesUIWorkspace
Dim uiview As NotesUIView
Set uiview = ws.currentView

Dim doc As NotesDocument

Dim session As New NotesSession
Dim curdb As NotesDatabase

Set curdb = session.currentDatabase
If uiview Is Nothing Then ' Код выполняется не в интерфейсе представления - подобно приведённому выше фрагменту кода
Dim uidoc As NotesUIDocument
Set uidoc = ws.currentDocument
If uidoc Is Nothing Then Messagebox "Выполнение действия прервано", 48, "Не выбрано записи в календаре" : Exit Sub
Set doc = uidoc.document
Else ' Код выполняется не в интерфейсе представления
Dim noteID As String
noteID = uiview.caretNoteID
If noteID = "" Then Messagebox "Выполнение действия прервано", 48, "Не выбрано записи в календаре" : Exit Sub
On Error Resume Next
Set doc = curdb.getDocumentByID(noteID)
On Error Goto 0
If doc Is Nothing Then Messagebox "Выполнение действия прервано", 48, "Не выбрано записи в календаре" : Exit Sub
End If

Dim mailbox As New NotesDatabase("", "")
On Error Resume Next
Call mailbox.openmail
If Not mailbox.isOpen Then Messagebox "Выполнение действия прервано", 48, "Нет настройки на почтовую базу или недоступен почтовый сервер" : Exit Sub

' Дальше код претерпевает изменения, необходимые для решения задачи
Dim exDate As Variant
exDate = Evaluate(|dt := @Date(@Year(@Today); @Month(dtEvent); @Day(dtEvent); 4; 0; 0); dt : @Adjust(dt; 1; 0; 0; 0; 0; 0) : @Adjust(dt; 2; 0; 0; 0; 0; 0) : @Adjust(dt; 3; 0; 0; 0; 0; 0) : @Adjust(dt; 4; 0; 0; 0; 0; 0) : @Adjust(dt; 5; 0; 0; 0; 0; 0) : @Adjust(dt; 6; 0; 0; 0; 0; 0) : @Adjust(dt; 7; 0; 0; 0; 0; 0) : @Adjust(dt; 8; 0; 0; 0; 0; 0) : @Adjust(dt; 9; 0; 0; 0; 0; 0) : @Adjust(dt; 10; 0; 0; 0; 0; 0)|, doc)
' в стандартном интерфейсе календаря почтовой базы ежегодное повторение дат задаётся списком дат, по умолчанию, на десять лет вперёд
' время начала события устанавливается в четыре часа утра (по умолчанию)
If Isempty(exDate) Then Messagebox "Выполнение действия прервано", 48, "В документе не установлена дата события" : Exit Sub
If Not Datatype(exDate(0)) = V_DATE Then Messagebox "Выполнение действия прервано", 48, "В документе не установлена дата события" : Exit Sub

Dim alarmdoc As NotesDocument ' создание документа записи календаря
Set alarmdoc = mailbox.createDocument
Call alarmdoc.replaceItemValue("Form", "Appointment") ' тип документа - запись календаря
Call alarmdoc.replaceItemValue("AppointmentType", "1") ' тип события - годовщина
Call alarmdoc.replaceItemValue("CalendarDateTime", exDate) ' задание списка дат на 10 лет вперёд
Call alarmdoc.replaceItemValue("StartDateTime", exDate)
exDate = Evaluate({@Adjust(StartDateTime; 0; 0; 0; 16; 0; 0)}, alarmdoc) ' дата окончания события - в 20:00
Call alarmdoc.replaceItemValue("EndDateTime", exDate)
Call alarmdoc.replaceItemValue("Repeats", "1") ' флаг повторения события
Call alarmdoc.replaceItemValue("$NoPurge", exDate(Ubound(exDate))) ' не удалять документ до последней даты
subject = "День рождения: " & doc.getItemValue("Fullname")(0)
Call alarmdoc.replaceItemValue("alarmDescription", subject) ' Описание события в окне оповещения (alarm)
Call alarmdoc.replaceItemValue("Alarms", "1") ' включение флага оповещения
Call alarmdoc.replaceItemValue("$Alarm", 1)
Call alarmdoc.replaceItemValue("$AlarmOffset", -1440) ' известить за сутки до наступления события
' для выставления этих параметров можно взять настройки из профильного документа пользователя в базе почты
Call alarmdoc.replaceItemValue("$AlarmUnit", "D")
Call alarmdoc.replaceItemValue("_ViewIcon", 177) ' иконка с синим шариком
Call alarmdoc.replaceItemValue("$PublicAccess", "1") ' установить доступ пользователям как публичный документ
Call alarmdoc.replaceItemValue("$SMTPKeepNotesItem", "1") ' передавать Notes-поля при пересылке почтой протокола SMTP
Call alarmdoc.replaceItemValue("Subject", subject)
Call alarmdoc.replaceItemValue("Logo", "StdNotesLtr0")
Call alarmdoc.replaceItemValue("Location", "")
Call alarmdoc.replaceItemValue("Importance", "1")
Call alarmdoc.replaceItemValue("apptUNID", alarmdoc.universalID) ' ссылка собственно на сам документ
' здесь автор слегка схитрил - на самом деле в интерфейсе календаря создаются два документа со связью родитель-потомок
' но пока никаких побочных эффектов от применённого упрощения не замечено
Dim item As NotesItem
Set item = alarmdoc.replaceItemValue("Principal", session.userName)
Set item = alarmdoc.replaceItemValue("$BusyName", session.userName)
item.isNames = True
Call alarmdoc.replaceItemValue("$BusyPriority", "2")
Set item = alarmdoc.replaceItemValue("Chair", session.userName)
Set item = alarmdoc.replaceItemValue("From", session.userName)
item.isAuthors = True
Call alarmdoc.replaceItemValue("Categories", "Календарь событий\Дни рождения")
Dim rtitem As NotesRichTextItem
Set rtitem = New NotesRichTextItem (alarmdoc, "Body")
Call rtitem.AppendDocLink(doc, "Открыть документ в календаре событий")
If alarmdoc.save(True, True) Then
alarmdoc.putInFolder("$Alarms") ' Добавить документ в папку ($Alarms) для оповещения о наступлении события
Else
Messagebox "Выполнение действия прервано", 48, "Не удалось сохранить документ календаря"
End If
End Sub

Действие Создание календарной записи Задача. Помещение ссылки на документ приложения Notes в пользовательский календарь (Задача)
Данный код чуть-чуть отличается от приведённого выше только набором полей и их значений
...
Dim exDate As Variant
exDate = doc.getItemValue("execDate")(0)
If Not Datatype(exDate) = V_DATE Then Print "not exdate is datetime", Datatype(exDate) : Exit Sub
Dim alarmdoc As NotesDocument
Set alarmdoc = mailbox.createDocument
Call alarmdoc.replaceItemValue("Form", "Task") ' Тип документа - Задача
Call alarmdoc.replaceItemValue("TaskType", "1") ' Тип задачи - задачи
Call alarmdoc.replaceItemValue("CalendarDateTime", exDate) ' здесь уже не список дат, а скалярное значение даты
Call alarmdoc.replaceItemValue("StartDateTime", exDate)
Call alarmdoc.replaceItemValue("EndDateTime", exDate)
Call alarmdoc.replaceItemValue("DueDateTime", exDate) ' срок исполнения
Call alarmdoc.replaceItemValue("DueState", 1)
Call alarmdoc.replaceItemValue("$NoPurge", exDate)
subject = doc.getItemValue("Subject")
Call alarmdoc.replaceItemValue("alarmDescription", subject)
Call alarmdoc.replaceItemValue("Alarms", "1")
Call alarmdoc.replaceItemValue("$Alarm", 1)
Call alarmdoc.replaceItemValue("$AlarmOffset", -1440)
Call alarmdoc.replaceItemValue("$AlarmUnit", "D")
Call alarmdoc.replaceItemValue("_ViewIcon", 19) ' вид иконки для отображения в календарном представлении
Call alarmdoc.replaceItemValue("$PublicAccess", "1")
Call alarmdoc.replaceItemValue("$SMTPKeepNotesItem", "1")
Call alarmdoc.replaceItemValue("Subject", subject(0))
Call alarmdoc.replaceItemValue("Logo", "StdNotesLtr0")
Call alarmdoc.replaceItemValue("Location", "")
Call alarmdoc.replaceItemValue("Importance", "1")
Call alarmdoc.replaceItemValue("apptUNID", alarmdoc.universalID)
Call alarmdoc.replaceItemValue("Principal", session.userName)
Call alarmdoc.replaceItemValue("From", session.userName)
Call alarmdoc.replaceItemValue("Categories", "Оперативная отчётность")
Dim rtitem As NotesRichTextItem
Set rtitem = New NotesRichTextItem (alarmdoc, "Body")
Call rtitem.AppendDocLink(doc, "Открыть документ запроса")
If alarmdoc.save(True, True) Then alarmdoc.putInFolder("$Alarms") Else Messagebox "Выполнение действия прервано", 48, "Не удалось сохранить документ календаря" : Exit Sub
...
Примечание. Приведённый код (набор полей календарного документа) соответствует требованиям к функционалу документа (отображение документа в представлении, открытие документа без возникновения ошибки, оповещение пользователя) для версии 6.5.x. Автор предупреждает читателя, что для другой версии платформы (дизайна почтового ящика) или выполнения другого функционала (поддержка механизма выбора свободного времени, допустим) может потребоваться создание серии дополнительных полей в документе

Часть первая >>> Часть вторая >>> Часть третья >>> Часть четвёртая >>> Часть пятая Часть шестая >>>

Экспорт представления в электронную таблицу >>>
 
  Опубликовано — 07/23/2007 |    Источник: Николай Норкин, CLP R5 (Вятские Информационные Технологии)



Добавить комментарий
Имя * :
e-mail
Комментарий * :
Код подтверждения * :

Мероприятия
Пресс-релизы
Биржа труда
Последнее на форуме
 
А так же:
Как удалить профиль?
16.04.2016 00:08:51
Скопировать в буфер поле документа
24.05.2015 08:55:52
Импорт DXL-описания документов в Lotus Domino. Одноимённые поля
16.04.2015 16:49:58
 
© LOGOSPHERE.RU