Различия

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

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

ru:manual:report:use_macros_in_reports:examples:kod_as_link [2020/07/23 15:24]
192.168.1.126 удалено
— (текущий)
Строка 1: Строка 1:
-====== Ссылка для процесса с видом типа "Код" ====== 
- 
-===== Текущая ситуация ===== 
- 
-Для того, чтобы в отчетах типа HTML (HTML-публикация, Business Studio Portal), названия Процессов, Субъектов и т.д. показывались ссылками (при условии, что есть куда ссылаться), необходимо, чтобы соответствующие привязки создавались как объекты, а не как параметры объекта. При этом текст такого объекта предопределен. Например, в отчетах ссылка будет только у процессов с текстом вида "Код НазваниеПроцесса". Если в отчет вывести параметр "Иерархический код", то гиперссылки у такого кода процесса не будет.  
- 
-===== Постановка задачи ===== 
- 
-В отчете формата Word по процессу в таблице с данными его подпроцессов столбец "Следующий процесс" должен быть: 
- 
-  - Представлен в формате "Код + Название процесса" если формируется как отдельный документ Word (т.е. обычный формат). 
-  - Представлен в формате "Код"  с гиперссылкой на процесс, если формируется для HTML (HTML-публикация или Business Studio Portal). 
- 
-Ничего не делать с данными о следующем процессе для отчетов типа HTML в случаях, если: 
- 
-  * Процесс не является гиперссылкой; 
-  * Процесс обозначен как {Туннель} или {Граница}. 
- 
-===== Исходные данные ===== 
- 
-Решение описывается с момента, когда в шаблоне отчета создана необходимая привязка типа "Список", которую можно видеть таблицей. В таблице есть столбец "Следующий процесс", который представлен форматом "Код + Название процесса". 
-  
-[{{ ru/manual/report/use_macros_in_reports/examples/kod_as_link/kod_as_link_01.png?nolink |Рисунок 1. Вид необходимой привязки типа "Список" в шаблоне отчета}}] 
- 
-[{{ ru/manual/report/use_macros_in_reports/examples/kod_as_link/kod_as_link_02.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/manual/report/use_macros_in_reports/examples/kod_as_link/kod_as_link_03.png?nolink |Рисунок 3. Вид данных, сформированных по необходимой привязке, в выполненном отчете в HTML-публикации после решения задачи макросом}}]  
- 
- 
- 
- 
- 
-[<contextnavigator>] 
- 
  
Driven by DokuWiki