如何控制分栏打印报表中每一栏记录的数目(100分)

  • 主题发起人 主题发起人 南宫慕容
  • 开始时间 开始时间

南宫慕容

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个这样的报表:
|科室名称||科室名称||科室名称||科室名称||科室名称|
|********||********||********||********||********|
|********||********||********||********||********|
|********||********||********||********||********|
|********||********||********||********||********|
|********||********||********||********||********|
|********||********||********||********||********|
大概有4、5十个科室,每一个科室多对应的记录数目是一样的
其中“科室名称”和它们对应记录的记录不在同一个表中,
所以只能用主--明细表实现。打印用的纸是那种有孔的那种(
比A4还大,比B3小一些),为了达到节省纸张的目的,用了分
栏打印,每一页分成5栏,请问:如何控制每一栏打印完固定
记录后,自动换一栏(不换页)?
 
在报表设计中应该有按某条件分栏的功能吧
 
yth:
我用的是Delphi5里的QuickRep,在设计分栏时好像没发现你说的那个功能,
你能说的具体点吗?
 
我的程序中的代码,没有得及整理,送给你:
procedure TForm3.QuickRep1BeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
begin
form1.table1.First;
end;

procedure TForm3.QuickRep1NeedData(Sender: TObject;
var MoreData: Boolean);
begin
moredata:=true;
if not form1.table1.eof then
begin
//24---29为显示数据标签
qrlabel24.caption:=form1.table1.fieldbyname('yjhm').asstring;
qrlabel27.caption:=form1.table1.fieldbyname('yjhm').asstring;
form1.table1.next;
end;
if form1.table1.eof then
moredata:=false;
end;
 

我想实现的是这样的报表:
| A科室 || B科室 || C科室 || D科室 || E科室 |
|********||********||********||********||********|
|********||********||********||********||********|
|********||********||********||********|
|********||********||********||********|
|********||********||********|
|********||********|
myyzg:你的方法好像行不通。
由于时间的紧迫,小弟我采用了一个苯办法:建了一个临时表,把这些数据存储到这个临时
表中,再把QuickRep的DateSet设成这个临时表,用preview,观察结果,如果某一栏的数据
没有填满,就用空记录填满。这样就形成了一个这样的报表:
| A科室 || B科室 || C科室 || D科室 || E科室 |
|********||********||********||********||********|
|********||********||********||********||********|
|********||********||********||********|| |
|********||********||********||********|| |
|********||********||********|| || |
| ||********||********|| || |
还好没有被一棒否决,不过感觉比较别扭,希望大家继续给点意见,分不够可以再加!
 
现将资料附上:
  在很多有关Delphi的书籍中,都没有讲解如何实现一个打印项的多栏打印,而现实生活中往往有许多报表要求同一项目多栏打印。QuickReport提供了报表打印一整套完整的解决方案,完全可以实现同一项目的多栏打印。
  如果在Treport的DataSet属性中选定一个Table,那么QuickReport每次打印详细列表(BandType=rbDetail)属性的TQRBand时,系统会自动取出一个记录供打印,并将表中的记录指针移到下一位,这样程序无法控制表中记录指针的移动,就无法实现多栏打印。因此,只要程序不在Treport的DataSet属性选定任何表, QuickReport便不会控制表记录的提取。
  QuickReport特为其它类型数据打印提供了一个OnNeedData事件,QuickReport每次打印详细列表属性的TQRBand时,会触发这个事件,要求提供打印数据,如果程序在OnNeedData事件中编写运用表中数据提供打印资料,便能实现多栏打印。现例举实现一个Table1中Name项两栏打印的方法。
  1.在窗口上放TquickReport组件
  quickReport1,并在上面放Tband组件band1,将其BandType属性改为Detail。然后在Tband组件上并排放两个QRLabel组件QRLabel1和QRLabel2,并在quickReport1的OnNeedData事件中写如下代码:
  procedure TForm1.QuickRep1NeedData(Sender: TObject;
var MoreData: Boolean);

  var
   I: integer;

  begin

   MoreData := True;

   for I:= 1 to 2do

   begin

    if Table1.Eof then
Break;

    case I of
     1: QRLabel1.Caption := Table1.FieldByName(′Name′).AsString;

     2: QRLabel2.Caption := Table1.FieldByName(′Name′).AsString;

    end;

    Table1.Next;

   end;

   if Table1.Eof then
MoreData := False;

  end;

  2. 为了保证打印或者打印预览开始时Table1指针在第一条记录,在quickReport1的BeforePrint事件中写如下代码:
  procedure TForm1.QuickRep1BeforePrint(Sender: TCustomQuickRep;

   var PrintReport: Boolean);

  begin

   Table1.First;

  end;

  这样,程序调用QuickRep1.Preview或者QuickRep1.Print便能预览或者打印到一个关于Name的从左至右、从上到下的多栏报表。
 
myyzg:
这不失为一个解决办法,但是我的报表是主-明细表,但我想要在一张纸上打印6栏,
难道我要添加6个SQL控件吗?况且如果控件太多的话,会不会影响速度呢?
 
当然不会,我的程序中LABEL更多,加上表头,表尾等有几十个,速度你可测试。
 
已经解决问题,非常感谢myyzg的帮助
 

Similar threads

D
回复
0
查看
930
DelphiTeacher的专栏
D
D
回复
0
查看
871
DelphiTeacher的专栏
D
D
回复
0
查看
945
DelphiTeacher的专栏
D
后退
顶部