Пример обращения к данным из базы

Текущая ситуация

Business Studio предлагает создавать необходимые отчеты с использованием привязок. Это позволяет с минимумом знаний создавать необходимые правила для формирования отчетов. При этом, в Business Studio существуют механизмы, позволяющие создать отчет полностью программным путем, без создания привязок.

Постановка задачи

В отчете формата Word по процессу необходимо в разных строках кодом VBA добавить:

  • Параметр процесса "Название";
  • Параметр процесса "Содержание деятельности";
  • Текст с указанием числа задействованных субъектов в процессе;
  • Маркированным списком перечень субъектов и их типа участия вида "Субъект (НазваниеТипаСвязи).

Решение описывается с момента

Существует пустой шаблон отчета по процессу. Отчет не содержит ни одной привязки, а содержит лишь 2 строки, введенные вручную:

  • "Название процесса:"
  • "Содержание деятельности:".

Концепция решения

  1. В шаблоне в местах, где необходимо отображать данные, устанавливаем закладки. Далее кодом VBA получаем необходимые данные из базы и выводим их в указанных местах.
  2. Средствами OLE найти связи процесса по субъектам и получить названия субъектов и их типов связей. Вставить эти значения в документ.

Шаги решения

В шаблоне в разных строках вводятся поясняющие названия и добавляются закладки (лента "Вставка" группа "Ссылки" кнопка "Закладка") с названиями:

  • НазваниеПроцесса
  • СодержаниеДеятельности
Рисунок 1. Вид шаблона отчета после добавления необходимых закладок и форматирования

Для данного примера (Процесса) параметры называются:

  • Название
  • СодержаниеДеятельности

Далее средствами OLE будут получены остальные данные через создание необходимого фильтра. Отправным параметром для поиска будет служить guid процесса, от которого вызывается отчет. Полученные данные будут вставлены в документ средствами VBA.

Sub ПослеВыполненияОтчета(ob As Variant, app As Variant)
    
'ВВОДНАЯ ЧАСТЬ

    'Названия закладок
    bkmName = "НазваниеПроцесса"
    bkmContent = "СодержаниеДеятельности"
    
    Dim Name As String 'для хранения параметра процесса "Название"
     
                    
'ПРОЦЕДУРНАЯ ЧАСТЬ
     
     
    '***
    'Обращение к параметрам объекта
    '***
     
     
    'Название процесса
    Name = ob.Название 'получаем данные
    Selection.GoTo What:=wdGoToBookmark, Name:=bkmName  'переход к закладке
    Selection.TypeText Text:=Name 'вставляем текст
     
     
    'Содержание деятельности
    Selection.GoTo What:=wdGoToBookmark, Name:=bkmContent  'переход к закладке
    Selection.TypeText Text:=ob.СодержаниеДеятельности  'вставляем текст
     
     
    '***
    'Использование механизма OLE
    '***
     
     
    'Работаем со справочником Процессов
    Set ProcS = app.ПолучитьОбъектПоУмолчанию_OLE("БизнесМодель.Процессы")
    
        'Создаем фильтр по процессам, чтобы получить наш процесс как объект
        Set ProcSFiltr = ProcS.СоздатьФильтр
            ProcSFiltr.Условия.Параметры.GUID.Значение = ob.GUID
        Set ResultProcSFiltr = ProcSFiltr.Выполнить
        Set ProcName = ResultProcSFiltr.ПолучитьЭлемент(0)


    'Работаем со справочником, хранящим связи Процессы-Процессы
    Set ProcSubjectLink = app.ПолучитьОбъектПоУмолчанию_OLE("БизнесМодель.СвязиСубъектов")

        'Создаем фильтр, чтобы получить субъекты, которые участвуют в нашем процессе
        Set PSLinkFiltr = ProcSubjectLink.СоздатьФильтр
            'значение = результат предыдущего фильтра
            PSLinkFiltr.Условия.Параметры.ОбъектВ.Значение = ProcName
        Set ResultPSLinkFiltr = PSLinkFiltr.Выполнить
    
        'Количество связей, в которых присутствует наш процесс
        countLinks = ResultPSLinkFiltr.КоличествоЭлементов
        
        'в этом массиве будут названия субъектов
        Dim Subjects() As String
        ReDim Subjects(countLinks)
        
        'в этом массиве будут названия связей
        Dim LinkName() As String
        ReDim LinkName(countLinks)
        
        'Выделяем из каждого элемента списка данные
        'о субъектах и типах связей
        'Каждый элемент списка представлен строкой вида:
        'Связи субъекта с процессом: из "<Субъект>" в "<Процесс>" с типом "<Тип связи>"
        
        smbl = """" 'символ "
        
        For i = 0 To countLinks - 1
            
            'Название субъекта между вхождениями первых двух символов "
            LinkText = ResultPSLinkFiltr.ПолучитьЭлемент(i)
            
                'Ищем первое вхождение символа
                FirstIn = InStr(LinkText, smbl)
                
                'Второе вхождение символа
                SecondIn = InStr(FirstIn + 1, LinkText, smbl)
                
                'Название субъекта между вхождениями
                Subjects(i) = Mid(LinkText, FirstIn + 1, (SecondIn - FirstIn - 1))
            
            'Название типа связи между вхождениями справа первых двух символов "
            
                LastNeedCharPos = Len(LinkText) - 1 'номер предпоследнего символа
            
                'Ищем второе вхождение символа справа
                SecondIn = InStrRev(LinkText, smbl, LastNeedCharPos)
                
                'Название типа связи между вхождениями
                LinkName(i) = Mid(LinkText, SecondIn + 1, LastNeedCharPos - SecondIn)
                
        Next i
    
    'Внесение данных в документ и форматирование
    Selection.TypeParagraph 'с новой строки
    Selection.TypeParagraph

    Selection.TypeText Text:="Количество субъектов, связанных с процессом: "

    Selection.Font.Bold = wdToggle
    Selection.TypeText Text:=CStr(countLinks)
    Selection.Font.Bold = wdToggle
    
    Selection.TypeParagraph
    Selection.TypeText Text:="А именно:"
    Selection.TypeParagraph
    
    'Создание маркированного списка
    'субъектов и типов связей вида:
    '* Субъект (тип связи)
    
    'Вкл. маркированный список
    Selection.Range.ListFormat.ApplyListTemplateWithLevel _
        ListTemplate:=ListGalleries(wdBulletGallery).ListTemplates(1), _
        ContinuePreviousList:=False, _
        ApplyTo:=wdListApplyToWholeList, _
        DefaultListBehavior:=wdWord10ListBehavior
    
    For i = 0 To countLinks - 1
        
        Selection.TypeText Text:=Subjects(i) + " (" + _
                                    LinkName(i) + ")"
                                    
        If i <> countLinks Then
            Selection.TypeParagraph
        End If
        
    Next i
    
    'Убираем маркированный список
    Selection.Range.ListFormat.RemoveNumbers NumberType:=wdNumberParagraph
    
End Sub

Результат

Рисунок 2. Вид сформированного отчета. Все было создано кодом VBA без единой привязки
« ПредыдущаяНа уровень вышеСледующая »
Driven by DokuWiki