1

Тема: Отправить группу документов админом

Иногда возникает ситуация, когда админу надо выбрать несколько документов у человека (или нескольких людей) и отправить на другого человека.
Для этого в виде "Админ по сотрудникам" сделана кнопка, которая после выбора документов показывает
1. диалоговое окно - кому направить документы.
2. Если хоть в одном документе было более одного человека в поле рассмотрения - то выбрать в диалоговом окне - с кого именно снять документ.

Код кнопки:

Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim uiview As NotesUIView
    Dim dc1 As NotesDocumentCollection
    Dim session As New NotesSession
    Dim view As NotesView
    Dim db As NotesDatabase, strukdb As notesdatabase
    Dim dc As NotesDocumentCollection, strukdc As NotesDocumentCollection
    Dim curdoc As NotesDocument, docreg As NotesDocument, ftdoc As notesdocument,  strukdoc As NotesDocument
    Dim mes As String, mes2 As String, mes3 As String, who As String, server As String, user As String, shadow1 As String, shadow2 As String
    Dim flag As Boolean
    Dim picklist As Variant, sdate As Variant
    Dim item As NotesItem, item2 As NotesItem, item3 As NotesItem, item4 As NotesItem 
    Dim valueArray() As String
    Dim kom As String
    Dim kkey As String
    Dim PolicyPatch As String
    On Error Goto ErrH
    Set uiview = ws.CurrentView
    Set dc1 = uiview.Documents
    Dim values() As Variant
    Dim response As Variant
    response = ""
    
    Set db = session.CurrentDatabase
    server = db.Server
    Set view = db.GetView ("reg" )
    Set docreg = view.GetFirstDocument
    PolicyPatch = docreg.PolicyPatch(0)'путь к базе 'Структура'
    Print  "PolicyPatch "  PolicyPatch    
    
    If dc1.Count<2 Then
        Msgbox "Необходимо выбрать по крайней мере два документа !"
        Exit Sub
    End If
    
    Set curdoc = dc1.GetFirstDocument
    
    user = session.CommonUserName
    
    picklist = ws.PickListStrings( _
    PICKLIST_CUSTOM, _
    True, _
    server, _
    "promdoc\policy", _
    "StrukChoice2", _
    "Сотрудники организации", _
    "Выберите кому отправить документ", _
    2 ) 
    If picklist(0) = "" Then Messagebox("Выбор не сделан") : Exit Sub
    
    kom = Inputbox$ ( "Введите комментарий","ADMIN" )
    If kom = "" Then Exit Sub
    
    While Not (curdoc Is Nothing)
        curdoc.komment = kom    
        
        Set item = curdoc.GetFirstItem( "who" )    
        i=0
        
        Redim values(Ubound(item.Values)) As Variant
        
        If Ubound(item.Values)>0  And     response = "" Then    ' первый раз - выбрать с кого снимать из who
            Forall v In item.Values
                values(i) = v
                i=i+1
            End Forall
            response = ws.Prompt (PROMPT_OKCANCELLIST, _
            "Рассматривает несколько человек!", _
            "У кого снять с рассмотрения?", _
            values(0), values)
            Print "response" response
        End If
        
        If Ubound(item.Values)>0  Then    '  для всех где   who 2+ чела.
            curdoc.empty=""
            Set item2 = curdoc.GetFirstItem("empty")  '   удалить у выбранного, если рассмастривало несколько чел 
            Forall v In item.Values
                If v <> response Then  Call item2.AppendToTextList(v)
            End Forall
            curdoc.who=curdoc.empty
        End If
        
' добавляем всех выбранных для отправки документа сотрудников в поле who + FullTrim    
' авторами документа становятся только сотрудники, которым документ отправлен    
        Set item = curdoc.GetFirstItem( "who" )    
        picklist = Fulltrim(picklist)
        Forall v In picklist
            Call item.AppendToTextList( v )
        End Forall
        
        curdoc.addauthors = ""    
        
        i=Ubound(item.Values)     ' определяем размерность массива (сколько значений в поле who)        
        
        curdoc.empty=""
        Set item4 = curdoc.GetFirstItem("empty")  ' Удаляем дубли   из item (поле who)
        Forall v In item.Values
            If Not item4.contains(v) Then Call item4.AppendToTextList(v)
        End Forall    
        curdoc.who=curdoc.empty
        curdoc.empty = ""
        
