Работа с подчиненными запросами

отредактировано December 2011 Раздел: FastReport .NET
Добрый день. Есть необходимость перенести печать отчетов (квитанций) с Delphi на C#. Для формирования отчета существует главный запрос и подчиненные, которые используют данные главного запроса. Если упростить, то первым запросом я отбираю список лицевых счетов, а во всех остальных различные данные для лицевых из списка. Естественно, на экране должен быть лицевой счет и его данные, потом следующий лицевой счет и его данные и т.д. Решила начать с простого. Создала в программе 3 DataTable, закинула их в DataSet, создала связи, зарегистрировала источник. Если я создаю 3 DataBand один под другим и у каждого задаю источник и прописываю связи, то все работает. Сложность в том, что данные, относящиеся к лицевому не расположены подряд, одни под другими, они могут располагаться как угодно. Когда я пытаюсь использовать 1 DataBand, то получаю что у каждого лицевого список параметров соответствует первому лицевому.
В Delphi эта проблема решалась так. Кидаешь на форму 3 компонента frxDBDataSet, у каждого в свойстве DataSet прописываешь свой Query, например, QMain,Q1,Q2. Кидаешь компонент DataSource, называешь его DSMain, привязываешь его к QMain. У подчиненных Query (Q1 и Q2) заполняешь свойство DataSource= DSMain. То есть говоришь, что у них источник - данные получаемые после выполнения QMain. В главном запросе пишешь что-то типа:
select id from TableMain
Это конечно очень условно. В подчиненных пишешь что-то типа.
select param from TableParam where id=:id
То есть поле id передается как параметр.
В отчете же, подключаешь все свои данные (frxDBDataSet), кидаешь один компонент MasterData, на него кидаешь все поля которые нужны, привязываешь его к fdxDBDataSet, который привязан к главному запросу(QMain). Все работает как надо.
Подскажите, пожалуйста, как такое сделать в FastReport.Net и возможно ли такое в принципе. Посмотрела документацию и интернет, но похожих примеров не нашла. :) .Может тоже какие-нибудь параметры следует прописать.

Комментарии

  • отредактировано 14:16
    У тебя есть одна таблица со списком лицевых счетов (в нем есть столбец id), во второй таблице содержатся какие-то сведения о лицевых счетах (в ней есть внешний ключ на id лицевого счета). Между ними установлена связь. Если я правильно все понял, то нужно просто DataBand связать с первой таблицей. В него добавить DetailDataBand и связать его со второй таблицей. И все. Никаких фильтров прописывать не надо.
  • отредактировано 14:16
    Это было бы правильно если бы не несколько "НО". Во-первых, запросов зависящих от главного не один, а шесть, а это значит 6 таблиц. Во-вторых, описанный способ подходит для случая когда данные структурированы, например, сверху идет id, ниже поля из второго запроса, еще ниже из третьего и т.д.. На самом деле это не так. Поля из таблиц могут располагаться в любом порядке, например, сверху из третьей таблицы, чуть ниже из второй и на том же уровне из главной, еще чуть ниже из четвертой, потом опять из главной и т.д.. В общем, вразнобой. Причем, я хочу иметь возможность пододвинуть любое поле куда угодно не меняя порядок DataBand.
  • отредактировано 14:16
    Если между главной таблицей и подчиненными отношение один к одному, то нужно создать один DataBand, связанный с первой таблицей. А поля подчиненных таблиц вытаскивать через главную.Например, [Таблица1.Таблицы2.Имя]
  • отредактировано 14:16
    К сожалению это не так. Если бы было так, то я бы все в один запрос закинула. Более того поскольку данные могут располагаться в разной последовательности, а в подчиненном запросе может быть, например, 5 строк, то вывести все их автоматом и в Delphi не получалось. Вместо одного memoView, приходилось рисовать 5 одинаковых и после заполнения каждого программно переходить на следующую запись.
  • отредактировано 14:16
    Можно DetailDataBand наделать и менять их местами при необходимости.
  • отредактировано 14:16
    Разве у DetailDataBand можно поменять ширину? Или я чего-то не понимаю. Мне казалось, что он растягивается на всю ширину страницы. Повторюсь, мне необходимо, чтобы была возможность размещать данные из разных запросов на одной высоте. Примерно так:

    Счет
    № 001                 Услуга 1  100                Показания по холодной воде  40
                          Услуга 2  150                Показания по горячей воде  67
                          Услуга 3   47  
    
    Долг 100     Начислено 297    Итого 397
    

    Где id=001 выбирается в результате главного запроса, список услуг в результате второго запроса, подчиненного главному, показания это третий запрос, а строка с итогами - четвертый запрос. Разве это можно сделать с помощью DetailData?
  • отредактировано 14:16
    С помощью DetailData такого сделать не получится. А какие объекты ты хочешь для этого использовать? Например для услуг?
  • отредактировано 14:16
    Вообще, я надеялась, что можно положить один DataBand и на него кинуть все поля в виде TextObject, для тех же услуг, например. Как я уже писала именно так я и делала в FastReport 3 и 4. Единственный минус такого подхода в том, что перейти от первой услуги ко второй автоматом не получится и приходится в тексте программы перескакивать на следующую запись. Это выглядит примерно так.
                 |   Счет
    Данные       |   № [Table1.Id]                 Услуга 1  [Table2.summ]                Показания по холодной воде   [Table3.pok]
                 |                                 Услуга 2  [Table2.summ]                Показания по горячей воде    [Table3.pok]
                 |                                 Услуга 3  [Table2.summ]
    
  • отредактировано 14:16
    Неужели никто не сталкивался с подобным? У меня тут возникла еще идея, что все данные из подчиненных запросов можно передавать в виде параметров в отчет. Но тогда придется их обрабатывать в программе, что значительно увеличит объем кода. Не хотелось бы. Вариант прямо в шаблоне гораздо более удобный, на мой взгляд.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.