100分求肋,有点难度的报表(100分)

  • 主题发起人 主题发起人 caohaodelphi
  • 开始时间 开始时间
C

caohaodelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库表中有款号,数量,员工姓名等字段,经过统计后
要生成如下报表:
姓名 | 款号1 | 款号2 |................ | 款号n |
这是填写姓名 | 款1的数量 | 款2的数量 | |款n的数量|
有多少种款号是不确定的,该怎样设计此报表,怎样实现,最好写出代码




 
可以通过查询数据库,动态的生成DBGRIDE中的列,及其列中的值。
 
但是可能有1000种款号怎样分页,怎样通过查询数据库,具体点可以吗?
 
先把DBGRIDE中所包括的所有列查询出来,我把它形成临时表,只是为了表现出列。
再根据这些列把相应的数据从原始表中取出数据,添到里面。
 
创建临时表中的款1,款2...款3字段(也就是原表中的款号值),怎样创建,可能是1000个字段呀!报表又怎样控制分页呢?
 
如果你想把列来横着打的话,只要横着能排开,换页的事不用管。
我说的那种情况是每个款号做为一条记录在表中出现的。
用语句创建表,当然有多少列也不一定,那就把所有的列查询出来设循环。
 
报表要这样排:
姓名 | 款号1 | 款号2 |................ | 款号n |
这是填写姓名 | 款1的数量 | 款2的数量 | |款n的数量|
并不是每个款号做为一条记录在表中出现的,而是作为临时表中的字段了
 
比如(只是打个比方,这些数字完全是灵活的):
每行只能显示10个款号!你有100个款号!
那么你就建立10个临时表(当然也可以用别的方法,只要把数据取出来就可以)
第一个临时表的字段为款1,款2...款10;
第二个临时表的字段为款11,款12...款20;
...
这样显示第一页时,用临时表1,
显示第二页是,用临时表2
...
十次一个循环!
 
1000个字段!!
我曾经听别人说过,不过那字段数目是很少的,在这种情况下,一个人的信息可能要打印在不同的页上,每页都需要姓名信息,在这种情况下要使用程序控制打印过程,(页码应该自己控制,一个人的所有信息所在的页应该在同一页码上).
1.首先得到所有要打印的列名.各列的数据类型是相同的.
2.确定在一页纸内可以打印多少列,记为ColsPerPage,一个人的信息最多占几页n
3,设计一个能够打印ColsPerPage的报表.
4.建立n个临时表,表的结构是相同的,如下
姓名|帐号a|帐号b|...|帐号ColsPerPage
5.按照第一步所得到的列名按次序填充建立的临时表.
6.然后就可以打印了,每换一页,就换下一个表,到n个后,就可以再从第一个继续打印.注意打印时的页码.
以上也是听别人说的,我整理了一下,没有完整实现,仅供参考.
 
star.yu:
显示第一页时,用临时表1,
显示第二页是,用临时表2
好控制吗?
 
select 姓名,sum(款号1),sum(款号2),...,sum(款号n)
from 表名
where 条件
group by 姓名
 
star.yu的意思我明白了
或许是个办法
 
star.yu:
显示第一页时,用临时表1,
显示第二页是,用临时表2
怎样控制呀?
 
好控制,
你可以加一个PAGEFOOTER,
每次打印它的时候,你改变REPORT的DATASOURCE
 
你可以加一个PAGEFOOTER,
每次打印它的时候,你改变REPORT的DATASOURCE .
不懂
 