' ответственный за документ - первый сотрудник в поле who    
        curdoc.main_isp = curdoc.who(0)
        
' добавляем сотрудника, который документ отправляет в читатели документа    
        Set item2 = curdoc.GetFirstItem("addreaders")
        Call item2.AppendToTextList(user)    
        
        
        mes3=""
        Forall v In picklist  ' фомируем mes3 для добавления в историю
            mes3=mes3+v+"; "
        End Forall
        sdate = Evaluate("@Now( [SERVERTIME])")
            '  ----------- ИСТОРИЯ
        mes2=sdate(0) +"   документ отправил "&Chr(13)+user+" на " + mes3+" "&Chr(13)+" с комментарием: " + kom &Chr(13)+" "&Chr(13)
        curdoc.shadowhistory = mes2 + curdoc.shadowhistory(0)
        curdoc.history=mes2 + curdoc.history(0)
        
        
            ' Основной Исполнитель - первый сотрудник в поле who    
    ' находим ответственного за документ сотрудника в БД "Структура" -----------------------------------
        Set strukdb = session.GetDatabase(server, PolicyPatch , False )
        Set view = strukdb.GetView("notespeople")
        Set strukdc = View.GetAllDocumentsByKey(curdoc.main_isp, True )
        
        If strukdc.count=0 And curdoc.main_isp(0)<>"" Then     Msgbox ("Основной Исполнитель не найден в Структуре организации!!!")
        If strukdc.count > 1 Then Msgbox ("Внимание! в структуре организации обнаружены идентичные элементы !")
        If strukdc.count > 0 Then     
            Set strukdoc = strukdc.GetFirstDocument() '  первый исполнитель из поля main_isp
            curdoc.hierarchy = strukdoc.subdivision(0) ' для отображения документа в представлении "по подразделениям"     
            Set item3 = curdoc.GetFirstItem( "addauthors" )        ' добавление руководителя подразделения из структуры  в поле addauthors    
            If strukdoc.shef(0) <>"" Then Call item3.AppendToTextList(strukdoc.shef(0))
        End If
        
    ' в соответствии с нотес именем в поле who заносим в поле whois должности и ФИО -------------------------
        curdoc.whois=""
        Set item5 = curdoc.GetFirstItem("whois")
        Forall v In item.Values   ' поле who
            Set ftdoc=view.GetDocumentByKey(v)  ' вид notespeople БД Структуры
            If (ftdoc Is Nothing) Then    
                Msgbox ("Исполнитель: ") + v  +  (" не найден в Структуре организации.")
            Else
                Call item4.AppendToTextList(v)     ' ФИО есть в структуре, добавить в empty (потом в who)
                Call item5.AppendToTextList(ftdoc.position(0)+" "+ftdoc.fio(0)) ' ФИО и Должность добавить в  whois        
            End If        
        End Forall    
        
        curdoc.who=curdoc.empty
        curdoc.empty = ""
    '  ---------------------------------    
        
        curdoc.lastsenddate=sdate(0)  ' дата последней отправки документа
        curdoc.main_isp = curdoc.who(0)    'ответственный за документ     ФИО
        curdoc.main_isp2 = curdoc.whois(0)    ' ответственный за документ     должность + ФИО
        
        curdoc.addreaders=Arrayunique(curdoc.addreaders)  ' 2020 Боря
        Call curdoc.Save(True, False)
        
