Различия

Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.

Ссылка на это сравнение

ru:creating_user_reports:use_macros_in_reports:examples:data_access_from_report [2020/07/21 03:39]
192.168.1.126 удалено
— (текущий)
Строка 1: Строка 1:
-====== Пример обращения к данным из базы ====== 
- 
-===== Текущая ситуация ===== 
- 
-Business Studio предлагает создавать необходимые отчеты с использованием привязок. Это позволяет с минимумом знаний создавать необходимые правила для формирования отчетов. При этом, в Business Studio существуют механизмы, позволяющие создать отчет полностью программным путем, без создания привязок. 
- 
-===== Постановка задачи ===== 
- 
-В отчете формата Word по процессу необходимо в разных строках кодом VBA добавить: 
- 
-  * Параметр процесса "Название"; 
-  * Параметр процесса "Содержание деятельности"; 
-  * Текст с указанием числа задействованных субъектов в процессе; 
-  * Маркированным списком перечень субъектов и их типа участия вида "Субъект (НазваниеТипаСвязи). 
- 
-===== Решение описывается с момента ===== 
- 
-Существует пустой шаблон отчета по процессу. Отчет не содержит ни одной привязки, а содержит лишь 2 строки, введенные вручную: 
- 
-  * "Название процесса:" 
-  * "Содержание деятельности:". 
- 
-===== Концепция решения ===== 
- 
-  - В шаблоне в местах, где необходимо отображать данные, устанавливаем закладки. Далее кодом VBA получаем необходимые данные из базы и выводим их в указанных местах. 
-  - Средствами OLE найти связи процесса по субъектам и получить названия субъектов и их типов связей. Вставить эти значения в документ. 
- 
-===== Шаги решения ===== 
- 
-В шаблоне в разных строках вводятся поясняющие названия и добавляются закладки (лента "Вставка" группа "Ссылки" кнопка "Закладка") с названиями: 
- 
-  * НазваниеПроцесса 
-  * СодержаниеДеятельности 
- 
-[{{ ru:creating_user_reports:use_macros_in_reports:data_access_from_report:lang_data1.png?nolink |Рисунок 1. Вид шаблона отчета после добавления необходимых закладок и форматирования}}] 
- 
-Для данного примера (Процесса) параметры называются: 
- 
-  * Название 
-  * СодержаниеДеятельности 
- 
-Далее средствами OLE будут получены остальные данные через создание необходимого фильтра. Отправным параметром для поиска будет служить guid процесса, от которого вызывается отчет. Полученные данные будут вставлены в документ средствами VBA. 
- 
-<code> 
-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 
-</code> 
- 
-===== Результат ===== 
- 
-[{{ ru:creating_user_reports:use_macros_in_reports:data_access_from_report:lang_data2.png?nolink |Рисунок 2. Вид сформированного отчета. Все было создано кодом VBA без единой привязки}}] 
- 
- 
- 
- 
- 
-[<contextnavigator>] 
- 
  
Driven by DokuWiki