说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

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

HTML文档下载 WORD文档下载 PDF文档下载
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 1 DO

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 SG11 DO

BEGIN

QUERYTB1.FIRST;

FOR J:=2 TO K-1 DO

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 SG11 DO

BEGIN

FOR J:=1TO K-1 DO

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 SGLL DO

BEGIN CELLS[0

0]:=’单位’{填写第0行各列标题}

CELLS[1

0]:=’总人数’;

CELLS[2

0]:=’固定’;

CELLS[3

0]:=’合同’;

CELLS[4

0]:=’干部’;

CELLS[5

0]:=’工人’;

FOR I:=1 TO 5 DO

BEGIN

CELLS[I

1]:=INTTOSTR(0);

END;

END;

WITH QUERYTB1 DO

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 K DO

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.

一张图让你知道大数据的生态系统 Camera360开放SDK:拍照和滤镜一行代码搞定 一周消息树:计算机将拥有五感 人类面临威胁? 通晓数学的人就可以当程序员吗? 360发布企业版4.0 可自定义软件白名单 不要总是依赖机器 MongoDB扩展彰显分片功夫 Dell与HP的OpenStack的战略:渠道对抗SLA 路况电台王雷:未来车载系统会是Android的天下 移动周报:2012移动开发工具系列盘点 谷歌不愿错失机会 Android或不再成它人独享 黑客文化:Facebook公布2012年Hackathon大赛顶级“黑客作品” 中国移动音乐开放平台正式对外开放 GitLab 4.0发布 更好地支持PostgreSQL 傻瓜式移动应用开发平台:专访摩讯创始人赵健 日本DeNA进军中国智能电视,与海信战略合作 扎克伯格不仅为Poke编码,而且还“献声” Wordament:首款支持Xbox Live成就的iPhone游戏 使用Storm实现实时大数据分析! 孙博凯:微软日益开放,Windows Azure更加拥抱开源 大数据计算:如何仅用1.5KB内存计算十亿个不同的对象 我们为什么爱EC2和S3却彻底抛弃EBS 不畏Surface:诺基亚明年或推Windows平板 Linus Torvalds:用户程序被破坏永远是Kernel的问题! Python高效编程技巧 苹果加速硬件迭代 iPad5原型机曝光 宏碁推99美金平板 价格创历史新低 黑莓10全键盘版代号N系列,谍照泄露! 那些年我们用过的互联网产品 QQ亿级业务演变:从文件、音视频说起 少年企鹅的成长之旅:QQ体验设计发展史 全球超算Top 500:Linux已占93.8%,Windows或将消失 搞不定了,7456..来回切换窗口状态的问题, 有源码 友情链接,我的网站http://fullstrong.myetang.com/ 请问RTDB(实时数据库和商用数据库的区别) 各位高手,请问在Tomcat下怎么解决中文问题? XML如何实现曲线图、饼图、梯形图的表示? “红萝卜的胳膊白萝卜的腿”谁听过? 问一个语法的问题? 读入文本的回车和换行为什么都没有了 类似HTML为扩展名的有哪几种文件 安装php+Mysql+Apache时出现的一个小问题,请高手指教! 取url中?后参数的javascript函数是什么? 怎么样来控制声道,如左声道,右声道,立体声? 简单问题,能介绍一下dual吗?? 新操作系统,老编程工具 这样能兼容吗? applet请教 衷心祝愿正在找工作的朋友们心想事成 浪费了几百份了,从来没人回答这个问题,窝气阿,up以下也好啊?????? 米卢是神奇的,中国队更神奇! 有谁知道哪里可以下载PDF Reference Manual中文版? 请教各位大虾! 怎样能把oracle数据库中的所有用户表的结构以及主键外键信息导出为sql 脚本? 踢得真不公平,真是21人踢我们一个人! 友情链接,我的网站http://fullstrong.myetang.com/ VB里面怎么编译出,不用安装的运行程序,请问在那里设置?(上限5分,人人有分)? 哪位大师知道在VC中怎样实现视频捕捉功能 有谁知道mp3的压缩和解压缩算法 问一下关于文件图标的问题。 pb6.5,win2000中文板,Oracle817.在oracle中连接数据库正确。在pb中连接数据库错误。什么内存出错,还有pbo7360.dll acess error之类的错 急!!请问如何将扩展名为PLB的文件转换为SQL文件 关于datagrid的selecteditem事件 谁能告诉我如何给回答对的人加分呀,散分啦 有谁知道哪里可以下载PDF Reference Manual中文版? 文件上传,然后把文件中的数据写入数据库,怎样做到。 问一个很菜的问题 100分在线等待:请介绍resin 如何在listview在作模糊查询。100分 ODBC下正确,BDE下出错?为什么?分数不够可以再加 项目中的角色 vb中怎样终止一个正在运行的应用程序? ADO编程,怎么把SQL Server里的DateTime取到windows的SYSTEMTIME或time_t里? 简单问题!Webbrowser控件 谁用过在那里加?还有程序中怎么打开如“http://www.csdn.net”的页? 小问题,抢分呀 将一个数据库a1的记录追加到另一个数据库a2记录后面的SQL语句怎么写? 怪事! 求助:如何在一个已经存在的数据库中增加一个列(即增加一个属性)?? 字符串打印时换行如何避免中文字符被分成两半? 请高手进入解决“不能拨号上网”的问题? 两个存放在不同目录中的ini文件用什么方法比较起来比较方便? 如何用vb语言实现把sql server 2000中的数据导出成dbf 文件格式 如何指定float 型的小数点后位数(比如2位) redhat7.3 Kdevelop2.1中为什么设置断点不起作用? 在酸、碱、盐的反应中,一定是复分解反应吗?如题... 请给详细一点的回答..说明下原因.. 谢谢! TS是什么意思 有机化合物的结构简化,写出下列物质的化学式 什么是超自然现象? ts 什么意思 写出厨房中的有机物.你能写这些有机物的化学式吗? 某个超自然现象小知识 科学家们相信,每10人中有1人会经历灵魂出窍体验,他们中的5% 将因这种体验获得超感官知觉 (ESP).大部分灵魂出窍体验发生在实际或可能的濒死之时.常有病人报告在手 TS是什么意思啊 一列火车从静止开始做匀加速直线运动,有一人站在站台上从第一节一列火车从静止开始做匀加速直线运动,有一人站在站台上从第一节车厢的前段观察,第一节车厢通过他历时2s,全部车厢通过 超自然现象有哪些?还有那些很快就能用心算出来的天文数字的人是具备超自然现象么? 请问用硫酸做电解液的蓄电池的原理是什么 请写出几种厨房里的有机物(化学式)请问酒精(C2H5OH)算吗?不是有料酒的吗? 超自然现象有那些? 铅蓄电池常期使用为什么会导致电解液硫算的损耗?不是充电时又生成硫酸了吗? 一列火车从静止开始做匀加速直线运动,有一人站在站台上从第一节车厢的前端观察.第一节车厢通过他历时2s,全部车厢通过他历时6s.试求:(1)这列火车共有几节车厢?(2)最后2s内有几节车 超自然现象都有哪些? 自制延时照明开关电路图问题我按照这个电路图做了个延时照片开关,可是做好后不管打还是关闭开关,灯泡都是亮的,区别就是断开开关后灯泡的亮度降低了,并没有延时关闭,请问各位这是怎 一列火车从静止开始做匀加速直线运动,一人站在第一节车厢前观察,第一节车厢通过他历时2s一列火车从静止开始做匀加速直线运动,一人站在第一节车厢前观察,第一节车厢通过他历时2s,全部 如图所示,在半径为R的油桶外绕了几圈绳子,在绳的引出端还加了一水平拉力F,使油桶沿水平地面滚动一周.在这个过程中,拉力F所做的功为( )A.0 B.2πRF C.πRF D.4πRF 照明用二个开关控制一盏灯线路图一个开关三个点有一捆线接开关另一点谁知道是那个点 一列火车从静止开始做匀加速直线运动,一个人站在第一列车厢前观察到第一节车厢通过他历时2S,全部列车通过他历时6S,那么这列火车共有车厢( )A.6节 B.8节 C.9节 D.10节请会的解说下,并说明 陆永以总成绩394kg夺取金牌,他的抓举成绩是180kg,挺举成绩是214kg,估计他在挺举全过程中对杠铃做功是多少? 酸,碱,盐溶液能够导电只是靠可以自由移动的正离子 判断对错 一列火车从静止开始做匀加速直线运动,有一人站在站台上从第一节车厢的前端观察.一列火车从静止开始做匀加速直线运动,有一人站在站台上从第一节车厢的前端观察.第一节车厢通过他历时 以“燃放鞭炮的利与弊”写一篇论文要求约在3000 如何把乙酸,乙醇,水,乙酸乙脂分离开来 ⒈如图所示使一薄钢下端固定,现分别用不同的力去推它,使其发生(a)、(b)、(c)、(d)各图所示的形变.如果F1=F3=F4>F2,那么说明力的作用效果跟力的作用点有关的图是---------------------- 酸、碱、盐之间反应都是复分解反应吗? 怎样才能把乙酸乙脂和无水乙醇分离开来? 酸,碱,盐的水溶液中的自由电荷是()和() 某汽车刹车后至停止的加速度大小为7m/s2,刹车线长14M1 求初始速度V0大小2 该车从刹车停下来的时间T TS清晰版中英双字是什么意思 某旅客以1.5m/s的速度在火车车厢内行走.当车厢静止时,他从车厢的头走到车厢的尾需20s;当火车以10m/s的...某旅客以1.5m/s的速度在火车车厢内行走.当车厢静止时,他从车厢的头走到车厢的尾需20s 家用照明线路应该是火线进开关吗? p()()ts这是什么词 一列火车以15m/s的速度匀速前进,运动的路线是直线,已知车厢的长为20m,乘客以5m/s的速度在车厢内跑,则( )a乘客用4s从车头跑到车尾b乘客用1s从车头跑到车尾c乘客用2s从车头跑到车尾d乘客从车 铺设家庭照明线路需要电工几级就是普通装修房子 铺设照明线路需要维修电工几级可以干这个活如果是家庭照明线路有损坏 比如短路 漏电维修电工初级能查得出原因 修的好不? 下载时说的TS中字TC中字是什么意思 电动车天能牌硅胶电池能不能加电解液 .青石棉是一种致癌物质 .主要是下面D 答案怎么为什么对?.青石棉是一种致癌物质,为Na2Fe5Si8O22(OH)2 .青石棉用稀硝酸溶液处理时,还原产物只有NO,下列说法正确的是 ( )A.青石棉不属于硅酸盐原料 有机物的化学式C H N O 等的先后 火车5m/s速度 第一节前端经站台上旅客处时 加速 加速度2m/s第一节车厢经此用2s 问第五节经此用多少时间 力)如图,人箱共重900N,人在箱中,人要用多大的力拉动绳子,才能使自己和吊篮在空中保持静止?两个滑轮都是定滑轮吗?图中有哪些承重绳? 石棉是一级致癌物质,温石棉硅酸钙板可以用在公共建筑吗? 聊天中ts是什么意思? 快啊.急质量为4t的汽车,在平直的公路上运动时,受地面的支持力为3.92x10的四次方N,受到的阻力为6x10³N,汽车的牵引力为7x10³,求汽车所受的合力是多大? 青石棉(cricidolite)是世界卫生组织确认的一种致癌物质,是《鹿特丹公约》中受限制的46种化学品之一,青石棉的化学式为:Na2Fe5Si8O22(OH)2,青石棉用稀硝酸溶液处理时,还原产物只有NO,下列 硫酸铵受热分解到底成什么?怎么这么乱? 1.小明在电视节目中看到了一种体育运动:有一个人把自己悬挂在一根很长的橡皮绳下,自由地在空中上下一次所用的时间似乎是总是一样的.小明很想证明自己的观察结果的正确性,甲,乙,丙, Nacl溶液中含有少量的Na2CO3用适当的什么可以把Na2CO3除去? 硫酸铵受热分解生成什么? 炎热的夏季 在公园门口会有许多商贩为躲避阳光在地面上固定一把太阳伞 一阵大风吹来 伞被“吸”而变形 这是为什么 用什么鉴别乙酸和乙醇 石棉是硅酸盐某石棉的化学是为Ca2MgXSiYO22(OH)2 钙2镁x硅y氧22氢氧根2问x与y的值分别是?要解析 怎么计算扭矩轴啊? 如何鉴别乙酸乙醇 硅酸盐中没有sio2晶体,那为什么硅酸盐如青石棉会有sio2的性质? 复分解反应是不是只是发生在酸,碱,盐中? 怎样鉴定乙酸和乙醇为什么金属锌可以鉴定?硝酸钠不可以? 为何滑石可以做润滑剂,而同为硅酸盐的石棉性质却有很大不同,从其结构上如何说明滑石是一种硅酸盐,从滑石的结构上怎么解释这个?我只能说出它的硬度很低,具体结构上找不到资料来说明
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