Сортировка записей (продуктов) в печатной форме

Добрый день, Коллеги!
Возникла проблема с сортировкой записей в печатной форме.

Описание:
В разделе Заказ была добавлена Custom деталь с редактируемым реестром. На эту делать с помощью функционала импорта загружаем продукты из excel файла.
Во время импорта была реализована генерация порядкового номера продукта в соответствии с порядком записей в файле (Скриншот: "Порядок продуктов на детали с сортировкой по колонке порядковый номер".
Далее уже используем сортировку по колонке "Номер продукта" на детали для приемлемого вида.
Однако регистрация записей в базе происходит в произвольном порядке, и при печати файла продукты, в скачанном docx файле, не отсортированы (Скриншот: Порядок продуктов в распечатанном docx файле).

Вопрос: Как именно можно реализовать сортировку продуктов в распечатанном файле при его генерации по колонке "Номер продукта" детали, содержащей актуальную нумерацию? Возможно есть какой-то стандартный функционал сортировки при настройке печатной формы?

Заранее спасибо за помощь, Коллеги!

Нравится

17 комментариев

Здравствуйте,
Есть справочник «Печатные формы», там открываете вашу печатную форму. Там есть закладка «Табличные части», табличные части можно изменить, и нужному полю, установить нужную сортировку. См скр:

Максим, огромное спасибо! Глупая невнимательность

Добрый день!

А как быть если нужно сортировку динамически определять, т.е. брать ее из детали на странице. Допустим хотим мы отсортировать записи по наименованию продукции, посмотрели - не понравилось, отсортировали по возрастанию/убыванию количества, суммы или цены - годится.

Руслан, например, можно формировать Excel-отчёт и затем уже в Excel сортировать так, как нужно.

Как вариант, да. Но если это, допустим, коммерческое предложение, которое формируется в PDF?

Тогда либо сделать несколько копий отчёта с сортировкой по разным колонкам, либо переделывать механизм формирования отчёта. К тому же, это тема о старой версии системы, сейчас в PDF можно выводить только отчёты на движке FastReport.

Хорошо, отбросим формат вывода, интересует момент "переделать механизм формирования". На стороне клиента, вроде как, удалось получить сортируемые колонки, не понятно теперь куда их передать.

Нельзя просто так отбросить формат вывода, отчёты Word и PDF генерируются принципиально различно.

 

Если речь о Word, нужно смотреть ReportService, там направления определяют в коде функции GetAdditionalMacrosesData.

Почему же принципиально? Я как раз использую ReportService в котором с помощью флага задается формат формирования отчета (WORD или PDF), т.е. не надо писать дополнительный код, просто true/false. Печатная форма разрабатывалась еще на версии 7.14.х. Новую версию построителя отчетов еще не пробовал, вы наверно его имеете ввиду упоминая принципиальные отличия.

Спасибо за подсказку с функцией GetAdditionalMacrosesData. Глянул на нее, все методы приватные, видимо нужно будет дублировать класс ReportService с переопределением методов. Может как нибудь, но пока руки не поднимаются.

 

Руслан Хасанов пишет:

Почему же принципиально? Я как раз использую ReportService в котором с помощью флага задается формат формирования отчета (WORD или PDF), т.е. не надо писать дополнительный код, просто true/false.

Руслан, в более новых версиях вывод Word-отчёта в PDF отключили. На днях обсуждали. Тем, кто уже у себя использовали, пока оставили.

Руслан Хасанов пишет:

Спасибо за подсказку с функцией GetAdditionalMacrosesData. Глянул на нее, все методы приватные, видимо нужно будет дублировать класс ReportService с переопределением методов. Может как нибудь, но пока руки не поднимаются.

Либо же подойти с другой стороны и модифицировать саму информацию в базе о табличной части отчёта. Она хранится в таблице SysModuleReportTable в текстовом поле MacrosList структурами вроде:

  {
    "caption": "Активность.Фактическое завершение",
    "metaPath": "6d33ae9b-e8b1-46d0-bd42-b8a8ca3d4f6b.f944fa96-ddd0-4cb5-ab5b-19c08048beed",
    "metaPathCaption": "Активность.Фактическое завершение",
    "aggregationType": "",
    "subFilters": null,
    "dataValueType": "DateTime",
    "sort": "Descending"
  },

Модифицировали, выгрузили и вернули прежнее значение. Маловероятно, что будут несколько пользователь грузить одновременно. Хотя, может помешать кеширование в ESQ, нужно пробовать.

Зверев Александр,

Зверев Александр пишет:

Модифицировали, выгрузили и вернули прежнее значение. Маловероятно, что будут несколько пользователь грузить одновременно. Хотя, может помешать кеширование в ESQ, нужно пробовать.

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

Тогда проще всего без доработок логики насоздавать копий отчёта с разными настройками сортировки. Для ускорения, чтобы не вручную, сделать копирование записей о настройках в этих таблицах через базу.

Такой подход неудобен тем, что если надо внести корректировку в печатную форму, то это придется делать на всех формах и чем их больше, тем сложнее поддерживать. Поэтому решил переопределить логику ReportService, но столкнулся с проблемой - при запуске проекта в Visual Studio команда (оригинал инструкции из коробки, т.е. я ни чего еще не менял): 

var reportGenerator = ClassFactory.Get<IReportGenerator>("Word"); 

выбрасывается исключение:

Error creating an instance of the "Terrasoft.Configuration.IReportGenerator" class

Потыкался и обнаружил что инструкция: 

ClassFactory.Get<Terrasoft.Configuration.ReportService.ReportHelper>();

в Visual Studio выполняется без ошибок.

В чем разница? Почему первая инструкция вылетает с ошибкой? Из-за этого не могу продолжить работу. Кто нибудь знает как ее побороть?

Руслан, видимо, разница в том, что в во втором случае создают класс по названию, а в первом — по интерфейсу IReportGenerator и параметру. Может, такой способ при запуске не из системы не подходит?

 

Класс отчёта Word задан в схеме WordReportGenerator:

#region Class: WordReportGenerator
/// <summary>
/// Provides report generating functionality.
/// </summary>
[DefaultBinding(typeof(IReportGenerator), Name = "Word")]
public class WordReportGenerator : IReportGenerator
{

Видны те самые интерфейс, от которого наследуется класс, и параметр Word, который у Вас передаётся в ClassFactory.

 

Может, для целей отладки из Studio, создавать класс по полному названию, а уже потом, когда готовую логику будете размещать в схеме, напишете ClassFactory.Get<IReportGenerator>("Word"). Судя по схеме PdfAsyncReportGenerator, где использован именно этот вариант, он сам по себе допустим.

Спасибо, Александр, за помощь. Попробую пойти предложенным вами способом.

Удалось выполнить кастомную сортировку продукта в печатной форме, которая установлена у детали "продукт в продаже". Если деталь еще не загружена используется сортировка установленная в настройках отчета. Если у детали стоит сортировка и поле по которому выполнена сортировки имеется в печатной форме, то в печатной форме сортировка соответствует сортировке у детали. Спасибо, Александр, за оказанную помощь. 

Показать все комментарии