动态报表问题!!(100分)

  • 主题发起人 主题发起人 笨猪
  • 开始时间 开始时间

笨猪

Unregistered / Unconfirmed
GUEST, unregistred user!
我想实现动态报表打印,即是将用户执行查询之后的结果进行报表打印!
该怎么做???
 
好像大部分的报表控件都支持查询吧?呵呵。。。
格式不太复杂的话,用EHLIB比较好。
 
比如一个GRID,里面反映出的是客户指定条件查询后的结果。你想要做的是,把GRID里经过查询后的记录,用客户规定的报表格式打印出来对吧?
这个是最简单的问题啊。报表指向的DATASET指定为GRID用到的QUERY就可以拉。
如果你说的问题,牵扯到报表里字段的动态更改,老兄,你要自己写点代码。
把问题说细点啊。
 
可以用动态创建报表,这是我自己的程序,你可以参考一下:
{
±¨±íÔ¤ÀÀºÍ´òÓ¡
}
procedure TfrmMain.PrintPriview(Print:Boolean);
var
aReport : TCustomQuickRep;
SomeFields: TStringList;
nIdx: integer;
//Title:String;
MyTable:TCustomADODataSet;
QrLabel:TQrLabel;
begin
// MyTable:=nil;
if CurrentForm=nil then
exit;
SomeFields := TStringList.Create;
MyTable:=TCustomAdoDataSet.Create(nil);
MyTable.Name:='MyTable';
for nIdx:=0 to CurrentForm.ComponentCount-1do
if CurrentForm.Components[nIdx] is TCustomADODataSet then
begin
if CurrentForm.Components[nIdx].Tag=0 then
begin
MyTable:=CurrentForm.Components[nIdx] as TCustomADODataSet;
MyTable.Name:=CurrentForm.Components[nIdx].Name;
break;
end;
end;
// Èç¹ûÊÇcubeÏÔʾ¸ñʽ£¬µ÷ÓñðµÄº¯Êý
for nIdx:=0 to CurrentForm.ComponentCount-1do
if CurrentForm.Components[nIdx] is TDecisionQuery then
begin
exit;
end;
//¸Ã´°ÌåÉÏûÓÐÊý¾Ý¼¶£¬Í˳ö
if MyTable.Name ='MyTable' then
Exit;
{
for nIdx:=0 to CurrentForm.ComponentCount-1do
if CurrentForm.Components[nIdx].Name='Panel1' then
begin
Title:=TPanel(CurrentForm.Components[nIdx]).Caption;
break;
end;
}
{
else
if CurrentForm.Components[nIdx] is TADOQuery then
begin
MyTable:=CurrentForm.Components[nIdx] as TADODataSet;
break;
end;
}
if MyTable=nil then
begin
SomeFields.Free;
exit;
end;
if MyTable.FieldCount=0 then
begin
SomeFields.Free;
exit;
end;

for nIdx := 0 to MyTable.FieldCount - 1do
begin
SomeFields.Add(MyTable.Fields[nIdx].FieldName);
//if (Fields[nIdx].DataType=ftBCD) or (Fields[nIdx].DataType=ftfloat) then
// TBCDField(Fields[nIdx]).DisplayFormat:='#,#0,00';
//ÉèÖÃ×ֶοí¶È
//if Length(Fields[nIdx].DisplayLabel)>Fields[nIdx].Size then
// Fields[nIdx].DisplayWidth:=Length(Fields[nIdx].DisplayLabel)
end;

areport := nil;

// ´´½¨±¨±í
QRCreateList(aReport, nil, MyTable,ReportTitle, SomeFields);
// ÉèÖÃÁÐ×ÖÌå
aReport.Bands.ColumnHeaderBand.Font.Style := [fsBold];

// Now adjust the spacing of the fields. There isn't any reason to
//do
this, this is just to show how to access the controls on the
// report.
// areport.Bands.ColumnHeaderBand.ControlCount
for nIdx := 0 to aReport.Bands.ColumnHeaderBand.ControlCount -1do
if aReport.Bands.ColumnHeaderBand.Controls[nIdx] is TQRPrintable then
with TQRPrintable(aReport.Bands.ColumnHeaderBand.Controls[nIdx])do
Left := Left - (5 * nIdx);
for nIdx := 0 to aReport.Bands.DetailBand.ControlCount -1do
if aReport.Bands.DetailBand.Controls[nIdx] is TQRPrintable then
with TQRPrintable(aReport.Bands.DetailBand.Controls[nIdx])do
Left := Left - (5 * nIdx);
for nIdx := 0 to aReport.Bands.ColumnHeaderBand.ControlCount -1do
if aReport.Bands.ColumnHeaderBand.Controls[nIdx] is TQRlabel then
TQRlabel(aReport.Bands.ColumnHeaderBand.Controls[nIdx]).Alignment:=taCenter;

for nIdx := 0 to aReport.Bands.DetailBand.ControlCount -1do
if aReport.Bands.DetailBand.Controls[nIdx] is TQRExpr then
TQRExpr(aReport.Bands.DetailBand.Controls[nIdx]).Alignment:=taCenter;
{ You can change the report objects before calling the report }
// areport.page.orientation := poLandscape;
{preview or print the report}
//·ù±êÌâ
if ReportTitle<>'' then
begin
QrLabel:=TQrlabel.Create(nil);
QrLabel.Parent:=aReport.Bands.TitleBand;
Qrlabel.Caption:=SmallTitle;
Qrlabel.AutoSize:=true;
Qrlabel.Left:=Round(aReport.Bands.TitleBand.Width/2-qrlabel.Width/2);
QrLabel.Top:=aReport.Bands.TitleBand.Controls[0].Top+aReport.Bands.TitleBand.Controls[0].Height+10;
QrLabel.Font:=aReport.Bands.ColumnHeaderBand.Font;
aReport.Bands.TitleBand.Height:=aReport.Bands.TitleBand.Controls[0].Height+qrlabel.Height+30;
end;
if Print then
Areport.print
else
Areport.Preview;
{ alldo
ne, free the objects }
aReport.Free;
SomeFields.Free;
end;
 
你好!我做有类似的控件,DEMO可以到http://www.efile.com.cn上用dfw@133780搜索就可以看到
 
问题不太明确,简单的办法是用第三方控件如:dxgrid和printsystem控件直接打印表格,复杂的是动态画如fastreport的全部内容甚至包括每一条线,要写好多代码哦!
或者是固定字段的打印,那就什么都好说了,报表直接联上数据源就搞定了,我有些原码感兴趣mail我:beforeready@163.com
 
后退
顶部