' находим все дочерние документы    и приравниваем значение полей who, addreaders, addauthors (у кого документ находится)
        Set dc = curdoc.Responses
        Set ftdoc = dc.GetFirstDocument    
        While Not ftdoc Is Nothing
            If ftdoc.IsValid=False Then 
                Print "Документ не валидный"
            Else
                ftdoc.who = curdoc.who
                ftdoc.addreaders = curdoc.addreaders
                ftdoc.addauthors = curdoc.addauthors
                ftdoc.hierarchy = curdoc.hierarchy
                ftdoc.history=mes2+ftdoc.history(0)
                ftdoc.save True, False
            End If
            Set ftdoc = dc.GetNextDocument (ftdoc )
        Wend    
        
        
        Set curdoc = dc1.GetNextDocument (curdoc)
    Wend
    Call uiview.DeselectAll
'    Call uiview.View.Refresh()
'    Call view.Refresh
    Msgbox "ОК!"
    Exit Sub
ErrH:    
    Print  Error & | in line | & Erl(),
    Exit Sub
End Sub

Поделиться

2

Re: Отправить группу документов админом

Так же в этом виде полезно иметь кнопочку "В архив" - шлет главные и все ответы в вид архива с вводом причины.

Sub Click(Source As Button)
    On Error Goto ErrH
    Dim session As New NotesSession
    Dim ws As New NotesUIWorkspace
    Dim db As NotesDatabase
    Dim uiview As NotesUIView
    Dim uidoc As NotesUIDocument    
    Dim doc As NotesDocument, ftdoc As notesdocument
    Dim  nextftdoc As  NotesDocument
    Dim mes As String, mes2 As String, user As String, mes3 As String, server As String
    Dim resp As Variant
    Dim values(2) As Variant
    Dim i As Integer,  y As Integer
    Dim sdate As Variant, picklist As Variant
    Dim st As String
    
    user = session.CommonUserName
    Set db = session.CurrentDatabase
    server = db.Server
    Set uiview = ws.CurrentView
    
    Dim dc As NotesDocumentCollection
    Dim dc2 As NotesDocumentCollection
    Set dc=uiview.Documents  '  все помеченные доки - будущие ответы
    
    
    
    If dc.count = 0 Then
        Messagebox "Выберите документы!"
        Continue=False        
        Exit Sub
    Else
        Print "dc.count" dc.count
    End If
    
    sdate = Evaluate("@Now( [ServerTime])")
    mes3 = sdate(0)
    
    kom = Inputbox$ ( "Введите комментарий","ADMIN" )
    If kom = "" Then Exit Sub
    
    For i=1 To dc.count
        Set doc = dc.GetNthDocument (i)
        
        y=0
        Set item = doc.GetFirstItem( "who" )
        Forall v In item.Values
            y=y+1 
        End Forall
        If y>1 Then Messagebox("Нельзя отправлять документы в архив, если их рассматривает несколько человек!") : Exit Sub    
        
        doc.addauthors = user
        doc.arcdate = Now    
        doc.archive = "1"
        doc.who = "В архиве"
        doc.whois = "В архиве"
        doc.hierarchy=""
        
        mes=doc.history(0)
        mes2=mes3+"  "+ user+"   списал документ в архив "+" " &Chr(13) +" с комментарием: " + kom &Chr(13)+" "&Chr(13)
        doc.history=mes2+mes        
        Print  doc.header(0)
        Call doc.Save(True, False)
        
        Set dc2 = doc.Responses    
        For x=1 To dc2.count
            Set ftdoc = dc2.GetNthDocument(x)
            If ftdoc.IsValid=False Then 
                Print "Документ не валидный"
            Else
                Print "ответ " ftdoc.header(0)
                ftdoc.archive = doc.archive(0) 
                ftdoc.who = doc.who(0) 
                ftdoc.whois = doc.whois(0) 
                ftdoc.history=mes2+ftdoc.history(0) 
                ftdoc.addauthors=user
                ftdoc.addreaders=doc.addreaders
                ftdoc.save True, False
            End If
        Next    
    Next    
    
    uiview.DeselectAll
    Msgbox "Документы отосланы в архив!"
    Call ws.ViewRefresh
    Exit Sub
ErrH:
    Print "Ошибка: " & Error(Err) & " в строке " & Erl
End Sub

Поделиться

3

Re: Отправить группу документов админом

Доработанный вариант кнопочки.

