Delphi数据库开发完美教程 第9章 数据报表的制作

合集下载

Delphi7报表制作入门

Delphi7报表制作入门

Delphi报表制作入门Delphi 7.0 中实现报表的方法称为 Rave。

Rave 报表是一种基于组件的可视化报表设计工具,使用它可以简化设计过程,提高设计效率。

只要将 Rave 报表组件添加到应用程序中后,就可以创建各种类型的报表。

本文将以 ADO 组件连接数据库,向读者介绍怎样利用 Rave Report5.0 快速设计报表。

还是赶快行动起来,体验一下 Rave Reports 的强大功能吧!1.准备好范例数据库,笔者使用 Access 建立数据库Student.mdb,创建一个表:StuInf(学生基本信息),包含Sno(学号),Sname(姓名),Sex(性别),Class(班级),Birthday(出生日期)... 等字段,所有字段名先使用括号中的中文;再写入几条数据备用。

2.启动Delphi7.0 建立一个工程,在窗体上放置一个ADOQuery 控件,设置其ConnectionString 属性,连接数据库 Student,设置 SQL 属性为“select * from StuInf;”,Active 属性为 True 。

为了能看到库中的数据,再往窗体上放置一个DBGrid 和一个 DataSource ,设置相关属性,使 DBGrid 中显示数据。

3.在窗体上添加一个 GroupBox,设置其 Caption 为“选择报表式样”;往其中添加两个 RadioButton ,Caption 分别为“条列形式”、“表格形式”;往窗体上添加一个按钮,Caption 为“显示报表”。

现在,准备工作已经完成了,保存工程,下面开始报表的设计。

4.在窗体上添加一个RvDataSetConnection组件,设置其DataSet为ADOQuery1,这样,就提供了 Rave 报表与数据源之间的连接。

5.在 Delphi 主菜单的 Tools 中选择 RaveDesigner 启动 Rave Reports5.0。

DELPHI报表的动态生成

DELPHI报表的动态生成

DELPHI报表的动态生成(Create Delphi Dynamic Report)摘要:本文主要介绍如何在DELPHI开发环境下动态生成报表,给出公用模块,并结合具体示例分析了实现的主要技术问题,给出解决这些问题的技术细节。

关键词:DELPHI报表、动态创建一、引言报表是数据库应用程序的重要部分,可是报表的生成也是数据库开发中最麻烦的一项工作。

报表格式复杂多样,一直是使程序员头疼的事。

DELPHI 在其3.0以后版本中加入了QUICKREPORT,使这种情形有所改变。

它的全部可视化编程以及设计和运行过程中都可以进行预览等特性给程序开发带来了很大的方便。

我们可以通过在应用程序设计阶段往窗体中添加报表控件,再与数据库表组件Ttable,查询组件Tquery等数据访问组件相关联,从而实现报表的预览与报表的输出。

但在许多应用程序中,程序员往往期望从静态或者动态生成的数据库表中动态提取所需数据,进而生成报表输出。

本文介绍的就是如何动态选择所需数据,动态生成报表的公用模块。

这种动态方式生成的报表更加灵活,也更加容易做到报表的格式统一。

动态报表主要是在程序运行阶段利用Creat方法动态创建控件,设置其Parent属性来设置其容器控件。

然后,在程序中根据所选择的数据库表中的数据字段的长度和数目,通过修改控件的大小和位置属性,来控制控件的大小和外观,如果该控件有事件,可直接把函数或过程名赋给它的相应事件名。

二、动态报表的实现下面结合一个具体实例来说明如何其实现的方法和技术。

1、基本思路数据来源,我们以DELPHI自带的DBDEMOS中的employee.db表为例,它共有6个字段。

在F_main主窗体中(如图一),可以自由选择所需要打印的字段。

它的主要控件及属性设置如下:①.Table1:Databasename设置为DEDEMOS,Tablename设置为employee.db②.Listbox1:显示所连数据库表中的全部字段③.Listbox2:用于选择所需报表输出的字段④.AddBitBtn:用于把所选择的字段名添加到Listbox2中⑤.DeleteBitBtn:用于把Listbox2中的字段名去掉⑥.PreviewBitBtn:用于报表的预览⑦.PrintBitBtn:用于报表的输出⑧.CloseBitBtn:用于关闭应用程序在F_report窗体中,放置了以下主要控件,并设置属性,以减少程序的篇幅:①.Table1:Databasename设置为DEDEMOS,Tablename设置为employee.db②.QuickRep1:papesize属性为A4,dataset属性为Table1,bands 属性中的hascolumnheader、hasdetail、hastitle设置为True显示数据库表中的全部字段在F_report的Oncreate事件中加入了如下代码:Table1.Open;if Table1.Active thenTable1.GetFieldNames(Listbox1.Items);// 获得数据库表中的全部字段名DeleteBitBtn.Enabled:=False; //在Listbox2中无字段时,DeleteBitBtn变灰2、从Listbox1中选择字段添加到Listbox2中为AddBitBtn的Onclick事件加入如下代码:if listbox1.Items.Count=0 then exit; //如Listbox1中无可供选择的字段,则执行空操作if listbox1.Selected[listbox1.ItemIndex] then //在Listbox1中选择字段beginListbox2.Items.Add(Listbox1.Items[Listbox1.ItemIndex]);//往Listbox2中增加选中的字段Listbox1.Items.Delete(Listbox1.ItemIndex);//从Listbox1中删除此字段if Listbox2.Items.Count>=1 then //在Listbox2中有字段才允许执行删DeleteBitBtn.Enabled:=True;end;3、从Listbox2中删除不需要的字段为DeleteBitBtn的Oncreate事件添加如下代码:if Listbox2.Items.Count=0 then exit; // 如果Listbox2中无字段,则执行空操作if listbox2.Selected[Listbox2.ItemIndex] then //在Listbox2中选择字段beginListbox1.Items.Add(Listbox2.items[Listbox2.itemindex]); //添加到Listbox1中Listbox2.Items.Delete(Listbox2.itemindex); //从Listbox2中删除此字段end;if Listbox2.Items.Count=0 then //如果Listbox2中无字段,则DeleteBitBtn变灰DeleteBitBtn.Enabled:=False;4、在报表中动态添加一列的步骤:①.TitleBand1中打印的是报表的名称,这里假设为:动态报表生成示例。

