Delphi 11中Fast Report主从报表按Quantity字段重复打印记录
Delphi 11 + Fast Report 实现主从记录按Quantity重复打印的方法
方案一:使用Fast Report内置脚本循环(无需修改数据集)
- 先完成基础主从报表设计:拖入主表数据源,绑定主记录字段到
MasterDataBand;添加明细表数据源,设置与主表的关联条件(如主表ID关联明细表MasterID),将明细字段绑定到DetailDataBand。 - 选中
MasterDataBand,在其OnBeforePrint事件中添加以下Pascal脚本:
替换var i: Integer; begin // 主记录默认会打印1次,所以循环次数为Quantity-1,凑够总次数 for i := 1 to <主表别名.Quantity> - 1 do begin MasterDataBand1.Print; DetailDataBand1.Print; end; end;<主表别名>为你实际的主表数据源名称,运行报表即可实现主记录+对应明细按Quantity值重复打印。
方案二:预处理数据集(适合复杂场景)
如果脚本方式出现明细联动异常,可在Delphi代码中提前复制主记录,再绑定到报表:
- 创建临时数据集(如
TClientDataSet),结构与原主表一致,保留关联明细表的字段(如ID)。 - 遍历原主表,按Quantity值复制记录到临时数据集:
var i: Integer; begin TempMasterCDS.Close; TempMasterCDS.CreateDataSet; OriginalMasterTable.First; while not OriginalMasterTable.Eof do begin for i := 1 to OriginalMasterTable.FieldByName('Quantity').AsInteger do begin TempMasterCDS.Append; // 复制主表所有字段 TempMasterCDS.FieldByName('ID').AsInteger := OriginalMasterTable.FieldByName('ID').AsInteger; TempMasterCDS.FieldByName('Name').AsString := OriginalMasterTable.FieldByName('Name').AsString; // 其他字段依次复制 TempMasterCDS.Post; end; OriginalMasterTable.Next; end; // 将临时数据集绑定到Fast Report frxReport1.DataSets[0].DataSet := TempMasterCDS; end; - 报表中直接使用临时数据集作为主数据源,保持原有的主从关联设置,报表会自动打印所有复制后的主记录及对应明细。
注意事项
- 脚本方案需确保
MasterDataBand和DetailDataBand的打印顺序正确,避免明细重复混乱。 - 预处理数据集的方式更灵活,可额外给重复记录添加序号等自定义内容。
内容的提问来源于stack exchange,提问作者codeGood
相关产品推荐
相关产品推荐

