Это старая версия документа.


Ссылка для процесса с видом типа "Код"

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

Для того, чтобы в отчетах типа HTML (HTML-публикация, Business Studio Portal), названия Процессов, Субъектов и т.д. показывались ссылками (при условии, что есть куда ссылаться), необходимо, чтобы соответствующие привязки создавались как объекты, а не как параметры объекта. При этом текст такого объекта предопределен. Например, в отчетах ссылка будет только у процессов с текстом вида "Код НазваниеПроцесса". Если в отчет вывести параметр "Иерархический код", то гиперссылки у такого кода процесса не будет.

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

В отчете формата Word по процессу в таблице с данными его подпроцессов столбец "Следующий процесс" должен быть:

  1. Представлен в формате "Код + Название процесса" если формируется как отдельный документ Word (т.е. обычный формат).
  2. Представлен в формате "Код"  с гиперссылкой на процесс, если формируется для HTML (HTML-публикация или Business Studio Portal).

Ничего не делать с данными о следующем процессе для отчетов типа HTML в случаях, если:

  • Процесс не является гиперссылкой;
  • Процесс обозначен как {Туннель} или {Граница}.

Исходные данные

Решение описывается с момента, когда в шаблоне отчета создана необходимая привязка типа "Список", которую можно видеть таблицей. В таблице есть столбец "Следующий процесс", который представлен форматом "Код + Название процесса".  

Invalid Link
Рисунок 1. Вид необходимой привязки типа "Список" в шаблоне отчета
Invalid Link
Рисунок 2. Вид данных, сформированных по необходимой привязке, в выполненном отчете в HTML-публикации

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

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

Шаги решения

Только если отчет формируется  для HTML-публикации или Business Studio Portal необходимо кодом VBA для каждой ячейки столбца "Следующий процесс":

  • запомнить текст ячейки и гиперссылку;
  • из текста взять только код процесса (весь текст ячейки слева до первого пробела) и запомнить;
  • заменить содержимое ячейки гиперссылкой с текстом типа "Код" и таким же адресом ссылки;
  • если ячейка не содержит информацию о процессе, не содержит ссылки на процесс, тогда оставить все без изменения.
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

Результат

Invalid Link
Рисунок 3. Вид данных, сформированных по необходимой привязке, в выполненном отчете в HTML-публикации после решения задачи макросом

 

« ПредыдущаяНа уровень вышеСледующая »
Driven by DokuWiki