1

Тема: Синхронизация документов в двух базах

Агент для синхронизации

%REM
    Agent adrefresh
    Created Jun 23, 2022 by Administrator NYY FGR/fond
    Description: Comments for Agent
%END REM
Option Public
Option Declare

Sub Initialize
    Dim session As New NotesSession
    Dim db As NotesDatabase, adrdb As NotesDatabase
    Dim view As NotesView, adrview As NotesView
    Dim doc As NotesDocument, maindoc As NotesDocument, adrdoc As NotesDocument, mainadrdoc As NotesDocument
    Dim formula As String
    Dim l1 As Variant,  l2 As Variant
    Dim isnewd As Boolean
    Dim i As Integer, x As Integer
    Dim mainadrid As String, fla As String, del As String, stsubdivision As String, sts As String
    On Error GoTo ErrH    
    i=0
    Set db=session.Currentdatabase
    Set view=db.GetView("reforgs3")  ' Адресаты МЭД по donorid в БД ВЭД
    Set adrdb=session.GetDatabase("fgrmed/Fgr","promdoc\adress.nsf", False)
    If adrdb Is Nothing Then Print "no connection with fgrmed/Fgr !" Else Print "fgrmed/Fgr connection OK!"
    Set adrview=adrdb.GetView("all")
    
    For x= 1 To 2
        Set adrdoc=adrview.GetFirstDocument    ' док в БД Адресаты
        While Not adrdoc Is Nothing    
            Set doc=view.GetDocumentByKey(adrdoc.UniversalID) ' ищем в ВЭД док с бд Адресаты по donorid.
            If doc Is Nothing Then 
                Set doc=db.CreateDocument : doc.form="ref_orgs" ' создали в ВЭД
            Else
                If doc.modify(0)= adrdoc.LastModified Then GoTo l1 'пропустить неизмененные документы
            End If
            i=i+1
            Print  i "." adrdoc.Server_name(0)
            If adrdoc.form(0)="forg" And x =1 Then 'Организация в БД Адресаты
                doc.donorid=adrdoc.Universal_ID(0)
                doc.modify=adrdoc.LastModified            
                doc.flag_not_visible=adrdoc.flag_not_visible
                doc.delete=CStr(adrdoc.delete(0))
                doc.Server_name=adrdoc.Server_name ' во вью ref_orgs3 - для отображения.
                doc.nam=adrdoc.Server_name  ' назв Орг
                doc.shnam=doc.nam
                doc.code=adrdoc.Server_id
                doc.xmlstr="<destination><legalentity><kodorgout>"+doc.code(0)+"</kodorgout><nameorg>"+doc.nam(0)+"</nameorg><structuralsubdivision></structuralsubdivision><post>"+doc.nam(0)+"</post></legalentity></destination>"
                Call doc.ComputeWithForm(1,0)            
                Call doc.Save(1,0)
            End If
            Sleep 1
            
            If adrdoc.form(0)="forg_resp" And x =2 Then  'Руководитель ФИО, или подвед в БД Адресаты 
                doc.donorid=adrdoc.Universal_ID(0)
                doc.modify=adrdoc.LastModified
                
                'рекурсивный поиск в БД Адресаты , если родительский элемент верхнего уровня - скрыт или удален
                mainadrid$=adrdoc.ParentDocumentUNID
                While Not mainadrid$=""
                    Set mainadrdoc = adrdb.GetDocumentByUNID(mainadrid$)
                    mainadrid$=mainadrdoc.ParentDocumentUNID
                Wend
                
                If Not mainadrdoc Is Nothing Then
                    fla$=mainadrdoc.flag_not_visible(0)' скрыт ли  родительский элемент верхнего уровня
                    del$=CStr(mainadrdoc.delete(0)) ' или удален в БД Адресаты
                End If
                doc.flag_not_visible=adrdoc.flag_not_visible
                If fla$="1" Then doc.flag_not_visible="1" 'скрыть, если родительский элемент верхнего уровня скрыт     
                doc.delete=CStr(adrdoc.delete(0))
                If del$="1" Then doc.delete="1" 'или удален в ВЭД
                
                doc.Server_name=adrdoc.Server_name ' ФИО, или назв орг подведа.
                doc.Server_id=adrdoc.Server_id
                doc.type_adr =adrdoc.type_adr  ' в БД адресаты у орг подведа - 1, а у человека - 2. 
                
                stsubdivision$ = doc.Server_id(0)
                '    Print "Server_id " stsubdivision$ 
                sts=stsubdivision$
                
                doc.donorparentid=adrdoc.ParentDocumentUNID
                Set maindoc=view.GetDocumentByKey(doc.donorparentid(0)) ' ищем родительский элемент в ВЭД по donorid в виде reforgs3 в ВЭД
                If Not maindoc Is Nothing Then  'вообще всегда есть
                    Print    maindoc.Server_name(0) " /родитель/ " maindoc.type_adr(0)
                    If maindoc.type_adr(0)="1" Then 
                        'Print "родитель  "  doc.Server_name(0) "  у  "  maindoc.nam(0)
                        sts= maindoc.Server_id(0) + "." + doc.Server_id(0)
                        If stsubdivision$ <> sts Then 
                            Print "подвед "  doc.Server_name(0) + " // " sts
                            stsubdivision$ = maindoc.Server_id(0)
                        End If
                    End if
                    doc.sts = sts
                    doc.nam=maindoc.nam   ' Наименование организации  
                    doc.shnam=maindoc.shnam ' краткое Наименование организации  
                    doc.code=maindoc.code   '   Код организации в МЭД
                    doc.xmlstr="<destination><legalentity><kodorgout>"+doc.code(0)+"</kodorgout><nameorg>"+doc.nam(0)+"</nameorg><structuralsubdivision>" + stsubdivision$ +"</structuralsubdivision><post>"+doc.Server_name(0)+"</post></legalentity></destination>"        
                    Call doc.MakeResponse(maindoc)        
                End If
                'Print "sts " sts
                
                Call doc.ComputeWithForm(1,0)
                Call doc.Save(1,0)
                
            End If    
