大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 用Delphi的Tquery控件充分发挥数据库系统SQL功能

用Delphi的Tquery控件充分发挥数据库系统SQL功能

时间: 2021-07-31 作者:daque

通观现有的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 = mrok then    begin    tryjbqk.disablecontrols;    tryjbqk.locate('身份证',dynamicquery.fieldbyname('身份证').value,[]);    tryjbqk.enablecontrols;    end;    end;   end;   end;   二、动静计划、窜改数据库记载的实行   图二   {底下的进程是在用户按下“爆发复合前提”按钮后实行的,它的工作是挪用天生复 合前提的对话框,并将截止归来给报酬项计划设置表(底下有证明)的subquery字段, 并表露到如图上“#3> =0”表露的memo框上 }   procedure tgzxfzjsdlg.generatingcomplexbtnclick(sender: tobject);   begin   { 挪用天生搀杂表白式的对话框,即(一)图 所示的对话框 }   if mergeconditiondlg.showmodal = mrok then   begin   { tgzxjs 为 class(ttable),是一个寄存报酬项字段计划表白式的表, 它由gzx(对应报酬表中的报酬项)、bh(计划设置的编号,同声也确定批量计划的程序 )、iscurrent(在批量处置时能否被计划)、singleexp(大略的计划表白式,本质的 表白式因为在该本子的delphi中不许平常处置text字段,而以文献情势被寄存在硬盘上)、 subquery(实行的控制前提,即该项设置的计划只对适合前提的报酬表记载举行计划) 等5字段构成,该表的subquery字段被窜改后,机动挪用一个进程,将对应的计划表白式 简略 }    datafrm.tgzxjs.edit;    if mergeconditiondlg.maincondition.text = '' then    begin    if mergeconditiondlg.subcondition.text = '' then    datafrm.tgzxjssubquery.asstring := ''    else    datafrm.tgzxjssubquery.asstring := '身份证 in (select 身份证 from 职员基 本情景 where '+ mergeconditiondlg.subcondition.text+') ';    end    else    begin    if mergeconditiondlg.subcondition.text = '' then    datafrm.tgzxjssubquery.asstring := mergeconditiondlg.maincondition.text    else    datafrm.tgzxjssubquery.asstring := '('+mergeconditiondlg.maincondition.text+') and (身份证 in (select 身份证 from 职员基础情景 where '+ mergeconditiondlg.subcondition.text+')) ';    end;   end;   end;   {底下的进程是在用户按下“加简单报酬项值表白式”按钮后实行的, 它的工作是挪用规范的输出的对话框,并将用户输出的大略算术表白式加到报酬项计划表 达式上}   procedure tgzxfzjsdlg.addsingleexpclick(sender: tobject);   var   inputvalue :string;   begin   inputvalue := inputbox('报酬项值演算表白式输出框','#1,#2--#40、数字、 演算符构成,如#3、(#3+#8)*0.15、#4-#6+#40+18之类:','');   datafrm.tgzxjs.edit;   gzxfzjsdlg.expression.text := gzxfzjsdlg.expression.text + inputvalue;   datafrm.tgzxjssingleexp.value := datafrm.tgzxjssingleexp.value + inputvalue;   datafrm.tgzxjs.post;   end;   {底下的进程是在用户按下“清空计划表白式”按钮后实行的,它的工作是计划表白 式清空}   procedure tgzxfzjsdlg.speedbutton4click(sender: tobject);   begin    datafrm.tgzxjs.edit;    gzxfzjsdlg.expression.text := '';    datafrm.tgzxjssingleexp.asstring := '';    datafrm.tgzxjs.post;   end;   {底下的进程是在用户按下“加核计因变量表白式”按钮后实行的,它的工作是挪用生 成核计因变量表白式的的sumexpressiondlg对话框,这边运用的核计因变量有核计值(sum) 、平衡值(avg)、最大值(max)、最小值(min)、记载数(count)等5种,并将截止 加到计划表白式}   procedure tgzxfzjsdlg.addsumexpclick(sender: tobject);   begin   with sumexpressiondlg do   begin   if showmodal = mrok then   begin    datafrm.tgzxjs.edit;    case calstyle.itemindex of {calstyle是囊括上述5种核计表白式的选项控件}    0: //即sum    begin    gzxfzjsdlg.expression.text := gzxfzjsdlg.expression.text + '(select sum('+sumexpression.text+') from 报酬表 where '+datafrm.tgzxjssubquery.asstring+')';    datafrm.tgzxjssingleexp.asstring := datafrm.tgzxjssingleexp.asstring + 'sum('+sumexpression.text+')';    end;    1: //即avg    begin    gzxfzjsdlg.expression.text := gzxfzjsdlg.expression.text + '(select avg('+sumexpression.text+') from 报酬表 where '+datafrm.tgzxjssubquery.asstring+')';    datafrm.tgzxjssingleexp.asstring := datafrm.tgzxjssingleexp.asstring + 'avg('+sumexpression.text+')';    end;    2: //即max    begin    gzxfzjsdlg.expression.text := gzxfzjsdlg.expression.text + '(select max('+sumexpression.text+') from 报酬表 where '+datafrm.tgzxjssubquery.asstring+')';    datafrm.tgzxjssingleexp.asstring := datafrm.tgzxjssingleexp.asstring + 'max('+sumexpression.text+')';    end;    3: //即min    begin    gzxfzjsdlg.expression.text := gzxfzjsdlg.expression.text + '(select min('+sumexpression.text+') from 报酬表 where '+datafrm.tgzxjssubquery.asstring+')';    datafrm.tgzxjssingleexp.asstring := datafrm.tgzxjssingleexp.asstring + 'min('+sumexpression.text+')';    end;    4: //即count    begin    gzxfzjsdlg.expression.text := gzxfzjsdlg.expression.text + '(select count('+sumexpression.text+') from 报酬表 where '+datafrm.tgzxjssubquery.asstring+')';    datafrm.tgzxjssingleexp.asstring := datafrm.tgzxjssingleexp.asstring + 'count('+sumexpression.text+')';    end;    end;    datafrm.tgzxjs.post;   end;   end;   end;   {底下进程经过相应双击鼠标将对应的算术演算符+、-、x、/、(、)加到计划表 达式 }   procedure tgzxfzjsdlg.addoperationalcharacterdblclick(sender: tobject);   begin   datafrm.tgzxjs.edit;   gzxfzjsdlg.expression.text := gzxfzjsdlg.expression.text + listbox2.items[listbox2.itemindex];   datafrm.tgzxjssingleexp.asstring := datafrm.tgzxjssingleexp.asstring + listbox2.items[listbox2.itemindex];   datafrm.tgzxjs.post;   end;   {底下的进程是在用户按下“实行暂时报酬项计划”按钮后实行的,它的工作是对话 框表露的被设置报酬项,对报酬表中的该字段按照前提表白式和计划表白式举行从新计 算}   procedure tgzxfzjsdlg.okbtnclick(sender: tobject);   begin   if datafrm.sgzxjs.state in [dsedit,dsinsert] then    showmessage('记载正在编纂或插入状况,现归还!')   else   begin   if data.confirm('真的须要按照前提和表白式对报酬项 '+datafrm.tgzxjsgzx.value+' 实行报酬项赋值吗?') then   begin   mypromptfrm.show; //表露进度和图片   mypromptfrm.update;   try   datafrm.dynamicquery.close;   datafrm.dynamicquery.sql.clear;   datafrm.dynamicquery.sql.add('update 报酬表 set '+datafrm.tgzxjsgzx.value+' = '+gzxfzjsdlg.expression.text);   if datafrm.tgzxjssubquery.asstring 〈〉 '' then    datafrm.dynamicquery.sql.add(' where '+datafrm.tgzxjssubquery.asstring) ;   datafrm.dynamicquery.execsql;   finally   mypromptfrm.close;   end;   datafrm.tgz.refresh;   end;   end;   end;   {底下的进程是在用户按下“实行批量计划”按钮后实行的,它的工作是对报酬项 计划设置表中所设置的、而且批量处置标记为真的一切报酬字段按照批量处置程序、 前提表白式和计划表白式举行从新计划}   procedure tgzxfzjsdlg.button1click(sender: tobject);   begin   if datafrm.sgzxjs.state in [dsedit,dsinsert] then    showmessage('记载正在编纂或插入状况,现归还!')   else   begin   if data.confirm('真的须要实行批量报酬项赋值吗?') then   begin   mypromptfrm.show;   mypromptfrm.update;   try    datafrm.tgzxjs.first;    while not datafrm.tgzxjs.eof do    begin    if datafrm.tgzxjsiscurrent.value = 1 then    begin    datafrm.dynamicquery.close;    datafrm.dynamicquery.sql.clear;    datafrm.dynamicquery.sql.add('update 报酬表 set '+datafrm.tgzxjsgzx.value+' = '+gzxfzjsdlg.expression.text);    if datafrm.tgzxjssubquery.asstring 〈〉 '' then    datafrm.dynamicquery.sql.add(' where '+datafrm.tgzxjssubquery.asstring) ;    datafrm.dynamicquery.execsql;    end;    if datafrm.tgzxjsgzx.value = '#37' then    gz.jssds;    datafrm.tgzxjs.next;    end;   finally    mypromptfrm.close;   end;   datafrm.tgz.refresh;   end;   end;   end;   end. 

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.