Перемещение документов в другую базу

Тема в разделе "Lotus - Программирование", создана пользователем Lesik, 21 янв 2010.

  1. Lesik

    Lesik Well-Known Member

    Регистрация:
    6 авг 2009
    Сообщения:
    76
    Симпатии:
    0
    Здравствуйте,
    появилась необходимость сделать что-то вроде архивации писем. Хочу попробовать написать агента по переносу выделенных документов с базы 1 в базу 2 по кнопке.
    В Lotus scriptе я пока новичек. Изрыл хелп, ничего по переносу не нашёл(((
     
  2. Klido

    Klido Гость

    CopyToDatabase method
    Copies a document into the specified database.

    Defined in
    NotesDocument
     
  3. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    вчера писал подобное... только мне надо било респонзи:)

    а вот для вас пример с сайта, адрес которого я предлагаю виучить наизусть www.openntf.org

    Код (Text):
    (Declarations)

    Dim ns As NotesSession
    Dim ndb As NotesDatabase
    Dim ArchiveDb as NotesDatabase
    Dim collection As NotesDocumentCollection
    Dim kidDocs as NotesDocumentCollection
    Dim kid as NotesDocument
    Dim parent As NotesDocument
    Dim switchDoc As NotesDocument

    Sub Initialize

    Set ns = New NotesSession
    Set ndb = ns.CurrentDatabase
    Set ArchiveDb = ns.GetDatabase('your code here')
    Set collection = ndb.UnprocessedDocuments
    Set parent = collection.GetFirstDocument

    If ArchiveDb.Title = "" Then
    Msgbox("Couldn't find the Archive Database. Please contact the Notes Admins.")
    ExitSub
    End If

    Do Until parent is Nothing
    Call parent.CopyToDatabase(ArchiveDb)
    Set kidDocs = parent.Responses
    Set kid = kidDocs.GetFirstDocument
    Do Until kid is Nothing
    Call kid.CopyToDatabase(ArchiveDb)
    Set switchDoc = kid
    Set kid = kidDocs.GetNextDocument(kid)
    Call switchDoc.Remove(True)
    Loop
    Set switchDoc = parent
    Set parent = collection.GetNextDocument(parent)
    Call switchDoc.Remove(True)
    Loop

    End Sub
     
  4. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Плохой пример. Переносятся только респонсы первого уровня. А если в collection попадают документы не только первого уровня, тогда вообще бред.
     
  5. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    TIA, в очередной раз спасибо за внимательность :angry2:
    Cleric-Lviv - вот тема Как сделать, что б при удалении документа в БД, сразу же удалялись все его респонсы, там есть ссылка на пример из КБ
    (там в квери непонятно - вроде могут быть баги при переборе документов коллекции, если респонсы туда попадут вместе с основными, но в DeleteResponses вроде корректный рекурсивный обход респонсов (не совсем поняла, правда, зачем надо Call resp.Save(True, True))
    но это так, навскидку, одним взглядом, код не пробовала...)
     
  6. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    TIA

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

    что человек хотел? перенести письма из бази "А" в базу "Б"
    в коде есть строки которие ему нужни, надобно просто изучить ккод.

    Set ndb = ns.CurrentDatabase - база "А"
    Set ArchiveDb = ns.GetDatabase('your code here') - База "Б"
    Set collection = ndb.UnprocessedDocuments - колекция документов - просто пример какой может бить колекция
    Call parent.CopyToDatabase(ArchiveDb) - как скопировать документ

    так в чем плохой пример? тем что не готовий код? дальше если что не вийдет, человек напишет.......


    OKEN

    ви наверно ето для Lesik писали :angry2:
     
  7. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Ну а я просто предупредил человека, чтоб был внимательнее. Не использовал код как есть.
     
  8. Lesik

    Lesik Well-Known Member

    Регистрация:
    6 авг 2009
    Сообщения:
    76
    Симпатии:
    0
    Спасибо Klido :rolleyes: Направил на путь истинный)))
    после небольших манипуляций с образцом из хелпа получил следующий вариант:

    Код (Text):
    Sub Initialize
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim db2 As NotesDatabase
    Dim doc As NotesDocument
    Dim doccoll As NotesDocumentCollection
    Set db = session.CurrentDatabase
    Const dbfile="база.nsf"
    Dim flag
    Set db2 = New NotesDatabase("", "")

    Set doccoll = db.UnprocessedDocuments
    If doccoll.Count>0 Then
    Set doc=doccoll.GetFirstDocument
    flag = db2.Open( "сервер", dbfile )
    While Not doc Is Nothing
    Call doc.CopyToDatabase(db2)
    Set doc=doccoll.GetNextDocument(doc)
    Wend           
    Call doccoll.RemoveAll( False)
    End If
    End Sub
     
  9. Lesik

    Lesik Well-Known Member

    Регистрация:
    6 авг 2009
    Сообщения:
    76
    Симпатии:
    0
    В ходе архивирования возникла проблема: хоть письма и переносятся в базу но попадают они в allDocument. Пришлось в базе "Б" делать перенос документов следующим образом:

    Код (Text):
    Sub Initialize

    Dim s As New NotesSession
    Dim db As NotesDatabase
    Dim fDoc As NotesDocument
    Dim W As New NotesUIWorkspace
    Dim ad As NotesView
    Dim aDoc As NotesDocument
    Dim fUNID() As String
    Dim i As Long
    Dim deldate As NotesItem
    Dim Chair1 As NotesItem

    i =0
    Set db = s.CurrentDatabase

    ReDim fUNID(0)


    ForAll view In db.views
    If view.IsFolder And Not view.Name=("($All)") Then
    Set fDoc = view.GetFirstDocument
    While Not fDoc Is Nothing
    ReDim Preserve fUNID(i)
    fUNID(i) = fDoc.UniversalID
    i=i+1
    Set fDoc = view.GetNextDocument(fDoc)
    Wend
    End If
    End ForAll



    Set ad = db.GetView("($All)")
    Set aDoc = ad.GetFirstDocument
    While Not aDoc Is Nothing
    i = 0
    Do While i <= UBound(fUNID)
    If fUNID(i) = aDoc.UniversalID Then
    Exit Do
    End If
    i = i + 1
    Loop
    Set deldate = adoc.getfirstitem("delivereddate")
    Set Chair1 = adoc.getfirstitem("CHAIR")
    If i > UBound(fUNID) And Not deldate Is Nothing And Chair1 Is Nothing Then
    Call adoc.PutInFolder( "($Inbox)")
    End If
    Set aDoc = ad.GetNextDocument(adoc)
    Wend
    Call w.ViewRefresh
    End Sub
    P. S. на данный момент осталась проблема в запуске агента т. к. его надо как-то запускать, когда в базе появятся новые документы.
     
  10. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    Lesik

    документи както связание между собой?
     
  11. Lesik

    Lesik Well-Known Member

    Регистрация:
    6 авг 2009
    Сообщения:
    76
    Симпатии:
    0
    Нет, документы связей не имеют.
     
  12. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Установить агенту Trigger On event "After documents are created or modified"?
     
Загрузка...

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