https://www.cnblogs.com/m0488/p/3774797.html 麦麦提敏
实战例子 D:\WorkResource\测试用例\主子从报表
9.建立复合报表(批量打印)
在某些情况下,需要立刻组织几个报表打印,或者在一个打印预览窗体中封装并呈现几个报表。
要执行这些,在FastReport中有些工具能够允许建立一个新的报表附加在一个已经存在的报表上。
“TfrxReport.PrepareReport”方法中有一个选项“ClearLasReport”布尔类型参数,默认情况下他等于True,这个参数定义了是否有必要在建立报表时清除
前一个报表。下面的方法展示了如何从两个报表中建立一个批量报表:
Pascal:
frxReport1.LoadFromFile('1.fr3');
frxReport1.PrepareReport;
frxReport1.LoadFromFile('2.fr3');
frxReport1.PrepareReport(False);
frxReport1.ShowPreparedReport;
C++:
frxReport1->LoadFromFile("1.fr3");
frxReport1->PrepareReport(true);
frxReport1->LoadFromFile("2.fr3");
frxReport1->PrepareReport(false);
frxReport1->ShowPreparedReport();
我们加载并建立第一个报表,但并没有显示他。然后我们加载第二个报表到同一个TfrxReport对象,并使用“ClearLastReport”参数,让他等于False。这就允许第二个报表
附加在先前建立的报表之后。接下来,我们在预览窗口中显示一个完成的报表。
9.1 复合报表中的页数
你可以使用“Page”,“Page#”,“TotalPages”和“TotalPages#”系统变量显示页数或总页数,在复合报表中,这些变量以下面的方式工作:
Page - 当前报表页数
Page# - 批量报表页数
TotalPages - 当前报表总页数(报表必须两遍)
Totalpages# - 批量报表总页数
9.2 合并符合报表页数
正如上面所说的,报表设计页中的“PrintOnPrevousPage”方法让你在打印报表的时候使用前一页的剩余空间接合报表。在复合报表中,允许你在前一个报表的最后一页的剩
余空间创建一个新的报表。要执行这个,要使能每一个连续报表的第一个设计页“PrintOnPreviousePage”属性[SPAN]
》》》》》》》》》》》》》》》》》》》实战
procedure TForm1.Button9Click(Sender: TObject); //批量打印
var
vVou_no :string;
vStr ,vStr1 ,vStr2,vSql : string;
begin
// ADODataSet1.RecNo := StrToInt(LabeledEdit1.Text);
ADODataSet1.Locate('vou_no',LabeledEdit1.Text,[]);
vVou_no := adodataset1.FieldByName('vou_no').AsString;
with adodataset2 do
begin
close;
Parameters.ParamByName('vou_no').Value := vVou_no ;
open;
end;
cxg_mx.ClearItems;
cxg_mx.DataController.CreateAllItems();
cxg_mx.Columns[0].Width := 100;
frxReport1.PrepareReport(True);
ADODataSet1.Locate('vou_no',LabeledEdit2.Text,[]);
vVou_no := adodataset1.FieldByName('vou_no').AsString;
with adodataset2 do
begin
close;
Parameters.ParamByName('vou_no').Value := vVou_no ;
open;
end;
cxg_mx.ClearItems;
cxg_mx.DataController.CreateAllItems();
cxg_mx.Columns[0].Width := 100;
//ClearLasReport这个参数定义了是否有必要在建立报表时清除前一个报表
frxReport1.PrepareReport(False);
frxReport1.ShowPreparedReport; //批量打印
end;
//选择单据号
{根据选择Y,循环获取选取的单据号,用于批量打印,不能用dataset.first,会清除选择Y}
procedure TForm1.Button6Click(Sender: TObject);
var
Row,RowCurrent,i : Integer;
vDJH:string;
begin
RowCurrent :=cxGridDBTableView1.DataController.FocusedRecordIndex;
with DataModule2.RFDataSet1 do
begin
while not Eof do
begin
Row := cxGridDBTableView1.DataController.FocusedRecordIndex;
if cxGridDBTableView1.ViewData.DataController.Values[Row,0] = 'Y' then
vDJH :=cxGridDBTableView1.ViewData.DataController.Values[Row,6]+'|'+vDJH;
DataModule2.RFDataSet1.Next;
Next;
end;
end;
for i:=RowCurrent-1 downto 0 do //RecNo的最小值等于0
begin
if cxGridDBTableView1.ViewData.DataController.Values[i,0] = 'Y' then
vDJH :=cxGridDBTableView1.ViewData.DataController.Values[i,6]+'|'+vDJH;
DataModule2.RFDataSet1.Prior;
end;
ShowMessage(vDJH);
end;