1

Тема: Извлечение документа с архивной базы в рабочую.

Есть архивная база за какой-то год, к примеру 2021 года. Например "documents2021.nsf"
И есть основная, куда нужно перенести документ + его ответные - "documents.nsf"

Еще есть индексная база - в которой хранятся документы связи.  "P...doc\index.nsf"

На формах у документов в архивной базе используем кнопку "Извлечь из архива".

Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim ws As New NotesUIWorkspace    
    Dim workdb As NotesDatabase
    Dim dc As NotesDocumentCollection
    Dim uidoc As NotesUIDocument    
    Dim workview As NotesView
    Dim uiview  As NotesView
    Dim doc As NotesDocument, workdoc As NotesDocument, ftdoc As NotesDocument, nextftdoc As NotesDocument
    Dim mes As String, mes2 As String
    
    On Error Goto Errh 
    
    Set workdb = session.GetDatabase(session.CurrentDatabase.Server,"promdoc\documents.nsf",False)
    Set workview = workdb.GetView("arc_check")
    Call workdb.UpdateFTIndex( False )    
    Call workview.Refresh()
    user = session.CommonUserName
    sdate = Evaluate("@Now( [SERVERTIME])")
    Set uidoc = ws.CurrentDocument
    Set doc = ws.currentdocument.Document
    
    'База 2022
    
    Set workdoc = workview.GetDocumentByKey( doc.id(0))        'проверка, что дока нет в бд документы
    If workdoc Is Nothing Then
        If doc.parent(0)=""  Then   
            Print "ГЛАВНЫЙ"
            Set workdoc=workdb.CreateDocument            ' создали в   documents.nsf
            Call doc.CopyAllItems(workdoc,1)    
            workdoc.UniversalID=doc.UniversalID
            workdoc.archive = ""
            workdoc.who = "На регистрации"
            workdoc.whois = "На регистрации"
            
            If doc.links(0)<>"" Then  ' 2022
                Call ReplacePathDoc(workdoc.UniversalID)    
            End If
            
            mes2=sdate(0)+" "+user+"   извлёк документ из архивной базы"&Chr(13)+" "&Chr(13)    
            mes2=mes2+uidoc.FieldGetText( "history" )
            workdoc.history = mes2
            
            Call workdoc.Save(True,False)
            
            
            Set dc = doc.Responses        
            Set ftdoc = dc.GetFirstDocument    
            While Not ftdoc Is Nothing
                Print "ОТВЕТ в Архивной"
                Set workdoc=workdb.CreateDocument  ' ОТВЕТ в ВЭД
                Call ftdoc.CopyAllItems(workdoc,1)    
                workdoc.UniversalID=ftdoc.UniversalID
                workdoc.archive = ""
                workdoc.who = "На регистрации"
                workdoc.whois = "На регистрации"
                Call workdoc.Save(True,False)
                
                Set nextftdoc = dc.GetNextDocument (ftdoc )
                Call RemoveDoc(ftdoc.NotesURL) ' удалить ОТВЕТ в Архивной
                Set ftdoc=nextftdoc
                Set nextftdoc=Nothing
            Wend    
            
            
            Call uidoc.Close()
            
            Print "закрыли"
            
            Call RemoveDoc(doc.NotesURL)
            
            Msgbox "Документ извлечен успешно."
        Else
            Msgbox      "Документ ответный, выделите главный!"
        End If
    Else
        Msgbox      "Документ уже был в БД Документы !"
    End If
    
    Exit Sub
errh:
    Print Error & | in line | & Erl()
    Exit Sub
End Sub

Function RemoveDoc (url_doc As String)
    Print "RemoveDoc Удаляет перенесенный в раб базу документ"
    Dim ns As NotesSession     
    On Error Goto Errh 
    Dim Agent As NotesAgent
    Dim docRequest As NotesDocument
    Dim item As NotesItem
    Dim paramid As String
    Dim db As NotesDatabase 
    
    Set ns=New NotesSession
    Set db=ns.CurrentDatabase
    
    
    Set docRequest = db.CreateDocument     
    
    Set item = docRequest.AppendItemValue("Field_curdoc_url", url_doc)
    
    
    Call docRequest.save(True, False)
    
    'Получаем агента(серверного с правами менеджера), передаем ему параметр(Noteid дока-запроса,и запускаем агент)
    Set agent = db.GetAgent("doc_del_remove")
    paramid = docRequest.Noteid
    Print  paramid
    Call Agent.RunOnServer(paramid)
    Print "RemoveDoc - END"
    Exit Function
