明天要交活了,RAVE的报表还没做出来,帮忙呀!!!!(200分)

  • 主题发起人 主题发起人 大老虎
  • 开始时间 开始时间

大老虎

Unregistered / Unconfirmed
GUEST, unregistred user!
我想把stringgrid内容添加到RAVE报表中,请问大虾们如何做呢?
 
首先保存到数据库临时表中,再加载到报表
 
临时表如何加,用完了怎么删呢?
 
*1.1初识Rave
其实在Delphi7发布以前,我们就已经看到过有关Rave的相关内容,但它在那时,是非常的复杂的,如*图11.1所示。

*图11.1.Delphi6下面的Rave
而在使用它时,我们会看到一个与现在的界面相差不是太多的一个设计界面,如*图11.2所示。

*图11.2.Rave4的设计界面
通过这样的一个报表设计界面,开发人员可以开发出符合用户要求的报表来,而且更可贵的是这一切与使用Delphi集成开发环境几乎是完全的一样,这可能是Rave与其它的报表组件最大的外观上的不同吧!
在*图11.2中,我们看到的是Rave4.0中的界面,而当Delphi7发布后,Rave也随之升级为Rave5.0,而它们的组件也产生了非常大的变化,而这些变化是在吸收了Rave4的优点,并更加集成化后得到的一个新的版本。如*图11.3所示。

*图11.3.Delphi7下的Rave
而在设计报表时,它的报表组件栏也再一次的支持了浮动功能,这样就可以更加容易的进行自定义的处理,如*图11.4所示

*图11.4.Rave5的报表设计界面
了解到这些后,那么该如何使用这些组件,并且如何进行报表的设计及分发,该如何让这些设计好的报表与我们的应用程序紧密的集成这些问题都被列上了日程,接下来就让我们对Rave的一些特点进行深入的了解,相信读者在看完这些后,结合Rave的帮助信息,可以非常容易的完成自己的报表设计。

*1.2Rave组件的介绍
正如前面我们所看到的,Rave报表组件已经在Delphi7中被默认的安装了。使用过报表组件的开发人员都知道,如果一个好的报表组件就必须具备以下几个特点。
l l 简单易用
l l 模块化强
l l 有供开发人员和用户使用的报表设计器
l l 可以与应用程序高度集成
l l 具备优秀的数据库连接能力
而我们已经知道的报表组件QuickReport、FastReport、ReportBuilder都具备了这样的几个特点,那么Rave又是怎样支持这样的几个特点的呢?如果想了解这些内容,那么就必须进行深入的使用才可以让我们充分的体会到Rave强大的功能。
*1.3简单易用
如果说FastReport是Delphi报表组件当中最为优秀的,相信没有读者会反对,而Rave在继承了它的优点的同时也体现了自己的特色。简单易用就是它的最大的特点。
如果现在你需要设计一个报表,那么可以有两个选择进行这项工作:

*1.3.1启动报表设计器

1、 1、 使用Delphi 集成开发环境下的菜单项选项,如*图11.5所示。

*图11.5.菜单项启动Rave
当你选择了Rave Designer菜单项后,相应的Rave报表设计环境将自动的启动,如*图11.6所示。

*图11.6.启动过程
如果此时你的计算机系统足够快的话,不用几秒钟,读者一定会看到Rave的报表设计器界面,如*图11.7所示。

*图11.7.Rave的报表设计器
如果到了*图11.7所示的报表设计器界面,那么就可以开始正常的报表设计了,相信这时就可以发挥读者设计报表的功力了。
当然,除此之外,还有一种方法可以让我们调用这样的报表设计器,那就是
1、 2、 使用组件打开报表设计器
如果现在是在设计的环境下,那么同样可以使用组件来打开相应的报表设计器,但要注意的是现在必须使用 (RvProject)报表项目组件来进行处理。具体的处理过程是。
在相应的表单中放入RvProject组件,并且在RvProject组件上面双击鼠标左键。如*图11.8所示。

*图11.8.使用组件打开报表设计器
这时,我们同样可以看到*图11.6所示的报表设计器的启动过程。而且只需几秒钟,读者就可以看到*图11.7所示的报表设计界面。
从这两点中,相信读者不难看出,它在启动方面与其它的报表设计组件是不相上下的。并且使用方面也是非常的简单。
*1.3.2设计简单的报表
1.报表设计器概览
如果现在你想设计一个报表,那么它绝对是一个非常简单的过程。不过在设计报表之前,让我们先来了解一下报表设计器的一些特点。如*图11.9所示。

