Различия

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

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

ru:creating_user_reports:use_macros_in_reports:examples:two_tasks [2020/07/21 03:44]
192.168.1.126 удалено
— (текущий)
Строка 1: Строка 1:
-====== Решение 2-х задач в одном макросе ====== 
- 
-В отчете формата Word по всем субъектам необходимо решить 2 задачи: 
- 
-  - Добавить в указанную таблицу с пустой ячейкой текст. 
-  - Сделать сортировку в указанной таблице. 
- 
-===== Задача "Вставка текста в пустую ячейку" ==== 
- 
-==== Текущая ситуация ==== 
- 
-Бывают ситуации, когда необходимо выводить значения некоторых параметров у объектов.  При этом значения некоторых из этих параметров могут быть не заполнены. В свойствах объектов это видно и понятно, а в отчетах может быть не столь очевидным. Поэтому будет полезно вместо пустого значения выводить какое-то пояснение. 
- 
-==== Постановка задачи ==== 
- 
-В таблице, в которой выводится количество должностей по категориям, необходимо указать текст "Категория должности не выбрана". 
- 
-==== Исходные данные ==== 
- 
-В отчете существует привязка типа "Фильтр", которая выводит информацию о том, какие категории должностей есть у должностей, а также их количество. Так же показывается количество должностей, у которых категория не выбрана. 
- 
-[{{ ru:creating_user_reports:use_macros_in_reports:two_tasks:lang_two_tasks1.png?nolink |Рисунок 1 -- Вид привязки с кол-вом должностей по категориям в шаблоне отчета}}] 
- 
-Для должностей, у которых категория не выбрана, название категории пустое. 
- 
-[{{ ru:creating_user_reports:use_macros_in_reports:two_tasks:lang_two_tasks2.png?nolink |Рисунок 2 -- Вид привязки, выводящей кол-во должностей по категориям, в выполненном отчете (до решения задачи)}}] 
- 
-==== Концепция решения ==== 
- 
-Необходимо определить длину текста для каждой ячейки 2го столбца таблицы. Если длина 2 символа (т.е. только 2 служебных символа), то в эту ячейку необходимо вставить указанный текст. 
- 
-===== Задача "Сортировка таблицы" ===== 
- 
-==== Текущая ситуация ==== 
- 
-Управлять отображением данных можно как в фильтрах, так и в настройках привязок. Например, сортировку можно указать для списков как в фильтре, так и в настройках сложной привязки, задав направление сортировки и параметр, по которому будет происходить сортировка. При этом, бывают случаи, когда для вывода информации используется несколько фильтров и задание направления сортировки средствами Business Studio невозможно. 
- 
-==== Постановка задачи ==== 
- 
-В таблице, которая выводит информацию о количестве процессов, с которыми связаны должности, необходимо сделать сортировку по столбцу с количеством процессов -- от наибольшего к наименьшему. 
- 
-==== Исходные данные ==== 
- 
-В отчете существует привязка типа "Фильтр", которая выводит список должностей, имеющих хотя бы одну связь с процессами. В параметрах этой привязки задана другая привязка типа "Фильтр", которая выводит количество должностей, с которыми связана конкретная должность. 
- 
-[{{ ru:creating_user_reports:use_macros_in_reports:two_tasks:change_two_tasks3.png?nolink |Рисунок 3 -- Вид привязки, выводящей кол-во процессов у должностей, в окне "Привязки отчета"}}] 
- 
-[{{ ru:creating_user_reports:use_macros_in_reports:two_tasks:lang_two_tasks4.png?nolink |Рисунок 4 -- Вид привязки, выводящей кол-во процессов у должностей, в шаблоне отчета}}] 
- 
-Установка задания условий сортировки по каким-либо параметрам не дает ожидаемый результат -- сортировку по количеству процессов должностей. 
- 
-[{{ ru:creating_user_reports:use_macros_in_reports:two_tasks:lang_two_tasks5.png?nolink |Рисунок 5 -- Вид привязки, выводящей кол-во процессов у должностей, в выполненном отчете (до решения задачи)}}] 
- 
-==== Концепция решения ==== 
- 
-В Word имеется функционал для сортировки данных в таблицах (лента "Макет"). Мы сделаем тоже самое, но кодом VBA. 
- 
-Для ситуации, когда у разных должностей будет одинаковое количество процессов, необходимо будет сделать сортировку должностей по алфавиту. Это будет второй столбец сортировки. Будем считать, что она находится перед столбцом с количеством процессов. 
- 
-После проведенной сортировки столбец с нумерацией не будет соответствовать действительности. Поэтому необходимо для каждой ячейки этого столбца проставить последовательную нумерацию. 
- 
-===== Шаги решения ===== 
- 
-  - Согласно описанным концепциям решения, для каждой задачи реализуем свой код. Код каждой задачи оформим независимо друг от друга отдельными макросами. 
-  - В макросе "ПослеВыполненияОтчета" лишь сделаем вызов каждого макроса по очереди. 
-  - Общими для обоих макросов задач будет являться проверка наличия закладки (привязки) в отчете. Поэтому эту задачу реализуем через функцию. Вызов этой функции будет из каждого макроса задач. 
- 
-<code> 
-Sub ПослеВыполненияОтчета(ob As Variant, app As Variant) 
- 
-Call AddTextCleanRow 
-Call Sorting 
- 
-End Sub 
- 
- 
- 
-Sub AddTextCleanRow() 
- 
-'Макрос добавляет поясняющий текст в пустые строки таблиц 
-'по типам подразделений и категориям должностей 
- 
-'ВВОДНАЯ ЧАСТЬ 
-Dim BookmarkName As String 'название привязки нужной таблицы 
-BookmarkName = "Количество_субъектов_по__c209c161" 
-     
-Dim NeedColumn As Integer 'номер столбца, где пустая ячейка 
-NeedColumn = 2 
- 
-Dim TypeSubjectTextIns As String  'текст для вставки 
-TypeSubjectTextIns = "(Категория должности не указана)" 
- 
-'Служебные переменные 
-Dim TypeSubjectTable As Table 
-Dim RangeCell As Range 
- 
-'ПРОЦЕДУРНАЯ ЧАСТЬ 
- 
-If BookmarkIs(BookmarkName) Then 'если в документе закладка есть 
-     
-    'получаем таблицу по названию привязки 
-    Set TypeSubjectTable = Application.ActiveDocument.Bookmarks(BookmarkName).Range.Tables(1) 
-             
-    countRow = TypeSubjectTable.Rows.Count 'количество строк таблицы 
- 
-    For i = 2 To countRow 'проходимся по всем строкам таблицы 
- 
-        On Error Resume Next 'игнор error 5991, если какие-то ячейки имеют вертикальное объединение 
-         
-        Set RangeCell = TypeSubjectTable.Cell(i, NeedColumn).Range 'нужная ячейка 
-         
-        If Len(RangeCell.Text) = 2 Then  'если в ячейке только 2 служебных символа, т.е. ячейка пустая 
- 
-            'меняем текст в ячейке 
-            RangeCell.Select 
-            Selection.SelectCell 
-            RangeCell.Text = TypeSubjectTextIns 
- 
-        End If 
- 
-    Next i 
- 
-End If 
- 
-End Sub 
- 
- 
- 
-Sub Sorting() 
- 
-'Макрос производит сортировку данных в нужных полях 
-'Сортировка по количеству, по убыванию 
- 
-'ВВОДНАЯ 
- 
-'Задаем ключевые значения 
-Dim BookmarkName As String 
-BookmarkName = "Колво_процессов_у_Должно_30007b7b" 
- 
-Dim ColumnFirst As Integer  'номера столбца для первой сортировки 
-ColumnFirst = 3 
- 
-'Служебные переменные 
-Dim SortingTable As Table 
-Dim TextNumber As String 
- 
-'ПРОЦЕДУРНАЯ ЧАСТЬ 
-      
-If BookmarkIs(BookmarkName) Then 'если в документе закладка есть 
-     
-    'получаем таблицу по названию привязки 
-    Set SortingTable = Application.ActiveDocument.Bookmarks(BookmarkName).Range.Tables(1) 
-     
-    'Сортируем таблицу 
-    'Сначала по столбцу с количество процессов - по убыванию 
-    'Затем по столбцу с название должностей - по алфавиту 
-    SortingTable.Sort _ 
-        ExcludeHeader:=True, _ 
-        FieldNumber:="столбцам " & Str(ColumnFirst), _ 
-        SortFieldType:=wdSortFieldNumeric, _ 
-        SortOrder:=wdSortOrderDescending, _ 
-        FieldNumber2:="столбцам " & Str(ColumnFirst - 1), _ 
-        SortFieldType2:=wdSortFieldAlphanumeric, _ 
-        SortOrder2:=wdSortOrderAscending 
- 
-    'Приводим в порядок нумерацию 
-    countRow = SortingTable.Rows.Count 'количество строк таблицы 
- 
-    For i = 2 To countRow 
-         
-        TextNumber = Str(i - 1) + "." 'формируем номер 
-        TextNumber = Right$(TextNumber, Len(TextNumber) - 1) 'убираем первый пробел 
-         
-        SortingTable.Cell(i, 1).Range.Text = TextNumber 'вставляем номер 
- 
-    Next i 
-     
-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:two_tasks:lang_two_tasks6.png?nolink |Рисунок 6 -- Вид привязки, выводящей кол-во должностей по категориям, в выполненном отчете (после решения задачи)}}] 
- 
-==== Результат "Сортировка таблицы" ==== 
- 
-[{{ ru:creating_user_reports:use_macros_in_reports:two_tasks:lang_two_tasks7.png?nolink |Рисунок 7 -- Вид привязки, выводящей кол-во процессов у должностей, в выполненном отчете (после решения задачи)}}] 
- 
- 
- 
- 
- 
-[<contextnavigator>] 
- 
  
Driven by DokuWiki