综观现有的RAD工具——Microsoft的Visual Basic、Sybase的PowerBuilder及Inprise的Delphi,它们都提供了相应的数据库控件。软件开发人员利用这些控件可以有效、方便地实施数据库编程,但编写高效及功能强大的数据库应用软件应该直接、动态地利用数据库管理系统的SQL功能。
下例的
程序是在Delphi 4.0上开发的一个相对简单的人事管理软件的一部分,它能够满足复杂的动态
查询、条件打印,实现全活动的工资字段管理和复杂计算功能。
Delphi访问数据库,一般通过Borland数据库引驚(BDE,Borland DataBase Engine),通过BDE可以访问客户机/服务器数据库,如Microsoft SQL、Oracle、Sybase、DB2等,及本地数据库,如Access、Paradox、dBase等。本例采用的数据库是Sybase SQL Anywhere5.0。但应该指出的是,由于各个数据库系统的功能不一样,在编程考虑软件移植性的时候应注意使用标准isql,还要利用当前数据库的特殊功能。
在Delphi里,可以直接发挥数据库SQL语句功能的控件除了Tquery,还有TupdateSQL、TstoredSQL等,利用这些控件可以实现
查询、计算外,还可以建立、修改数据库表等等。本文以Delphi的Tquery控件为例,通过下面两段
程序实现动态
查询、复杂计算的方法,阐述数据库编程应充分发挥数据库系统功能这一概念。
程序中用到的两个控件说明:
* Tquery控件:name属性为DynamicQuery,如果用以
查询,RequestLive属性为False,如果用以更改则要求RequestLive属性为True。
* TdataSource控件:name属性为DynamicSource,DataSet属性为DynamicQuery。
一、 动态
查询的实现
图一
{下面程序是“执行
查询”按钮被按下后的响应
程序。它首先根据上图复合条件对话框生成的条件生成复杂的连接两表的SQL语句,然后利用Tquery控件将结果响应在显示窗口上。生成打印报表原理也一样}
procedure TMainFrm.ExcuteQueryBtnClick(Sender: TObject);
var
condition:String;
begin
{ MergeConditionDlg就是上图所示的对话框}
if MergeConditionDlg.ShowModal = mrOK then
begin
{ MainCondition.Text为上图“编辑主设限条件”显示的内容}
if MergeConditionDlg.MainCondition.Text = '''' then
begin
{ SubCondition.Text为上图进入“子条件构造”对话框生成的内容 }
if MergeConditionDlg.SubCondition.Text = '''' then
condition := ''''
else
condition := ''身份证 IN (SELECT 身份证 FROM 人员基本情况 WHERE ''+ MergeConditionDlg.SubCondition.Text+'') '';
end
else
begin
if MergeConditionDlg.SubCondition.Text = '''' then
condition := MergeConditionDlg.MainCondition.Text
else
condition := ''(''+MergeConditionDlg.MainCondition.Text+'') AND (身份证 IN (SELECT 身份证 FROM 人员基本情况 WHERE ''+ MergeConditionDlg.SubCondition.Text+'')) '';
end;
with DataFrm do
begin
DynamicQuery.Close;
DynamicQuery.SQL.Clear;
DynamicQuery.SQL.Add(''SELECT * FROM gzdaView '');
if (condition〈〉 '''') then
DynamicQuery.SQL.Add(''WHERE 身份证 IN (SELECT 身份证 FROM 人员基本情况 WHERE ''+condition+'') '');
DynamicQuery.SQL.Add('' ORDER BY 单位编号,部门编号,行政级别编号,工作时间,出生日期,发放日期'');
DynamicQuery.Open;
{DbgridDlg对话框根据DBGrid数据源的不同显示不同的结果}
DBgridDlg.DBGrid.DataSource := DataFrm.DynamicSource;
if DBgridDlg.ShowModal =