Простое воссоздание представлений «Общий, рабочий стол 1-го использования» - PullRequest
3 голосов
/ 13 мая 2011

У меня есть некоторые представления, которые используют @UserName в формуле выбора.Для работы это представление должно быть «Shared, Desktop Private при первом использовании».Это не проблема.

Но эти представления будут часто тихо изменяться.

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

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

Лучший результат - удалить значок из рабочей области и снова открыть приложение.Это работает (до сих пор) всегда.Но это так раздражает, когда конечные пользователи повторно открывают приложение из (глубоко выровненных) серверных папок.

Любой другой способ обновить дизайн представлений «При первом использовании»?

Ответы [ 5 ]

4 голосов
/ 14 мая 2011

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

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

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

Mick Moignard опубликовал хорошую статью на эту тему в Интернете: Динамическая фильтрация представлений в Notes .

См. Также справку Lotus Domino Designer, раздел " Отображение отдельной категории во встроенных представлениях "

2 голосов
/ 13 мая 2011

Я попытался решить ту же проблему и в итоге сделал две вещи: (1) автоматически отправил пользователю электронное письмо со ссылкой на базу данных и попросил его удалить значок базы данных, чтобы удалить частные просмотры, и (2) предупредить пользователя, когда дизайн частного просмотра изменился.

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

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

Вот описание дизайна, который я использовал:

  • Позвольте представлению использовать общую библиотеку сценариев, PrivateViewsCode.
  • В PrivateViewsCode (Declarations) объявить Const DESIGN_VERSION = "1.0".
  • В PrivateViewsCode объявить функцию myQueryopen.Один из параметров, который получает myQueryopen - это строка designVersion.
  • В приватном вызове события Queryopen myQueryopen, передавая DESIGN_VERSION в designVersion.Поскольку этот код находится в кэшированном представлении, DESIGN_VERSION будет содержать постоянное значение, как оно было в момент кэширования дизайна представления (когда пользователь впервые его открыл), в данном случае - "1.0".
  • В myQueryopen сравнить designVersion с DESIGN_VERSION.

    Dim designChanged As Integer  
    designChanged = (designVersion <> DESIGN_VERSION)  
    

    Поскольку myQueryopen является частью библиотеки сценариев PrivateViewsCode, здесь вы фактически сравниваете DESIGN_VERSION (как кешируется в приватном представлении и затем передается в myQueryopen) с DESIGN_VERSION изPrivateViewsCode, который всегда актуален.

  • Осталось только перекомпилировать представления (Tools \ Recompile all LotusScript) после изменения DESIGN_VERSION.

Я надеюсь, что это объясняет дизайн, вот как это работает:

  • После внесения изменений в дизайн частных представлений вы меняете версию:

    DESIGN_VERSION = "1.1"  
    
  • Перекомпилируйте все LotusScript.
  • Обновление дизайна базы данных.
  • Пользователи открывают любое частное представление, которое использует эту функцию.
  • Они получают сообщение о том, что получат ссылку на базу данных, и что они должны удалить значок из рабочей области и открыть его снова, используя предоставленную ссылку.
  • Пользователь закрывает базу данных и удаляет значок - личные представления удаляются.
  • Пользователь открывает ссылку на базу данных в электронном письме, и в следующий раз, когда он открывает одно из закрытых представлений, новый дизайн кэшируется вместе с новым значением DESIGN_VERSION (здесь "1.1").
  • Сравнение (designVersion <> DESIGN_VERSION) теперь дает false.Все возвращается на круги своя до следующего обновления.

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

(Редактировать)
Я предполагал, что у вас есть особая причина для использования частных представлений, но я использовал «Показать отдельную категорию» во встроенном представлении (как предлагает leyrer) с тех пор, как оно стало доступно и быловполне доволен этим.Если вы обнаружите какие-либо ограничения в использовании параметра «Показать отдельную категорию», я постараюсь вам в этом помочь.

1 голос
/ 15 мая 2011

