Во многих отчетах возникает необходимость обработать повторяющиеся значения, например, объединить несколько экземпляров компонента Текст (Text) в один, если эти экземпляры содержат повторяющиеся значения. Для этого необходимо воспользоваться свойством текстового компонента Обработка дубликатов (Processing Duplicates).

 

 

Основные режимы работы свойства

В таблице ниже представлены основные режимы для обработки дубликатов.

 

Наименование

Описание

Нет

(None)

Не выполнять обработку дубликатов. Все элементы выводятся в отчете без изменений, даже если содержат одинаковые данные.

Соединить

(Merge)

Объединяет все соседние элементы с одинаковым содержимым в один общий блок.

Спрятать

(Hide)

Оставляет первое вхождение без изменений, скрывает остальные соседние элементы с повторяющимся содержимым.

Удалить текст

(Remove Text)

Оставляет первое вхождение без изменений, удаляет текст из остальных соседних элементов с повторяющимся содержимым.

 

 

Ниже представлен пример обработки повторяющихся текстовых значений:

 

None

Merge

Hide

Remove text

Item

Item

Item

Item

Item

 

 

Item

 

 

 

 

В большинстве случаев достаточно использования только этих основных режимов. Все дополнительные (расширенные) режимы обычно нужны в случае более сложной структуры отчета или дополнительных требований к обработке дубликатов.

 

 

Дополнительные (расширенные) режимы работы свойства

Расширенные режимы работы имеют в названии модификаторы «Global» и/или «BasedOnXXX». Рассмотрим эти режимы по порядку.

 

Режимы «Global»

По умолчанию повторяющиеся значения обрабатываются отдельно у каждого компонента, проверяются только его экземпляры (по имени). Если один под другим окажутся два текстбокса с одинаковыми текстовыми значениями, но при этом они будут экземплярами разных компонентов, то эти экземпляры объединяться не будут.

Однако в некоторых случаях, при сложной структуре отчета, бывает нужно обойти это ограничение. В этом случае нужно использовать режимы, в названии которых есть слово Global: Соединить глобально (Global Merge), Спрятать глобально (Global Hide), Удалить текст глобально (Global Remove Text). Работают эти режимы точно так же, как и описанные выше режимы, но при этом не учитываются имена компонентов.

 

Режимы «Based On Tag»

Довольно часто встречаются ситуации, когда повторяющиеся значения надо объединять не все подряд, а по какому-то критерию. Например, в таблице ниже приведены продажи предметов за несколько дней, и надо объединить одинаковые предметы только в пределах одного дня. Стандартные режимы объединяют все подряд только по содержимому текстбокса, не учитывая больше ничего. Поэтому в этом случае надо применять режимы, в названии которых есть слово BasedOnTag. В этих режимах при обработке учитывается не содержимое текстбокса, а только значение его поля Tag. А в поле Tag компонента можно задать сложное выражение, которое может учитывать многие критерии.

 

Date

Items

Expected

Merge Based on Tag

Merge

1.05.2026

Item 1

Item 1

Item 1

Item 1

Item 2

Item 2

Item 2

Item 2

Item 2

2.05.2026

Item 2

Item 2

Item 2

Item 1

Item 1

Item 1

Item 1

Item 1

3.05.2026

Item 1

Item 1

Item 1

Item 1

 

 

Например, пусть в таблице выше во второй колонке выводится название предмета с помощью выражения {dataSource.ItemName}, а.в первой колонке выводится дата с помощью выражения {dataSource.Date}, и эта дата является критерием объединения значений. Тогда в поле Tag текстового компонента надо написать следующее выражение: {dataSource.ItemName}{dataSource.Date}, т.е. к выражению, которое должно выводиться в компоненте, добавляются выражения с критериями из предыдущих колонок. И в результате объединение работает правильно, только в пределах заданных критериев.

 

Режимы «Based On Value And Tag».

Теперь поговорим про самую трудную часть – режимы, в названии которых есть модификаторы BasedOnValueAndTag. Сначала необходимо пояснить, что все остальные режимы работают только в пост-процессинге отчета, т.е. сначала отчет строится целиком, и только потом движок пробегает по страницам отчета, ищет повторяющиеся значения и обрабатывает их. Поэтому после обработки положение компонентов и их размеры никак не изменяются.

 

