Программное Обновление Элементов Дизайна Бд

Тема в разделе "Lotus - Программирование", создана пользователем proteam, 11 фев 2013.

  1. proteam

    proteam Well-Known Member

    Регистрация:
    2 мар 2012
    Сообщения:
    144
    Симпатии:
    2
    Всем привет. Стоит задача, сделать программное обновление шаблона. В интернете натолкнулся на такой вот
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
    Function ReplaceDesign(SourceServer As String, SourcePath As String, TargetServer As String, TargetPath As String) As Boolean
    On Error GoTo eh
    Dim ui As Long
    Dim Session As New NotesSession
    'Dim workspace As New NotesUIWorkspace

    Dim Sourcedb As New NotesDatabase(SourceServer,SourcePath)
    Dim Targetdb As New NotesDatabase(TargetServer,TargetPath)

    Call Logger.log(0, "Удаление элементов дизайна у текущей БД...")
    'Delete elements from the Target Database
    'Ignore Elements having "Prohibit design...." property or Master Template Defined
    Dim TargetNoteCol As NotesNoteCollection
    Set TargetNoteCol = Targetdb.CreateNoteCollection(True)

    'Select All Design Elements
    'Deselct Admin Notes
    Call TargetNoteCol.SelectAllAdminNotes(False)
    'Deselect Document Notes
    Call targetNoteCol.SelectAllDataNotes(False)
    'Deselect Icon Note
    TargetNoteCol.SelectIcon = False
    'Deselect Help-About and Help Using Notes which has different mechanism for checking "Prohibit design....."
    TargetNoteCol.SelectHelpAbout = False
    TargetNoteCol.SelectHelpIndex = False
    TargetNoteCol.SelectHelpUsing = False


    'Loop Thru All Design Notes and Check -- 'Ignore Elements having "Prohibit design...." property or Master Template Defined
    Call TargetNoteCol.BuildCollection
    Dim DesignDoc As NotesDocument
    Dim ID As String
    Dim NextID As String
    Dim i As Long
    ID = TargetNoteCol.GetFirstNoteId
    For i = 1 To TargetNoteCol.Count
    NextID = TargetNoteCol.GetNextNoteId(ID)
    Set DesignDoc = TargetDB.GetDocumentByID(ID)
    If (Not(DesignDoc.HasItem("$Class"))) And InStr(DesignDoc.~$Flags(0),"P") =0 Then
    'Print "Removing " + DesignDoc.~$Title(0)
    Call DesignDoc.RemovePermanently(True)
    End If
    nxtID:
    ID= NextID
    Next

    'Check for Help About and Help Using

    Dim IsHelpAbout As Boolean
    Dim IsHelpUsing As Boolean
    IsHelpAbout = False
    IsHelpUsing = False
    Call TargetNoteCol.SelectAllNotes(False)
    Call TargetNoteCol.ClearCollection
    TargetNoteCol.SelectHelpAbout = True
    Call TargetNoteCol.BuildCollection
    If TargetNoteCol.Count <> 0 Then
    ID = TargetNoteCol.GetFirstNoteId
    Set DesignDoc = TargetDB.GetDocumentByID(ID)
    If InStr(DesignDoc.~$Flags(0),"R") <> 0 Then
    'Print "Removing Help-About Document"
    'Call DesignDoc.Remove(True)
    Call DesignDoc.RemovePermanently(True)
    IsHelpAbout = True
    End If
    End If
    Call TargetNoteCol.SelectAllNotes(False)
    Call TargetNoteCol.ClearCollection
    TargetNoteCol.SelectHelpUsing = True
    Call TargetNoteCol.BuildCollection
    If TargetNoteCol.Count <> 0 Then
    ID = TargetNoteCol.GetFirstNoteId
    Set DesignDoc = TargetDB.GetDocumentByID(ID)
    If InStr(DesignDoc.~$Flags(0),"R") <> 0 Then
    'Print "Removing Help-Using Document"
    'Call DesignDoc.Remove(True)
    Call DesignDoc.RemovePermanently(True)
    IsHelpUsing = True
    End If
    End If

    'Set More Fields Options
    Call TargetDb.SetOption(54,True)

    Call Logger.log(0, "Копируем дизайн...")

    'Copy All the Design Elements from SourceDB to Target DB except Help About and Help Using
    Dim SourceNoteCol As NotesNoteCollection
    Set SourceNoteCol = Sourcedb.CreateNoteCollection(True)
    'Deselct Admin Notes
    Call SourceNoteCol.SelectAllAdminNotes(False)
    'Deselect Document Notes
    Call SourceNoteCol.SelectAllDataNotes(False)
    'Deselect Icon Note
    SourceNoteCol.SelectIcon = False
    'Deselect Help-About and Help Using Notes which has different mechanism for checking "Prohibit design....."

    If IsHelpAbout = False Then
    SourceNoteCol.SelectHelpAbout = False
    End If
    If IsHelpUsing = False Then
    SourceNoteCol.SelectHelpUsing = False
    End If

    'Loop Thru All Design Notes and Check -- 'Ignore Elements having "Prohibit design...." property or Master Template Defined
    Call SourceNoteCol.BuildCollection
    ID = SourceNoteCol.GetFirstNoteId
    For i = 1 To SourceNoteCol.Count
    NextID = SourceNoteCol.GetNextNoteId(ID)
    Set DesignDoc = SourceDB.GetDocumentByID(ID)

    Call DesignDoc.CopyToDatabase(TargetDB)    
    'Print "Copying...." + DesignDoc.~$Title(0)
    nxtID1:
    ID= NextID
    Next


    'Add All the roles from Source DB to Target DB
    Dim TargetACl As NotesACL
    Dim SourceACL As NotesACL
    Set TargetACL = TargetDb.ACL
    Set SourceACL = SourceDB.ACL
    Dim TargetRoles As Variant
    Dim SourceRoles As Variant
    TargetRoles = TargetACL.Roles
    SourceRoles = SourceACL.Roles
    If IsArray(SourceRoles) Then
    Dim RolesToBeAdded As Variant
    RolesToBeAdded = ArrayUnique((ArrayReplace(SourceRoles,TargetRoles,"")))
    ForAll DummyRole In RolesToBeAdded
    If FullTrim(DummyRole) <> "" Then
    TargetACL.AddRole(StrLeft(StrRight(DummyRole,"["),"]"))
    End If
    End ForAll
    TargetACL.Save
    End If

    ReplaceDesign = True

    Call Sourcedb.Remove()
    Delete Targetdb
    ex:
    Exit Function
    eh:Call Logger.log(Err, CStr(Error)+" in "+Cstr(GetThreadInfo(1))+" on line "+Cstr(Erl))

    Resume ex
    End Function
    Но лотус такая штука, в первый раз агент все хорошо обновил, во второй - тоже, запускаю в 3 раз: логируется что все успешно, но открываешь базу данных и видишь кривой дизайн, дубликаты некоторых элементов дизайна в общем небольшой хауз.

    Может быть кто нибудь знает, как лучше и для лотуса безошибочно сделать программное обновление элементов дизайна БД?
     
  2. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
  3. proteam

    proteam Well-Known Member

    Регистрация:
    2 мар 2012
    Сообщения:
    144
    Симпатии:
    2
    Зачем поиск когда есть такие добрые люди) Спасибо.

    А если серьезно, искал только в разделе Лотус - программирование.
     
  4. proteam

    proteam Well-Known Member

    Регистрация:
    2 мар 2012
    Сообщения:
    144
    Симпатии:
    2
    Жаль что только на виндовой машине работает, мне нужно кросплатформенное решение(
     
  5. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    >мне нужно кросплатформенное решение(
    ну так скачайте доку по NotesAPI, напишите нужные декларации и select case Notessession.Platform.
     
  6. proteam

    proteam Well-Known Member

    Регистрация:
    2 мар 2012
    Сообщения:
    144
    Симпатии:
    2
    Задекларировал для AIX, запустил и .... сервер рухнул. Ниже привожу код. Может кто сталкивался?

    Код (Text):
    Declare Private Function AIX_NSFDbOpen Lib "libnotes_r.a" Alias "NSFDbOpen" (ByVal PathName As LMBCS String, hDB As Long) As Integer
    Declare Private Function AIX_NSFDbClose Lib "libnotes_r.a" Alias "NSFDbClose" (ByVal hDB As Long) As Integer
    'обновление
    Declare Private Function AIX_DesignRefresh Lib "libnotes_r.a" Alias "DesignRefresh" (ByVal ServerName As LMBCS String, ByVal hDB As Long, ByVal dwFlags As Long, ByVal abortCheck As Long, ByVal messageProc As Long) As Integer
    'замена дизайна из шаблона
    Declare Function AIX_DesignReplace Lib "libnotes_r.a" Alias "DesignReplace" (ByVal ht As Long, ByVal hDB As Long, ByVal dw1 As Long, ByVal dw2 As Long, ByVal dw3 As Long, ByVal dw4 As Long) As Integer
    Код (Text):
    Sub Initialize
    Dim s As New NotesSession

    Call ReplaceDesign(s.Currentdatabase.server+"!!"+"attach/inbox.ntf", s.Currentdatabase.server+"!!"+"inbox.nsf")
    End Sub
    Sub Terminate

    End Sub

    Function ReplaceDesign(ByVal templateDB As String, ByVal targetDB As String) As Boolean
    On Error GoTo eh
    Dim status As Integer
    Dim htemplate As Long
    Dim htarget As Long
    Dim tDB As NotesDatabase

    Print "открытие БД шаблона"
    status = AIX_NSFDbOpen(templateDB, htemplate)
    If status<>0 Then
    Print "Не удалось открыть шаблон " & templateDB & " - Error Code " & CStr(status)
    GoTo ex
    End If
    Print "открытие текущей БД"    
    status = AIX_NSFDbOpen(targetDB, htarget)
    If status<>0 Then
    Print "Не удалось открыть БД " & targetDB & " - Error Code " & CStr(status)          
    Call AIX_NSFDbClose(htemplate)
    GoTo ex
    End If

    Call AIX_DesignReplace(htemplate, htarget, 1, 0, 0, 0)

    Call AIX_NSFDbClose(htemplate)

    Call AIX_NSFDbClose(htarget)


    ReplaceDesign = True

    ex:

    Exit Function
    eh:
    Print Error+" on line "+CStr(Erl)
    Resume ex
    End Function
     
  7. proteam

    proteam Well-Known Member

    Регистрация:
    2 мар 2012
    Сообщения:
    144
    Симпатии:
    2
    PS. Посмотрел NotesAPI. DesignRefresh такая функция там есть, а вот DesignReplace не обнаружил. Хотя в примере (http://codeby.net/forum/threads/33068.html) эта функция задеклирирована и для винды все работает прекрасно, может тут какие то траблы лотуса(
     
  8. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    А у тебя AIX... А файлика "libnotes.so" там нет? Не знаком с данной осью.
    DesignReplace недокументированная функция, корректность ее работы под вопросом...
    Можно использовать DesignRefresh предварительно изменив каждый элемент дизайна в шаблоне источнике.
    Выход всегда есть.
     
  9. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.019
    Симпатии:
    8
    Хммм... Вообще говоря, у меня и через NoteCollection все неплохо работает (как в 1-м посте написано). Дебажить агента не пробовали? Мож база открыта в Дизайнере на момент обновления?
     
  10. proteam

    proteam Well-Known Member

    Регистрация:
    2 мар 2012
    Сообщения:
    144
    Симпатии:
    2
    Работало, но тут получилось следующее, первый запуск отлично, второй запуск отлично, на третий или 4 раз выходит кривой шаблон. Я запускал подряд, проверял как он реагирует. А сейчас вообще молодец, сначала удаляет все элементы дизайна, потом пытается вставить и выходит ошибка Данный документ уже используется, хотя я БД тока выгрузил и ее никто кроме этого агента не использует - как итог бд вообще без дизайна осталась, что заставило меня задуматься над стабильностью этого способа. Пока забросил первый способ, переключился на второй через DesignReplace

    DesignRefresh вроде требует настроеный мастер шаблонов?
     
  11. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Да, по идее, на 4 закладке свойств БД указать.
    А почему сервер рухнул узнать не получилось? В логах что-то есть?
    Типы параметров и разрядность может не совпадают?

    Попробуй заменить Long на Integer, может и глупость, но с разрядностью наверняка проблемы.
     
  12. proteam

    proteam Well-Known Member

    Регистрация:
    2 мар 2012
    Сообщения:
    144
    Симпатии:
    2
    Спасибо. Попробую и отпишусь

    Не помогло. Может я что то не понял, я у всех 4 параметров сменил тип на Integer

    Сменил у последних двух как советовали в другой теме, тоже не помогло( Жаль не могу найти AIX 32 bit
     
  13. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    По идеи надо только для Handle сменить:
    Код (LotusScript):
    ByVal ht As Integer, ByVal hDB As Integer
    А в целом забавно... Lotus кроссплатформенное существо, а видно не везде...
     
  14. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.019
    Симпатии:
    8
    Lotus Notes/Domino 8.5.2 Fix Pack 2 Fix List:
    "...SPR# PCHE7S9VAB (LO40738) - Fixed a Domino Crash issue within the C API call DesignRefresh called from LotusScript causes panic on 64-bit Domino server..."
     
  15. proteam

    proteam Well-Known Member

    Регистрация:
    2 мар 2012
    Сообщения:
    144
    Симпатии:
    2
    Снова не помогло

    Добавлено:
    Лотус Доминов на Windows 64bit не упал... Значит все таки с платформой какие то траблы.. Аикс уже давно мне не нравится, на нем иногда агенты, запускаемые по расписанию не видят классы подключаемые через библиотеки.
     
  16. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    savl :) посмотри декларации - http://www-12.lotus.com/ldd/doc/tools/c/8....e0?OpenDocument
    DamirUrazov Не твой ли случай заявлен для 8.5 (конкретную версию ты вроде не указал, так что гадаем) - http://www-01.ibm.com/support/docview.wss?uid=swg1LO52803
    помечено как дубликат ошибки, закрытой в 852 fp2 и 853:
    SPR# PCHE7S9VAB (LO40738) - Fixed a Domino Crash issue within the C API call DesignRefresh called from LotusScript causes panic on 64-bit Domino server. ( http://www-10.lotus.com/ldd/fixlist.nsf/Pu...DE?OpenDocument )
     
  17. proteam

    proteam Well-Known Member

    Регистрация:
    2 мар 2012
    Сообщения:
    144
    Симпатии:
    2
    Да, у меня Domino 8.5 FP1(

    Спасибо. Очень помогли
     
  18. proteam

    proteam Well-Known Member

    Регистрация:
    2 мар 2012
    Сообщения:
    144
    Симпатии:
    2
    Попробовал на Lotus Domino 8.5.3 FP3 на том же сервере, теперь вообще отвалилась функция NSFDbOpen(( выдает 2055 ошибку при открытии БД, запуск локально агента прекрасно обновил БД.

    Решил делать по 1 способу, через NoteCollection. И снова чудеса лотуса. Стали появлятся дубликаты. И тут я увидел следующее. Кто нибудь сталкивался с таким косяком:

    NotesNoteCollection видит не все элементы дизайна. Прохобиты не стоят, скрытые от него элементы дизайна ничем не отличаются от тех что видны. Еще есть специальная утилита от TeamStudio, Configurator называется, он также не видит эти элементы для анализа. Сделал сделующие, создал дубликат элемента дизайна что не виден для NotesNoteCollection, он его увидел, а оригинал так и не увидел. Пересохранение не помогает.
     
  19. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.019
    Симпатии:
    8
    DamirUrazov, у Вас же есть шаблон (из которого копируете дизайн)? Создайте на его основе новую базу и попробуйте работать с ней. Полей типа Readers в элементах дизайна точно нет? И, кстати, "невидимые" элементы работают-то нормально? Т.е., виды открываются, формы сохраняются? Я к тому, что, возможно, Лотус уже и не считает их дизайном :)
     
  20. proteam

    proteam Well-Known Member

    Регистрация:
    2 мар 2012
    Сообщения:
    144
    Симпатии:
    2
    Да, иначе бы давно били тревогу. Все работает нормально. Снимаешь шаблон (если его смотреть конфигуратором от ТимСтудио тоже не видит эти элементы дизайна), накатывает на другую базу уже все ок, и Конфигуратор видит и NotesNoteCollection. Полей Read-Write Access нету
     
Загрузка...

Поделиться этой страницей