l1:    
            Set adrdoc=adrview.GetNextDocument(adrdoc)
        Wend
    Next
    Print "всего " i
    Exit Sub
ErrH:
    Print "Ошибка АДРЕСАТЫ " & Error(Err) & " в строке " & Erl    
    Exit Sub
End Sub

Поделиться

2

Re: Синхронизация документов в двух базах

Вторая версия с реккурсией.

%REM
    Agent adrefresh
    Created Jun 23, 2022 by Administrator NYY FGR/fond
    Description: Comments for Agent
%END REM
Option Public
Option Declare


Dim db As NotesDatabase
Dim view As NotesView
Dim i As Integer

Sub Initialize
    Dim session As New NotesSession
    Dim adrdoc As NotesDocument
    Dim doc As NotesDocument
    Dim adrdb As NotesDatabase
    Dim adrview As NotesView
   
    Dim tmp_doc As NotesDocument
    Print "adrefresh2 START"
    On Error GoTo ErrH   
    i=0
    Set db=session.Currentdatabase
    Set view=db.GetView("reforgs3")  ' Адресаты МЭД по donorid в БД ВЭД
    Set adrdb=session.GetDatabase("fgrmed/Fgr","promdoc\adress.nsf", False)
    If adrdb Is Nothing Then Print "no connection with fgrmed/Fgr !" Else Print "fgrmed/Fgr connection OK!"
    Set adrview=adrdb.GetView("all")   

    Set adrdoc=adrview.GetFirstDocument    ' док в БД Адресаты
    While Not adrdoc Is Nothing   
        If adrdoc.form(0)="forg" Then 'Организация в БД Адресаты
            i=i+1
       
           
            Set doc=view.GetDocumentByKey(adrdoc.UniversalID) ' ищем в ВЭД док с бд Адресаты.
       
            If doc Is Nothing Then
                Set doc=db.CreateDocument : doc.form="ref_orgs" ' создали в ВЭД
            End If               
           
            If doc.modify(0)<> adrdoc.LastModified Then ' изменена Организация
                Sleep 1
        Print  i ". Modified forg " adrdoc.Server_name(0)
                doc.donorid=adrdoc.Universal_ID(0)
                doc.modify=adrdoc.LastModified           
                doc.flag_not_visible=adrdoc.flag_not_visible
                doc.delete=CStr(adrdoc.delete(0))
                doc.Server_name=adrdoc.Server_name ' во вью ref_orgs3 - для отображения.
                doc.nam=adrdoc.Server_name  ' назв Орг
                doc.shnam=doc.nam
                doc.code=adrdoc.Server_id
                doc.xmlstr="<destination><legalentity><kodorgout>"+doc.code(0)+"</kodorgout><nameorg>"+doc.nam(0)+"</nameorg><structuralsubdivision></structuralsubdivision><post>"+doc.nam(0)+"</post></legalentity></destination>"
                    Call doc.ComputeWithForm(1,0)           
                    Call doc.Save(1,0)
            End If           
            Call Resp (adrdoc)
        End If       
       
        Set adrdoc=adrview.GetNextDocument(adrdoc)
    Wend   
   
    Print "конец"
    Print "всего: " i
    Exit Sub
