Различия

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

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

ru:creating_user_reports:use_macros_in_reports:examples:kod_as_link [2019/02/18 14:20]
ru:creating_user_reports:use_macros_in_reports:examples:kod_as_link [2019/02/18 15:34] (текущий)
Строка 1: Строка 1:
 +====== Ссылка для процесса с видом типа "Код" ======
 +
 +===== Текущая ситуация =====
 +
 +Для того, чтобы в отчетах типа HTML (HTML-публикация, Business Studio Portal), названия Процессов, Субъектов и т.д. показывались ссылками (при условии, что есть куда ссылаться), необходимо, чтобы соответствующие привязки создавались как объекты, а не как параметры объекта. При этом текст такого объекта предопределен. Например, в отчетах ссылка будет только у процессов с текстом вида "Код НазваниеПроцесса". Если в отчет вывести параметр "Иерархический код", то гиперссылки у такого кода процесса не будет. 
 +
 +===== Постановка задачи =====
 +
 +В отчете формата Word по процессу в таблице с данными его подпроцессов столбец "Следующий процесс" должен быть:
 +
 +  - Представлен в формате "Код + Название процесса" если формируется как отдельный документ Word (т.е. обычный формат).
 +  - Представлен в формате "Код"  с гиперссылкой на процесс, если формируется для HTML (HTML-публикация или Business Studio Portal).
 +
 +Ничего не делать с данными о следующем процессе для отчетов типа HTML в случаях, если:
 +
 +  * Процесс не является гиперссылкой;
 +  * Процесс обозначен как {Туннель} или {Граница}.
 +
 +===== Исходные данные =====
 +
 +Решение описывается с момента, когда в шаблоне отчета создана необходимая привязка типа "Список", которую можно видеть таблицей. В таблице есть столбец "Следующий процесс", который представлен форматом "Код + Название процесса".
 + 
 +[{{ ru:creating_user_reports:use_macros_in_reports:kod_as_link:code_link1.png?nolink |Рисунок 1. Вид необходимой привязки типа "Список" в шаблоне отчета}}]
 +
 +[{{ ru:creating_user_reports:use_macros_in_reports:kod_as_link:code_link2.png?nolink |Рисунок 2. Вид данных, сформированных по необходимой привязке, в выполненном отчете в HTML-публикации}}]
 +
 +===== Концепция решения =====
 +
 +После того, как отчет будет сформирован и Business Studio создаст все необходимые ссылки, будем запоминать каждую ссылку и название столбца.
 +
 +===== Шаги решения =====
 +
 +Только если отчет формируется  для HTML-публикации или Business Studio Portal необходимо кодом VBA для каждой ячейки столбца "Следующий процесс":
 +
 +  * запомнить текст ячейки и гиперссылку;
 +  * из текста взять только код процесса (весь текст ячейки слева до первого пробела) и запомнить;
 +  * заменить содержимое ячейки гиперссылкой с текстом типа "Код" и таким же адресом ссылки;
 +  * если ячейка не содержит информацию о процессе, не содержит ссылки на процесс, тогда оставить все без изменения.
 +
 +<code>
 +Sub ПослеВыполненияОтчета(ob As Variant, app As Variant)
 +
 +'Определяем направление вывода отчета (файл или HTML: публикатор или портал)
 +Dim HTMLCreate As Boolean
 +HTMLCreate = Application.ActiveDocument.Variables("BSHtml").Value
 +
 +If HTMLCreate Then 'если HTML Публикатор или BS Portal
 +
 +    'ВВОДНАЯ
 +    
 +    Dim BookmarkName As String
 +    Dim SpecText As String
 +    'Dim SpecText As String
 +    Dim СolumnNextProc As Integer
 +    
 +    'название закладки для привязки типа Список, формирующей нужную таблицу
 +    BookmarkName = "Подпроцессы_54860073"
 +    СolumnNextProc = 4 'номер столбца "Следующий процесс" в таблице
 +    SpecText = "{" 'с этого символа начинается информация о {Туннель} или {Граница}
 +    
 +    'Служебные
 +    Dim CellText As String
 +    Dim KodText As String
 +    Dim hLinkAdress As String
 +    Dim spaceNum As Integer
 +    
 +    'ПРОЦЕДУРНАЯ ЧАСТЬ
 +    
 +    If BookmarkIs(BookmarkName) Then 'если есть необходимая закладка
 +    
 +        ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes 'Alt + F9 - видим не коды полей, а значения
 +    
 +        Set TableKod = Application.ActiveDocument.Bookmarks(BookmarkName).Range.Tables(1)
 +        
 +        TableKodRows = TableKod.Rows.Count 'количество строк таблицы
 +    
 +        For i = 2 To TableKodRows 'проходим по всем строкам таблицы, кроме первой
 +    
 +            On Error Resume Next ' игнорирование <error 5991> - ячейки таблицы имеют вертикальное объединение
 +    
 +            CellText = TableKod.Cell(i, СolumnNextProc).Range.Text 'получаем значение ячейки
 +            CellText = Left$(CellText, (Len(CellText) - 2)) 'удаляем 2 последних служебных символа ячейки
 +                
 +            If Len(CellText) <> 0 And _
 +                SpecText <> Left$(CellText, 1) Then 'если не пустая ячейка И не {Туннель} или {Границы}
 +    
 +                spaceNum = InStr(1, CellText, " ") 'место первого пробела
 +    
 +                KodText = Mid(CellText, 1, spaceNum - 1) 'код = всё до первого пробела
 +                    
 +                TableKod.Cell(i, СolumnNextProc).Range.Select 'работаем с ячейкой
 +                
 +                hLinkAdress = "" 'очищаем значение адреса ссылки
 +                
 +                For Each hLink In Selection.Hyperlinks
 +                    hLinkAdress = hLink.Address 'определяем адрес гиперссылки
 +                Next hLink
 +                       
 +                If Len(hLinkAdress) <> 0 Then 'если процесс имеет ссылку
 +                       
 +                    'заменяем содержимое ячейки гиперссылкой
 +                    ActiveDocument.Hyperlinks.Add _
 +                        Anchor:=Selection.Range, _
 +                        Address:=hLinkAdress, _
 +                        SubAddress:="", _
 +                        ScreenTip:="", _
 +                        TextToDisplay:=KodText
 +                
 +                End If
 +                
 +            End If
 +    
 +        Next i
 +    
 +    End If
 +
 +End If
 +
 +End Sub
 +
 +
 +Function BookmarkIs(BookmarkName As String) As Boolean
 +
 +'Проверка на корректность названия привязки
 +
 +Dim Bkm As Bookmark 'переменная типа Закладка
 +
 +BookmarkIs = False 'сначала считаем, что нужной закладки нет
 +
 +For Each Bkm In ActiveDocument.Bookmarks 'перебираем все закладки в документе
 +
 +    If Bkm.Name = BookmarkName Then 'если нашли закладку с нашим именем
 +    
 +        BookmarkIs = True 'отмечаем, что закладка есть
 +        
 +    End If
 + 
 +Next
 +    
 +End Function
 +
 +</code>
 +
 +===== Результат =====
 +
 +[{{ ru:creating_user_reports:use_macros_in_reports:kod_as_link:code_link3.png?nolink |Рисунок 3. Вид данных, сформированных по необходимой привязке, в выполненном отчете в HTML-публикации после решения задачи макросом}}] 
 +
 +
 +
 +
 +
 +[<contextnavigator>]
 +
  
Актуальные новости, публикации и практики для бизнес-архитекторов и аналитиков
Driven by DokuWiki