Как динамически назначить набор данных в FastReport?

Я создал отчет с помощью FastReport Designer и вызвал его с помощью Delphi 6. Но DataSet для MasterData и полей не назначается во время разработки. Я хочу установить эти свойства во время выполнения на основе выбранного DataSet. Как я могу это сделать? Как я могу получить доступ к DataSet из MasterData в Delphi перед вызовом предварительного просмотра/печати/дизайна? Добавлен следующий код в frxReport1BeforePrint.

  t := frxReport1.FindObject('MasterData1') as TfrxMasterData;
  //if Assigned(t) then
    //t.DataSet := frxIBODataset1;

  m := frxReport1.FindObject('mTenderType') as TfrxMemoView;
  if Assigned(m) then
  begin
    m.DataSet := frxIBODataset1;
    m.DataField := 'ACCOUNTNAME';
    m.Text := '[frxIBODataset1."ACCOUNTNAME"]';
  end;

Но мне нужно установить эти свойства перед вызовом функции print/design/preview. Любая помощь приветствуется.


person sinu    schedule 31.10.2010    source источник


Ответы (2)


Вы должны сначала указать, пытаетесь ли вы использовать набор данных, определенный в вашем приложении, или набор данных, определенный непосредственно в вашем отчете (вкладка «Данные» в дизайнере FastReport)?

Если вы пытаетесь использовать набор данных, который определен внутри вашего приложения (например, экземпляр AdoDataset, определенный в одном из ваших модулей данных), для этой цели вам не нужно привязывать MasterBand к вашему набору данных. динамически. Внутри отчета ваш MasterBand привязан к экземпляру TfrxDbDataset во время разработки. Во время выполнения ваш экземпляр frxDbDataset может быть подключен к любому набору данных в вашем проекте.

Вот как это будет:

1- Вы помещаете компонент frxReport и компонент frxDbDataset в свою форму или модуль данных. 2- В дизайнере отчетов вы переходите в раздел «Наборы данных» и добавляете доступный frxDbDataset в список наборов данных отчета. 3- Вы добавляете бэнд основных данных и назначаете frxDbDataset его свойству Dataset. 4- Теперь в вашем коде перед показом или подготовкой отчета можно написать что-то вроде этого:

  if MyOption = 1 then
    frxDbDataset1.Dataset := AdoDataset1
  else
    frxDbDataset1.Dataset := AdoDataset2;

Все, что вы назначите frxDbDataset, будет напечатано мастер-полосой в вашем отчете.

Если вы определяете набор данных непосредственно внутри отчета, используя дизайнер FastReport; тогда все внутри вашего отчета. Просто откройте дизайнер fastreport и сделайте следующее:

1- Перейдите на вкладку «Данные» и определите свои наборы данных (например, AdoQuery1). 2- Выберите объект отчета на панели дерева отчетов. 3- В инспекторе объектов перейдите на вкладку События. 4- Выберите подходящее событие; OnStartReport — хорошее событие для вашей работы. Дважды щелкните по нему, чтобы открыть редактор кода. 5- Теперь вы можете назначить набор данных, определенный на вкладке данных, полосе основных данных, используя код PascalScript. Что-то вроде этого:

procedure frxReport1OnStartReport(Sender: TfrxComponent);
begin
  MasterData1.Dataset := <ADOQuery1."ADOQuery1">;      
end;
person vcldeveloper    schedule 31.10.2010
comment
Ваше решение не работает с FastReports4/delphi XE2. Я вижу, что полоса печатается много раз, если я установил StartNewPage, однако я не вижу в ней никаких данных. Есть ли дополнительный шаг для определения полей для него (динамически, без учета типов данных)? - person ertx; 20.07.2012

Если вы используете FastReport 3+, вы можете разместить компоненты базы данных внутри отчет. Единственное, что вам нужно, это обеспечить подключение к базе данных и запустить конструктор из вашего приложения.

Вы можете определить переменные, передать их из приложения и запустить файл отчета .fr3.

person DiGi    schedule 01.11.2010