Delphi数据库开发及统计表格设计

Delphi数据库开发及统计表格设计

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 操作的普通用户来说,不直观,也不易操作。

如何制作并在屏幕上显示出直观的二维统计报表,这是本文所要阐述的主要问题。

以表格形式显示数据库内容一般地采用下面两种方式:•纵向列表(如图1)•交叉统计列表(如图2)一、纵向列表Delphi 可以用TDBGRID 控件,以表格形式非常方便地显示单一或多数据库纵向列表。

一般采用两种方法实现:(一)采用TTable 与Tdatasource、TDbgrid 控件在窗体中引入上述三个控件,并在Ttable 中控件指出要访问的数据库存放路径及数据库名,在Tdatasource 控件中指出数据源与Ttable 相连,在TDbgrid 控件中指出显示Tdatasource数据源内容,程序运行后,则显示出如图1所示的数据库纵向列表。

delphi制作报表

delphi制作报表

批最近刚刚做完一个项目,使用到了RAVE进行报表设计,在使用中也查阅了很多资料,但总觉得网上的资料过于分散,而且都不是很全面,所以决定将如何在Delphi 7中使用RAVE报表写成几篇文章,由于本人从小语文学得不好,不是写作高手,这次也是第一次写这样的文章。

希望看到这篇文章的网友能多提意见,欢迎大家指教。

可以给我留言。

言归正传,在我们要给用户编写的软件中往往需要生成各种各样的报表,报表是数据库中数据的最终表现形式,在Delphi 6以前,编写报表都在使用Qusoft公司的Quick report,而且在Delphi中集成了Quick report。

在Borland Delphi™ 7 Studio 集成开发环境(IDE)的控件面板中取消了Quick report项,取而代之以Nevrona公司Rave Reports项,且在Tools中有Rave Designer 5.0 。

打开Rave Designer 5.0,我们可以如图所示的一个报表设计界面,开发人员可以开发出符合用户要求的报表来,而且这个报表的设计、使用与Delphi集成开发环境几乎是完全的一样,这可能是Rave与其它的报表组件最大的外观上的不同。

我在使用中下载了Rave Reports v5.1.3,你可以在这里或者这里下载,在写这篇文章时,上面上已经发布了Rave Reports 6.0,不过文章还是以Rave Reports v5.1.3为准。

打开Delphi,可以控件面板看到如图:Delphi7下的Rave打开Tools中的Rave,看到的报表设计界面如图:Rave5的报表设计界面一、Rave5的报表设计界面首先,介绍一下Rave的报表设计器的各组件和相关的属性。

Rave Designer集成开发环境的界面包括标题栏、菜单栏、快捷工具栏、组件栏和一些窗口:·标题栏显示了当前的工程名,位于最上部。

·菜单栏,一些功能可通过菜单栏的菜单命令实现。

《Delphi报表设计》课件

《Delphi报表设计》课件
Delphi报表可以处理各种类型的数据,包括文本、数字、日期、时间等,并且可以支持各种类型的报表格式,如 表格、图表、图形等。
Delphi报表可以帮助用户更好地理解和分析数据,从而更好地做出决策。
Delphi报表还可以与其他软件集成,如Excel、Access等,从而实现数据的共享和交 互。
简单报表:只包含 基本的数据展示和 格式设置
报表交互:设置报 表的交互功能,如 筛选、排序、钻取 等
报表控件:使用TDBGrid控件实现报表的显示和编辑
报表事件:通过编写事件处理程序实现报表的交互功能
报表打印:使用TQRPrinter控件实现报表的打印功能
报 表 导 出 : 使 用 TQ R E x p o r t 控 件 实 现 报 表 的 导 出 功 能 , 如 导 出 为 P D F 、 E xc e l 等 格式
优化报表 布局:合 理布局报 表元素, 提高报表 的可读性 和易用性
优化报表 交互:减 少报表交 互次数, 提高报表 交互效率
01 检查报表设计是否正确,包括字段、 格式、计算等
02 使用断点调试,查看报表执行过程中 的变量值和错误信息
03 利用日志文件,记录报表执行过程中 的详细信息,便于定位问题
04
利用第三方工具,如SQL Server Profiler, 监控报表执行过程中的SQL语句和性能指标
05 优化报表性能,包括减少数据量、优 化SQL语句、使用缓存等
06 定期备份报表,防止数据丢失或损坏
错误类型:语法错误、逻辑错误、 数据错误等
异常处理:记录异常信息,显示异 常信息,重新执行异常代码
PART FIVE
导出格式:支持多种格式,如PDF、Excel、Word等 导出设置:可以设置导出文件的名称、路径等 打印设置:可以设置打印纸张大小、方向、页边距等 保存设置:可以设置报表的保存路径、文件名等

第9章 报表与图表

第9章  报表与图表

