quickreport的多表打印,急急急。。。(200分)

  • 主题发起人 主题发起人 litte wing
  • 开始时间 开始时间
L

litte wing

Unregistered / Unconfirmed
GUEST, unregistred user!
各位quickreport高手:小第近日遇到一打印问题,苦思数日,不得其解,敬请赐教:
有四个表:
1.KMB.DB(科目表)
字段:kmdm(科目代码),kmmc(科目名称)
记录:
kmdm kmmc
NO.1 01 英语
NO.2 02 数学
NO.3 03 语文
...
NO.40 04 化学
2.XSB.DB(学生表)
字段:zch(注册号),xm(姓名),zydm(专业代码)
记录:
zch xm zydm
NO.1 121 张三 01
NO.2 122 李四 01
NO.3 123 王五 02
...
NO.n 124 王二 03
3.CJB.DB(成绩表)
字段:zch(注册号),zydm(专业代码),kmdm(科目代码),kmcj(科目成绩)
记录:
zch zydm kmdm kmcj
NO.1 121 01 01 85
NO.2 121 01 02 70
NO.3 121 01 03 65
NO.4 122 01 01 95
NO.5 122 01 02 85
NO.6 122 01 03 65
...

4.ZYKMB.DB(专业科目表)
字段:zydm(专业代码),kmdm(科目代码)
记录:
zydm kmdm
NO.1 01 01
NO.2 01 02
NO.3 02 01
NO.4 02 02
NO.5 03 03
NO.6 03 04
...
希望能打印出以下效果:
1.在Title Band中根据zydm从ZYKMB.DB中的kmdm将KMB.DB中的kcmc查找出来,并横向将所有
kcmc打印出来;
2.在detail band中根据zydm将XSB.DB中的zch,xm和CJB.DB中对应zch和Title band中对应
顺序的kmcj答应出来.如下所示:
_____________________________
|注 | 英 | 数 | 化 |
|册 | 语 | 学 | 学 |...
|号 | | | |
|__ |______|_______|______|____
|121| 85 | 70 | 65 |...
|122| 95 | 85 | 60 |...
.... ...
 

看来你使用的是fox或dbase,只有在程序中动态建立TQRLabel和TQRDBText控件实现,
先设置好一个,动态生成TQRLabel和TQRDBText的Width、Height等属性用已经存在的设置,

var aLabel : TQRLabel;
aList : TList;
i : integer;
Label1.Caption := '注册码';
next;
i := 1;
with KMBdo
begin
first;
while not eofdo
begin
//设置TitleBand代码
aLabel := TQRLabel.Create(self);
with aLabeldo
begin
Left := i * Label1.Width + label1.Left;
Top := Label1.Top;
Width := Label1.Width;
Height := Label1.Height;
Parent := TitleBand1;
// set other property
Caption := FieldByName('kmmc').asstring;
//如果要纵向显示,自己加入代码调整, 很容易
end;
//设置DetialBand代码
aLabel := TQRLabel.Create(self);
with aLabeldo
begin
Left := i * Label1.Width + label1.Left;
Top := Label1.Top;
Width := Label1.Width;
Height := Label1.Height;
Parent := DetialBand1;
// set other property
Caption := '';
end;
aList.add(alabel);
i := i + 1;
next;
end
end;

//设置DetialBand 内容
// QuickRep, QRDBText 的DataSet 置为 XSB.DB, QRDBText.DataField 置为zch(注册号),
// 现在,调用Print可以打印出表头和注册号
// 实现成绩的打印
procedure form1.DetailBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
CJB.Filtered := True;
i := 0;
with KMBdo
begin
first;
while not eofdo
begin
CJB.Filter := format('(zch=%d) and (kmdm = %d)', [XSBzch.value, KMBkmdm.Value]);
with TQRLabel(aList.Items)do
if CJB.recordcount > 0 then
Caption := CJBkmcj.asstring
else
Caption := '';
next;
i := i + 1
end;
end;
end;
 
感谢slicker的回复,看了代码,其中如何保证各科成绩相互对应而不出错,请明示(主要困惑的
问题之一).
 
大虾slicker,在代码中未用到TQRDBText?
 
大虾slicker,
CJB.Filter := format('(zch=%d) and (kmdm = %d)', [XSBzch.value, KMBkmdm.Value]);
该语句的具体含义及用法?
zch=%d //表示什么意思?
XSBzch.value//表示什么意思? 具体语法是这样吗?
 
我认为在你的数据定义中已经实现了,
1.KMB.DB(科目表)=kmdm(科目代码) + kmmc(科目名称)
2.XSB.DB(学生表)=zch(注册号)+xm(姓名)+zydm(专业代码)
4.ZYKMB.DB(专业科目表)=zydm(专业代码)+kmdm(科目代码) !
3.CJB.DB(成绩表)=zch(注册号)+zydm(专业代码)+kmdm(科目代码)+kmcj(科目成绩) !
obviously:
in KMB, kmdm is the Key
in XSB, zch is the Key, no duplicate zch is allowed
in ZYKMB, zydm is the Key, no duplicate km is allowed in one zy
so in CJB, the key is zch+zydm+kmdm
//
CJB.Filter := format('(zch=%d) and (kmdm = %d)', [XSBzch.value, KMBkmdm.Value]);
CJB.Filtered := True;
//
that is means, set the CJB key,
and I use the natural turn in KMB, if you did not change the IndexField or IndexName of
KMB, the turn will not changed. however, if you want to use the key, use an array to
record the kmdm and to locate in KMB
 
i use you table name in DB as TTable name in Delphi, and if U defined
the TField, you can use XSBzch.Value or XSBzch.asinteger to get the field
value, it U did not define the TField, you can use XSB.FieldByName('zch').asinteger
function format like sprintf in C/C++;
see delphi help,
 
>>如何保证各科成绩相互对应而不出错,请明示(主要困惑的问题之一).
用主Query选出最基本的数据,其它的数据全用LookUp.
运行时先open lookup的Query.
 
i have already receive the help,Let me try it.THX.
 
既然问题解决了,还是结束了吧。
 
后退
顶部