Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
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>] | ||
- | |||