FastReport主从表

FastReport的设置:
FastReport报表一定要勾上 PrintIfDetailEmpty,否则很容易打印报表没有数据
如果需要对MasterData进行统计,必须把Footer放在MasterData之后、DetailData之前。

FastReport的优点:不用单独SQL进行统计,而是使用FastReport的特点,对Band进行统计即可。
[Sum(<DBExecute."ex_tarif">, Band2)]

Band的RowCount很有用,但正常打印的时候要小心。
FastReport就是好,当Delphi里查明情况,不执行小广告的SQL语句的时候,FastReport的小广告Detail和Summary部分自动屏蔽,什么都不显示。
FastReport貌似会自动打开ADO数据库控件并执行,所以要小心。必须提前手动执行SQL语句,它才不会越俎代庖。

============================================================================

ADOExecute是主表,ADOSub是从表。
ADOExecute什么都不用设置,普通查询即可。ADOSub要设置MasterSource为dsExecute(主表),MasterFields为ex_numero(主表字段),DetailFields为sub_ex_numero(从表字段)。

ADOSub既可以是Table,也可以是Query。
但是如果是Table,设置比较简单。其内容自动被设置成
SELECT * FROM pub_execute_sub
WHERE sub_ex_numero = :ex_numero
顶多写一句代码 ADOSub.Open;(可能不需要),写在 ADOExecute.Open之后。

如果是Query的话,需要手动写:
SELECT * FROM pub_execute_sub
WHERE sub_ex_numero = :ex_numero
并且应该写上 ADOSub.Open; 写在ADOExecute.Open之后有效,写在之前是否有效不清楚。

之前Query设置死活不行,至今不知道为什么。
但后来从Table里把
SELECT * FROM pub_execute_sub
WHERE sub_ex_numero = :ex_numero
拷贝到Query里,
且DBSub设置DataSource,而不是DataSet,
就有效了。

后来又出现了Bound Outindex的错误,还以为是FastReport的问题,害我又调试了半天。最后发现还是Query的问题,到最后都没解决。算了Table够用了。

============================================================================

以下例子都试过,一般使用方法2和方法5:
// 一般情况下,主表会自动打开从表,而不必写代码。
// 即使有特殊过滤语句,也会自动打开从表
// 方法一:good
{ ADOCheque.SQL.Clear;
ADOCheque.SQL.Add('SELECT * FROM fac_cheque ');
ADOCheque.SQL.Add('WHERE (ch_date='''+FormatDateTime('yyyy-mm-dd', debut.DateTime)+''')');
ADOCheque.SQL.Add(' AND ch_facture = :fc_id ORDER BY ch_id');
ShowMessage(ADOCheque.SQL.Text);
if not ADOCheque.Active then ADOCheque.Open;
} // 方法二:good
{ ADOChequeDetail.SQL.Clear;
ADOChequeDetail.SQL.Add('SELECT * FROM fac_cheque ');
ADOChequeDetail.SQL.Add('WHERE ch_facture = :fc_id ORDER BY ch_act_nom,ch_act_prenom,ch_id');
ADOChequeDetail.FilterSQL:='ch_date='''+FormatDateTime('yyyy-mm-dd', debut.DateTime)+''''; }
// 方法三:可以
{ ADOCheque.SQL.Clear;
ADOCheque.SQL.Add('SELECT * FROM fac_cheque, facture ');
ADOCheque.SQL.Add('WHERE (ch_facture=fc_id) AND ch_facture = :fc_id ORDER BY ch_id');
ADOCheque.FilterSQL:='ch_date=fc_date';
}
{ // 方法四:可以
ADOCheque.SQL.Clear;
ADOCheque.SQL.Add('SELECT * FROM fac_cheque, facture ');
ADOCheque.SQL.Add('WHERE (ch_facture=fc_id) AND (ch_date=fc_date) AND ch_facture = :fc_id ORDER BY ch_id');
}
// 方法五:把'fac_cheque, facture'和'ch_date=fc_date'写在IDE的ADOCheque里不行
// 这段才是要真正打印的内容
{ with ADOExecute do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM Facture ');
SQL.Add('WHERE fc_date='''+strDebut+'''');
SQL.Add('ORDER BY fc_act_nom,fc_act_prenom,fc_id ');
// ShowMessage(SQL.Text);
// SQL.SaveToFile('C:\Facture.sql');
Open;
end; }
// 曾经发生过一种有趣现象,查询2013.02.18的数据,第一遍没有从表,第二遍有从表,第三遍出错
// 事后查明原因有2个,1是没有在FactureReport里引入ChequeDetail数据集,2是没有在DetailBand里选中ChequeDetail数据集
// 是否手动打开ADOChequeDetail没有关系
// ADOChequeDetail.Open;

frxExecute.PrepareReport;
frxExecute.ShowReport;

你可能感兴趣的:(port)