大家是如何處理如下主從表打印的呢﹖使用的什么控件﹖請教了﹗(100分)

  • 主题发起人 主题发起人 小師妹
  • 开始时间 开始时间

小師妹

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一個單据打印﹐要求如下﹐A,B,C,D顯示主表內容﹔E,F,G顯示從表內容。
E1..En是從表的n個記錄﹔請教阿。
_______________________
|A | B | C |
________________________
| D |
_______________________
|E1 | F1 | G1|
_______________________
|E2 | F2 | G2|
_______________________
|En | Fn | Gn|
_______________________
 
这个问题令狐大哥解决不了,你只有去问小林子了!说不定他的避邪剑谱上有
 
要是换了我,会说服客户改变单据的格式,不能让自己聪明的脑袋被客户“愚蠢”的脑袋蹩死。
相信你有这个能力,实在不行我能帮你啊
 
看看﹕  用户在使用数据库应用程序时经常要生成报表,利用Delphi 4的QReport 部件,可以帮助我们快速方便地生成报表。这里以一个设备管理报表为例说明如何用QReport部件与Query部件设计从多个数据表中生成报表。
一、 所用数据库
这里用到三个Foxpro资料表,DLBMK(设备大类编码)、SBXHK(设备型号及配置)、BMSBK(设备所在部门),存放在D:/SB目录下。其库结构如下:
(一) DLBMK
        字段名称  字段类型 解释
    1.   DLBH    N3   设备大类的编号
    2.   DLMC   C20   设备大类的名称

(二)SBXHK
字段名称 字段类型 解释
  1. XHBM   N3    设备型号的编码
  2. DLBH   N3    同DLBMK中的DLBH字段
  3. SBXH   C30    设备型号
  4. SBPZ   C30    设备配置
  5. SBSL   N3    设备数量
(三)BMSBK
   字段名称 字段类型 解释
  1. BMMC    C20    部门名称
  2. XHBM    N3    同SBXHK中的XHBM字段
  3. SL    N3    数量
利用这三个资料表,要生成一个只有计算机部有而其它部门没有的设备型号的情况。
二、 程序中的部件及属性
程序中有两个窗体:主窗体mainForm与报表窗体repForm。
主窗体mainForm中有两个TButton部件,设置如下:
部件 属性及属性值
PreviewBtn:TButton Caption:预览
PrintBtn: TButton Caption:打印报表窗体repForm中的部件及属性设置如下: 部件 属性及属性值
Query1: TQuery DatabaseName:d:/sb
Active: True
Qrep1: TQuickrep Dataset:query1
TitleBand1: TQRBand BandType:rbTitle
HeadBand1: TQRBand BandType:rbColumnHeader
DrawLeft : True
DrawRight : True
DrawTop : True
DrawBottom : True
DetailBand1: TQRBand BandType:rbDetail
DrawLeft : True
DrawRight : True
DrawTop : True
DrawBottom : True
ChildBand1: TQRChildBand ParentBand:DetailBand1
DrawLeft : True
DrawRight : True
DrawTop : True
DrawBottom : True
TitleLabel: TQRLabel Caption:设备统计表
DlmcLabel: TQRLabel Caption:类别
SbxhLabel: TQRLabel Caption:型号
SbpzLabel: TQRLabel Caption:配置
SbslLabel: TQRLabel Caption:数量
DlmcDBText: TQRDBText Dataset:Query1
Datafield: dlmc
SbxhDBText: TQRDBText Dataset:Query1
Datafield: sbxh
SbpzDBText: TQRDBText Dataset:Query1
Datafield: sbpz
SbslDBText: TQRDBtext Dataset:Query1
Datafield: sbsl
Shape1~9: TQRShape Shape:qrsVertline
Top:0
Width:1
Query1的SQL属性设置为:
select a.dlbh,a.dlmc,b.sbxh,b.sbpz,b.sbsl
from dlbmk a,sbxhk b
where a.dlbh=b.dlbh and b.xhbm not in
(select xhbm from bmsbk where trim(bmmc)< > ’计算机部’)
order by a.dlbh
设置几个TQRband部件的DrawLeft、DrawRight、DrawTop、DrawBottom属性值为True,是为了打印表格边框及横线。利用TQRShape部件,是为了打印出表格竖线。DlmcDBText放置在DetailBand1上,其它几个TQRDBText部件放置在ChildBand1上,Shape1~3放置在HeadBand1上,Shape4~6放置在DetailBand1上, Shape7~9放置在ChildBand1上。
三、 为程序增加代码
1.mainForm窗体中的两个按钮事件
procedure TmainForm.PreviewBtnClick(Sender : TObject)
begin
  repForm.Qrep1.Preview;