delphi程序设计基础教程
第9章 报表与图表
9.1.7 TQRLabel组件
TQRLabel组件用来在报表中显示静态文本,与使用 TLabel组件在一个窗体中显示静态文本一样。这个文本值在 显示时不能被改变。TQRLabel组件的属性、方法和事件以 及用法与TLabel组件基本一致。
delphi程序设计基础教程
第9章 报表与图表
3. QReport 组件页 Delphi中的QReport组件页中的组件共有23种,该组件 页如图9.1所示。 图9.1 Delphi 中的QReport 组件页
delphi程序设计基础教程
第9章 报表与图表
9.1.2 TQuickRep 组件
使用TQuickRep 组件的方法如下。 (1) 通过Delphi中的New Form创建一个新的窗体。 (2) 选择QReport组件页,将TQuickRep 组件拖到新窗 口中,如图9.2所示。 (3) 设置TQuickRep 组件的Bands属性,确认是否打印 标题,页眉、页脚等。 (4) 在TQuickRep 组件中放入其他种类的QReport组件, 并进行属性设置。 (5) 为程序加入代码。
delphi程序设计基础教程
第9章 报表与图表
9.1.17 TQRComposite组件
TQRComposite组件可以将多个报表合并成一个报表。 使用这个组件可以创建一个包含许多不同条件的大报表,而 不需要通过编程来实现打印。可以简单地将条件报表当成一 个分离的报表进行创建,然后只把需要打印到总报表内的部 分添加进去。 通过OnAddReport事件可以将报表添加到 TQRComposite组件内。
第9章 报表与图表
9.1.13 TQRDBRichText组件

课件Delphi实用教程

课件Delphi实用教程
利用Delphi进行客户机/服务器数据库应用系统的开发,通常按以 下步骤进行:
系统总体设计与规划。 网络和SQL服务器建设。 数据库设计。 前端开发。 调试与应用程序的发布。
整理版ppt课件
2
9.2 试题库管理系统的设计实例
9.2.1 创建stkgl(试题库管理)数据库
创建包含试题信息表和试卷信息表,结构分别如下两表所示。
数据模块DMSTK
整理版ppt课件
14
9.2.4 C/S数据库应用程序设计
数据模块组件对象属性表
整理版ppt课件
15
9.2.4 C/S数据库应用程序设计
Ⅱ 使用字段编辑器把QryTMNR,DSetSJ,TabST组件中的所有字 段设置为永久字段,再设置这些永久字段的DisplayLabel属性, 以便于阅读。
按钮不应太多,如果按钮过多,可以考虑用菜单替代。 (2)颜色选择不应过多,尽量保持与操作系统或运行应用程序
的背景相协调。尤其没必要追求过分鲜艳的界面。 (3)最好提供友好的中文界面。 (4)要充分考虑到与用户的交互性,在后台执行的应用程序可
以通过提供一个进度条方式给用户一个直观的认识。 (5)最好能提供一定的提示信息,用以引导用户操作。 (6)要充分考虑到用户的误操作的可能性,对敏感的信息提供
整理版ppt课件
5
9.2.2建立存储过程
CREATE PROCEDURE sjsc @sjbh tinyint
AS DROP TABLE paper; CREATE TABLE paper(txdm tinyint,tmnr text); DECLARE @i int; SET @i=-3; WHILE @i<40
● 其次,本例中,将访问基于Microsoft SQL Server的数据库, 因此选择“Microsoft OLE DB Provider for SQL Server” 选项,选择完毕后单击“Next>>”按钮。

数据报表的制作_roshyhlc

数据报表的制作_roshyhlc

数据报表的制作_roshyhlc数据报表的制作1. Rave报表概述Delphi 7中实现报表的方法称为rave,将rave报表组件添加到应用程序中后就可以创建各种类型的报表了。

1)Rave 工程组件:Rave工程组件只包含一个rvproject组件,她是应用程序喝rave 可视化报表之间的接口,可以在rave designet中设计各种格式的报表。

通过rvproject组件可以在delphi应用程序中打开已经设置好的rave组件。

2)引擎类组件引擎类组件包括rvsytem和rvndrwriter组件,可以从以前定义的报表文件中读取,也可以根据属性描述设定报表风格。

3)render组件Render组件用于将一个RSR文件或者从rvndrwriter产生的流转换为各种格式,并发布出来。

这类组件主要包括:rvrenderpreview、rvenderprinter、rvrenderpdf、tvrenderhtml、rvrenderrif和rvrendertext组件。

4)数据连接组件主要用于将应用程序的数据与rave报表中的direct data view 相连接,主要包括:-----connection.下面重点介绍几个常用的组件1. RvProject组件它是rave报表工具中的核心组件,是访问rave可视化报表的手段,只要使用Rave报表就要用到RvProject组件。

在一个应用程序中一般只有一个rvproject组件。

属性:projectFile属性:指定应用程序保存报表定义的Rave项目文件,这种项目文件的扩展名一般是.rav。

方法:Execute方法:用于开始打印当前选中的rave报表。

使用方法:rvproject1.execute; Open方法:用于打开指定的报表项目文件,相当于把Active属性设置为true。

Close方法:用于关闭执行的项目文件,并从内存中卸载,相当于把active属性设置为false。

Delphi实用教程ppt课件

Delphi实用教程ppt课件
WHERE th IN (SELECT substring(sjnr,i,3) FROM sj WHERE sjbh=sjbh)
end;
9.2.2建立存储过程
阐明: 该存储过程的功能是把符合条件的题型代码〔txdm〕和标
题 内容〔tmnr〕,插入paper表中,paper表即为生成的试卷。 Where条件子句使以下的select语句所产生的题型代码 〔txdm〕和标题内容〔tmnr〕所对应的题号〔th〕必需在sj 表中试卷内容〔sjnr〕中。 select txdm,tmnr from st where th in (select substring(sjnr,i,3) from sj where sjbh=sjbh)