Sub Click(Source As Button)
    Dim ws As New NotesUIWorkspace
    Dim uiview As NotesUIView
    Dim dc1 As NotesDocumentCollection
    Dim session As New NotesSession
    Dim view As NotesView
    Dim db As NotesDatabase, strukdb As notesdatabase
    Dim dc As NotesDocumentCollection, strukdc As NotesDocumentCollection
    Dim curdoc As NotesDocument, docreg As NotesDocument, ftdoc As notesdocument,  strukdoc As NotesDocument
    Dim mes As String, mes2 As String, mes3 As String, who As String, server As String, user As String
    Dim picklist As Variant, sdate As Variant
    Dim item As NotesItem, item2 As NotesItem, item3 As NotesItem, item4 As NotesItem 
    Dim valueArray As String
    Dim kom As String
    Dim PolicyPatch As String
    On Error Goto ErrH
    Set uiview = ws.CurrentView
    Set dc1 = uiview.Documents
    Dim values() As Variant
    Dim response As Variant
    response = ""
    
    Set db = session.CurrentDatabase
    server = db.Server
    Set view = db.GetView ("reg" )
    Set docreg = view.GetFirstDocument
    PolicyPatch = docreg.PolicyPatch(0)'путь к базе 'Структура'
    Print  "PolicyPatch "  PolicyPatch    
    
    If dc1.Count<2 Then
        Msgbox "Необходимо выбрать по крайней мере два документа !"
        Exit Sub
    End If
    
    Set curdoc = dc1.GetFirstDocument
    
    user = session.CommonUserName
    
    picklist = ws.PickListStrings( _
    PICKLIST_CUSTOM, _
    True, _
    server, _
    "promdoc\policy", _
    "StrukChoice2", _
    "Сотрудники организации", _
    "Выберите КОМУ  отправить документы", _
    2 ) 
    If picklist(0) = "" Then Messagebox("Выбор не сделан") : Exit Sub
    picklist = Fulltrim(picklist)
    
    kom = Inputbox$ ( "Введите комментарий","ADMIN" )
    If kom = "" Then Exit Sub
    
    While Not (curdoc Is Nothing)
        curdoc.komment = kom    
        
        Set item = curdoc.GetFirstItem( "who" )    
        
        i=1
        Print  i "." curdoc.header(0)
        Print "Ubound(item.Values) " Ubound(item.Values) "  // response  " response
        If Ubound(item.Values)>0  And     response = "" Then    ' первый раз - выбрать с кого снимать из who, если 2+ чела
            
            response = ws.Prompt (PROMPT_OKCANCELLIST, _
            "Рассматривает несколько человек!", _
            "У кого снять с рассмотрения?", _
            curdoc.GetItemValue( "who" ) (0), curdoc.GetItemValue( "who" ))
            Print "снять с response " response
        End If
        
        If Ubound(item.Values)>0  Then    '  для всех где   who 2+ чела.
            curdoc.empty=""
            Set item2 = curdoc.GetFirstItem("empty")  '   удалить у выбранного, если рассмастривало несколько чел 
            Forall v In item.Values
                If v <> response Then  Call item2.AppendToTextList(v)
            End Forall
            curdoc.who=curdoc.empty
        Else
            curdoc.who=""    '  рассмастривал 1 человек
        End If
        
        
        curdoc.empty=""
        Set item4 = curdoc.GetFirstItem("empty")  ' Удаляем дубли   из item (поле who)
        Forall v In item.Values
            If Not item4.contains(v) Then Call item4.AppendToTextList(v)
        End Forall    
        curdoc.who=curdoc.empty
        curdoc.empty = ""
        
' ответственный за документ - первый сотрудник в поле who    
        curdoc.main_isp = curdoc.who(0)
        