Решение вашей дилеммы не слишком сложно, но немного утомительно. Существует technote о простом удалении частных представлений программным способом. Это общая проблема дизайна для разработчиков.

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

Секрет в том, чтобы проверить событие DatabaseOpen, так как это представление хранится на локальном клиенте, поэтому вам нужно сделать это с помощью пользовательского интерфейса пользователя. Пока ваш клиентский парк Lotus Notes работает под управлением версии 6.5.x, вы можете попробовать следующее. Чтобы быть кратким, я обрисовал в общих чертах, что Вы должны сделать.

  1. Назовите ваше личное представление "yourPrivateViewName_1.0 | yourPrivateViewName"

    • Обратите внимание на использование псевдонима. Это делается для того, чтобы вы могли ссылаться на представление в виде схемы или кода независимо от того, сколько версий вы используете.
    • Это также может быть многозначное поле, если у вас есть несколько частных представлений для управления.
  2. Создайте документ профиля базы данных, в котором есть поле с текущим именем частного представления, например, «youPrivateViewName_1.1»

  3. В DatabaseOpen просматривайте представления, находя закрытые представления, затем сравнивайте имя с именем в профиле базы данных. Соглашение об именах разработано, чтобы сделать возможным проверку версии. Если версии не совпадают, удалите представление. Когда пользователь откроет это представление в следующий раз, он должен получить текущую версию, которую вы выпустили.

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

1 голос
/ 13 мая 2011

Я нашел способ перенести боль от конечного пользователя к разработчику. Я разработал навигацию, чтобы использовать контуры, чтобы я мог контролировать, куда пользователь попадает, когда он перемещается к представлению. Записи схемы Notes могут быть изменены без необходимости проходить через пользовательские операции delete-icon-then-reopen-database.

Когда мне нужно обновить дизайн частного представления, я переименовываю его, а также обновляю ссылку на него в записи схемы заметок. На рабочем столе пользователей при следующем открытии базы данных для них будет создано новое частное представление. Большинство (или все) из моих пользователей никогда ничего не замечали, по крайней мере, они никогда не упоминали об этом!

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

0 голосов
/ 18 мая 2011

Спасибо всем!

Я наконец-то получил следующее:

Создание агента, работающего из меню, которое закрывает базу данных

Sub Initialize
    Dim s As New NotesSession
    s.SetEnvironmentVar "remove-"+s.CurrentDatabase.ReplicaID,"1"
    Dim ws As New NotesUIWorkspace
    ws.CurrentDatabase.Close
End Sub

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

Declare Sub keybd_event Lib "user32.dll" (Byval bVk As Integer, Byval
 bScan As Integer, Byval dwFlags As Integer,Byval dwExtraInfo As Integer)

Sub Queryclose(Source As Notesuidatabase, Continue As Variant)

    Dim s As New NotesSession
    x = s.GetEnvironmentString("remove-"+s.CurrentDatabase.ReplicaID)
    s.SetEnvironmentVar "remove-"+s.CurrentDatabase.ReplicaID,""
    If x="" Then Exit Sub

    Dim ws As New NotesUIWorkspace
    Call ws.AddDatabase( s.CurrentDatabase.Server,s.CurrentDatabase.FilePath)

    Dim m As New NotesDocument(s.CurrentDatabase)

    m.From = s.CurrentDatabase.Title
    m.SendTo = s.CommonUserName
    m.Subject = "Link to open " + s.CurrentDatabase.Title

    Dim rt As New NotesRichTextItem(m,"Body")
    rt.AppendText s.CurrentDatabase.Title
    rt.AppendText " -> "
    rt.AppendDocLink s.CurrentDatabase,"Open Application"

    m.Send False
    Delete m

    keybd_event &h2e,0,0,0 ' Del key down
    keybd_event &h2e,0,2,0 ' Del key up
    keybd_event &h0D,0,0,0 ' Y key down
    keybd_event &h0D,0,2,0 ' Y key up

End Sub

(Вы все получили свои положительные отзывы, но отметили ai как ответ для пользователя с самым низким количеством респ.)

...