Delphi XE2中的FastReport Master / Detail

时间:2015-06-05 08:02:43

标签: oracle delphi fastreport

我需要一些帮助在Delphi XE2的快速报告中创建主/详细报告。

我有一个简单的表单,可以接受用户的2个日期和2次。然后,我在表单上有2个Oracle数据集,用于检索我的数据。当用户按下打印按钮时,程序接受来自用户的值并将值发送到第一个oracle数据集,然后第一个oracle数据集检索第一个值,然后将此值与用户接受的值一起发送到第二个数据集打印与检索到的值有关的详细信息。

对于每个数据集,我都有一个相应的frxDBDataset组件,然后将其分配给frxReport1组件。在报告中,我创建了一个分配给dataset1的Master Band和一个分配给datset2的Detail Band。当我运行报表时,数据集1会返回所有记录,但数据集2仅返回第一个值的记录,并为dataset1中的每个记录复制它。

以下是我要执行的代码:

<section class="container clearfix">
  <div class="text-center">
    <ul class="solutions-items">
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
    </ul>
  </div>
</section>
<section class="container clearfix">
  <div class="text-center solutions-text-p">
    <p class="">{% yaml reference %}</p>
    <p class="hidden">{% yaml reference %}</p>
    <p class="hidden">{% yaml reference %}</p>
    <p class="hidden">{% yaml reference %}</p>
    <p class="hidden">{% yaml reference %}</p>
    <p class="hidden">{% yaml reference %}</p>
    <p class="hidden">{% yaml reference %}</p>
    <button class="solutions-learnmore-btn">{% yaml reference %}</button>
  </div>
</section>

如何让第二个数据集继续下一个记录的值?

此报告过去在Delphi 2005中与RaveReports6完美配合,但我们使用基于代码的表单开发,使用“writeln”更容易操作,而不像Fast Reports那样直观。

1 个答案:

答案 0 :(得分:1)

创建预览时,FastReport执行类似以下代码的操作:

while not MasterBand.DataSet.Eof do
  begin
    ...Do special FastReport's work :)
    while not DetailBand.DataSet.eof do 
      begin
        ...Do special FastReport's work :)
        DetailBand.DataSet.Next; 
      end;
    MasterBand.DataSet.Next;   
 end;

在您的代码中:

while not opr_operatorcount_ods.Eof do
begin
 frxReport1.PrepareReport(false);
 opr_operatorcount_ods.Next; <-- here opr_operatorcount_ods is in the last position from PrepareReport 
end;  

数据带可以是主要类型或详细类型,但它们仅控制输出页面的数据定位  (显示的顺序和次数)。 由条带中的对象显示的数据取决于两个(或更多)数据集之间的关系。 所以你应该建立关系

关系可以通过多种方式完成。 如果要使用参数,可以按如下方式执行此操作:

  • 放置DataSource组件。

  • 使用DataSet属性DataSet = opr_operator_ods;

  • 将其连接到dataset1(opr_operator_ods)
  • 在DataSource.OnDataChange事件中写:

      opr_operatorcount_ods.Close;
      ......
      //Set parameter(relation between opr_operator(Master) and opr_operatorcount(Detail)   
      opr_operatorcount_ods.Params.ParamByName('opr_code').asString :=   opr_operator_ods.FieldByName('opr_code').AsString);            
      opr_operatorcount_ods.Open;
    

然后准备并打印报告:

procedure Print;
begin
  //Prepare Master dataset ( parameters, close open etc.) like :
  opr_operator_ods.Close;
  opr_operator_ods.SetVariable('DATEFROM', opr_datefrom_dtp.Date); 
  opr_operator_ods.SetVariable('DATETO', opr_dateto_dtp.Date);
  opr_operator_ods.SetVariable('TIMEFROM', opr_timefrom_dtp.Text);
  opr_operator_ods.SetVariable('TIMETO', opr_timeto_dtp.Text);
  opr_operator_ods.Open;
  ... 
  frxReport1.PrepareReport;
  frxReport1.ShowPreparedReport;
end;