errh:
    Print  Error & | in line | & Erl()
    Exit Function
End Function
Function ReplacePathDoc (url_doc As String)
    'Меняет путь в БД связей, где находится документ
    On Error Goto Errh
    Dim linksDB As NotesDatabase
    Dim Agent As NotesAgent
    
    Dim docRequest As NotesDocument
    Dim paramid As String
    Set ns=New NotesSession
    Set linksDB=ns.GetDatabase( ns.CurrentDatabase.Server,"Promdoc\index.nsf")
    Print "функция ReplacePathDoc"
    Set docRequest = linksDB.CreateDocument     
    
    Set item = docRequest.AppendItemValue("doc_id", url_doc)
    'Set item =docRequest.AppendItemValue("Field_user_name", ns.UserName)
    
    Call docRequest.save(True, False)
    
    'Получаем агента(серверного с правами менеджера), передаем ему параметр(Noteid дока-запроса,и запускаем агент)
    Set agent = linksDB.GetAgent("ReplacePath")
    paramid = docRequest.Noteid
    Call Agent.RunOnServer(paramid)
    Print "функция ReplacePathDoc - END"
    Exit Function
Errh:    
    Print Error & | in line | & Erl()
    Exit Function
End Function

Поделиться

2

Re: Извлечение документа с архивной базы в рабочую.

Функция RemoveDoc  запускает агент doc_del_remove в текущей архивной базе - стирает док в архиве серверным агентом.

Option Public
Option Declare
Use "Library"

Sub Initialize
    Dim ns As NotesSession    
    Dim db As NotesDatabase    
    Dim docrequest As NotesDocument '--документ-запрос
    Dim curdoc As NotesDocument  
    Dim sdoc As NotesDocument '-- документ в базе links
    Dim item As NotesItem
    Dim agent As NotesAgent    
    Dim links As String '-- links
    Dim url_cur_doc As String '-- URL документа

    Dim id_link As String '--Переменная для Unid link документа
    Dim id_curdoc As String '--Переменная для Unid текущего документа    
    Dim session As New NotesSession    
    Set ns = New NotesSession    
    Set db = ns.CurrentDatabase    
    Set agent = ns.CurrentAgent  
    Dim dblog As NotesDatabase  
    
    Print "AGENT doc_del_remove"
    
    Dim Noteid As Variant
    
    On Error GoTo Errh

    
    'Получаем документ    
    Set docrequest = db.GetDocumentById( agent.ParameterDocID  )    
    
    Set item= docrequest.GetFirstItem ("Field_curdoc_url")
    If (item Is Nothing) Then
        Print "Field_curdoc_url не найдено!"
    Else
        url_cur_doc=item.Text
    End If

    id_curdoc=GetUnidFromUrl(url_cur_doc)     '--
    
    Set dblog=session.CurrentDatabase    '
    
    
    Set sdoc=DatabaseGetDocumentByUnid(dblog,id_curdoc) '
    Print sdoc.Notesurl
    If sdoc Is Nothing Then
        '
        GoTo Errh
        
    Else 
        'Удаляем sdoc        
        Call sdoc.Remove(True)    
        
    End If
    
    
    
    'Удаляем док-запрос
    Call docrequest.Remove(True)
    
    Exit Sub
Errh:    
    
    Print Error & | in line | & Erl()
End Sub

Функция ReplacePathDoc запускает агент ReplacePath в индексной базе -  серверным агентом.

