Тема: Работа с функциями постобработки выборок в TDMS 4.0

Речь в публикации пойдёт об изменении представления результатов работы выборки при помощи дополнительных возможностей, предоставляемых функцией постобработки.
Выборка в TDMS - это сохраненный запрос, который позволяет динамически накапливать объекты (а также пользователей и файлы), удовлетворяющие условиям поиска. Созданные выборки можно вставлять в состав объектов, ограничивая поиск только составом данного объекта.
Функция постобработки – встроенная функция в дизайнер выборок, позволяющая изменять представление результатов работы выборки. Вызывается функция постобработки при помощи комбинации клавиш CTRL+D в дизайнере выборок. Функции постобработки доступны только для глобальных выборок TDMS, для динамических выборок данный функционал не доступен. Так же возможно использование одновременно нескольких функций постобработки для изменения представления результатов выборки.


Использование функционала
Для просмотра и использования функций постобработки создадим новую выборку или выберем существующую.
Работа с функциями постобработки выборок в TDMS 4.0
На закладке Условия нажимаем комбинацию клавиш CTRL+D. Откроется окно Постобработки с доступными функциями.
Работа с функциями постобработки выборок в TDMS 4.0
Окно постобработки состоит из следующих элементов:
•    Функции постобработки: - перечень выбранных функций, с заданными параметрами;
•    Вставить – кнопка для добавления Шаблона функции в перечень функций постобработки;
•    Шаблоны функций: - доступные шаблоны функций постобработки;
•    Комментарии: - описание выбранного шаблона функции постобработки с кратким описанием параметров и примерами;

Для добавления новой функции необходимо выбрать требуемый шаблон функции в поле Шаблоны функций: и нажать на кнопку Вставить, далее внести параметры согласно описания в поле Комментарии: и нажать на кнопку ОК окна Постобработка, чтобы сохранить внесенные изменения в выборке.

Назначение функций постобработки
Работа с функциями постобработки выборок в TDMS 4.0


Примеры
Для примера рассмотрим выборку, которая выбирает информационные объекты типа Входящий документ внешняя претензия (ВДВП), в состав которых входят  объекты типа Обработка ВП:

без использования функций постобработки
Работа с функциями постобработки выборок в TDMS 4.0

Работа с функциями постобработки выборок в TDMS 4.0
Как видно из рисунка, у объекта ВДВП с регистрационным номером 00001 есть в составе три объекта Обработка ВП с регистрационными номерами 000001, 000002 и 000017, поэтому объект отображается три раза. Аналогично и по другим объектам ВДВП. Общее количество, возвращенное выборкой 44 элемента.

с использованием функции ToOneRow
Работа с функциями постобработки выборок в TDMS 4.0

Работа с функциями постобработки выборок в TDMS 4.0
После применения функции постобработки ToOneRow(@NULL,@NULL) выборка возвратит 26 элементов, т.к.  данная функция объединяет все одинаковые объекты ВДВП.

с использованием функции HideDuplicates
Работа с функциями постобработки выборок в TDMS 4.0

Работа с функциями постобработки выборок в TDMS 4.0
После применения функции постобработки  HideDuplicates(@C5);, выборка возвратит 44 записи т.к., очищает одинаковые регистрационные номера объектов ВДВП оставляя только один номер, т.е. очищает дубликаты строк по ключу, образованному идентификатором столбца С5.

с использованием функций ToOneRow и CellTextFormat
Работа с функциями постобработки выборок в TDMS 4.0

Работа с функциями постобработки выборок в TDMS 4.0
Функция ToOneRow(@NULL,@NULL); описана в предыдущем подразделе.
После применения функций постобработки  функция CellTextFormat(@ALL,@NULL,'Рассмотрение отделами',bold); выделяет жирным цветом шрифта (bold)  все объекты ВДВП, которые имеют статус (Рассмотрение отделами), @ALL,@NULL эти два параметра указывают на то, что необходимо обработать все объекты, отображенные выборкой.

с использованием функций ToOneRow, CellTextFormat и RemoveColumn
Работа с функциями постобработки выборок в TDMS 4.0

Работа с функциями постобработки выборок в TDMS 4.0
Функции ToOneRow(@NULL,@NULL); и CellTextFormat(@ALL,@NULL,'Рассмотрение отделами',bold); описаны в предыдущем подразделе.
После применения функций постобработки функция RemoveColumn(@C7); ); удаляет столбец «Описание» с идентификатором С7 из результатов выборки.

с использованием функций ToOneRow, CellTextFormat, RemoveColumn и ColumnOrder
Работа с функциями постобработки выборок в TDMS 4.0

Работа с функциями постобработки выборок в TDMS 4.0
Функции ToOneRow(@NULL,@NULL); и CellTextFormat(@ALL,@NULL,'Рассмотрение отделами',bold); и RemoveColumn(@C7); описаны в предыдущем подразделе.
После применения функций постобработки функция ColumnOrder(@C6,@C5); меняет местами столбцы @C6 «Статус» и @C5 «Регистрационный номер».

с использованием функций ToOneRow, CellTextFormat, RemoveColumn и Sort
Работа с функциями постобработки выборок в TDMS 4.0

Работа с функциями постобработки выборок в TDMS 4.0
Функции ToOneRow(@NULL,@NULL); и CellTextFormat(@ALL,@NULL,'Рассмотрение отделами',bold); и RemoveColumn(@C7); описаны в предыдущем подразделе.
После применения функций постобработки функция Sort(@C5,asc); сортирует объекты по столбцу «Регистрационный номер» С5 по возрастанию asc.