*图11.9.报表设计器概览
而如图9中的设计器主菜单中,我们可以看到它其中已经包括了所有的报表操作选项,如*图11.10所示。

*图11.10.Rave报表设计器的菜单项
不过幸好,Rave提供了快捷按钮这样的设计方式,通过这样的处理,开发人员可以非常快捷的使用这些功能而不用来回的在菜单下进行操作。如*图11.11所示。

*图11.11.报表设计器的快捷操作按钮
在这里与Delphi中的项目概念是一样的,一般Rave报表是由【项目】-【报表】-【页面】所组成的。也就是说,当要为一个应用程序设计报表时,一般是先建立一个项目,接下来建立一个新的报表,最后进行页面的设计。这样就可以设计完成一个最基本的报表。如果在此时需要对报表设计器的基本环境进行设置,那么*图11.12所示的快捷按钮可以帮助你完成这一切。

*图11.12.报表设计器的页面设计
而在这里面对我们设计最为主要的几个快捷按钮,在使用过程中需要注意。如果你需要相应的报表网格线,那么可以使用*图11.12中所示的【激活网格线】的快捷按钮,而且最终会发现报表设计表单中会出现相应的网格线。如*图11.13所示。

*图11.
 
楼上的,初识我已看过,我想解决问题呀
 
建临时表,用完后系统会自动删除的。
 
能不能不用数据库呀,像QREPORT那样,有个值来控制是否不接受值了
procedure TFRM31506R.QRPBaseNeedData(Sender: TObject;
var MoreData: Boolean);
begin
with FRM31506.StringGriddo
begin
if i<=RowCount then
QR_0.Caption := Cells[0,i];
QR_1.Caption := Cells[1,i];
QR_2.Caption := Cells[2,i];
QR_3.Caption := Cells[3,i];
QR_4.Caption := Cells[4,i];
QR_5.Caption := Cells[5,i];
QR_6.Caption := Cells[6,i];
inc(i);
MoreData := i<= RowCount;
end;

end;

procedure TFRM31506R.QRPBaseBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
begin
I := 1 ;
end;

end.
 
建临时表是多此一举,是没有办法的办法。我也遇到此种问题,但我坚信有办法,其实我也没办法。所以关注。
 
看看有谁能帮忙呢,分不是问题,不够可再加呀,顶呀弟们?
 
建议楼主把问题的标题改改[:)]
 
我也要解决这个问题阿
 
去CSDN这个问题解决了
 
你不用删除啊,你把stringgrid的数据格式建成空表,在rave执行之前可以读入表的数据,操作完成之后删除该表中的数据不就完了。
 
to:xyf2001721能给段代码吗,说完结账,给你100
 
拉一个RVCustomConnection控件;
RVCustomConnection:
在下面事件中写代码
onOpen: datarows=stringgrid.items.count;设置记录数量
onGetCols:为stringgrid每个col生成字段
begin
connection.writeField('fieldname',dtstring,50,'...');
connection.writeField('fieldname',dtstring,50,'...');
...
end;

onGetRows:
begin
connection.writestrData('','string content');
....
end;
 
Delphi数据库开发及统计表格设计

Delphi是Borland公司开发的基于PASCAL语言的Windows平台应用程序开发工具,它将可视化编程(Visual Programming)与面向对象(Object-Oriented)的卓越优点结合在PASCAL语言开发平台上,而且同时可以支持Client/Server模式的SQL 数据库访问与ODBC(开发数据库互连),是一个真正面向对象的开发工具。

Delphi最吸引人的特点是它的强大的数据库访问能力,它主要通过使用数据库引擎(Borland Database Engine,简称BDE)来访问本地数据库和远程数据库。

但对于用户而言,不必直接编程访问BDE,而只需通过采用窗体(FORM)和大量方便且实用的数据库访问元件(Component)来实现,通过ReportSmith报表生成器可以生成多种随心所欲的报表。

但是,用ReportSmith制作的各类报表,只便于输出至打印机上打印出来,若想把报表在屏幕上显示,则还需调用ReportView。而ReportView窗口界面对不太懂Delphi和Windows操作的普通用户来说,不直观,也不易操作。如何制作并在屏幕上显示出直观的二维统计报表,这是本文所要阐述的主要问题。

以表格形式显示数据库内容一般地采用下面两种方式:
●纵向列表
●交叉统计列表