Sub Initialize
    Dim agent As NotesAgent
    Dim db As NotesDatabase, dblog As NotesDatabase
    Dim doc_id As String '--  документ - обновляем  связь
    Set ns=New NotesSession
    Set db = ns.CurrentDatabase
    Set agent=ns.CurrentAgent
    Print "AGENT ReplacePath START"
    On Error GoTo Errh
    'Получаем параметр, передаваемый в агент, то есть получаем Noteid
    NoteId=agent.ParameterDocID
    
    
    'Получаем документ    
    Set docrequest = db.GetDocumentById(NoteId)    
    
    'Получаем ИД curdoc    
    Set item= docrequest.GetFirstItem ("doc_id")
    doc_id=item.Text

    
    Set dblog=ns.CurrentDatabase    
     '
    Set sdoc=DatabaseGetDocumentByUnid(dblog,doc_id) '--Получаем документ в базе Loglinks
    If Not sdoc Is Nothing Then '  ЕСТЬ в Индексной
        sdoc.database = "promdoc\documents.nsf"
        Call sdoc.Save(True,False)
        Print    "Обновили путь в доке Связи в Индексной"
        else        
        Print    "НЕ найден док в Индексной!"
    End If
    
        'Удаляем док-запрос
    Call docrequest.Remove(True)
    Print "AGENT ReplacePath - Конец"
    Exit  Sub
Errh:    
    'Создание документа в БД связей, с номером ошибки , также Print ошибки в базе Log на сервере
    'Call CreateDocError(CStr(Error) &  " in line " & CStr(Erl()) & " Lotus Notes (" &CStr(LSI_Info(2)) & ")", url_cur_doc )
    Print "ReplacePath " Error & | in line | & Erl()
    Exit Sub
End Sub

Поделиться

3

Re: Извлечение документа с архивной базы в рабочую.

Есть еще вариант с кнопкой "Перенести в рабочую базу" в виде с поиском.