例SQL效力器名为cjhdb,如下图。
9.2.4 C/S数据库运用程序设计
〔2〕在“登录效力器的信息〞中,输入相应
SQL Server数据效力
器的登录信息。本例
以系统管理员sa身份登录计算机。
〔3〕选中“选择数据库〞单项选择框,单击
其列表框的下拉按钮,如
果在第〔2〕步
输入的登录信息正确,那么会显示在第1步选
QryTMNR.Active:=true; QryTMNR.First; while not QryTMNR.Eof do begin
MenSJ.Lines.Append(QryTMNRtmnr.AsString); QryTMNR.Next end; end; end;
9.2.4 C/S数据库运用程序设计
AS DROP TABLE paper; CREATE TABLE paper(txdm tinyint,tmnr text); DECLARE i int; SET i=-3; WHILE i<40

Delphi——报表设计

Delphi——报表设计

9.2 Rave Delphi组件
9.2.3 数据连接组件 Rave数据来源于应用程序,是通过数据连接组件与数据
集组件相连来组织数据的。数据连接组件包括: •TrvCustomConnection •TrvDataSetConnection •TRvQueryConnection •TrvTableConnection DataSet属性是它们共同的属性,用于指定连接的数据
TRvRenderPDF允许从报表中生成PDF文档。设置 EmbedFonts属性为True可以让字体嵌入到PDF文档中。 PDF中图像的质量可以用一个使用百分比的ImageQuality 属性来设置。设置UseCompression为True可以生成压缩 的PDF文档。 4. TRvRenderHTML组件
9.2 Rave Delphi组件
(2) GetReportList方法 GetReportList方法同来获取报表列表。 例: Var TempReportList:TstringList; Begin TempReportList := TstringList.Create; RvProject1.GetReportList(TempReportList,False); End;
RvProject组件,然后双击该组件以启动Rave报表设计器。 Rave报表设计器的集成开发环境的界面包括标题栏、
菜单栏、快捷工具栏、组件面板、属性面板和一些窗口。 Rave5.0设计界面如下图所示。
9.1 Rave介绍
9.2 Rave Delphi组件
9.2.1 Rave Reports组件概述 在Delphi中,应用程序可以通过一组Rave Reports组件
视化的报表设计器。它本身是一个第三方报表软件,目前的版 本是Rave5.0,由于其简单 、易用和强大的功能被Delphi引入 ,并集成在Delphi7中。

delphi报表

delphi报表

DELPHI制作复杂报表实例,特别推荐!我近段时间一直在做各种各样的报表,特别是那些复杂报表,如下图所示:像这类报表若说用第三方控件,说实在,你还得重做一次表,你做的又不一定符合人家原来做的要求,若用用友软件,那得交一笔不小的数目的钱哦!可我们公司一直要求以最小的投入获取最大的回报,所以是不可能的,后面想想,他们是用EXCEL做成的表给我的,我为什么不可以直接调用它们的表呢,我只要把这些表做成模板再与数据库相连,便可实现了,后来就按这方案去进行了,结果当然是搞定了,现在公布出来与大家共享,当然,对与高手而言也许不是怎么高的水平,但我相信会对部分人有用的,像这类报表做的思想就是:!一.定义各类数据的行列;二,连接模板;三,按要求进行相关的数据提取和相关的运算,对于数据运算一定要尽量想到EXCE 的强大的运算功能,只要它能帮解决的就不要程序里面编写,否则运行起来就不是那么快了,相关代码如下:procedure Tdp_bb.dp_okClick(Sender: TObject);varcbw,zbw,wbw,rjw,ph,ExeRootPath:string;i,j,k:integer;t1,t2:Ttime;beginrjw:=trim(datetostr(dp_dtp.Date));cbw := trim(dp_cbbc.Text);zbw := trim(dp_cbbz.Text);wbw := trim(dp_cbbw.Text);t1:=0;t2:=0;if (cbw<>'') and (zbw<>'') and (wbw<>'') thenbegintryChDir(ExtractFilePath(Application.ExeName));ChDir('..');ExeRootPath := GetCurrentDir;dp_exapt.Connect;dp_exapt.Visible[0]:=false;dp_exapt.Workbooks.Add(ExeRootPath+'/config/sjcs.xls',0);dp_exwb.ConnectTo(dp_exapt.Workbooks[1]);dp_exws.ConnectTo(dp_exwb.Sheets[1] as _worksheet);j:=6;//起始行初始化with dp_form.dp_adoq1 dobeginclose;sql.Clear;sql.Add('select GWDY_SJPH,GWDY_ZTP from TB_GWDY order by GWDY_XH asc');open;while not eof dobeginph:=fieldbyname('GWDY_SJPH').AsString;i:=fieldbyname('GWDY_ZTP').AsInteger;if i=6 then{时间类型}begin{早班数据位置}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' andYS_BB='''+cbw+''' and YS_DATE='''+rjw+''' order by YS_XH asc');open;for k:=6 to RecordCount+5 dobegindp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPTM').AsString);next;end;end;{中班数据位置}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+zbw+''' and YS_DATE='''+rjw+''' order by YS_XH asc');open;for k:=11 to RecordCount+10 dobegindp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPTM').AsString);next;end;end;{晚班数据位置}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+wbw+''' and YS_DATE='''+rjw+''' order by YS_XH asc');open;for k:=16 to RecordCount+15 dobegindp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPTM').AsString);next;end;end;{月平均}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' and month(YS_DATE)='''+formatdatetime('mm',dp_dtp.Date)+''' order by YS_XH asc');open;while not eof dobegint1:=t1+strtotime(trim(fieldbyname('YS_YPTM').AsString));next;end;dp_exws.Cells.Item[j,22]:=timetostr(t1);t1:=0;end;{榨季平均}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' order by YS_XH asc');open;while not eof dobegint2:=t2+strtotime(trim(fieldbyname('YS_YPTM').AsString));next;end;dp_exws.Cells.Item[j,23]:=timetostr(t2);t2:=0;end;endelse{非时间类型}begin{早班数据位置}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPS from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+cbw+''' and YS_DATE='''+rjw+''' and YS_YPTM in(''2:30'',''4:30'',''6:30'',''8:30'','''') order by YS_XH asc');open;for k:=6 to RecordCount+5 dobegindp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPS').AsString);next;end;end;{中班数据位置}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPS from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+zbw+''' and YS_DATE='''+rjw+''' and YS_YPTM in(''10:30'',''12:30'',''14:30'',''16:30'','''') order by YS_XH asc');open;for k:=11 to RecordCount+10 dobegindp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPS').AsString);next;end;end;{晚班数据位置}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPS from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+wbw+''' and YS_DATE='''+rjw+''' and YS_YPTM in(''18:30'',''20:30'',''22:30'',''00:30'','''') order by YS_XH asc');open;for k:=16 to RecordCount+15 dobegindp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPS').AsString);next;end;end;{月平均}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select avg(YS_YPS) as A from TB_YS where YS_SJPH='''+ph+''' and month(YS_DATE)='''+formatdatetime('mm',dp_dtp.Date)+''' group by YS_SJPH');open;if not eof thenbegindp_exws.Cells.Item[j,22]:=trim(fieldbyname('A').AsString);end;end;{榨季平均}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select avg(YS_YPS) as B from TB_YS where YS_SJPH='''+ph+''' group by YS_SJPH');open;if not eof thenbegindp_exws.Cells.Item[j,23]:=trim(fieldbyname('B').AsString);end;end;end;j:=j+1;next;end;end;dp_exws.Cells.Item[2,1] := rjw;dp_exws.Cells.Item[4,6] := cbw;dp_exws.Cells.Item[4,11]:= zbw;dp_exws.Cells.Item[4,16]:= wbw;bb_tm.Enabled:=true;exceptshowmessage('模板路径出错或者是您还没有安装OFFICE办公软件');close;end;end;end;。