一、纵向列表

Delphi可以用TDBRID控件,以表格形式非常方便地显示单一或多数据库纵向列表。一般采用两种方法实现:

(一)采用TTable与Tdatasource、TDbgrid控件

在窗体中引入上述三个控件,并在Ttable中控件指出要访问的数据库存放路径及数据库名,在Tdatasource控件中指出数据源与Ttable相连,在TDbgrid控件中指出显示Tdatasource数据源内容,程序运行后,则显示出如图1所示的数据库纵向列表。

该种方法一般用来显示单数据库表格或一对多两个数据库表格。

(二)采用TQuery与Tdatasource、TDbgrid控件

同样,在窗体中引入上述三个控件,并在TQuery控件中用SQL语句给出对有关数据库的查询,在Tdatasource控件中指出数据源与TQuery相连,在TDbgrid控件中指出显示查询的结果。程序运行后,则显示出如图1所示的数据库纵向列表。

该种方法一般用于两个以上的多数据库查询。

在TQuery控件中建立SQL查询有两种方法,一种是在程序设计阶段使用SQL查询,即为静态查询,第二种是在程序运行阶段使用SQL查询,即为动态查询。

1.静态查询在编写程序时,在窗体中放置Tquery元件,并设置对象名称,如Query 1。使用Delphi对象检测器Object,双击Query 1对象的SQL属性,则激活SQL语句输入框,根据要求输入SELECT语句。当程序运行后,则显示出数据库纵向列表。静态查询比较简单,但实用性差。对于较复杂的查询,一般采用动态查询。

2.动态查询同样,在编写程序时,在窗体中放置TQUERY元件,并设置对象名称,如Query 1。在相关的事件函数中输入SQL语句,例如:

WITH QUERY 1do

begin

SQL.CLEAR;
SQL.ADD(‘SELECTDW
COUNT(DW)FROM B_BASETJ F
B_INFO E’);
SQL.ADD(‘WHERE F.”SHBZCODE”=E.”SHBZCODE”GROUP BY DW’);
OPEN;
end;

当程序运行后,由某一事件激发,则显示出查询结果纵向列表。

二、交叉统计列表

在Delphi环境下,无论用上述哪种方法制作数据库纵向列表,都是相对容易的。但要生成如图2所示二维统计报表,则并非易事。

下面以笔者开发的《社会养老保险管理系统--统计管理》中的一段程序为例,详细说明图2所示交叉统计列表的制作。
(一)调用数据库B_BASETJ.DB和B_INFO.DB

上述两数据库的结构分别为:
B_BASETJ.DB B_INFO.DB 字段名字段类型字段长度字段名字段类型字段长度
dw a 4(单位代码)shbzcode a 21(社会保障号码)
shbzcode a 21(社会保障号码)attribution a 10(工作属性)
cadre_zw a 4(干部职务)sex a 2(性别)

在B_INFO.DB数据库中存放着各人的基本情况,其中ATTRIBUTION字段包含固定工、农民合同工等工作属性;CADRE_ZW字段包含干部职务,若该字段内容为空,则表示为工人。

(二)窗口界面设计及各组件属性说明

用到的重要组件及其属性如下:
QYERYTB1:TQUERY;{指明SQL的存取元件名为QUERYTB1}
DataSourceTB1:Tdatasource;{指明与TQUERY相连的数据源为DatasourceTB1 }
Datasourcename=DataSourceTB1
Dataset=QYERYTB1
SG11:TstringGrid;{字符型二维数据表格}
BTNEXIT:Tbutton;{取消按钮}

(三)程序代码及其分析

程序中主要通过使用TStringGrid和TQUERY控件来生成交叉统计列表。其中T StringGrid控件以二维网格形式显示字符型数据表格,CELL[I
K]为表格中的一个数据单元,K为行号,I为列号,K、I的起始值为0;TQUERY控件的作用是利用SQL 语句统计出表格中某一列数据,如图2表格中共有6列,则需6次调用TQUERY。

本程序还设置了公共程序段procedure COL(var I
k:INTEGER),这一子程序将被多次调用,用于填写表格中某一列数据。
主要程序代码如下:
unit T1;
interface
uses
SysUtils
WinTypes
WinProcs
Messages
Classes
Graphics
Controls

Forms
Dialogs
StdCtrls
ExtCtrls
Grids
DB
DBTables
DBGrids
Report;
type
TT1FORM=class(TForm)
BTNEXIT:TButton;
SG11:TStringGrid;
Labell:TLabel;
QueryTB1:TQuery;
DataSourceTB1:TDataSource;
procedure FormCreate(Sender:TObject);
procedure BTNEXIT Click(Sender:TObject);
private
PROCEDURE COL(VAR I
K:INTEGER);
PROCEDURE CC(VAR I
K:INTEGER);
{Private declarations}
public
{Public declarations}
end;

var
T1FORM:TT1FORM;
implementation
{$R*.DFM}
PROCEDURE tt1form.COL(VAR I
K:INTEGER);{用FOR...DO循环填写SG11表格中第I列的VAR J:INTEGER;值}
begin

WITH SG11do

begin

QUERYTB1.FIRST;
FOR J:=2 TO K-1do

begin

IF CELLS[0
J]=QUERYTB1.FIELDS[0].ASSTRING{第0列填写单位代码}
then
begin

CELLS[I
J]:=QUERYTB1.FIELDS[1].ASSTRING;{填写第I列中某一行的值}
QUERYTB1.NEXT;
CELLS[I
1]:=INTTOSTR(STRTOINT(CELLS[I
1])+STRTOINT(CELLS[I
J]));
END
else
CELLS[I
J]:=INTTOSTR(0);
end;
{FOR}
end;
{WITH}
end;

PROCEDURE Tt1form.CC(VAR I
K:INTEGER);
VAR J:INTEGER;
begin

WITH SG11do

begin

FOR J:=1TO K-1do

CELLS[I
J]:=INTTOSTR(STRTOINT(CELLS[1
J]-STRTOINT(CELLS[I-1
J])));
end;
{WITH}
end;

procedure TT1FORM.FormCreate(Sender:TObject);{在创建窗体T1FORM时生成表格并填写统计值}
VAR R
I
K
J:INTEGER;
begin

WITH SGLLdo

begin
CELLS[0
0]:=’单位’{填写第0行各列标题}
CELLS[1
0]:=’总人数’;
CELLS[2
0]:=’固定’;
CELLS[3
0]:=’合同’;
CELLS[4
0]:=’干部’;
CELLS[5
0]:=’工人’;
FOR I:=1 TO 5do

begin

CELLS[I
1]:=INTTOSTR(0);
end;

end;

WITH QUERYTB1do

begin

SQL.CLEAR;
SQL.ADD(‘SELECT DW
COUNT(DW)FROM B_BASETJ F
B_INFO E’);
SQL.ADD(‘WHERE F.”SHBZCODE”=E.”SHBZCODE”GROUP BY DW’);
OPEN;
R:=RECORDCOUNT+2;
SG11.ROWCOUNT:=R;
SG11.CELLS[0
1]:=’合计’;
FIRST;
K:=R;
FOR J:=2 TO Kdo

begin
SG11.CELLS[0
J]:=FIELDS[0].ASSTRING;{填写第0列单位号}
NEXT;
end;

I:=1;
COL(I
K);{填写第1列合计}
SQL.CLEAR;
SQL.ADD(‘SELECT DW
COUNT(E.”DW”)’);
SQL.ADD(‘FROM“B_BASETJ.DB”E
B_INFO F WHERE E.”SHBZCODE”=F.”SHBZCODE”AND F.”ATTRIBUTION”=”固定职工”GROUP BY DW’);
I:=2;
OPEN;
COL(I
K);{填写第2列各单位固定工人数}
SQL.CLEAR;
SQL.ADD(‘SELECT DW
COUNT(E.”DW”)’);
SQL.ADD(‘FROM“B_BASETJ.DB”E
B_INFO F WHERE E.”SHBZCODE”=F.”SHBZCODE”AND F.”ATTRIBUTION”=”农民合同工”GROUP BY DW’);
I:=3;
CC(I
K);{填写第3列各单位合同工人数}
SQL.CLEAR;
SQL.ADD(‘SELECT DW
COUNT(E.”DW”)’);
SQL.ADD(‘FROM“B_BASETJ.DB”E
B_INFO F
WHERE E.”SHBZCODE”=F.”SHBZCODE”AND F.”CADRE_ZW”<>””GROUP B Y DW’);
I:=4;
OPEN;
COL(I
K);{填写第4列各单位干部人数}
I:=5;
CC(I
K);{填写第5列各单位工人人数}
end;

end;

......
end.
 
后退
顶部