Sub Click(Source As Button)
    '  переносит в БД "Документы" выделенный главный и ответные документы к нему.
    ' проверяется наличие нового документа в documents.nsf и потом док. удаляется в архивной БД.
    On Error Goto Errh
    Dim session As New NotesSession    
    Dim ws As New NotesUIWorkspace        
    Dim db As NotesDatabase, workdb As NotesDatabase
    Dim uiview As NotesUIView
    Dim  workview As NotesView
    Dim doc As NotesDocument, newdoc As NotesDocument, workdoc As NotesDocument    
    Dim  newdoc2 As NotesDocument
    Dim workdoc2 As NotesDocument    
    Dim ftdocD As NotesDocument    
    Dim server As String    
    Dim dc1 As NotesDocumentCollection
    Dim dc As NotesDocumentCollection
    Dim i As Integer
    Set db = session.CurrentDatabase
    server = db.Server
    Set uiview=ws.CurrentView
    
    Set workdb = New NotesDatabase( server, "promdoc\documents.nsf" )
    Set workview = workdb.GetView("arc_check")
    Call workdb.UpdateFTIndex( False )    
    Call workview.Refresh()
    
    Set dc1 = uiview.Documents
    If dc1.Count<1 Then
        Msgbox "Необходимо выбрать по крайней мере один документ !"
        Exit Sub
    End If
    
    Set doc = dc1.GetFirstDocument '  док в арзхиве в текущей вью
    While Not doc Is Nothing
        Print    doc.header(0)
        Set workdoc = workview.GetDocumentByKey( doc.id(0))        'проверка, что дока нет в бд документы
        If workdoc Is Nothing Then
            If doc.parent(0)=""  Then   '    ГЛАВНЫЙ
                
                Set newdoc=workdb.CreateDocument        
                Call doc.CopyAllItems(newdoc,1)
                newdoc.UniversalID=doc.UniversalID
                newdoc.who="На регистрации"
                newdoc.whois="На регистрации"
                newdoc.archive = ""
                
                If doc.links(0)<>"" Then
                    Print "Есть связь"
                    Call ReplPathDoc(newdoc.UniversalID)    
                End If
                
                Call newdoc.Save(True,False)        
                Print  "Создали главный "
                
                Set dc = doc.Responses     '  Ответы
                Set ftdoc = dc.GetFirstDocument    
                i=0
                While Not ftdoc Is Nothing
                    Print  i " Создали ответ "   ftdoc.header(0)
                    i=i+1
                    Set workdoc2 = workview.GetDocumentByKey( ftdoc.id(0))         'проверка, что ответного дока нет в бд документы
                    If workdoc2 Is Nothing Then
                        Set newdoc2=workdb.CreateDocument        ' ОТВЕТ новый
                        Call ftdoc.CopyAllItems(newdoc2,1)
                        newdoc2.UniversalID=ftdoc.UniversalID
                        newdoc2.who="На регистрации"
                        newdoc2.whois="На регистрации"
                        newdoc2.archive = ""
                        Call newdoc2.Save(True,False)    
                    Else
                        Print ftdoc.header(0) "   уже был в БД Документы (ответный)"
                    End If
                    Set ftdoc = dc.GetNextDocument (ftdoc )
                Wend
                
            Else
                Messagebox "Документ ответный, выделите главный!!"
            End If
        Else
            Print doc.header(0) "   уже был в БД Документы !"
        End If
        
        Set nextdoc = dc1.GetNextDocument (doc)
        '    Call doc.Remove(True)   ' удалить Главный  с архивной
        
                  'Обновляем индекс и view в рабочей базе    
        Call workdb.UpdateFTIndex( False)    
        Call workview.Refresh()     ' в     documents вид arc_check
        Call workview.Refresh()
        
        i=0
        Set workdoc = workview.GetDocumentByKey( doc.id(0)) 
        If Not workdoc Is Nothing Then          ' если есть Главный документ в БД Докумнеты  - удаляем его из Архивной базы
            Print "есть Главный документ в БД Докумнеты"
            
            Set dc = doc.Responses    ' архивная, главный док
            Set workftdoc = dc.GetFirstDocument    
            While Not workftdoc Is Nothing                
                Print i "Удаляем ответ из Архивной - "       workftdoc.header(0)
                i=i+1
                Set ftdocD = workview.GetDocumentByKey( workftdoc.id(0))   ' Проверка - есть ли уже в БД Докумнеты
                If Not ftdocD Is Nothing Then  
                    Set worknextftdoc = dc.GetNextDocument (workftdoc )
                    Call workftdoc.Remove(True) 
                '    Print "Удален ответ  из Архивной базы"
                Else
                    Messagebox  "Ответного Нет в БД Документы! Сообщите админу."
                    Set worknextftdoc = dc.GetNextDocument (workftdoc )                    
                End If
                Set workftdoc=worknextftdoc
                Set worknextftdoc=Nothing
            Wend    
            Print  "Удаляем главный   из Архивной базы"
            Call doc.Remove(True)       '
            
        Else
            Messagebox  "Главного Нет в БД Документы! Сообщите админу."
        End If
        Print "-----------------"
        Set doc=nextdoc
        Set nextdoc=Nothing
        
    Wend
    
    Call uiview.DeselectAll
    
    Call ws.ViewRefresh
    Messagebox "Документ(ы) перенесен(ы)!"
    Exit Sub
Errh:    
    Print Error & | in line | & Erl()
End Sub
Function ReplPathDoc (url_doc As String)
    'Меняет путь в БД связей, где находится документ
    On Error Goto Errh
    Dim linksDB As NotesDatabase
    Dim Agent As NotesAgent
    Dim docRequest As NotesDocument
    Dim paramid As String
    Set ns=New NotesSession
    Set linksDB=ns.GetDatabase( ns.CurrentDatabase.Server,"Promdoc\index.nsf")
    Print "функция ReplPathDoc"
    Set docRequest = linksDB.CreateDocument     
    Set item = docRequest.AppendItemValue("doc_id", id_doc)
    Call docRequest.save(True, False)
    
    'Получаем агента(серверного с правами менеджера), передаем ему параметр(Noteid дока-запроса,и запускаем агент)
    Set agent = linksDB.GetAgent("ReplPath")
    paramid = docRequest.Noteid
    Call Agent.RunOnServer(paramid)
    Print "функция ReplPathDoc - END"
    Exit Function
Errh:    
    Print Error & | in line | & Erl()
    Exit Function
End Function

Поделиться