вторник, 11 сентября 2012 г.

Доступ на документ начальников и их ИО, ДЛ выше по структуре исполнителя исходящего (Босс-референт 2.5)


' Процедура получает Notes имена начальников отделов и их ИО, ДЛ выше по структуре Исполнителя исходящего
' и дает им доступ на чтение исходящего документа CurrDoc, помещая имена найденных сотрудников в поле 'Access_Read_Leader'
' В документе должно быть для этого обязательное поле 'Access_Read_Leader'
' Для поиска сотрудников процедура использует служебное представление:
' - DBAliasLookup (для поиска документов сотрудников)
' Параметры, передаваемые в процедуру:
' - ExecName - уникальное имя исполнителя исходящего
' - CurrDoc - исходящий документ
Sub AddReadersFromParentLinkDocs(ExecName As String, CurrDoc As NotesDocument)
            Const  lsERR_NOTES_BAD_UNID=4091
            Dim ParentsDep As Variant
            Dim sw As New SwitchBoard         
           
            Dim db As New NotesDatabase("", "")
            Dim dbStaff As NotesDatabase
            Dim ViewNotesLookUp As NotesView
            Dim ViewAliasLookUp As NotesView
            Dim doc As NotesDocument
            Dim doc_dep As NotesDocument
            Dim doc_Dep_Leader As NotesDocument
            Dim tempdoc As NotesDocument
           
            Dim Leader As String
           
            Dim ItemAccessReadLeader As NotesItem
           
            Set dbStaff = sw.GetFirstDatabaseByDesign ("ITStaffManager")
           
            Set ViewAliasLookUp = dbStaff.GetView("DBAliasLookup")
           
            ' Из представления справочника сотрудников получаем документ сотрудника исполнителя исходящего
            Set doc = ViewAliasLookUp.GetDocumentByKey(ExecName)
            ' Получаем ИД подразделений, которые выше по структуре Исполнителя исходящего
            ParentsDep = doc.GetItemValue("Resp_Parents") 
           
            'Получаем Item "Access_Read_Leader" исходящего документа
            Set ItemAccessReadLeader = CurrDoc.GetFirstItem("Access_Read_Leader")
            ' Очищаем поле "Access_Read_Leader"
            Call CurrDoc.ReplaceItemValue("Access_Read_Leader", "")
            'Проходим по всем подразделениям, которые выше по структуре исполнителя исходящего
            Forall dep_id In ParentsDep
                        On Error lsERR_NOTES_BAD_UNID Goto processError
                       
                        'Получаем документ подразделения
                        Set doc_dep = dbStaff.GetDocumentByUNID(dep_id)
                       
                        On Error Resume Next                                            
                        'проверяем, если документ - подразделение, то берем поле "Dep_Leader" и получаем документ начальника отдела
                        ' иначе, если документ -организация. то берем поле "Org_Leader" и получаем документ начальника организации
                        If doc_dep.GetItemValue("Form")(0)="Department" Then                                   
                                   Set  doc_Dep_Leader = ViewAliasLookUp.GetDocumentByKey(doc_dep.GetItemValue("Dep_Leader")(0))
                        Elseif doc_dep.GetItemValue("Form")(0)="Organization" Then                           
                                   Set  doc_Dep_Leader = ViewAliasLookUp.GetDocumentByKey(doc_dep.GetItemValue("Org_Leader")(0))                            
                        End If                        
                        ' Если документ начальника отдела и организации существует, продолжаем поиск
                        If Not doc_Dep_Leader Is Nothing Then
                                   ' Если у начальника подразделения (организации) нотес имя не пустое, добавляем его в поле "Access_Read_Leader"
                                   ' если там этого имени нет
                                   If doc_Dep_Leader.GetItemValue("User_NotesName")(0)<>"" Then
                                               If ItemAccessReadLeader.Contains(doc_Dep_Leader.GetItemValue("User_NotesName")(0))=False Then
                                                           Call ItemAccessReadLeader.AppendToTextList(doc_Dep_Leader.GetItemValue("User_NotesName")(0))
                                               End If                                   
                                   End If
                                   'Получаем документ ИО начальника подразделения (организации)
                                   Set tempdoc = ViewAliasLookUp.GetDocumentByKey(doc_Dep_Leader.GetItemValue("User_Proxy")(0))
                                   If Not tempdoc Is Nothing Then
                                               If tempdoc.GetItemValue("User_NotesName")(0)<> "" Then
                                                           If ItemAccessReadLeader.Contains(tempdoc.GetItemValue("User_NotesName")(0))=False Then
                                                                       Call ItemAccessReadLeader.AppendToTextList(tempdoc.GetItemValue("User_NotesName")(0))
                                                           End If
                                               End If
                                   End If
                                   Set tempdoc = Nothing
                                   'Проходим по всем доверенным лицам начальника подразделения (организации)
                                   Forall User_Friend In doc_Dep_Leader.GetItemValue("User_Friends")
                                               'получаем документ - доверенное лицо начальника подразделения (организации)
                                               Set tempdoc = ViewAliasLookUp.GetDocumentByKey(User_Friend)
                                               If Not tempdoc Is Nothing Then
                                                           If tempdoc.GetItemValue("User_NotesName")(0)<> "" Then
                                                                       If ItemAccessReadLeader.Contains(tempdoc.GetItemValue("User_NotesName")(0))=False Then
                                                                                  Call ItemAccessReadLeader.AppendToTextList(tempdoc.GetItemValue("User_NotesName")(0))
                                                                       End If
                                                           End If
                                               End If
                                               Set tempdoc = Nothing
                                   End Forall
                        End If
processError:
            End Forall      
End Sub

воскресенье, 9 сентября 2012 г.

Поиск полей документа типа Readers, Authors и запись их в файл

Sub Click(Source As Button)
Dim s As New NotesSession
Dim w As New NotesUIWorkspace

Dim doc As NotesDocument
Dim docItem As NotesItem

Set doc = w.CurrentDocument.Document

Set FSO = CreateObject("Scripting.FileSystemObject")

 Set TextStream = FSO.CreateTextFile("C:\Fields.txt") 'Файл, куда записываются имена полей

Forall docit In doc.Items
If docIt.IsAuthors Then
TextStream.WriteLine docIt.Name + "###" + Join(docIt.Values, "; ")
End If
If docIt.IsReaders Then
TextStream.WriteLine docIt.Name + "###" + Join(docIt.Values, "; ")
End If
End Forall
TextStream.Close
End Sub

Другой вариант функции:
Function GetAllReadersAndAuthors(doc As NotesDocument) As Variant
On Error Goto errhand

Dim pItem As Variant
Dim emptyvar As Variant

Redim pItem(0)

Forall itemb In doc.Items
If ( itemb.IsAuthors Or itemb.IsReaders ) Then
pItem = Fulltrim(Arrayunique(Arrayappend(pItem, itemb.Values)))
End If
End Forall

GetAllReadersAndAuthors = pItem
exiting:
Exit Function
errhand:
Msgbox "Ошибка " & Err & " в функции GetAllReadersAndAuthors, в строке " & Erl
GetAllReadersAndAuthors = emptyvar
Resume exiting
End Function