delphi,如何,画表格

delphi,如何,画表格

竭诚为您提供优质文档/双击可除delphi,如何,画表格篇一:delphi程序代码设计报表用程序代码设计报表创建一窗体Form1,unit文件保存为RaveReport.pas,窗体上放置一个Rpsystem控件和一个button,程序代码如下,一个简单的报表就完成了。

unitRaveReport;interfaceuseswindows,messages,sysutils,Variants,classes,graphics ,controls,Forms,dialogs,RpRendercanvas,RpRenderpreview,RpRender,RpR enderpdF,Rpbase,Rpsystem,stdctrls,Rpdefine,RpRave;tForm1=class(tForm)button1:tbutton;Rvsystem1:tRvsystem;procedureRvsystem1print(sender:tobject); procedurebutton1click(sender:tobject);private{privatedeclarations}public{publicdeclarations}end;varForm1:tForm1;implementation{$R*.dfm}proceduretForm1.Rvsystem1print(sender:tobject); vari1:integer;s1:string[20];s2:string[20];bitmap:tbitmap;polylinearr:array[1..6]oftpoint;withsenderastbaseReportdobegin{打印表头和表尾}sectiontop:=0.75;//设定内容输出区域的顶部位置thesepropertiesreturnorsetthecurrentsectionofthepapertob eprintedon.//header输出在内容输出区域的顶部setFont(宋体,10);printheader(第+inttostr(currentpage)+页,pjleft);//页码thismethodwillprintthestring,text,justbelowthecurrentsectiontopjustifiedb y,justify,betweenthecurrentsectionleftandsectionRight.printheader(日期:+datetostr(date)+,pjRight);//日期thismethodwillprintthestring,text,justbelowthecurrentsectiontopjustifi edby,justify,betweenthecurrentsectionleftandsectionRight.sectionbottom:=10.75;//设定内容输出区域的底部位置thesepropertiesreturnorsetthecurrentsectionofthepapertob eprintedon.//Footer输出在内容输出区域的底部setFont(宋体,10);printFooter(第+inttostr(currentpage)+页,pjleft);//页码thismethodwillprintthestring,text,justabovethecurrentsectionbottomjustifi edby,justify,betweenthecurrentsectionleftandsectionRight.printFooter(日期:+datetostr(date)+,pjRight);//日期thismethodwillprintthestring,text,justabovethecurrentsectionbottomjust ifiedby,justify,betweenthecurrentsectionleftandsectionRight.//输出报告的题目ypos:=1.0;//垂直方向的位置(从页顶向下的绝对位置,不受内容输出区域范围的限制,单位缺省为inch)thispropertysetsorreturnsthehorizontaltextcurs orposition.setFont(黑体,26);//设置字体underline:=true;//下划线FontRotation:=20;//旋转文字排列走向的角度(按逆时针方向)printcenter(我的报表,pagewidth/2);//在(pagewidth/2)位置居中输出字符串(字符串的水平中心与(pagewidth/2)位置相重合)//文字的下基线作为垂直方向的定位点setFont(宋体,10);underline:=False;FontRotation:=0;//--------重置内容区的底部位置sectiontop:=1.5;//顶端开始于0.75inchsectionbottom:=10.5;//设定内容输出区域的底部位置thesepropertiesreturnorsetthecurrentsectionofthepapertob eprintedon.home;//把文本光标移动到内容输出区域第1行的行首thismethodwillmovethetextcursortothebeginningofline1.//打印列标题cleartabs;setpen(clblack,pssolid,1,pmcopy);//设置画笔为一个点宽settab(0.5,pjcenter,3.5,0,boxlineall,0);//boxlineal l表格中各个cell均有边框线settab(na,pjcenter,1.0,0,boxlineall,0);settab(na,pjcenter,1.5,0,boxlineall,0);settab(na,pjcenter,1.5,0,boxlineall,0);setFont(宋体,12);bold:=true;//画出具有粗边框的表格thismethodsetsthecurrenttabsettingstothenextavailab letab.ifthenexttabisatabbox,thenthelinesforthattabaredraw natthistimeaswellasanyshadingthatmightapply.print(name);//thismethodwillprintthestring,text,atthecurrenttextcursorposition.//-2表示2倍1/100thsofaninch//na表示笔宽//tab(leftwidth:integer;Rightwidth:integer;topwidth :integer;bottomwidth:integer;shadeoverride:integer);tab(-2,na,-2,-2,na);print(name);//thismethodwillprintthestring,text,atthecurrenttextcursorposition.tab(na,na,-2,-2,na);print(number);tab(na,na,-2,-2,na);print(amount1);tab(na,-2,-2,-2,na);println(amount2);bold:=false;//{打印具有边框的数据}cleartabs;//settab(newpos:double;newjustify:tprintjustify;newwidth:double;newmargin:double;newlines:byte;newshade:byte);//boxlinenone=0;//boxlineleFt=1;//boxlineRight=2;//boxlineleFtRight=3;//boxlinetop=4;//boxlineleFttop=5;//boxlineRighttop=6;//boxlinenobottom=7;//boxlinebottom=8;//boxlineleFtbottom=9;//boxlineRightbottom=10;//boxlinenotop=11;//boxlinetopbottom=12;//boxlinenoRight=13;//boxlinenoleFt=14;//boxlineall=15;settab(0.5,pjleft,3.5,2,boxlineall,0);//boxlineall 表格中各个cell均有边框线settab(na,pjcenter,1.0,2,boxlineleFtRight,0);settab(na,pjRight,1.5,2,boxlineall,10);//具有阴影背景色settab(na,pjRight,1.5,2,boxlineall,0);fori1:=1to10dobeginstr(i1*1.23:2:2,s1);str(i1*98.76:2:2,s2);print(#9+lastname+inttostr(i1)+,);setFont(timesnewRoman,8);print(Firstnamem.);setFont(timesnewRoman,12);println(#9+inttostr(i1)+#9+$+s1+#9+$+s2);end;{for}//{打印具有阴影的数据}cleartabs;settab(0.5,pjleft,3.5,2,boxlinenone,0);//boxlinenon e表格中各个cell无边框线settab(na,pjcenter,1.0,2,boxlinenone,0);settab(na,pjRight,1.5,2,boxlinenone,0);settab(na,pjRight,1.5,2,boxlinenone,0);fori1:=11to20dobeginifodd(i1)thenbegintabshade:=0;//thispropertydefinesadefaulttabshadingthatwilloverridethetabshadingdefinedwithsett abbutnotoverridethesettingoftheshadeoverrideparameterofthetabmethod.tabshadecanbeu sefulforprintingbarredrowsofalternatingshadesbysettingtabshadebeforeeachlineisp rinted.endelsebegintabshade:=15;end;{else}str(i1*1.23:2:2,s1);。

