Субрепорт с параметрами

отредактировано 03:12 Раздел: FastReport 3.0
Привет.

В отчете есть субрепорт, который берет данные из TfrxAdoQuery, который прикручен к компоненте типа TfrxAdoDatabase. Запрос получает параметр CompanyID из основного отчета, и в свойстве Master у него я поставил датасет, который на форме лежит и из которого берутся данные для основного отчета. В Params у Query забито примерно следующее:
Name - CompanyID
Data Type - Integer
Value - <dsMovement."CompanyID">

Результат должен быть, на мой взгляд, однозначным - субрепорт должен выводить (в данном случае) все договоры по этому клиенту. Но получается какая-то фигня - у всех клиентов присутствует один и тот же договор. Где грабли?

Комментарии

  • отредактировано 03:12
    Господа, не оставьте без ответа! Очень надо, но везде натыкаюсь на эти грабли. Сдается, что-то я делаю не так, но что, понять не могу
  • gpigpi
    отредактировано October 2006
    dsMovement - TfrxDBDataSet?
    Именно он указан у дочернего датасета?
  • отредактировано 03:12
    написал:
    у всех клиентов присутствует один и тот же договор
    Все правильно. Так FR и должен работать.

    Если вы хотите, чтобы вашим компаниям проставлялись договора, ва необходимо при каждой новой компании вызвать запрос заново.
    Для этого, при печати текущей копании (например, в событии Mastedata1OnBeforePrint) надо вызвать следущий кусок кода:
    AdoQuery1.Close;
    CompanyID = <dsMovement."CompanyID">;
    AdoQuery1.Open;
    
    Здесь:
    Mastedata1 - мастердата, на которой выводится информация о компаниях
    AdoQuery1 - ваш запрос
    CompanyID - переменная FR (например) значение которой передается в ваш запрос AdoQuery1.
  • отредактировано October 2006
    написал:
    Если вы хотите, чтобы вашим компаниям проставлялись договора, ва необходимо при каждой новой компании вызвать запрос заново.
    Для этого, при печати текущей копании (например, в событии Mastedata1OnBeforePrint) надо вызвать следущий кусок кода:

    Хм... Что интересно, так это то, что на некоторых категориях компаний моя схема (то есть без указанного тобой кода) работает, а на остальных - на каждом клиенте пишет одно и то же.
    По идее, местный ADOQuery должен сам все открывать, присваивать и закрывать, иначе для чего нужна такая настройка параметров с указанием полей мастер-датасета. В хелпе об этом ни гугу, может, хотя бы на форуме разработчики попробуют мне ответить?

    Кстати, только что попробовал вот такое:
    qRubrics.Close;
    qRubrics.Params.Items[0] := <dsMovement."CompanyID">;
    qRubrics.Params.Items[1] := <BookID>;
    qRubrics.Open;
    

    qRubrics - эт TfrxAdoQuery. В работе выдает ошибку Left side cannot be assigned to
    написал:
    dsMovement - TfrxDBDataSet?
    Именно он указан у дочернего датасета?

    Да-да, именно так.
  • gpigpi
    отредактировано 03:12
    А тестовый проект (на Delphi) сделать можете?
  • отредактировано October 2006
    Хм... Честно говоря, я не уверен, что в тестовом проекте будут учтены все нюансы. В отчете у меня куча Child'ов, которые меняются местами и пропадают/появляются по сто раз за распечатку, плюс еще тонна кода, так что я могу что-то просто пропустить. А, если сделать самый простой отчет с субрепортом, то не исключена возможность, что это будет работать ;)

    Мне нужно знать главное:
    1. Достаточно ли того, что в TfrxADOQuery я прописываю мастер-датасет и в Params загоняю переменные мастер-датасета? В хелпе указано свойство MasterField, нужно ли оно, и почему я не могу его достать в инспекторе объектов?
    2. Нужны ли какие-то дополнительные действия, чтобы в субрепорте извлекались данные, зависящие, предположим, от кода компании, который меняется с выводом каждого MasterData?

    Если всего, что я написал, достаточно, и больше ничего делать не надо, значит, я буду искать ошибку у себя в коде.
  • отредактировано 03:12
    написал:
    Кстати, только что попробовал вот такое:
    qRubrics.Close;
    qRubrics.Params.Items[0] := <dsMovement."CompanyID">;
    qRubrics.Params.Items[1] := <BookID>;
    qRubrics.Open;
    


    qRubrics - эт TfrxAdoQuery. В работе выдает ошибку Left side cannot be assigned to
    Попробуйте в дизайнере создать 2 переменных (fx), например IDCompany и IDBook. Затем в запросе параметрам установить эти переменные и менять в коде уже их, а не Params.Items[].
    qRubrics.Close;
    Set ('CompanyID', <dsMovement."CompanyID">);
    Set ('IDBook', Get ('BookID'));
    qRubrics.Open;
    

    Кстати, не советую вам использовать следущее:
    qRubrics.Params.Items[1] := <BookID>;
    
    Если есть необходимость работать с переменной FR, используйте Set и Get:
    qRubrics.Params.Items[1] := Get('BookID');
    
    Так будет надежнее.

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

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