end;

procedure TmainFormPrintBtnClick(Sender : TObject)
begin
  repForm.Qrep1.Print;
end;

2.HeadBand1、DetailBand1及ChildBand1的BeforePrint事件
procedure TrepForm.HeadBand1BeforePrint(Sender : TQRCustomBand;  Var  PrintBand : Boolean)
begin
  Shape1.Height:=HeadBand1.Height;
  Shape2.Height:=HeadBand1.Height;
  Shape3.Height:=HeadBand1.Height;
end;

procedure TrepForm.DetailBand1BeforePrint(Sender : TQRCustomBand;  Var  PrintBand : Boolean)
begin
  PrintBand:=bh< > Query1[‘dlbh’];
  if  PrintBand then
  begin
   bh:=Query1[‘dlbh’];
   Shape4.Height:=DetailBand1.Height;
   Shape5.Height:=DetailBand1.Height;
   Shape6.Height:=DetailBand1.Height;
  end
end;

procedure TrepForm.ChildBand1BeforePrint(Sender : TQRCustomBand;  Var  PrintBand : Boolean)
begin
  Shape7.Height:=ChildBand1.Height;
  Shape8.Height:=ChildBand1.Height;
  Shape9.Height:=ChildBand1.Height;
end;

bh应在变量定义部分定义:
 Var  bh : shortint=0;
几个TQRShape部件的高度(Height)与所在TQRBand 部件保持一致,使竖线打印得整齐。如果在设计阶段调整了TQRBand部件的高度,也不会出现竖线断线或过长的情况。
在DetailBand1的BeforePrint事件中用PrintBand进行控制,可使每个设备大类名称只需打印一次,而不是每个型号都对应打印一次大类名称。因为dlbh字段的值都大于0,bh初值设为0使它与任一记录的dlbh字段的值都不同,以确保第一个大类名称被打印。这样就生成了一个从多个资料表中提取资料,并带有表格线的资料报表。
你把Query的SQL設置為﹕從表外連接主表﹔將主表來的字段放在DetailBand1上﹐從表字段放在SubDetailBand1上﹐然后寫事件﹕procedure TMainForm.DetailBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
PrintBand := s <> Qy.FieldByName(‘Field1’).AsString + //Field1是主表從表的共有主鍵
if PrintBand then
s := Qy.FieldByName('Rotbegin
').AsString;
end;
haha,add score to me!
 
这种样式的报表并不难啊,比这麻烦的多的我还做过呢。
就用Delphi带的QR吧,仔细看看.../Borland/Delphi5/Demos/Quickrpt自带的例子吧,应该有你需要的答案
 
用fastreport组件,用组合报表,三个独立报表,然后组合就可以拉。
 
在DetailBand里放若干个QrLabel(看你要打印的字段多少)
注意:QuickReport不要设置DataSet
在QuickReport的BeforePrint事件里,将主表,从表都打开。
在QuickReport的OnNeedData事件里写代码,先打印主表,然后打印从表:
MoreData:=not 从表.Eof;
if not 主表.Eof then
begin
Qrlabel1.Caption:=主表.FIeld1;
Qrlabel2.Caption:=主表.Fields;
.....
主表.Next;
end
else
if not 从表.Eof then
begin
Qrlabel1.Caption:=从表.FIeld1;
Qrlabel2.Caption:=从表.Fields;
......
从表.Next;

end;

 
做报表还是用FastReport吧,很好用的
 
有关报表的,请看看这个东东能否满足你的要求!
http://www.smartparter.com/download/ReportExpert20.zip
 
sorry, i give the score to GGs too late.
 
后退
顶部