FastReport的主从表怎么做(100分)

  • 主题发起人 主题发起人 stoneking
  • 开始时间 开始时间
S

stoneking

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个表,里面有一个字段叫partId是用来分章的,我现在做的报表是要分章打印,请问这个报表如何用FastReport做。
格式如下:
第一章
属于第一章的所有节
第二章
属于第三章的所有节
........
我现在用了frReport控件一个,frDBdataset两个,query两个,一个query对一个frDBDataset.
主表可以很顺地打印出来,问题的关键在怎么动态地查询章下的记录。
请帮忙!
 
怎么搞的,七八个人看了,没一个回答
那我再问一个问题,请问FastReport分组是怎么实现的
 
看看demo吧.
一下說不清楚的.
 
主从表:在Band(MasterData)上加frSubReport,然后在SubReport里
加Band(MasterBand)连接从表数据
分组:加一个Band(GroupHeader),填分组条件
 
主从表 也可以主表用MasterData,从表用DetailBand,
连接相应的MasterQuery和DetailQuery
 
为什么不看demo,这样的问题很难用语言描述!
 
demo怎么发各位?
 
可以在 Band(MasterData) 的打印前代码来动态查询 明细 query 的
 
在Band的事件中处理,章结束时分页就可以了
 
我后来发现是要先分组,再明细。
分组方法基本学会,就是一个分组头(TfrGroupHeader):
分组条件可以用字段,如按ItemId分组我就填数据集的.ItemId字段
一个主数据项(TfrMasterDataset),在上面放想要的字段。
明细呢,看了两个demo,发现那是用table实现的,在里面设置表的indexfields
,我要用的是query,主表是会的,就是从表的动态查询问题还不太清楚。
...
masterquery.sql.add('select * from tbMaster')
...
...
detailQuery.sql.add('select * from tbDetail where ItemId=:ItemId')
DetailQuery.ParamByName('ItemId').AsInteger :=
MasterQuery.FieldValues['ItemId'];
...
我是在设置报表前查询的,不知道为什么出来的,总是主表某一条记录下的所以细项,就是说不会主表到了下一条,然后从表再查询的情况。
 
......
到底好了没有?
 
没好!
明细中从表查询还没做好。
真奇怪:
DetailQuery.Close;
lb1: DetailQuery.SQL.Text := 'select * from Subprj where MarkId=2';
DetailQuery.Prepare;
DetailQuery.Open;
像上面一样是可以读到静数据的,当我把lb1行换成
DetailQuery.SQL.Text := 'select * from Subprj where MarkId=:MarkId';
DetailQuery.ParamByName('MarkId').AsInteger := MasterQuery.FieldValues['MarkId'];
就打印完全不对,真奇怪,可好像就是这样做的呀。请高手指点,这个完了,马上发分!
 
做个例子给你,怎么给???
 
谢谢,请发到stoneking@classme.net
到时一定给你分。
 
1、你的demo没有数据库,
2、然后我的fr跟你的版本可能不一样,打不开你的frf文件
3、再则我看不一定有用,你的两个好像没什么关系吧,我要的明细表是两个表有一个共同的字段相关:ItemId
 
看看我代码,看看有什么问题吧:
QueryStr := 'MasterQuery';
MasterQuery.Close;
MasterQuery.SQL.Text := 'select * from prj';//prj和subPrj表中共有一个MarkId字段
MasterQuery.Prepare;
MasterQuery.Open;

//建立了明细表中的主表条,主数据项---------------
curY:=100;
CellHeight:=36;
curX := Page.pgMargins.Left;
curY := CurY + cellheight + 5;
pagew := Page.PrnInfo.Pgw;
pageh := Page.PrnInfo.Pgh;
prnpagew := pagew - Page.pgMargins.Right - Page.pgMargins.Left;
prnpageh := pageh - Page.pgMargins.Bottom - Page.pgMargins.Top;

b := TfrBandView.Create;
// create MasterData band
b.SetBounds(curX, curY, prnpagew, cellheight);
b.BandType := btMasterData;
b.Dataset := 'frDBMasterDataSet';
// band's dataset
b.Name := 'MasterData';
b.Prop['Stretched'] := true;
Page.Objects.Add(b);
/// 主要数据内容
// create data field
For i := 1 To 5do
begin
v := TfrMemoView.Create;
cellwidth := 60;
v.SetBounds(curX, CurY, cellwidth, cellheight);
CurX := CurX + cellwidth;
v.Memo.Add(ColumnStr);//这里放主表中的数据,columnStr格式如:'[MasterQuery."字段名"]';
//SetMemoView(v);//一个设置样式的函数,
v.FillColor:=clSilver;
Page.Objects.Add(v);
end;


//---------下面是设置从表---细数据项-----------
QueryStr := 'DetailQuery';
DetailQuery.Close;
DetailQuery.SQL.Text := 'select * from Subprj where MarkId=:MarkId';
DetailQuery.ParamByName('MarkId').AsInteger := MasterQuery.FieldValues['MarkId'];
DetailQuery.Prepare;
DetailQuery.Open;
//这里添加每一条主表的细项
curX := Page.pgMargins.Left;
CurY := CurY + CellHeight+5;
b := TfrBandView.Create;
// create MasterData band
b.BandType := btDetailData;
b.Dataset := 'frDBDetailDataSet';
// band's dataset
b.Name := 'DetailBand';
b.Prop['Stretched'] := true;
b.SetBounds(curX, curY, prnpagew, cellheight);
Page.Objects.Add(b);

/// 主要数据内容
// create data field
For i := 1 To 5do
begin
v := TfrMemoView.Create;
cellwidth := 60;
v.SetBounds(curX, CurY, cellwidth, cellheight);
CurX := CurX + cellwidth;
v.Memo.Add(ColumnStr);//这里放主表中的数据,columnStr格式如:'[MasterQuery."字段名"]';
//SetMemoView(v);
v.FillColor:=clSilver;
Page.Objects.Add(v);
end;


frReport1.ShowReport;//打印预览
 
呵呵,经历stoneHuang指点,终于发现问题所在:
fr中主从表时,主表要打开,而从表不能打开,才会态地查询。
就是把
DetailQuery.Prepare;
DetailQuery.Open;
这两行删除就一切OK了
散分
 
后退
顶部