ErrH:
    Print "Ошибка АДРЕСАТЫ " & Error(Err) & " в строке " & Erl   
    Exit Sub
End Sub
Function Resp (adoc As NotesDocument) As Variant
    Dim adrdoc As NotesDocument,  respdoc As NotesDocument
    Dim maindoc As NotesDocument, doc As NotesDocument   
    Dim dc As NotesDocumentCollection
    Dim stsubdivision As String
    '    adoc - орг в БД Адресаты,  форма "forg"
    '  respdoc - ответ в БД Адресаты, форма "forg_resp", type_adr=2 у чела, type_adr=1 - у орг, Server_id 501
    '  maindoc - главный в ВЭД, форма "ref_orgs"
    ' doc - ответ в ВЭД, форма "ref_orgs"
    On Error GoTo errh           
    'Print "Function Resp"
    Set    maindoc = view.GetDocumentByKey(adoc.UniversalID)
    If maindoc Is Nothing Then
        Print "нет главного в ВЭД для "  adoc.Server_name(0)
        Exit Function
    End If
   
    Set dc = adoc.Responses '  ответы с БД Адресаты
    If Not dc Is Nothing Then
        Set respdoc = dc.GetFirstDocument           
        While Not respdoc Is Nothing
            i=i+1
            Set doc=view.GetDocumentByKey(respdoc.UniversalID) ' ищем в ВЭД док-ОТвет с бд Адресаты
            If doc Is Nothing Then
                Set doc=db.CreateDocument : doc.form="ref_orgs" ' создали в ВЭД
            End If
   
            If respdoc.form(0)="forg_resp"  Then  'Руководитель ФИО, или подвед в БД Адресаты (всегда)
                If doc.modify(0)<> respdoc.LastModified Then
                    Print i ". обновили respdoc " respdoc.Server_name(0)
                    doc.donorid=respdoc.Universal_ID(0)
                    doc.modify=respdoc.LastModified
                    doc.flag_not_visible=respdoc.flag_not_visible
                    doc.Server_name=respdoc.Server_name ' ФИО, или назв орг подведа.
                    doc.type_adr =respdoc.type_adr  ' в БД адресаты у орг подведа - 1, а у человека - 2.
                    doc.Server_id=respdoc.Server_id
                    If adoc.type_adr(0)="1" Then ' код подведа у адресата родителя в БД Адресаты
                        stsubdivision$    = adoc.Server_id(0)
                        respdoc.sts = stsubdivision$   
                        Print "подвед ЧЕЛ " stsubdivision$   
                    End If
                   
                    doc.nam=maindoc.nam   ' Наименование организации 
                    doc.shnam=maindoc.shnam ' краткое Наименование организации 
                    doc.code=maindoc.code   '   Код организации в МЭД
                    doc.xmlstr="<destination><legalentity><kodorgout>"+doc.code(0)+"</kodorgout><nameorg>"+doc.nam(0)+"</nameorg><structuralsubdivision>" + stsubdivision$ +"</structuralsubdivision><post>"+doc.Server_name(0)+"</post></legalentity></destination>"       
                    Call doc.MakeResponse(maindoc)       
                    Call doc.ComputeWithForm(1,0)
                    Call doc.Save(1,0)
                        Sleep 1
                End If
            End If   
           
            Call Resp (respdoc) '  рекурсия
           
            Set respdoc = dc.GetNextDocument(respdoc)           
        Wend
    End If
   
    Exit Function
