Проблемы С Импортом Дизайна Из Dxl

Тема в разделе "Lotus - Программирование", создана пользователем ty3uk, 22 окт 2014.

  1. ty3uk

    ty3uk Well-Known Member

    Регистрация:
    31 мар 2008
    Сообщения:
    169
    Симпатии:
    0
    ну пока писал, одну проблемы поборол. Остался вопрос, а можно как-то, при импорте дизайне через DXL указать явно, что реплейсить весь дизайн, т.е. если в старом есть форма "form1" а в новом её нет, то, чтоб, после импорта, форма "form1" удалилась?
     
  2. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    импорт программный или из дизигнера?
     
  3. ty3uk

    ty3uk Well-Known Member

    Регистрация:
    31 мар 2008
    Сообщения:
    169
    Симпатии:
    0
    програмный. перед этим формирую дизайн из базы в xml, потом, в другом месте, пытаюсь натянуть из XML обратно на базу. Вроде идёт нормально, но, вот, как старые документы дизайна убрать?
    Код (LotusScript):
        Dim importer As NotesDXLImporter
    Set importer = session.CreateDXLImporter(stream, dbCopy)
    importer.ReplicaRequiredForReplaceOrUpdate = False
    importer.DesignImportOption = DXLIMPORTOPTION_REPLACE_ELSE_CREATE
    Call importer.Process
    Call dbCopy.Sign(DBSIGN_DOC_ALL , false)
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    А чем не устраивает программный replace через C API?
     
  5. ty3uk

    ty3uk Well-Known Member

    Регистрация:
    31 мар 2008
    Сообщения:
    169
    Симпатии:
    0
    хотел малой кровью... хочется из LS всё сделать. А там начинается, копия базы "отпускает код" (т.е. не отловить конец), для больших баз используйте sleep.
    Или, блин, я что-то не так делаю.
    Какие есть способы?
    мне нужно:
    1) взять дизайн, сохранить его
    2) на "месте", забэкапить дизайн (с сохранением)
    3) накатить новый дизайн (из п.1)
    в последнем пункте, ещё, поиграться с ACL, позапускать агентов и т.п.
    вот сижу и думаю...
     
  6. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    У нас справочник систем, там документы, в них все пути к базам, ключевые слова, куча настроек.
    К каждому документу есть ответные: backup дизайна + шаблоны для обновления.
    BackUP делается через копию на локале, потом крепится в ответный, затем с локала удаляется.
    С ACL тоже можно поиграться, но это уже проще.
    Запуск агентов тоже можно сделать, причем через консоль.
    Выложу код, правда обрезки, полностью выкладывать это целую базу надо...
    Но если что на вопросы отвечу.

    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Declarations</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
    Declare Sub OSGetDataDir Lib "nnotes.dll" Alias "OSGetDataDirectory" (ByVal DataDir As String)
    Declare Private Function W32_NSFDbOpen Lib "nnotes" Alias "NSFDbOpen" (ByVal PathName As LMBCS String,hDB As Long) As Integer
    Declare Private Function W32_NSFDbClose Lib "nnotes" Alias "NSFDbClose" (ByVal hDB As Long) As Integer

    Declare Function W32_DesignReplace Lib "nnotes" 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
    Declare Public Function OSLoadString Lib "nnotes.dll" Alias "OSLoadString" _
    (ByVal hModule&, ByVal StringCode%, ByVal retBuffer As LMBCS String, BufferLength%) As Integer
    Declare Sub OSPathNetConstruct Lib "nnotes.dll" ( ByVal portName As Integer, ByVal ServerName As String, ByVal FileName As String, ByVal retPathName As String)
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">ReplaceDesign</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
    Function DBT_ReplaceDesign(Dest As NotesDatabase,Source As NotesDatabase) As Boolean
    On Error GoTo handler
    Const FuncName = {Function "ReplaceDesign"}
    Dim ErrStr As String

    Dim status As Integer
    Dim htemplate As Long
    Dim htarget As Long
    Dim SourceStr As String
    Dim DestStr As String

    DBT_ReplaceDesign = False

    SourceStr = Space(1024)
    Call OSPathNetConstruct(0, Source.Server, Source.FilePath, SourceStr)
    If SourceStr = "" GoTo endh

    SourceStr = FullTrim(SourceStr)

    DestStr = Space(1024)
    Call OSPathNetConstruct(0, Dest.Server, Dest.FilePath, DestStr)
    If DestStr = "" GoTo endh

    DestStr = FullTrim(DestStr)

    status = W32_NSFDbOpen(SourceStr, htemplate)
    If status <> 0 Then Error Err,"Не удалось открыть шаблон " & SourceStr & " - Error Code " & getLNerror(status)

    status = W32_NSFDbOpen(DestStr, htarget)
    If status <> 0 Then
    Call W32_NSFDbClose(htemplate)
    Error Err, "Не удалось открыть БД " & DestStr & " - Error Code " & getLNerror(status)        
    End If

    Call W32_DesignReplace(htemplate, htarget, 1, 0, 0, 0) 
    Call W32_NSFDbClose(htemplate)
    Call W32_NSFDbClose(htarget)

    DBT_ReplaceDesign = True

    GoTo endh
    handler:
    ErrStr = libName & ", " & FuncName & ": " & Err &", в стр " & Erl & nLine & Error$
    If htemplate <> 0 Then Call W32_NSFDbClose(htemplate)
    If htarget <> 0 Then Call W32_NSFDbClose(htarget)
    Error Err, ErrStr
    endh:
    End Function
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Как я делаю backUp</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
    fPath = StrLeftBack(db.Filepath,".")
    If InStr(fPath, {\}) Then fPath = StrRightBack(fPath,{\})
    Set templateDb = db.Createcopy("",fPath & ".ntf")
    Call templateDb.Grantaccess(ses.Username, 6)
    <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):
    ConCmd = {Tell AMGR RUN "} & DestDb.Filepath & {" '} & agentName & {'}
    Call ses.Sendconsolecommand(DestDb.Server, ConCmd)
    Добавлено:
    Убить текущую сессию и база "отпускается"
     
  7. ty3uk

    ty3uk Well-Known Member

    Регистрация:
    31 мар 2008
    Сообщения:
    169
    Симпатии:
    0
    данный момент я не пробовал, я имею в виду, от db.Createcopy я отказался, увидев в хелпаре... так... не понял... значит какой-то другой метод был, там явно говорилось о том, что "копия дело затяжное, и переход на следующую строчку кода, не значит что копия сделана, используйте sleep".. блин...

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

    а вот с реплейсом задница... почти все серваки под линухом (и аккурат те, которые нужны....)

    блин, походу придётся изобретать велосипед... перед "вливанием" дизайна, взять старый, составить "карту", посмотреть "новую", разницу удалить, потом влить новый дизайн. Блин, надо ещё прохибиты проверить, как они при вливании отрабатывают... так, проверил, прохибиты не проверяются... значит надо ещё и их отрабатывать... ёпрст... вот реально велосипед делаю...
     
  8. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    CreateFromTemplate - копирует по идее полностью, про этот метод наверное читали. Там да, там долго...
    Нет... тут другая фишка.. Посылаем команду на Amgr, а он уже сам этого агента стартует, как освободится.
    Ожидания нет, код сразу идет дальше этой строки, если надо с ожиданием, то либо Run, либо RunOnServer, либо вручную.

    если не AIX, то есть вариант. Эта C API подходит для Win, Mac и Lin. Объява только другая.
    МБ или похожее:
    Код (LotusScript):
    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
    но через нее точно удаляются элементы, кроме прохабитов
    Если есть manager добавляются роли в ACL и удаляются, но если роль на пользователе каком-то, то она не удалится и не снимется.

    Вот еще велосипед ближе к вашему
     
  9. ty3uk

    ty3uk Well-Known Member

    Регистрация:
    31 мар 2008
    Сообщения:
    169
    Симпатии:
    0
    вот, точно, оттуда... там даже красненьким выделено...

    меня интересуют исключительно "затяжные коды", т.е. когда я точно знаю что готово, либо ошибка (именно из-за это пришлось уйти от CreateFromTemplate и закинуться в DXL). Соотвественно и с агентами, интересует именно run (ну runonserver не интересует, т.к. корневой итак на серваке "топчется"...). Но, всёравно, за пинание через консоль пасиба, не знал как из скрипта консоль пнуть.... ;)


    Код (LotusScript):
    Declare Function AIX_DesignReplace Lib "libnotes_r.a" Alias "DesignReplace"...
    опа, не знал что так под юнихами будет работать, надо проверить... только, наверное, вот такое ;-)
    Код (LotusScript):
    Declare Function Lin_DesignReplace Lib "libnotes.so" Alias "DesignReplace" ...
    ну посмотрим, заработает или нет....

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

    Код (LotusScript):
    notes_document.~$item
    опа.. а я мучался....
     
  10. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Не понял этой строки)
    Да, может быть и "libnotes.so"
    Ну как либы подхватились?
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    savl скорее всего это про доступ к "служебным" полям, в расширенном синтаксисе ;)
     
  12. ty3uk

    ty3uk Well-Known Member

    Регистрация:
    31 мар 2008
    Сообщения:
    169
    Симпатии:
    0
    Пока нет, я, пока, на локалке тренеруюсь. Но функции зауниверсалил на W32 и Лялих. Придёт время на серваке проверю.
    Сейчас в промежутках между задачами, потихоньку делаю ;-) .

    оно самое. Не знал как такое делать, всё геты и реплейсы.
     
  13. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    799
    Симпатии:
    78
    Иконка и много чего полезного при APIReplaceDesign не переползает .
    делал просто:

    ' Заменили дизайн, переписываем документ со свойствами базы
    Set DBDocPropTempl = TemplDB.GetDocumentByID("FFFF0010")
    Set DBDocPropTarget = TargetDB.GetDocumentByID("FFFF0010")
    Call DBDocPropTempl.CopyAllItems(DBDocPropTarget)
    Call DBDocPropTarget.Save(True, False)

    info:
    http://www-01.ibm.com/support/docview.wss?uid=swg21244071 + тыц
     
  14. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Да, доки about, help.
    Что касается иконки, с версии 8.5 можно устанавливать png файл для иконки, так вот он меняется только если его не было первоначально.
    Если был, то нет, потому что при установке сразу выставляется галка прохабита.
     
  15. ty3uk

    ty3uk Well-Known Member

    Регистрация:
    31 мар 2008
    Сообщения:
    169
    Симпатии:
    0
    Вести с полей: работает! (имеется в виду, что протестил "скрипт наката" работая из-под линухового сервака, если он работает, то и под виндой запашет, ну налокалке-то пахало...)
    Косячёк с подписыванием базы. Стандартным способом не получается, пришлось админским процессом (есть способ через C API подписать сервером, и ожидать подписи?)

    ПО иконкам, абаут и т.п. Сделал по другому. Сделал, всётаки, если базы нет, то создавать из темплейта (подкладываю подготовленный "бланк" под сервак, и с него создаю, создаётся нормально, а там, иконки и т.п. уже подправленны на рефреш. Далее, да, можно тягать по noteID (если делать тупо, создать пустую базу (скриптом), то никаких иконок там нет, и на попытку выдернуть иконку по noteID и поменять её параметры... ну понятно.. самое забавное, что если на базу созданную с нуля, накатить дизайн, и потом попробовать добраться до иконки, опять болт!!! похоже по дефаулту, даже в нулевой базе, на иконке стоит запрет рефреша, и из-за этого, "накатом", она не создаётся....))

    теперь мешается только подписывание базы через админский процесс... хотелось-бы, чтоб "план работ" исполнялся в "один заход агентом", а не каждые 5-ть минут, проверял: "подписалась-ли база?" (кстати, есть способ как-то проверить, что база полностью подписалась? аа.. кажется понимаю... яж запрос создал, можно следить по его ID?)

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

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    799
    Симпатии:
    78
    по иконкам\етс. делалась такая ф-ция:

    Код (LotusScript):
    Function ReplaceDesign(TemplDB As NotesDatabase, TargetDB As NotesDatabase) As Integer
    '''''''''''''''''''''''''''''''''''''
    Const NOTE_CLASS_ICON_DEFAULT = &H8010 '*** icon default note
    Const NOTE_CLASS_DESIGN_DEFAULT = &H8020 '*** icon default note _DEFAULT = &H8010 '*** icon default note
    Const NOTE_CLASS= &H0003
    Dim hNote As Long
    Dim PathName As String * 256
    Dim TargetPathName As String * 256
    Dim retflag As Integer
    ''''''''''''''''''''''''''''''''''''''
    Dim htemplate As Long
    Dim htarget As Long
    ''''''''''''''''''''''''''''''''''''''
    Dim DBDocPropTempl As NotesDocument
    Dim DBDocPropTarget As NotesDocument
    ''''''''''''''''''''''''''''''''''''''

    Call W32_OSPathNetConstruct("", TemplDB.Server, TemplDB.FilePath, PathName)
    Call W32_OSPathNetConstruct("",TargetDB.Server, TargetDB.FilePath,TargetPathName)

    Call W32_NSFDbOpen(PathName, htemplate)
    If htemplate=0 Then Exit Function
    Call W32_NSFDbOpen(TargetPathName, htarget)
    If htarget=0 Then Exit Function
    If TargetDB.GetDocumentByID("FFFF0020") Is Nothing Then
    RetFlag = W32_NSFNoteCreate(htarget,hNote)
    Call W32_NSFNoteSetInfo( hNote, NOTE_CLASS, NOTE_CLASS_DESIGN_DEFAULT)
    RetFlag = W32_NSFNoteUpdate( hNote,0)
    Call W32_NSFNoteClose( hNote)
    End If
    If TargetDB.GetDocumentByID("FFFF0010") Is Nothing Then
    RetFlag = W32_NSFNoteCreate(htarget,hNote)
    Call W32_NSFNoteSetInfo( hNote, NOTE_CLASS, NOTE_CLASS_ICON_DEFAULT)
    RetFlag = W32_NSFNoteUpdate( hNote,0)
    Call W32_NSFNoteClose( hNote)
    End If
    Call W32_DesignReplace(htemplate, htarget, 1, 1, 0, 0)
    Call W32_NSFDbClose(htemplate)
    Call W32_NSFDbClose(htarget)
    ' Заменили дизайн, переписываем документ со свойствами базы
    Set DBDocPropTempl = TemplDB.GetDocumentByID("FFFF0010")
    Set DBDocPropTarget = TargetDB.GetDocumentByID("FFFF0010")
    Call DBDocPropTempl.CopyAllItems(DBDocPropTarget,True)
    Call DBDocPropTarget.Save(True, False)
    End Function
     
  17. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Я тоже через админпроцесс делаю, подпись серваком.
    Думаю, если работать под учеткой, то можно просто делать save+sign для каждой design-note

    Думаю это не поможет... АП стартует не сразу, у нас подпись занимает до 3х минут на самой большой базе.
    В среднем 20 секунд.
    При этом в документе АП стоит разница между старт и енд - 4 секунды.
    Видимо не отслеживает выполнение.
    Кстати, после такой подписи стартуют все SHDL агенты, у них сбрасывается флаг.
     
Загрузка...
Похожие Темы - Проблемы Импортом Дизайна
  1. aliaksandr89
    Ответов:
    3
    Просмотров:
    151
  2. Amfion
    Ответов:
    5
    Просмотров:
    146
  3. wowa
    Ответов:
    7
    Просмотров:
    402
  4. John_Tavarez
    Ответов:
    0
    Просмотров:
    343
  5. Валентин Амбер
    Ответов:
    11
    Просмотров:
    372

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