с использованием функций ToOneRow, CellTextFormat и ReplaceNull
Работа с функциями постобработки выборок в TDMS 4.0

Работа с функциями постобработки выборок в TDMS 4.0
Функции ToOneRow(@NULL,@NULL); и CellTextFormat(@ALL,@NULL,'Рассмотрение отделами',bold); описаны в предыдущем подразделе.
После применения функций постобработки функция ReplaceNull(@C10,'empty data'); заменяет пустое значение столбца «Дело списания оригинала» С10 на значение «empty data».


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

Re: Работа с функциями постобработки выборок в TDMS 4.0

Отлично!

Несколько нераскрытых вопросов:
1) Что быстрее работает Скрипт или Пост-обработчик
2) Что раньше вызывается Скрипт или Пост-обработчик
3) Функция ToOneRow(First)
3.1) Как выполняется группировка строк по нескольким значениям
3.2) Насколько я помню, эта группировка так же требует корректной сортировки записей. Т.е. если объединение строк идёт по идентификатору объекта из основной выборки, а сортировка идёт по идентификатору из присоединённой выборки, то объединение может пройти некорректно
3.4) Зачем нужны параметры DelimStr и ConcatUniq
4) Вроде бы только для динамических выборок не работает, а для локальных всё в порядке

Re: Работа с функциями постобработки выборок в TDMS 4.0

1) Что быстрее работает Скрипт или Пост-обработчик

В зависимости от количества обрабатываемых объектов выборкой и количества подвыборок. Если <100 объектов и выборка состоит из 1- 2 подвыборок тогда работает быстрея функции постобработки. Если большое количество обрабатываемых объектов >1000 и количество подвыборок 5 и более тогда быстрее отработает скрипт.


2) Что раньше вызывается Скрипт или Пост-обработчик

Раньше вызываются события выборки (т.е. скрипт):
- QueryBeforeExecute - Генерируется перед выполнением запроса.
- QueryAfterExecute - Генерируется после выполнения запроса, но перед отображением результатов на экране.

Последовательность вызовов:
- QueryBeforeExecute
- QueryAfterExecute
- Функции постобработки


3) Функция ToOneRow(First)
3.1) Как выполняется группировка строк по нескольким значениям

с использованием функции ToOneRow, с сортировкой по нескольким столбцам и использования параметра DelimStr
Работа с функциями постобработки выборок в TDMS 4.0

Работа с функциями постобработки выборок в TDMS 4.0

В примере использовалась выборка из предыдущего поста. После применения функции постобработки ToOneRow(@NULL,@C5+@C10,' :-: '); выборка возвратит 5 записей, т.к. данная функция объединяет все одинаковые объекты ВДВП по столбцу С5 (регистрационный номер) и С10 (Дело списания оригинала) и разделения в ячейке между значениями заменено с значения по умолчанию "," на значение ":-:".


3.2) Насколько я помню, эта группировка так же требует корректной сортировки записей. Т.е. если объединение строк идёт по идентификатору объекта из основной выборки, а сортировка идёт по идентификатору из присоединённой выборки, то объединение может пройти некорректно

Да такое возможно.


3.4) Зачем нужны параметры DelimStr и ConcatUniq

[DelimStr] - разделитель строк (по умолч =', ') в примере выше заменено значение на ':-:'
[ConcUniq] - объединять только уникальные значения <ConcExpr> (по умолч=1)


4) Вроде бы только для динамических выборок не работает, а для локальных всё в порядке

Функции постобработки предназначены для использования в глобальных выборках, для динамических выборок данный функционал не доступен. Описано в 3 абзаце первого поста.

Re: Работа с функциями постобработки выборок в TDMS 4.0

Slavikk пишет:

1) Что быстрее работает Скрипт или Пост-обработчик

В зависимости от количества обрабатываемых объектов выборкой и количества подвыборок. Если <100 объектов и выборка состоит из 1- 2 подвыборок тогда работает быстрея функции постобработки. Если большое количество обрабатываемых объектов >1000 и количество подвыборок 5 и более тогда быстрее отработает скрипт.

А можно усомниться?
Во-первых, несколько странно звучит привязка к подвыборкам. И обработчики событий и постобработчики, о которых идет речь в вашем посте, стартуют в составных выборках только по 1 разу. Поэтому скорость обработки от количества вложенных запросов не должна зависеть. Возможно я ошибаюсь. Но тогда этот "феномен" надо изучить глубже, возможно вы открыли "эффект Slavikk'а". Сразу скажу, лучше бы этого эффекта не было  ;)

Во-вторых, мне кажется Edhunter задал слишком абстрактный вопрос, а вы на него еще более абстрактно ответили.
-Кто быстрее дельфин или чайка?
-При пикировании чайка развивает скорость в 160км/ч, но если дельфин пристроиться на носовую волну корабля, то чайке за ним не угнаться.

Имхо, для сравнения уместно было бы
1) сравнить попарно скорость выполнения нескольких одинаковых операций, выполненных программным кодом и постобработчиком
2) сравнить скорость обработки "пакета" преобразований постобработчика (взяв их, например, из поста) с аналогичным по результату однопроходным (если такое возможно) программным кодом.

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

Спасибо за полезную статью  :)