' добавляем сотрудников, с кого сняли документ  -  в читатели документа    
        Set item2 = curdoc.GetFirstItem("addreaders")
        
        mes3=""
        Forall v In picklist  ' фомируем mes3 для добавления в историю, picklist - на  кого шлем
            mes3=mes3+v+"; "
            Call item.AppendToTextList(v)      '   ДОБАВЛЕНИЕ Кому в who
        End Forall
        sdate = Evaluate("@Now( [SERVERTIME])")
            '  ----------- ИСТОРИЯ
        mes2=sdate(0) +"   документ отправил "&Chr(13)+user+" на " + mes3+" "&Chr(13)+" с комментарием: " + kom &Chr(13)+" "&Chr(13)
        curdoc.shadowhistory = mes2 + curdoc.shadowhistory(0)
        curdoc.history=mes2 + curdoc.history(0)
        
            ' Основной Исполнитель - первый сотрудник в поле who    
    ' находим ответственного за документ сотрудника в БД "Структура" -----------------------------------
        Set strukdb = session.GetDatabase(server, PolicyPatch , False )
        Set view = strukdb.GetView("notespeople")
        Set strukdc = View.GetAllDocumentsByKey(curdoc.main_isp, True )
        
        If strukdc.count=0 And curdoc.main_isp(0)<>"" Then     Msgbox ("Основной Исполнитель не найден в Структуре организации!!!")
        If strukdc.count > 1 Then Msgbox ("Внимание! в структуре организации обнаружены идентичные элементы !")
        If strukdc.count > 0 Then     
            Set strukdoc = strukdc.GetFirstDocument() '  первый исполнитель из поля main_isp
            curdoc.hierarchy = strukdoc.subdivision(0) ' для отображения документа в представлении "по подразделениям"     
            Set item3 = curdoc.GetFirstItem( "addauthors" )        ' добавление руководителя подразделения из структуры  в поле addauthors    
            If strukdoc.shef(0) <>"" Then Call item3.AppendToTextList(strukdoc.shef(0))
        End If
        
    ' в соответствии с нотес именем в поле who заносим в поле whois должности и ФИО -------------------------
        curdoc.whois=""
        Set item5 = curdoc.GetFirstItem("whois")
        Forall v In item.Values   ' поле who
            Set ftdoc=view.GetDocumentByKey(v)  ' вид notespeople БД Структуры
            If (ftdoc Is Nothing) Then    
                Msgbox ("Исполнитель: ") + v  +  (" не найден в Структуре организации.")
            Else
                Call item4.AppendToTextList(v)     ' ФИО есть в структуре, добавить в empty (потом в who)
                Call item5.AppendToTextList(ftdoc.position(0)+" "+ftdoc.fio(0)) ' ФИО и Должность добавить в  whois        
            End If        
        End Forall    
        
        curdoc.who=curdoc.empty
        curdoc.empty = ""
    '  ---------------------------------    
        
        curdoc.lastsenddate=sdate(0)  ' дата последней отправки документа
        curdoc.main_isp = curdoc.who(0)    'ответственный за документ     ФИО
        curdoc.main_isp2 = curdoc.whois(0)    ' ответственный за документ     должность + ФИО
        
        curdoc.addreaders=Arrayunique(curdoc.addreaders)  ' 2020 Боря
        Call curdoc.Save(True, False)
        
' находим все дочерние документы    и приравниваем значение полей who, addreaders, addauthors (у кого документ находится)
        Set dc = curdoc.Responses
        Set ftdoc = dc.GetFirstDocument    
        While Not ftdoc Is Nothing
            If ftdoc.IsValid=False Then 
                Print "Документ не валидный"
            Else
                ftdoc.who = curdoc.who
                ftdoc.addreaders = curdoc.addreaders
                ftdoc.addauthors = curdoc.addauthors
                ftdoc.hierarchy = curdoc.hierarchy
                ftdoc.history=mes2+ftdoc.history(0)
                ftdoc.save True, False
            End If
            Set ftdoc = dc.GetNextDocument (ftdoc )
        Wend    
        
        i=i+1
        Set curdoc = dc1.GetNextDocument (curdoc)
    Wend
    Call uiview.DeselectAll
'    Call uiview.View.Refresh()
'    Call view.Refresh
    Msgbox "ОК!"
    Exit Sub
ErrH:    
    Print  Error & | in line | & Erl(),
    Exit Sub
End Sub

Поделиться