errh:
    Print "Ошибка  Resp" & Error(Err) & " в строке " & Erl   
    Exit Function
End Function

Поделиться

3

Re: Синхронизация документов в двух базах

Function Resp (adoc As NotesDocument) As Variant
    Dim adrdoc As NotesDocument,  respdoc As NotesDocument
    Dim maindoc As NotesDocument, doc As NotesDocument   
    Dim dc As NotesDocumentCollection
    Dim stsubdivision As String
    '    adoc - орг в БД Адресаты,  форма "forg"
    '  respdoc - ответ в БД Адресаты, форма "forg_resp", type_adr=2 у чела, type_adr=1 - у орг, Server_id 501
    '  maindoc - главный в ВЭД, форма "ref_orgs"
    ' doc - ответ в ВЭД, форма "ref_orgs"
    On Error GoTo errh           
    'Print "Function Resp"
    Set    maindoc = view.GetDocumentByKey(adoc.UniversalID)
    If maindoc Is Nothing Then
        Print "нет главного в ВЭД для "  adoc.Server_name(0)
        Exit Function
    End If
   
    Set dc = adoc.Responses '  ответы с БД Адресаты
    If Not dc Is Nothing Then
        Set respdoc = dc.GetFirstDocument           
        While Not respdoc Is Nothing
            i=i+1
            Set doc=view.GetDocumentByKey(respdoc.UniversalID) ' ищем в ВЭД док-ОТвет с бд Адресаты
            If doc Is Nothing Then
                Set doc=db.CreateDocument : doc.form="ref_orgs" ' создали в ВЭД
            End If
   
            If respdoc.form(0)="forg_resp"  Then  'Руководитель ФИО, или подвед в БД Адресаты (всегда)
                If doc.modify(0)<> respdoc.LastModified Then
                    Print i ". обновили respdoc " respdoc.Server_name(0)
                    doc.donorid=respdoc.Universal_ID(0)
                    doc.modify=respdoc.LastModified
                    doc.flag_not_visible=respdoc.flag_not_visible
                    doc.Server_name=respdoc.Server_name ' ФИО, или назв орг подведа.
                    doc.type_adr =respdoc.type_adr  ' в БД адресаты у орг подведа - 1, а у человека - 2.
                    doc.Server_id=respdoc.Server_id
                    If adoc.type_adr(0)="1" Then ' код подведа у адресата родителя в БД Адресаты
                        stsubdivision$    = adoc.Server_id(0)
                        respdoc.sts = stsubdivision$   
                        Print "подвед ЧЕЛ " stsubdivision$   
                    End If
                   
                    doc.nam=maindoc.nam   ' Наименование организации 
                    doc.shnam=maindoc.shnam ' краткое Наименование организации 
                    doc.code=maindoc.code   '   Код организации в МЭД
                    doc.xmlstr="<destination><legalentity><kodorgout>"+doc.code(0)+"</kodorgout><nameorg>"+doc.nam(0)+"</nameorg><structuralsubdivision>" + stsubdivision$ +"</structuralsubdivision><post>"+doc.Server_name(0)+"</post></legalentity></destination>"       
                    Call doc.MakeResponse(maindoc)       
                    Call doc.ComputeWithForm(1,0)
                    Call doc.Save(1,0)
                        Sleep 1
                End If
            End If   
           
            Call Resp (respdoc) '  рекурсия
           
            Set respdoc = dc.GetNextDocument(respdoc)           
        Wend
    End If
   
    Exit Function
errh:
    Print "Ошибка  Resp" & Error(Err) & " в строке " & Erl   
    Exit Function
End Function

Поделиться