• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發(fā)教程 > 詳細頁面

        用Delphi的Tquery控件充分發(fā)揮數(shù)據(jù)庫系統(tǒng)SQL技巧

        用Delphi的Tquery控件充分發(fā)揮數(shù)據(jù)庫系統(tǒng)SQL技巧

        更新時間:2022-05-16 文章作者:未知 信息來源:網(wǎng)絡 閱讀次數(shù):

        綜觀現(xiàn)有的RAD工具——Microsoft的Visual Basic、Sybase的PowerBuilder及Inprise的Delphi,它們都提供了相應的數(shù)據(jù)庫控件。軟件開發(fā)人員利用這些控件可以有效、方便地實施數(shù)據(jù)庫編程,但編寫高效及功能強大的數(shù)據(jù)庫應用軟件應該直接、動態(tài)地利用數(shù)據(jù)庫管理系統(tǒng)的SQL功能。

          下例的程序是在Delphi 4.0上開發(fā)的一個相對簡單的人事管理軟件的一部分,它能夠滿足復雜的動態(tài)查詢、條件打印,實現(xiàn)全活動的工資字段管理和復雜計算功能。

          Delphi訪問數(shù)據(jù)庫,一般通過Borland數(shù)據(jù)庫引驚(BDE,Borland DataBase Engine),通過BDE可以訪問客戶機/服務器數(shù)據(jù)庫,如Microsoft SQL、Oracle、Sybase、DB2等,及本地數(shù)據(jù)庫,如Access、Paradox、dBase等。本例采用的數(shù)據(jù)庫是Sybase SQL Anywhere5.0。但應該指出的是,由于各個數(shù)據(jù)庫系統(tǒng)的功能不一樣,在編程考慮軟件移植性的時候應注意使用標準isql,還要利用當前數(shù)據(jù)庫的特殊功能。

          在Delphi里,可以直接發(fā)揮數(shù)據(jù)庫SQL語句功能的控件除了Tquery,還有TupdateSQL、TstoredSQL等,利用這些控件可以實現(xiàn)查詢、計算外,還可以建立、修改數(shù)據(jù)庫表等等。本文以Delphi的Tquery控件為例,通過下面兩段程序實現(xiàn)動態(tài)查詢、復雜計算的方法,闡述數(shù)據(jù)庫編程應充分發(fā)揮數(shù)據(jù)庫系統(tǒng)功能這一概念。

          程序中用到的兩個控件說明:

          * Tquery控件:name屬性為DynamicQuery,如果用以查詢,RequestLive屬性為False,如果用以更改則要求RequestLive屬性為True。

          * TdataSource控件:name屬性為DynamicSource,DataSet屬性為DynamicQuery。


          一、 動態(tài)查詢的實現(xiàn)



          圖一

          {下面程序是“執(zhí)行查詢”按鈕被按下后的響應程序。它首先根據(jù)上圖復合條件對話框生成的條件生成復雜的連接兩表的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 單位編號,部門編號,行政級別編號,工作時間,出生日期,發(fā)放日期');

           DynamicQuery.Open;

        {DbgridDlg對話框根據(jù)DBGrid數(shù)據(jù)源的不同顯示不同的結果}

           DBgridDlg.DBGrid.DataSource := DataFrm.DynamicSource;

           if DBgridDlg.ShowModal = mrOK then

           begin

           Tryjbqk.DisableControls;

           Tryjbqk.Locate('身份證',DynamicQuery.FieldByName('身份證').Value,[]);

           Tryjbqk.EnableControls;

           end;

           end;

          end;

          end;


          二、動態(tài)計算、修改數(shù)據(jù)庫記錄的實現(xiàn)



          圖二

          {下面的過程是在用戶按下“產(chǎn)生復合條件”按鈕后執(zhí)行的,它的任務是調用生成復
        合條件的對話框,并將結果返回給工資項計算定義表(下面有解釋)的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(執(zhí)行的限制條件,即該項定義的計算只對符合條件的工資表記錄進行計算)
        等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;

          {下面的過程是在用戶按下“加單一工資項值表達式”按鈕后執(zhí)行的,
        它的任務是調用標準的輸入的對話框,并將用戶輸入的簡單算術表達式加到工資項計算表
        達式上}

          procedure TGzxFzjsDlg.AddSingleExpClick(Sender: TObject);

          var

          InputValue :String;

          begin

          InputValue := InputBox('工資項值運算表達式輸入框','#1,#2--#40、數(shù)字、
        運算符組成,如#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;

          {下面的過程是在用戶按下“清空計算表達式”按鈕后執(zhí)行的,它的任務是計算表達
        式清空}

          procedure TGzxFzjsDlg.SpeedButton4Click(Sender: TObject);

          begin

           DataFrm.Tgzxjs.Edit;

           GzxFzjsDlg.Expression.Text := '';

           DataFrm.TgzxjsSingleExp.AsString := '';

           DataFrm.Tgzxjs.Post;

          end;

          {下面的過程是在用戶按下“加合計函數(shù)表達式”按鈕后執(zhí)行的,它的任務是調用生
        成合計函數(shù)表達式的的SUMExpressionDlg對話框,這里使用的合計函數(shù)有合計值(SUM)
        、平均值(AVG)、最大值(MAX)、最小值(MIN)、記錄數(shù)(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;

          {下面的過程是在用戶按下“執(zhí)行當前工資項計算”按鈕后執(zhí)行的,它的任務是對話
        框顯示的被定義工資項,對工資表中的該字段根據(jù)條件表達式和計算表達式進行重新計
        算}

          procedure TGzxFzjsDlg.OKBtnClick(Sender: TObject);

          begin

          if DataFrm.Sgzxjs.State IN [dsEdit,dsInsert] then

           ShowMessage('記錄正在編輯或插入狀態(tài),現(xiàn)退回!')

          else

          begin

          if Data.Confirm('真的需要根據(jù)條件和表達式對工資項 '+DataFrm.TgzxjsGzx.Value+' 執(zhí)行工資項賦值嗎?') 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;

          {下面的過程是在用戶按下“執(zhí)行批量計算”按鈕后執(zhí)行的,它的任務是對工資項
        計算定義表中所定義的、并且批量處理標志為真的所有工資字段根據(jù)批量處理順序、
        條件表達式和計算表達式進行重新計算}

          procedure TGzxFzjsDlg.Button1Click(Sender: TObject);

          begin

          if DataFrm.Sgzxjs.State IN [dsEdit,dsInsert] then

           ShowMessage('記錄正在編輯或插入狀態(tài),現(xiàn)退回!')

          else

          begin

          if Data.Confirm('真的需要執(zhí)行批量工資項賦值嗎?') 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. 

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 亚洲激情在线观看| 亚洲成a人片77777老司机| 亚洲日本人成中文字幕| 91精品全国免费观看含羞草| 亚洲av永久无码精品古装片| a视频在线观看免费| 精品久久久久久亚洲| 黄页免费在线观看| 97亚洲熟妇自偷自拍另类图片| 91人成网站色www免费下载| 亚洲视频在线观看网站| 91精品成人免费国产片| 狠狠色香婷婷久久亚洲精品| 免费的一级片网站| 看免费毛片天天看| 亚洲综合精品网站在线观看| 国产A∨免费精品视频| 无码专区—VA亚洲V天堂| 久久笫一福利免费导航| 亚洲精品无码日韩国产不卡av| 国产一区二区三区无码免费| 人人公开免费超级碰碰碰视频 | 巨胸喷奶水视频www免费视频| 亚洲国产无套无码av电影| 香蕉免费一区二区三区| 亚洲国产成人精品青青草原| 在线播放免费播放av片| 一级女性全黄生活片免费看| 久久久久亚洲av无码专区导航| 毛片免费观看网址| 九九久久精品国产免费看小说 | 丁香花在线观看免费观看| 朝桐光亚洲专区在线中文字幕 | 久久亚洲精品无码aⅴ大香| 动漫黄网站免费永久在线观看| 国产大陆亚洲精品国产| 亚洲VA中文字幕无码毛片| 国产成人A在线观看视频免费| 国产精品永久免费视频| 亚洲欧洲国产成人精品| 婷婷亚洲天堂影院|