不用DataSet怎么做QuickReport报表?(88分)

  • 主题发起人 主题发起人 四四方方
  • 开始时间 开始时间

四四方方

Unregistered / Unconfirmed
GUEST, unregistred user!
我正做一个程序,想把数据库和界面完全分离,报表也就不能直接
和DataSet连接了,怎么办?急死我也~!
请各位大侠拔刀相助,在下不胜感激(初来乍到,银钱不多,请各位
多多包涵)!
 
这 是不可能的,即使是动态生成,也还是要用DataSet. 下面的建议供参考:
1 设计时先使用某个dataset, 设计好后,断开。在运行时再对报表的数据源属性进行设置。
但数据库表字段要和设计的格式对应好。
2 或者完全自己编程实现,只要字段不多,宽度不超的话,也不难。
 
这 不是不可能的
建议你看看报表的OnNeedData事件的用法。
 
liuly :
我仍坚持我的观点:还是要用DataSet。因用户的数据来自 数据库。
如果只从报表打印的要求来看,可以不要DataSet,除了在OnNeedData事件提供数据外,
对于单页报表也可以用表达式提供数据。希望能与你继续探讨。
 
我看了OnNeedData事件,试了一试还可以,VGA老兄的意见不错,可是
依我现在的设计,必须脱离DataSet,所以我需要OnNeedData事件了。初次
做关于报表的程序,希望VGA和Liuly老兄在动态创建报表控件,分组等方面
多多指点。(大家讨论提高是目的,分数是小事儿,这88分过会儿再分,希
望各位理解)
 
分数虽然不多,确是吉祥数字。
你是说数据库是变化的,不确定的,但仍可以使用DataSet与数据库表相连.
只不过需要动态调整DataSet的有关属性。(databasename, tablename/query的sql.text))
(调整前先关闭表/quer).
在预览/打印报表前为报表的相关字段赋值。
另一种变通的方法是用一个固定的表,每次打印报表前,将要打印的表数据复制到该表即可。
上面两个方法系我个人的观点,不知是否能对你有所帮助。我也希望Liuly老兄及其他富翁
继续参与讨论。
 
我现在是分层开发,界面表示层根本就不允许见到数据库组件,只能
通过其他方法传过来一些数据灌到Report中。所以无法使用DataSet组件。
各位富翁能不能给我一些通过使用OnNeedData事件抽象出做非数据库的
QReport的通用方法的建议?
 
我现在是分层开发,界面表示层根本就不允许见到数据库组件,只能
通过其他方法传过来一些数据灌到Report中。所以无法使用DataSet组件。
各位富翁能不能给我一些通过使用OnNeedData事件抽象出做非数据库的
QReport的通用方法的建议?
 
你的数据是用数组、文件、全局结构变量传给报表?
procedure TfrmNeedData.FormCreate(Sender: TObject);
var
i: integer;
begin
SomeList := TStringlist.Create;
for i := 0 to 500do
SomeList.Add('Line ' + IntToStr(i));
end;
procedure TfrmNeedData.QuickRep1BeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
begin
CurrentIndex := 0;
end;

procedure TfrmNeedData.QuickRep1NeedData(Sender: TObject;
var MoreData: Boolean);
begin
// If MoreData is true, then
QuickReport will print
// another detail band. When you set it to false,
// the report isdo
ne.
MoreData := (CurrentIndex < SomeList.Count);
if MoreData then
begin
QRLabel1.Caption := SomeList[CurrentIndex];
// Here's how to set the progress bar
QuickRep1.QRPrinter.Progress := (Longint(CurrentIndex) * 100) div SomeList.Count;
end
else
QuickRep1.QRPrinter.Progress := 100;
Inc(CurrentIndex);
end;

此例 的数据赋值: QRLabel1.Caption := SomeList[CurrentIndex];
数据来源:SomeList[CurrentIndex];
判断数据处理结束 :MoreData := (CurrentIndex < SomeList.Count);
按你的意思: QRLabel1的个数可能不固定,宽度也未知,只能态调整。
 
我也用过OnNeedData事件,效果也可以,可是在这个事件中能不能
解决分组的问题呢?
顺便问一句:怎么在OnNeedData事件中强制换页?
(VGA老兄,我这里网络不稳定,不能及时对你的解答作出回应,请多多
包涵)
欢迎大家积极参与讨论,把打印讨论个彻彻底底!
 
多人接受答案了。
 
后退
顶部