"Конвейерная печать"
Передо мной встала проблема: в самой программе я выделяю несколько элементов в списке, а потом отправляю их на печать, а точнее отправляю на печать всю развернутую информацию, касающуюся этих элементов. Эта информация должна быть представлена в виде нескольких кросс-табов, идущих один за другим. С одним выбранным элементом проблем нет: инфа, касающаяся его легко кладется в один кросс-таб, но как быть, если их (элементов) несколько? Ведь на этапе разработки я не знаю, сколько у меня будет выделено элементов и поэтому не могу заранее создавать некоторое количество заготовок, да это и глупо: нужно использовать один кросс-таб для всех элементов, чтобы он каждый раз печатался в количестве равном числу выделенных элементов, но с обновляющимся содержимым.
Как решить?
Как решить?
Комментарии
Расположи кросс-таб на датабэнде. Датабэнду устанавливай количество записей, равное количеству выбранных элементов. Ну а далее, перед печатью кросс-таба, анализируй для какого из выбранных элементов сейчас будет печататься кросс-таб и передавай соответствующий параметр датасету кросстаба. Примерно так.
Ну... Допустим запрос для кросса у тебя выглядит так:
Здесь item_id - идентификатор некоего элемента, входящего в список выбранных пользователем для печати отчёта.
Рисуешь кросс, кидаешь его на MasterData. Перед печатью отчёта вычисляешь количество выбранных пользователем элементов и устанавливаешь это значение дата-бэнду:
Далее, на OnBeforPrint датабэнда вешаешь такой обработчик:
Вот так примерно.
Есть ещё варианты. Например датабэнд, на котором кросс лежит, привязать к датасету, который тебе будет индексы выбранных элементов возвращать. Тогда ещё проще.
Да всё тебе подходит. В принципе изменений минимум.
Во-первых у датасетов есть свойства Filter и Filtered (по крайней мере у TfrxFIBDataSet есть, у остальных, думаю, тоже). Попробуй устанавливать его для датасета кросса в OnBeforePrint дата-бэнда. Я не знаю как отреагирует сам кросс (учитывает он отфильтрованные значения или нет), но стоит попробовать.
Во-вторых можно ведь перестроить запрос датасета для кросса по тому принципу, который я описал. В случае, если у тебя датабэнд привязан датасету, то кроссовый датасет можно привязать к нему через master-detail и вообще ни какого кода не надо (параметр можно привязать прямо в дизайнере отчёта через свойства датасета). Конечно этот вариант затратнее по временным ресурсам, поскольку датасет для кросса будет открываться несколько раз. Так что попробуй сначала первый вариант, может проканает. А нет - ну, куда деваться? Пусть переоткрывается. Запрос оптимизируй.
"Could not convert variant of type (Null) into type (Integer)"
Это происходит, когда я, например, использую в скрипте самый простой пробный вариант фильтрации: Чтобы это значило?
Второй вариант, честно говоря, хочется использовать в последнюю очередь. Да и к тому же я смутно представляю себе, как можно запросить данные с помощью TQuery из клиент-датасета. Я черпаю информацию для ДБ-Кросса не из таблицы (базы данных), а из клиентского набора данных.