1

Тема: Вернуть ответные без главных к главным документам.

В основной базе есть ответные документы без главных.
Так бывает, когда по какйм-то причинам главные документы попали в другие базы, а ответные - остались в основной.
Данный лотус-скрипт находит в базах, указанных в коде скрипта, главные документы и переносит к ним ответные - потеряшки.
Кнопка - "Вернуть ответы"

Декларации:
Dim newdoc  As NotesDocument
Dim doc As NotesDocument, maindoc As NotesDocument
Dim view As notesview, uniview As NotesView

Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim ws As New NotesUIWorkspace        
    Dim db As NotesDatabase, db1 As NotesDatabase, db2 As NotesDatabase
    
    On Error Goto ErrH
    Dim str1 As String
    Dim i As Integer
    i=0
    
    Set db = session.CurrentDatabase
    
    Set db1 = session.GetDatabase(db.Server,"promdoc\documents2021.nsf")
    Set db2 = session.GetDatabase(db.Server,"promdoc\documents2022.nsf")
    
    Set view = ws.CurrentView.View
    
    Set doc = view.getfirstdocument
    
    While Not doc Is Nothing
        Print doc.fullregnom(0)
        
        Set uniview = db1.GetView("unids")
        Set maindoc = uniview.GetDocumentByKey(doc.parent(0))
        If Not maindoc Is Nothing Then  Call CreateOtvet(db1)
        
        Set uniview = db2.GetView("unids")
        Set maindoc = uniview.GetDocumentByKey(doc.parent(0))
        If Not maindoc Is Nothing Then  Call CreateOtvet(db2)
        
        Set doc=view.GetNextDocument(doc)
    Wend
    Exit Sub
ErrH:
    Print "Ошибка   " & Error(Err) & " в строке " & Erl    
End Sub


Function CreateOtvet (db  As NotesDatabase)
    On Error Goto ErrH
    Print "найден док по parent!  CreateOtvet  " db.Title
    
    Set newdoc  = uniview.GetDocumentByKey(doc.id(0))
    If  newdoc Is Nothing Then ' нет копии потеряшки
        
        If    maindoc.responce(0)="" Then
            Print "главный  - создать ответ"
            Set newdoc=db.CreateDocument        
            Call doc.CopyAllItems(newdoc,1)  '   doc - в основной БД, без главного
            newdoc.UniversalID=doc.UniversalID
            Call newdoc.MakeResponse(maindoc)
            Call newdoc.ComputeWithForm(False, False)
            Print "-1----" 
            Call newdoc.Save(True,False)
            Print "создали в " db.Title
            Call doc.Remove(False)    
            Print "удалили doc" 
            Set doc = view.GetFirstDocument
        Else
            Print "в архиве ответный (maindoc) "  maindoc.fullregnom(0)
            Set maindoc  = uniview.GetDocumentByKey(maindoc.parent(0))
            If Not maindoc Is Nothing Then
                Print "в архиве нашелся главный у ответного "   maindoc.fullregnom(0)
                
                Set newdoc=db.CreateDocument        
                Call doc.CopyAllItems(newdoc,1)
                newdoc.UniversalID=doc.UniversalID
                Call newdoc.MakeResponse(maindoc)
                Call newdoc.ComputeWithForm(False, False)
                Print "-2----" 
                Call newdoc.Save(True,False)
                Print "создали в " db.Title
                Call doc.Remove(False)    
                Print "удалили doc" 
                Set doc = view.GetFirstDocument
            End If
        End If
        
    Else
        Print "ЕСТЬ ДУБЛЬ"
    End If
    
    Exit Function
ErrH:
    Print "Ошибка ф-ции  CreateOtvet   " & Error(Err) & " в строке " & Erl    
End Function

Поделиться

2

Re: Вернуть ответные без главных к главным документам.

Так же часто виде "ответные без главных" используются кнопки:

Кнопка "Найти главный в текущей БД" - у выбранных доков ищет главный и делает ответным к главному.

Use "Library"

Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim uiview As NotesUIView
    Dim session As New NotesSession
    Dim  viewunids  As NotesView
    Dim db As NotesDatabase
    Dim dc1 As NotesDocumentCollection
    Dim curdoc As NotesDocument, arhdoc As NotesDocument
    Dim db2020 As NotesDatabase
    
    On Error Goto Errh
    
    Set uiview = ws.CurrentView
    Set dc1 = uiview.Documents
    
    Set db = session.CurrentDatabase
    Set viewunids = db.GetView("unids")
    
    If dc1.Count<1 Then
        Msgbox "Необходимо выбрать по крайней мере один документ !"
        Exit Sub
    End If
    
    Set curdoc = dc1.GetFirstDocument
    
    While Not (curdoc Is Nothing)
        Print   curdoc.regnom(0)
        Set arhdoc    = DatabaseGetDocumentByUnid (db, curdoc.parent(0)  )
        
        If  Not (arhdoc Is Nothing) Then  ' Главный Док  - есть в архивной базе
            If arhdoc.parent(0)=""        Then   '  Главный 
                Print  "сделать ответным " curdoc.regnom(0)
                Call curdoc.MakeResponse(arhdoc)
                Call curdoc.Save(True,False)
            End If
        End If
        
        Set curdoc = dc1.GetNextDocument (curdoc)
        
    Wend
    Call uiview.DeselectAll
    Call uiview.View.Refresh()
    
    Exit Sub
errh:
    Msgbox Error & | in line | & Erl(), 64, |Lotus Notes (| & Lsi_info(2) & |)|
    Exit Sub    
End Sub

Поделиться

3

Re: Вернуть ответные без главных к главным документам.

Кнопка "ответ на ответ" - если у ответа в качестве главного другой ответный, у которого есть реальный главный, то ответ2 станет ответом к главному,
Вид "unids2" - без категоризации, первое поле "id" с UNID документа.

Use "Library"

Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim uiview As NotesUIView
    Dim session As New NotesSession
    Dim  viewunids  As NotesView
    Dim db As NotesDatabase
    Dim dc1 As NotesDocumentCollection
    Dim curdoc As NotesDocument, arhdoc As NotesDocument, arhdoc2  As NotesDocument
    Dim i As Integer
    On Error Goto Errh
    
    Set uiview = ws.CurrentView
    Set dc1 = uiview.Documents
    
    Set db = session.CurrentDatabase
    Set viewunids = db.GetView("unids2")
    i=0
    If dc1.Count<1 Then
        Msgbox "Необходимо выбрать по крайней мере один документ !"
        Exit Sub
    End If
    
    Set curdoc = dc1.GetFirstDocument
    
    While Not (curdoc Is Nothing)
        Set arhdoc = viewunids.GetDocumentByKey(curdoc.parent(0))
        
        If  Not (arhdoc Is Nothing) Then  ' Главный Док  - есть в архивной базе
    '        Print  "найден главный"            
            Set arhdoc2 = viewunids.GetDocumentByKey(arhdoc.parent(0))
            
            If  Not (arhdoc2 Is Nothing) Then
                i=i+1    
                Print  Cstr( i) ".   " arhdoc2.regnom(0)  " сделать ответным " curdoc.regnom(0)
                Call curdoc.MakeResponse(arhdoc2)
                Call curdoc.Save(True,False)
            End If
        End If
        
        Set curdoc = dc1.GetNextDocument (curdoc)
        
    Wend
    Call uiview.DeselectAll
'    Call uiview.View.Refresh()
    
    Exit Sub
errh:
    Msgbox Error & | in line | & Erl(), 64, |Lotus Notes (| & Lsi_info(2) & |)|
    Exit Sub    
End Sub

Поделиться