在FastReport里:
1、确定每一页打多少列。
2、作一个模板,设置好头、尾、数据源等,每一列的Memo用数字编号如Style1、Style2...
3、打印是先LoadFrom载入模板。
4、for n := 1 to DataSet.FieldCount - 1do
begin
找到Style(n).
设置Style(n)的列名
如果n 大于每一页的列数,创建一个新Page,还是从模板导,然后列的位置又要从1开始。
end
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, ADODB, Grids, DBGrids, QuickRpt, QRCtrls, ExtCtrls;
type
TForm1 = class(TForm)
ADODataSet1: TADODataSet;
Button1: TButton;
ADODataSet2: TADODataSet;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
DataSource1: TDataSource;
DataSource2: TDataSource;
QuickRep1: TQuickRep;
DetailBand1: TQRBand;
QRSubDetail1: TQRSubDetail;
QRDBText1: TQRDBText;
QRDBText2: TQRDBText;
QRLabel1: TQRLabel;
QRDBText3: TQRDBText;
QRDBText4: TQRDBText;
QRDBText5: TQRDBText;
QRDBText6: TQRDBText;
procedure ADODataSet1AfterScroll(DataSet: TDataSet);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure QRDBText1Print(sender: TObject;
var Value: string);
procedure QRLabel1Print(sender: TObject;
var Value: string);
procedure QRDBText3Print(sender: TObject;
var Value: string);
procedure QRDBText6Print(sender: TObject;
var Value: String);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ADODataSet1AfterScroll(DataSet: TDataSet);
begin
ADODataSet2.Filtered := false;
ADODataSet2.Filter := 'A=''' + DataSet.FieldByName('A').AsString + '''';
ADODataSet2.Filtered := true;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i, j, m: integer;
begin

ADODataSet2.AfterScroll := nil;
ADODataSet1.FieldDefs.Clear;
ADODataSet1.FieldDefs.Add('A', ftstring, 20, false);
ADODataSet1.CreateDataSet;
ADODataSet1.Open;
ADODataSet1.Append;
for i := 1 to 3do
begin
ADODataSet1.Append;
ADODataSet1.Fields[0].AsString := format('%d', );
end;
ADODataSet1.Post;
ADODataSet1.First;
ADODataSet2.FieldDefs.Clear;
ADODataSet2.FieldDefs.Add('A', ftstring, 20, false);
ADODataSet2.FieldDefs.Add('B', ftstring, 20, false);
ADODataSet2.CreateDataSet;
ADODataSet2.Open;
ADODataSet2.Append;
for m := 1 to 3do
for i := 1 to 3 * Mdo
begin
ADODataSet2.Append;
ADODataSet2.Fields[0].AsString := format('%d', [m]);
ADODataSet2.Fields[1].AsString := format('%d_%d', [m, i]);
end;
ADODataSet2.Post;
ADODataSet2.First;
ADODataSet1.AfterScroll := ADODataSet1AfterScroll;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
QuickRep1.Preview;
end;

procedure TForm1.QRDBText1Print(sender: TObject;
var Value: string);
begin
QRLabel1.Caption := Value;
end;

procedure TForm1.QRLabel1Print(sender: TObject;
var Value: string);
begin
Value := QRLabel1.Caption;
if Value <> '' then
QRLabel1.Caption := '';
end;

procedure TForm1.QRDBText3Print(sender: TObject;
var Value: string);
begin
if QRDBText2.DataSet.Eof then
Value := ''
else
QRDBText2.DataSet.Next;
end;

procedure TForm1.QRDBText6Print(sender: TObject;
var Value: String);
begin
if QRDBText2.DataSet.Eof then
Value := ''
end;

end.

object Form1: TForm1
Left = 192
Top = 107
Width = 543
Height = 375
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Scaled = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 32
Top = 16
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
object DBGrid1: TDBGrid
Left = 40
Top = 112
Width = 320
Height = 120
DataSource = DataSource1
TabOrder = 1
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'MS Sans Serif'
TitleFont.Style = []
end
object DBGrid2: TDBGrid
Left = 40
Top = 240
Width = 320
Height = 120
DataSource = DataSource2
TabOrder = 2
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'MS Sans Serif'
TitleFont.Style = []
end
object QuickRep1: TQuickRep
Left = 136
Top = 112
Width = 794
Height = 1123
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
DataSet = ADODataSet1
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'Arial'
Font.Style = []
Functions.Strings = (
'PAGENUMBER'
'COLUMNNUMBER'
'REPORTTITLE')
Functions.DATA = (
'0'
'0'
'''''')
Options = [FirstPageHeader, LastPageFooter]
Page.Columns = 1
Page.Orientation = poPortrait
Page.PaperSize = A4
Page.Values = (
100
2970
100
2100
100
100
0)
PrinterSettings.Copies = 1
PrinterSettings.Duplex = False
PrinterSettings.FirstPage = 0
PrinterSettings.LastPage = 0
PrinterSettings.OutputBin = Auto
PrintIfEmpty = True
SnapToGrid = True
Units = MM
Zoom = 100
object DetailBand1: TQRBand
Left = 38
Top = 38
Width = 718
Height = 3
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
AlignToBottom = False
Color = clWhite
ForceNewColumn = False
ForceNewPage = False
Size.Values = (
7.9375
1899.70833333333)
BandType = rbDetail
object QRDBText1: TQRDBText
Left = 8
Top = 0
Width = 8
Height = 17
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
Size.Values = (
44.9791666666667
21.1666666666667
0
21.1666666666667)
Alignment = taLeftJustify
AlignToBand = False
AutoSize = True
AutoStretch = False
Color = clWhite
DataSet = ADODataSet1
DataField = 'a'
OnPrint = QRDBText1Print
Transparent = False
WordWrap = True
FontSize = 10
end
end
object QRSubDetail1: TQRSubDetail
Left = 38
Top = 41
Width = 718
Height = 23
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
AlignToBottom = False
Color = clWhite
ForceNewColumn = False
ForceNewPage = False
Size.Values = (
60.8541666666667
1899.70833333333)
Master = QuickRep1
DataSet = ADODataSet2
PrintBefore = False
PrintIfEmpty = True
object QRDBText2: TQRDBText
Left = 128
Top = 3
Width = 8
Height = 17
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
Size.Values = (
44.9791666666667
338.666666666667
7.9375
21.1666666666667)
Alignment = taLeftJustify
AlignToBand = False
AutoSize = True
AutoStretch = False
Color = clWhite
DataSet = ADODataSet2
DataField = 'b'
OnPrint = QRDBText3Print
Transparent = False
WordWrap = True
FontSize = 10
end
object QRLabel1: TQRLabel
Left = 24
Top = 3
Width = 58
Height = 17
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
Size.Values = (
44.9791666666667
63.5
7.9375
153.458333333333)
Alignment = taLeftJustify
AlignToBand = False
AutoSize = True
AutoStretch = False
Caption = 'QRLabel1'
Color = clWhite
OnPrint = QRLabel1Print
Transparent = False
WordWrap = True
FontSize = 10
end
object QRDBText3: TQRDBText
Left = 200
Top = 3
Width = 8
Height = 17
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
Size.Values = (
44.9791666666667
529.166666666667
7.9375
21.1666666666667)
Alignment = taLeftJustify
AlignToBand = False
AutoSize = True
AutoStretch = False
Color = clWhite
DataSet = ADODataSet2
DataField = 'b'
OnPrint = QRDBText3Print
Transparent = False
WordWrap = True
FontSize = 10
end
object QRDBText4: TQRDBText
Left = 264
Top = 3
Width = 8
Height = 17
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
Size.Values = (
44.9791666666667
698.5
7.9375
21.1666666666667)
Alignment = taLeftJustify
AlignToBand = False
AutoSize = True
AutoStretch = False
Color = clWhite
DataSet = ADODataSet2
DataField = 'b'
OnPrint = QRDBText3Print
Transparent = False
WordWrap = True
FontSize = 10
end
object QRDBText5: TQRDBText
Left = 336
Top = 3
Width = 8
Height = 17
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
Size.Values = (
44.9791666666667
889
7.9375
21.1666666666667)
Alignment = taLeftJustify
AlignToBand = False
AutoSize = True
AutoStretch = False
Color = clWhite
DataSet = ADODataSet2
DataField = 'b'
OnPrint = QRDBText3Print
Transparent = False
WordWrap = True
FontSize = 10
end
object QRDBText6: TQRDBText
Left = 416
Top = 3
Width = 8
Height = 17
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
Size.Values = (
44.9791666666667
1100.66666666667
7.9375
21.1666666666667)
Alignment = taLeftJustify
AlignToBand = False
AutoSize = True
AutoStretch = False
Color = clWhite
DataSet = ADODataSet2
DataField = 'b'
OnPrint = QRDBText6Print
Transparent = False
WordWrap = True
FontSize = 10
end
end
end
object ADODataSet1: TADODataSet
AfterScroll = ADODataSet1AfterScroll
Parameters = <>
Left = 144
Top = 16
end
object ADODataSet2: TADODataSet
Parameters = <>
Left = 144
Top = 56
end
object DataSource1: TDataSource
DataSet = ADODataSet1
Left = 200
Top = 16
end
object DataSource2: TDataSource
DataSet = ADODataSet2
Left = 200
Top = 56
end
end
 
这个报表的行和列都不能确定
hfghfghfg:
可不可以直接发到我邮箱来,
bravercaohao@163.com
 
你提的问题与我曾经提过的问题性质是相同的。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1730265
 
有没有人用过
transform ...... pivot 实现统计后的数据集
怎样实现好像要在Microsoft JET Engine 3.5以上版本上才可以,我在SQL 2000上试过没有用 ,怎样解决?
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
926
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部