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

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.

亚洲高科技公司正在分享惠普、戴尔和IBM的云“午餐” Groupon创业启示:进军海外,请三思 天才之为责任:Unity CEO谈论Unity 4.0游戏引擎 中文版Evernote百宝箱上线:开发者海外推广新渠道 360产品被爆收集用户隐私 桌面安全路在何方 销售额达一万亿元 阿里巴巴成世界最大电商 共享软件海外营销策略与实战分析(武汉站)成功落幕 你未必知道的CSS故事:揭开leading的面纱 2013年 影响Web发展的5类API 《Warcraft是怎样炼成的》:多人对战、战争迷雾以及AI HBTC精彩回顾 Hadoop专家分享大数据技术工具与最佳实践 苹果iTV规格泄露:iOS应用开发的新蓝海 Facebook觊觎微信鼻祖WhatsApp,但谈不上收购 首款社交API应用 Facebook Messenger for Firefox正式上线! 共享软件海外营销策略与实战分析(沈阳站)成功落幕 移动之伤:为什么山寨游戏比原创更火? IBM在京发布PureData 主打数据交易处理、操作分析 Intel发布Hadoop免费版 全力拓展生态圈 突出图片搜索:微软向测试人员开放Socl社交搜索 豌豆荚创始人:和巨头竞争,我们拼产品和技术 “互联网女皇”报告解读:智能电视大趋势 苹果扩大其北卡罗莱纳州燃料电池发电场规模 Oracle回收站使用全攻略 微软这次很诚实:IE真的糟透了 Facebook进军短信业务,挑战微信鼻祖WhatsApp 从菜鸟到专家的五步编程语言学习法 亚马逊企业文化:从书贩到云服务巨头的催化剂 明年Google I/O大会日程敲定 或发Android“酸橙派”? 绝境求生,WebOS寄望Android Facebook在移动路上走过的那些弯路 曙光聂华:推动数据融合 VB在ACCESS中应用的一个小问题! ACCESS中的FORMS问题? 再普通不过的一个问题 delphi6中还有BDE和ADO吗?它们被淘汰了吗?现在还有必要用它们来学数据库的开发吗? 50分答谢!!!---这个css定义为什么会出现这样的效果??? 各位:怎么判断表里某个字段是否存在? 纯技术问题:精通“书签“与“层“的大虾请进!!!! 一个奇怪的现象,请教高手这是怎么回事? 哪里有破解清华五行卫士密码的软件? vc++7.0好用吗? 吃完晚饭了... 可不可以让 CppWebBrowser1的背景不是白色? 热热热!!!热疯了!!! 我的喇叭哪儿去了? 我的PB程序出了问题了!!! sql server中哪个函数是用于字符串与整型之间转换的? 我想限定文本输入框只能输入10个汉字或20个英文字符,但文件输入框却只能输入10个英文字符,如何解决? 当我将这样的字符串“dsdsdsdfsdffsdsdfsdfsfdsdfsdfsfsfdsdffs.....”放入我的表格中时,无论怎样设置也不折行,影响了部局,如何解决? MFC中视图(view)是怎样随着主窗口的大小改变而改变的。 急!请教!!猫猫连接,用数据管道同时访问两库,访问不到对方的网络库(sybase) 关于电影下载 我已经把一个exe文件加入到我自己的程序中了,请问在我的程序中应该样调用该exe文件呢? 哪位高手知道RTF格式的含义?或者更好,知道Rxlib中的RXRICHEDIT控件中识别RTF格式的方法? Delphi编写的DLL在VC下不能使用 请问哪儿有电工的<>的电子版下载?我只有这么多了 msdn2001年4月版的讨论 请问哪儿有电工的<>的电子版下载? 请教高手!!!! 请进 各位:周末愉快!为何我的多表查询用updatebatch提交时总是报错? 我不明白!!!! 请问,BAS 与 VBJ 有什么区别吗?为何他们安装在同一个目录呢? 如何得到系统进程的列表? vi下如何撤销操作? 我们知道MFC中的对象序列化做得很好,不知在DELPHI中怎样来实现对象的序列化? 我已经学过C++,想学VC++请问哪本书入门比较好啊? 欢迎使用技巧酷skillstore beta 1.00 有个可以显示IP的QQ,很不可思议,讨论一下好吗? 怎样在程序运行的时候加上参数,比如说双击文本文件打开记事本 谁有运行后烧硬件的程序 用VC开发如何实现网页的同步浏览呢? 动态产生的datawindow怎样调整它的显示? 怎么从ORACLE白痴到高手 怎样通过程序员考试??????? 庆祝北京成功 COM基础问题 感谢huangguanshu回答我的问题,请进来拿这200分 老问题了,access to SQLserver 关于的js问题(高分相送) 谁有运行后烧硬件的程序,要多少分都给. 请高手赐教, DDDW 的问题 ?谁有运行后烧硬件的程序,要多少分都给. 含FeS265%的硫铁矿在煅烧时有1.8%的硫损失而混入炉渣,二氧化硫转化为三氧化硫的利用率为99%.由这种硫铁矿制2t98%的硫酸,需硫铁矿多少吨?老师时这么算的 根据硫元素守恒 fes2~2so2~2so3~2h2so4120 98 3²-1²=4*2 7²-3²=10*4 10²-5²=15*5 a²-b²=( ) (1-1/2²)(1-1/3²)(1-1/4²)(1-1/5²)……(1-1/2007²)(1-1/2008²)要过程! 在250mL HgCl2溶液里放入75gCu片,反应一段时间后,把Cu片从溶液中取出洗净干燥,称其质量为76.37g.取上述溶液25mL,向其中加入0.2mol/L AgNO3溶液20mL两者恰好完全反应.有一段我看不懂):由反应前后氯 用公式法解方程:x²-(3+2 √ 3)x+5+3√ 3 已知 a+b=3,则a²-b²+6b的值是 1.把含有某一种氰化物杂质的Mgcl2粉末47.5溶于水,与足量硝酸银溶液反应,生成沉淀氯化银150mg,则该氯化镁中的杂质可能是 氯化铝 氯化钠 氯化钾 氯化钙 2 .在碘酸碘中,碘元素呈+3和+5两种价态, 用公式法解方程:x²-2ax-b²+a²=0 若a²+2a+b²-6b+10=0,求a²-b²的值 有Na2CO3和K2CO3的混合物12.52g,与足量盐酸反应,产生2.24L(S.T.P)CO2,求混合物中Na2CO3的百分含量.(要有过程) 计算:x²-√3 x+3/4=0用公式法解哟 已知a²+b²+4a+6b+13=0,求a,b的值 求简洁方法4%的NAOH溶液500g与足量盐酸反应,可生成多少摩尔NaCl?要求不求NaCl质量直接求物质的量,麻烦说明为什么,我上课没听懂谢谢. x²-1X-1=0用公式法怎么计算 已知a+b=3则a的²-b的²+6b的值为 由甲醇和乙醇组成的混合液体1.24g,加入足量的钠充分反应后,共产生标准状况下的气体336mL,则原混合物中甲醇和乙醇的物质的量之比为-----------------------------( )A、2:1 B、1:2 C、1:4 D、3:1 公式法 0.2x²+5=二分之三X可以两边同时乘10,再用公式法计算吗,结果还正确吗? 2a²+6b²=3,则a+b的最小值是 在MgCl2、KCl、K2SO4三种盐的混合溶液中,若K+、Cl-各为1.5mol,Mg2+为0.5mol,则SO42-的物质的量为………………………………………………………………( )A.0.1mol \x05B.0.5mol \x05C.0.15mol \x05D.0.25mol 用公式法解 x²+2根号5/x+10=0 已知a+b=5.ab=3,求a ²+b ²的值 高一化学题(说明理由)一定量的CH4燃烧后得到CO,CO2,H2O(g),其质量共为49.6克,将它缓慢通过浓硫酸时浓硫酸增重25.2克,试求原混合气体中CO2的质量? x²-根号二x -四分之一=0 要用公式法解. 已知a+b=5,ab=3,求a²+b²的值 元素A的原子核内质子数和中子数相等,最高价氧化物的化学式为A2O5,它形成的气态氢化物的密度为0.759g/L(标准情况).(1)写出元素符号及在周期表中的位置. 4y²-(根号2+8)y+根号2=0 速求! 已知a+b=5,ab=3,求,a²+b²的值 6题思路 计算2²-5乘5分之1+|-2| 谢谢 已知a+b=3,ab=1,求(a-b)²的值 是什么思路呢? 1.5²+2.2²=()² 已知(a-b)²=3,ab=-1/2,求(a+b)²的值 解这个方程:3(x-5)²=2(5-x) 1×2×3×4+1=5²=(1²+3×1+1)²2×3×4×5+1=11²=(2²+3×2+1)²;3×4×5×6+1=19²=(3²+3×3+1)²;4×5×6×7+1=29²=(4²+3×4+1)² …… (1)根据你的 已知ab满足a+b= 3,ab=2,求a²+b²的值 解方程:4(x-3)²-(x-3)²=2(x-5)(x-1) 1²+2×1×2+2²=3² 2²+2×2×3+3²=5² 3²+2×3×4+1²+2×1×2+2²=3² 2²+2×2×3+3²=5² 3²+2×3×4+4²=7²发现了什么规律 用数学语言叙述 已知a=3+2√2,b=3-2√2,则a²b-ab²的值为? 5(x²-x)=3(x²+x) 用因式分解法解、x有两个值、写过程 (√5-√3)²+√60-(√2+1)(√2-1) a+b=3,ab=2求a²+b²的值 化简:①(x+2)(x-5)+(x+3)(x+4) ②解分式方程:x+1/x-1-4/x²-1=1 1=1² 1+3=2².1+3+5.+2011=? 如果a²-ab=3,b²+ab=2,那么a²+b²的值是多少? 3√2+|3-√2|-√﹙﹣5﹚²请学霸多多指教!3√2+|3-3√2|-√﹙﹣5﹚².sorry,刚刚打错了! ﹙√5+1﹚﹙√5-1﹚,﹙2-√7﹚﹙2+√7﹚,﹙2√3+1﹚²,√3-√2/√3+√2 己知a²+ab=3 ,b²+ab=2,求a²+b²的值 3(×-5)²=2(5-×)怎么求 4(a+b)²-9(a+3)(a-3)+5(a-1)²,其中a=-1应该是4(a+2)²-9(a+3)(a-3)+5(a-1)²,其中a=-1 若|a+3|+(b-2)²=0,求ab的值. 分析下每个选项 思路.·已知Na2SO4和NaCl的混合溶液中,Cl-的物质的量浓度是Na+的物质的量浓度的0.6倍,则下列叙述中正确的是(    ) A.SO42-离子和CL-离子的物质的量之和等于Na+的物质的量B. (√3+2√5)²-(2√5-√3)² a+b=5,ab=3(1)...(2)...(3)求(a²-b²)² 请详细分析每一个选项在一定条件下,一定量的A和B气体发生如下可逆反应:2A(g)+3B(g)=3C(g),只有反应平衡才具有的性质是( )A.各物质的浓度之比为2:3:3B.混合物各物质浓度的浓度相等C.A、B、C -2又3/4*(-0.5)²/(-1/2)²*(-4/15)-1 1²+2²+3²+4²+5² +···+n²=? 就是物质的量,和离子大量共存的问题的解题方法.最好有例题 (-15³)+[(-3)²-(2-5²)×3] 1×3+1=2²,3×5+1=4²,2×4+1=3²,4×6+1=5²…,请找出规律,并用含有一个字母的式子表示出来.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn