Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
ru:creating_user_reports:use_macros_in_reports:kod_as_link [2013/10/16 16:02] 127.0.0.1 внешнее изменение |
— (текущий) | ||
---|---|---|---|
Строка 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 vb> | ||
- | 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-публикации после решения задачи макросом}}] |