Delphi数据库系统开发完全手册

Delphi数据库系统开发完全手册

图书目录
第二篇
章节
第三篇
章节
1.1 Delphi概述 31.2 Delphi 7的集成开发环境 41.2.1 熟悉Delphi 7开发环境 41.2.2 常用菜 单 51.2.3 工具栏 81.2.4 组件面板 91.2.5 对象检查器 121.2.6 代码编辑器 131.2.7 代码浏览 器 151.2.8 对象树状窗口 151.2.9 项目管理器 161.3 应用程序的开发过程 171.3.1 制作一个简单 的应用程序 171.3.2 构成Delphi 7项目的主要文件 211.3.3 构成Delphi 7项目的主要文件说明 21第2 章 面向对象的应用程序设计 242.1 面向对象的程序设计 242.1.1 对象的引入 242.1.2 Delphi提供的 对象 252.2 认识Delphi的窗体 262.3 窗体对象的主要属性 272.3.1 与窗体位置、大小有关的属性 272.3.2 与窗体客户区大小有关的属性 282.3.3 与窗体显示有关的属性 282.3.4 与窗体透明有关的属性 292.3.5 与窗体外观有关的属性 302.3.6 窗体的绘图属性 302.3.7 与窗体控制有关的属性 312.3.8 与窗体约束有关的属性 312.3.9 与窗体字体比例调整有关的属性 322.4 窗体的操作方法 322.4.1 窗体 对象的创建与释放 322.4.2 窗体对象的显示与隐藏 332.4.3 窗体对象的焦点设置 332.4.4 对象控制的 操作方法 342.5 窗体的事件处理 342.5.1 窗体激活时产生的相关事件 342.5.2 窗体关闭时产生的相关 事件 352.5.3 鼠标相关事件处理 362.5.4 键盘相关事件处理 372.5.5 拖动相关事件处理 382.6 应 用程序窗体组成 392.7 应用软件开发流程 45第3章 用户图形界面设计 473.1 可视化用户界面设计 473.1.1 界面设计基础 473.1.2 人机交互界面设计 483.1.3 人机交互界面举例 483.2 控件概述 503.2.1 控件分类 503.2.2 控件命名约定 503.2.3 控件的通用属性 513.2.4 控件的通用方法与事件 513.2.5 关于Tab键次序 523.2.6 关于焦点 523.3 使用控件数组 533.3.1 为何使用控件数组 533.3.2 定义控件数组 533.3.3 控件数组应用实例 533.

