在Delphi中实现数据分析模块的动态报表
---- Delphi作为强大的数据库开发工具,正被愈来愈多的编程人员所采用,"聪明的程序员用Delphi"更形象生动的道出广大程序员的心声,但这并不意味着所有功能的实现都非常容易,例如,笔者在开发军队的某个信息系统中,就在为数据分析模块中DecisionGrid1控件的数据进行报表输出时走了不少的弯路。广大的Delphi的爱好者在今后的学习或工作中也有可能会遇到类似的问题,而在许多参考书中,很少有甚至没有关于它们的解决方法,于是,我想花费一点时间把它整理出来,以供大家参考。本文中报表动态生成的公用模块具有很大的灵活性和易操作性,其中的思路、实现的功能和通用性等方面的优缺点就由大家看了本文后自有定论。
二、建立报表的动态输出公用模块
---- 下面,结合公司人事管理信息系统说明其实现的方法和技术。
---- 1、基本思路:首先从DecisionGrid1中获得报表所需数据,放到二维数组PA中,然后在C:DataWork中动态创建一个数据表tjb.dbf,存放报表数据,最后用T able1与tjb.dbf相连接,以后工作就与一般的动态输出报表(如查询报表)相类似,在这里我就无须赘述了。
---- 2、建立窗体文件:放入六个用于数据分析的常用控件DecisionQuery1、DecisionSource1、DecisionCube1、DecisionGraph1、DecisionPivot1、DecisionGrid1,设置DecisionSource1的decisionCube属性为decisionCube1,decisionCube1的Dataset属性为decisionQuery1、decisionQuery1的DatabaseName属性为c:datawork;一个Table1控件,用于连接数据表tjb.dbf;一个QuickRep1控件,用于数据的报表输出;两个Button1和Button2控件,其Caption分别设为"报表输出"和"返回"。分别设置decisionCube1的Dataset属性为decisionQuery1、decisionQuery1的DatabaseName属性为c:datawork.。
---- 3、单元文件的主要控件代码 Button1控件的代码如下(定义变量部分略),主要分以下8个功能块来加以说明:
---- ⑴删除同名或上一次建立的数据表
if FileExists('c:DataWorktjb.dbf') then
deletefile('c: DataWork tjb.dbf');
---- ⑵根据DecisionGrid1控件的cells属性,获得报表所需数据,并将其默认的'Sum'值汉化成'总计'、'合计'、'小计'以符合汉语的习惯要求,所求得的数据存放于二维数组PA中
for i:=1-DecisionGrid1.FixedCols to DecisionGrid1.
ColCount-DecisionGrid1.FixedCols-1 do
for j:=0-DecisionGrid1.FixedRows to DecisionGrid1.
RowCount-DecisionGrid1.FixedRows-1 do
begin
pa[i,j]:=DecisionGrid1.cells[i,j];
//处理DecisionGrid1控件中固定列的值为'Sum'的数据项
if ((i=1-DecisionGrid1.fixedcols) and (pa[i,j]='Sum')) then
pa[i,j]:='总 计'
else if ((i = -1) and (pa[i,j]='Sum')) then
pa[i,j]:='小 计'
else if ((i<-1) and (i>1-DecisionGrid1
.FixedCols) and (pa[i,j]='Sum')) then
pa[i,j]:='合 计';
//处理DecisionGrid1控件中固定行的值为'Sum'的数据项
if (pa[i,j]='Sum' ) and (j=-1) then
pa[i,j]:='总 计';
end;
---- ⑶用T able1动态创建数据表tjb.dbf
Table1.Active:=false;
with Table1 do
begin
DatabaseName := 'c:DataWork';
TableName := 'tjb';
TableType := ttDBase;
with FieldDefs do
begin
Clear;
for i:=1 to 40 do
Add(IntToStr(i),ftString,30, False);
end;
CreateTable;
end;
//下面将DecisionGrid1控件中的数据放入数据表中
Table1.Active:=true;
for j:=1-DecisionGrid1.FixedRows to DecisionGrid1
.RowCount-DecisionGrid1.FixedRows-1 do
begin
K:=0;
Table1.Insert;
for i:=1-DecisionGrid1.FixedCols to DecisionGrid1
.ColCount-DecisionGrid1.FixedCols-1 do
begin
Table1.Fields[K].AsString:=pa[i,j];
K:=K 1;
end;
Table1.Post;
Table1.Next;
end;
- 排行
- 推荐
- 最新
- C# Socket多线程编程实例
- Asp.net Ajax 中的脚本错误: Sys未定义 的解决方法
- 身份证号码15位升18位(C#)
- DataGrid 控件的使用
- Visual Basic 界面设计大观
- asp.net ajax学习系列功能强大的UpdatePanel控件
- Session丢失问题解决方案
- Javascript与asp.net 实现Ajax多文件无刷新上传
- Web Service描述语言 WSDL 详解(1)--为什么使用WSDL?[转]
- XP下java jdk环境变量设置
- Linux多线程编程
- JSP Struts之HTML标签库详解
- Java GUI:SWT/Swing/AWT的介绍及比较
- C#连接mysql
- asp http 500 - 内部服务器错误 请求的资源在使用中
- 教你在VB中操作 DataGrid 视图
- 关于ASP.NET调用JavaScript的实现
- 使用VB实现Excel自动获取外部数据
- 从资源文件里加载文件(C#)
- 怎样在JAVA文件中获取该项目的相对路径
- Asp.Net Unleashed 2nd Edition 学习笔记 第三部分
- 使用AJAX技术实现网页无闪自动局部刷新
- UpdatePanel与UrlRewrite
- 新手入门:介绍JSP中request属性的用法
- 基于ASP.NET AJAX的WebPart开发与部署
