F
filter
Unregistered / Unconfirmed
GUEST, unregistred user!
一个报表的字段来源于另一个数据表的记录(记录是可由用户增加删除的)例:tzcmcb中记录为
dmmc
电脑
办公桌
椅子
生成报表TEMP为科室 电脑 办公桌 椅子
zc 1 2 3
dd 2 3 4
现已用存储过程动态生成临时表temp,
现要根据TEMP生成REPORT,但生成时出错。源代码如下:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, QuickRpt, Db, DBTables,QRCTRLS;
type
TForm2 = class(TForm)
QuickRep1: TQuickRep;
DetailBand1: TQRBand;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
QRLabel: array of TQRLabel;
QRShape: array of TQRShape;
QRDBText:array of TQRDBText;
k: integer;
implementation
uses main;
{$R *.DFM}
procedure TForm2.FormDestroy(Sender: TObject);
var
i:integer;
begin
for i:=0 to k-1 do
//k为tzcmcb中的记录数,记录数数量=已创建的控件数量
begin
qrlabel.Destroy;
QRShape.Destroy;
QRDBText.Destroy;
end;
end;
procedure TForm2.FormCreate(Sender: TObject);
var
i,j: integer;
begin
with Form1.Query2 do
//确定报表中字段的数目
begin
close;
sql.clear;
sql.add('select * from tzcmcb');
try
open;
k:=recordcount;
except
application.MessageBox ('数据库连接超时!','警告',mb_ok+mb_iconerror);
end;
end;
with Form1.query3 do
//激活临时表,准备显示记录,临时表的字段名就是 tzcmcb中dmmc字段的记录
begin
close;
sql.clear;
sql.add('select * from temp');
try
open;
except
application.MessageBox ('数据库连接超时!','警告',mb_ok+mb_iconerror);
end;
end;
SetLength(QRLabel,k-1);
//设置动态数组长度
SetLength(QRShape,k-1);
SetLength(QRDBText,k-1);
xzjlst:=1;
for i:=0 to k-1 do
begin
QRShape:=TQRShape.Create(self);
with QRShape do
begin
Parent:=DetailBand1;
Left:=i*92;
Top:=i*24;
Height:=25;
Width:=93;
Enabled:=True;
Visible:=True;
end;
QRLabel:=TQRLabel.Create(self);
with QRLabel do
begin
Parent:=DetailBand1;
Left:=i*60+60;
Top:=100;
Height:=100;
Width:=90;
Alignment:=TaCenter;
AutoSize:=True;
Caption:='';
Enabled:=True;
Visible:=True;
end;
QRDBText:=TQRDBText.Create(self);
with QRDBText do
begin
Parent:=DetailBand1;
Left:=i*60+60;
Top:=200;
Height:=50;
Width:=90;
Alignment:=TaCenter;
AutoSize:=True;
//Caption:='';
Enabled:=True;
Visible:=True;
end;
end;
Form1.query2.first;
i:=0;
while not Form1.query2.eof do
//确定动态创建的QRLABEL名及字段名
begin
QRLabel.Caption:=Form1.query2.fieldbyname('dmmc').asstring;
QRDBText.DataSet:=Form1.query3;
QRDBText.DataField:=Form1.query2.fieldbyname('dmmc').asstring;
i:=i+1;
Form1.query2.next;
end;
end;
end.
问题1:显示仅能显于一条记录,其余记录未见。且预览关闭时,报'INVALID POINTER OPERATION' 出错?
问题2:由于TEMP是动态的,可能字段会很长很长,采用每增加一个字段即增加quickrep的width,虽然可以解决,但对一用户来说是
不方便的(只有竖向打印),能不能做成每八个字段打印一页,随字段的多少/8来创建多个quickrep.
头晕!如何解决呢
问题3:如不用quickreport,而采用fastreport时,上面有frPRINTGRID可根据DBGRID的的显示来自动调整页,但觉得不是很美观,且一些属性无法调整(另:fastreport中,怎么我用frReport1.Preview一预览就报错)
希望只用quickreport,请大侠们最好能给出源代码。
dmmc
电脑
办公桌
椅子
生成报表TEMP为科室 电脑 办公桌 椅子
zc 1 2 3
dd 2 3 4
现已用存储过程动态生成临时表temp,
现要根据TEMP生成REPORT,但生成时出错。源代码如下:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, QuickRpt, Db, DBTables,QRCTRLS;
type
TForm2 = class(TForm)
QuickRep1: TQuickRep;
DetailBand1: TQRBand;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
QRLabel: array of TQRLabel;
QRShape: array of TQRShape;
QRDBText:array of TQRDBText;
k: integer;
implementation
uses main;
{$R *.DFM}
procedure TForm2.FormDestroy(Sender: TObject);
var
i:integer;
begin
for i:=0 to k-1 do
//k为tzcmcb中的记录数,记录数数量=已创建的控件数量
begin
qrlabel.Destroy;
QRShape.Destroy;
QRDBText.Destroy;
end;
end;
procedure TForm2.FormCreate(Sender: TObject);
var
i,j: integer;
begin
with Form1.Query2 do
//确定报表中字段的数目
begin
close;
sql.clear;
sql.add('select * from tzcmcb');
try
open;
k:=recordcount;
except
application.MessageBox ('数据库连接超时!','警告',mb_ok+mb_iconerror);
end;
end;
with Form1.query3 do
//激活临时表,准备显示记录,临时表的字段名就是 tzcmcb中dmmc字段的记录
begin
close;
sql.clear;
sql.add('select * from temp');
try
open;
except
application.MessageBox ('数据库连接超时!','警告',mb_ok+mb_iconerror);
end;
end;
SetLength(QRLabel,k-1);
//设置动态数组长度
SetLength(QRShape,k-1);
SetLength(QRDBText,k-1);
xzjlst:=1;
for i:=0 to k-1 do
begin
QRShape:=TQRShape.Create(self);
with QRShape do
begin
Parent:=DetailBand1;
Left:=i*92;
Top:=i*24;
Height:=25;
Width:=93;
Enabled:=True;
Visible:=True;
end;
QRLabel:=TQRLabel.Create(self);
with QRLabel do
begin
Parent:=DetailBand1;
Left:=i*60+60;
Top:=100;
Height:=100;
Width:=90;
Alignment:=TaCenter;
AutoSize:=True;
Caption:='';
Enabled:=True;
Visible:=True;
end;
QRDBText:=TQRDBText.Create(self);
with QRDBText do
begin
Parent:=DetailBand1;
Left:=i*60+60;
Top:=200;
Height:=50;
Width:=90;
Alignment:=TaCenter;
AutoSize:=True;
//Caption:='';
Enabled:=True;
Visible:=True;
end;
end;
Form1.query2.first;
i:=0;
while not Form1.query2.eof do
//确定动态创建的QRLABEL名及字段名
begin
QRLabel.Caption:=Form1.query2.fieldbyname('dmmc').asstring;
QRDBText.DataSet:=Form1.query3;
QRDBText.DataField:=Form1.query2.fieldbyname('dmmc').asstring;
i:=i+1;
Form1.query2.next;
end;
end;
end.
问题1:显示仅能显于一条记录,其余记录未见。且预览关闭时,报'INVALID POINTER OPERATION' 出错?
问题2:由于TEMP是动态的,可能字段会很长很长,采用每增加一个字段即增加quickrep的width,虽然可以解决,但对一用户来说是
不方便的(只有竖向打印),能不能做成每八个字段打印一页,随字段的多少/8来创建多个quickrep.
头晕!如何解决呢
问题3:如不用quickreport,而采用fastreport时,上面有frPRINTGRID可根据DBGRID的的显示来自动调整页,但觉得不是很美观,且一些属性无法调整(另:fastreport中,怎么我用frReport1.Preview一预览就报错)
希望只用quickreport,请大侠们最好能给出源代码。