在Delphi中实现数据分析模块的动态报表

在Delphi中实现数据分析模块的动态报表

在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分别设为"报表输出"和"返回"。

Delphi利用ReportMachine报表控件制作小计和总计报表

Delphi利用ReportMachine报表控件制作小计和总计报表

Delphi利⽤ReportMachine报表控件制作⼩计和总计报表最近在做⼀个Delphi的发货清单的打印程序,其中涉及到需要计算清单的⼩计和总计的功能,⽂字难以表达清楚,上图吧:报表第⼀页的⼩计计算当前页⾯的商品价格总和,总计⽬前和⼩计⼀样是计算截⽌到当前页⾯的所有商品的⾦额和,下图为最后⼀页:这下⼤家明⽩了吧,就是要实现这样的报表。

废话不多说了,开始讲解我的思路:1.既然要计算⼩计,就是每页的⾦额和了,加⼊ReportMachine的计算⽂本框(TRMCalcMemoView),然后设置要汇总的字段值为数据字段“factSum”,然后选择计算⽂本框的属性⾯板中的“CalcOptions”选中“统计Brand”为要汇总的主项数据,统计类型为“合计(Sum)”,如图所⽰:2.最难的部分就是总计的计算,这不能简单的⽤计算⽂本框就能解决的,于是不得不⽤ReportMachine 的代码来处理,也就是在总计的⽂本框的OnBeforePrint事件中计算之前的⼩计⽂本框的值的和,然后赋值给总计⽂本框显⽰,先看下设计的报表:红⾊⽂字为两项总计的⽂本框的Name属性值。

下⾯是ReportMachine中⾃定义的OnBeforePrint事件函数代码如下:unit Report;varlValue,tValue: Double;//lValue=⾦额总计 tValue=税额总计procedure Memo1_OnBeforePrint(Sender: TObject);beginlValue:=lValue+CalcMemo1.CalcValue; //CalcMemo1为⾦额⼩计的⽂本框 TRMMemoView(Sender).Memo.Text := lValue; end;procedure Memo40_OnBeforePrint(Sender: TObject);begintValue:=tValue+CalcMemo2.CalcValue;//CalcMemo2为税额⼩计的⽂本框 TRMMemoView(Sender).Memo.Text := tValue; end;procedure Main;beginMemo1.OnBeforePrint:= Memo1_OnBeforePrint; //指定⾦额总计的⽂本框的OnBeforePrint事件的处理函数Memo40.OnBeforePrint:= Memo40_OnBeforePrint;//指定税额总计的⽂本框的OnBeforePrint事件的处理函数end;end.上⾯的代码先声明了两个事件函数⽤于计算两个累加的总计的值,然后赋值给相应的总计⽂本框;然后再Main中指定给总计⽂本框的事件,这样当打印总计之前先汇总赋值并打印。

Delphi中几种数据报表的生成方法

Delphi中几种数据报表的生成方法

Delphi中几种数据报表的生成方法
陈焕通
【期刊名称】《计算机时代》
【年(卷),期】2004(000)007
【摘要】本文介绍了Delphi环境中四种数据报表的生成方法,分析了各种方法的优劣性,并给出了几个简单的例子.
【总页数】2页(P45-46)
【作者】陈焕通
【作者单位】浙江师范大学计算机信息与工程学院,浙江,金华,321004
【正文语种】中文
【中图分类】TP312
【相关文献】
1.基于VB/Excel的数据报表生成及打印功能实现方法 [J], 杨晓春;丁一
2.数据报表的生成方法 [J], 曹淑芬
3.矿山遥感监测成果数据报表自动生成方法 [J], 刁明光; 赵元元; 赵丹宁; 刘芳; 王彦佐
4.一种城市基础设施安全监测数据报表的自动生成方法 [J], 李超;滕德贵;胡波
5.基于Doc模板的监测成果数据报表的自动生成方法研究 [J], 李超;袁长征;王大涛;肖兴国
因版权原因,仅展示原文概要,查看原文内容请购买。

Delphi编程实现Excel报表自动生成和发布

Delphi编程实现Excel报表自动生成和发布

Delphi编程实现Excel报表自动生成和发布文章介绍如何使用Delphi 编程通过定义报表内容描述、Excel 模板文件和服务器描述文件实现Oracle 数据库和Excel 模板文件的数据交换,并以Ftp 方式自动发布到Web 数据发布平台。

标签:Delphi;Excel模板;报表定义;Ftp1 引言随着计算机应用技术的快速发展,Excel 电子表格的普及,工作中常常需要从不同的信息管理系統中查询统计数据并以Excel 表格方式展现报表。

由于行业或者业务部门需求的变化,导致报表格式、种类繁多。

一些复杂报表,需求在软件开发期间都无法明确,为了解决此类问题,采用了表格功能强大的Excel 作为报表模板,Delphi 程序根据报表数据定义动态填入数据,完成数据填充后以Ftp 方式上传填写完数据的文件到Web 数据发布平台,从而实现Excel 报表的自动生成和发布功能。

2 实现原理2.1 按照业务部门的需求,根据需要的报表格式,编辑好Excel报表模板文件;根据报表的数据内容和区域,编写好报表定义文件。