Например, на картинке ниже в третьей колонке выводится описание категорий. Для некоторых категорий оно большое и занимает три строки текста. После простого объединения ячеек размеры ячеек никак не изменяются, каждая строка текста занимает столько же места, как и раньше, и общая высота объединенной ячейки будет большая.

 

 

 

Поэтому добавлены режимы, которые обрабатывают текстовые компоненты в два этапа. Первый этап – дополнительный, еще при расчете значения текстового компонента (в событии OnGetValue). На этом этапе при нахождении дубликата сразу очищается содержимое текстового компонента, что делает его высоту минимальной. И далее это сразу влияет на размеры текстового компонента и соответственно высоту строки. Второй этап, как и в других режимах, обрабатывает компоненты уже после построения всего отчета. На обоих этапах используется значение текстового компонента и значение его свойства Tag.

 

Информация

 

Первый компонент из повторяющихся всегда имеет содержимое и его высота остается полной, уменьшается только высота повторяющихся компонентов. Это особенность движка, которую мы не можем изменить. Если требуется, чтобы высота первой строки тоже могла уменьшаться – необходимо применять другие методы, например изменить структуру отчета и использовать master-detail связь.

 

 

 

В таблице ниже представлен полный список режимов при обработке дубликатов.

 

Наименование

Описание

Нет

(None)

Не выполнять обработку дубликатов. Все элементы выводятся в отчете без изменений, даже если содержат одинаковые данные.

Соединить

(Merge)

Объединяет все соседние элементы с одинаковым содержимым в один общий блок.

Спрятать

(Hide)

Оставляет первое вхождение без изменений, скрывает остальные соседние элементы с повторяющимся содержимым.

Удалить текст

(Remove Text)

Оставляет первое вхождение без изменений, удаляет текст из остальных соседних элементов с повторяющимся содержимым.

Соединить в зависимости от свойства Tag

(Merge based on Tag)

Объединяет все соседние элементы с одинаковым значением свойства Тег (Tag).

Спрятать в зависимости от свойства Tag

(Hide based on Tag)

Оставляет первое вхождение без изменений, скрывает остальные соседние элементы с одинаковым значением свойства Тег (Tag).

Удалить в зависимости от свойства Tag

(Remove Text based on Tag)

Оставляет первое вхождение без изменений, удаляет текст из остальных соседних элементов с одинаковым значением свойства Тег (Tag).

Соединить глобально

(Global Merge)

Объединяет дубликаты даже для разных компонентов.

Спрятать глобально

(Global Hide)

Скрывает повторяющиеся элементы даже для разных компонентов.

Удалить текст глобально

(Global Remove Text)

Удаляет текст у повторяющихся элементов даже для разных компонентов.

Удалить текст в зависимости от значения

(Remove based on Value Text)

Оставляет первое вхождение без изменений, удаляет текст из остальных соседних элементов с повторяющимся содержимым.

Соединить в зависимости от Значения и свойства Tag

(Merge based on Value and Tag)

Объединяет все соседние элементы с одинаковым содержимым и одинаковым значением свойства Тег (Tag).

Спрятать в зависимости от Значения и свойства Tag

(Hide based on Value and Tag)

Оставляет первое вхождение без изменений, скрывает остальные соседние элементы с одинаковым содержимым и значением свойства Тег (Tag).

Удалить глобально текст в зависимости от значения

(Global Remove based on Value Text)

Очищает текст у повторяющихся элементов по значению тега даже для разных компонентов.

Соединить глобально в зависимости от Значения и свойства Tag

(Global Merge based on Value and Tag)

Объединяет все соседние элементы с одинаковым значением свойства Тег (Tag) даже для разных компонентов.

Спрятать глобально в зависимости от Значения и свойства Tag

(Global Hide based on Value and Tag)

Оставляет первое вхождение без изменений, скрывает остальные соседние элементы с одинаковым значением свойства Тег (Tag) даже для разных компонентов.