2.2 以报表定义文件文件名作为运行的参数,在操作系统下创建批处理命令,并可以根据实际需要把批处理加入操作系统的计划任务,实现按程序自动运行。

2.3 程序根据报表定义文件的描述,主要做如下操作:①读取指定的Excel 模板文件;②到指定的数据库服务器查询数据并填充Excel 模板文件;③以Ftp 方式上传生成好的Excel报表文件到FTP服务器。

3 实现过程描述3.1 报表定义文件采用可扩展标记语言(XML文件描述),主要内容描述如下:report nameD:\xxxx\template_xxx.xlsD:\xxxx\xxxxxx.xls1ftp server nameftp remote dir……database name1n1,n2,n3,n4select col1,col2,… from table_name…………在Delphi 中使用控件解析方法生成XML 文件接口框架代码,通过生成的接口单元读取XML 文件,主要代码如下:Var xmlReport:IXMLReportType;//定义报表定义文件变量……xmlReport := LoadReport(报表定义XML文件);//读取报表定义文件if length(trim(xmlReport.Ftpserver))>0 then //是否指定FTP上传服务器uplaodFile(xmlReport.output);//上传文件到Ftp服务器……3.2 服务器定义文件文件格式同报表定义文件,主要内容及描述如下:server name user/pwd@ip:port:sid……ftp server namexxx.xxx.xxx.xxx215000usernamepassword……Delphi 处理该文件方法同上,根据指定服务器名称取查找服务器子节点,主要代码如下://根据指定的FTP名称,取服务器定义文件中FTP 中节点for i := 0 to xmlServers.Ftp.ChildNodes.Count - 1 do beginif (trim(xmlServers.Ftp.server[i].Name)= trim(serverName))then begin result := xmlServers.Ftp.server[i];exit;end;end;3.3 采用第三方數据库控件ODAC 访问Oracle 数据库ODAC 全称Oracle Data Access Components,是Oracle 数据存取组件,直接使用Oracle 接口(OCI),在应用中建立连接可以使用ODAC Net 选项无需在客户机上安装Oralce 客户端,仅需TCP/IP 支持,本次开发中使用了TOraSession 和TOraQuery 两个控件,主要代码如下:if oraSession.Connected then oraSession.Close;//关闭数据库连接oraSession.ConnectString := getOracleServerNode (OracleServerNname).ConnectString;//修改连接字串,函数getOracleServerNode 返回变量Oracle 服务器节点;oraSession.Connect;//连接数据库;ToraQuery 的使用方法同Delphi 中TQuery;3.4 Oracle 数据集填充Excel 数据区域根据指定数据区域和SQL语句向Excel模板文件中填写数据,注意点:SQL 语句运行结果和指定数据区域要一一对应。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

●图9-1 Rave Report5.0组件
图9-2 Select Rave Project File对话框
Engine属性:用于指定报表的引擎,该报表引擎在通过RvProject组件打印报表的时候使用,若这个属性没有被定义,一个默认的RvSystem将会被创建以填补该属性,TRvSystem和TRvNDRWriter对象都可以赋给这个属性。

2011-9-177
图9-3 Load Into Exe对话框
2011-9-1711
SystemOptions属性:用于控制RvSystem组件的配置情况,其各个属性的取值以及含义表9-2所示。

表9-1 SystemOptions中各个属性的取值以及含义
表9-2 SystemOptions中各个属性的取值以及含义2011-9-1712
图9-4 Rave Designer的主界面
2011-9-1722
●图9-5 Drawing页
●图9-6 Bar Code页
Standard页:该页中包含了一些基本的报表组件,如图9-7
●图9-7 Standard页
图9-10选择创建对象的类型图9-11 选择活动的连接
●图9-12 创建的DataView对象图9-13 Sample Table对话框
●第11步:单击“”按钮,显示调整页面边距和报表标题的对话框,如图9-16所示。

在Report Title中修改报表的标题为“结算报表”。

2011-9-1730
●图9-14 选择显示字段图9-15 调整字段出现的顺序
●第12步:单击“”按钮,打开选择报表字体的对话框,如图
9-17所示。

●第13步:选择完报表字体后,单击“”按钮创建报表。

创建
完成后在Page Designer中调整一下字段的位置即数据栏位置,以改进显示效果;接着修改数据标题的Text属性为中文形式,如图9-18所示,其中数据标题用于说明数据栏中每列数据表示的含义,在第一页的报表标题下面,在其它页位于报表页眉的下面。

2011-9-1731
●第14步:选择【File】|【Execute Report】命令,打开
Output Options对话框。

Output Options对话框用于设置输入参数,设置完成后单击“”按钮,即可看到报表预览的效果,如图9-19所示。

●图9-16 调整页面边距和报表标题图9-17 选择报表字体
●第15步:关闭预览窗口,选择【File】|【Save】命令,将
工程文件保存在应用程序的目录中,命名为reportjiesan.rav。

2011-9-1732

●图9-18 调整报表格式
2011-9-1733
●图9-19 报表预览的效果图9-20 Output Options对话框
●通过上例可以看出,采用Rave Report5.0进行报表开发十
分简单,只需要掌握报表设计过程中的几个要点即可以设计出满足各种实际需求的报表。

注意使用Rave Report5.0报表生成向导进行报表开发时,一般情况下都需要对报表格式进行一定的调整以及对界面进行美化,如上例中对Text组件和DataText组件位置进行了调整、表头文字及标题文字的美化。

2011-9-1735
图9-21 界面布局
图9-22 嵌套报表预览效果
2011-9-1743。

相关文档
最新文档