在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

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

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

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

更新時間:2022-05-16 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(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可以訪問客戶機/服務(wù)器數(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控件為例,通過下面兩段程序?qū)崿F(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控件將結(jié)果響應在顯示窗口上。生成打印報表原理也一樣}

  procedure TMainFrm.ExcuteQueryBtnClick(Sender: TObject);

  var

  condition:String;

  begin

  { MergeConditionDlg就是上圖所示的對話框}

  if MergeConditionDlg.ShowModal = mrOK then

  begin

   { MainCondition.Text為上圖“編輯主設(shè)限條件”顯示的內(nèi)容}

   if MergeConditionDlg.MainCondition.Text = '' then

   begin

   { SubCondition.Text為上圖進入“子條件構(gòu)造”對話框生成的內(nèi)容 }

   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ù)源的不同顯示不同的結(jié)果}

   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í)行的,它的任務(wù)是調(diào)用生成復
合條件的對話框,并將結(jié)果返回給工資項計算定義表(下面有解釋)的SubQuery字段,
并顯示到如圖上“#3> =0”顯示的Memo框上 }

  procedure TGzxFzjsDlg.GeneratingComplexBtnClick(Sender: TObject);

  begin

  { 調(diào)用生成復雜表達式的對話框,即(一)圖 所示的對話框 }

  if MergeConditionDlg.ShowModal = mrOK then

  begin

  { Tgzxjs 為 Class(Ttable),是一個存放工資項字段計算表達式的表,
它由gzx(對應工資表中的工資項)、bh(計算定義的編號,同時也決定批量計算的順序
)、isCurrent(在批量處理時是否被計算)、SingleExp(簡單的計算表達式,實際的
表達式由于在該版本的Delphi中不能正常處理Text字段,而以文件形式被存放在硬盤上)、
SubQuery(執(zhí)行的限制條件,即該項定義的計算只對符合條件的工資表記錄進行計算)
等5字段組成,該表的SubQuery字段被修改后,自動調(diào)用一個過程,將對應的計算表達式
刪除 }

   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í)行的,
它的任務(wù)是調(diào)用標準的輸入的對話框,并將用戶輸入的簡單算術(shù)表達式加到工資項計算表
達式上}

  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í)行的,它的任務(wù)是計算表達
式清空}

  procedure TGzxFzjsDlg.SpeedButton4Click(Sender: TObject);

  begin

   DataFrm.Tgzxjs.Edit;

   GzxFzjsDlg.Expression.Text := '';

   DataFrm.TgzxjsSingleExp.AsString := '';

   DataFrm.Tgzxjs.Post;

  end;

  {下面的過程是在用戶按下“加合計函數(shù)表達式”按鈕后執(zhí)行的,它的任務(wù)是調(diào)用生
成合計函數(shù)表達式的的SUMExpressionDlg對話框,這里使用的合計函數(shù)有合計值(SUM)
、平均值(AVG)、最大值(MAX)、最小值(MIN)、記錄數(shù)(COUNT)等5種,并將結(jié)果
加到計算表達式}

  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;

  {下面過程通過響應雙擊鼠標將對應的算術(shù)運算符+、-、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í)行的,它的任務(wù)是對話
框顯示的被定義工資項,對工資表中的該字段根據(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í)行的,它的任務(wù)是對工資項
計算定義表中所定義的、并且批量處理標志為真的所有工資字段根據(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)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 男女裸体影院高潮| 国产乱子夫妻xx黑人xyx真爽| 夜夜添无码一区二区三区| 亚洲最大成人在线观看| 精品中文字幕av| www.com毛片| 大西瓜av在线| 999在线免费视频| 黄色免费网址大全| 中文字幕乱码人妻综合二区三区 | 国产精品嫩草影院8vv8| 日本黄色福利视频| 蜜臀av色欲a片无码精品一区 | 欧美 日韩精品| 无码人妻丰满熟妇区毛片| 欧美深夜福利视频| 深爱五月综合网| 青青草视频在线免费播放| 日韩日韩日韩日韩日韩| 亚欧无线一线二线三线区别| 黄色片视频在线播放| 欧美日韩一区二区在线免费观看| 黄色片一级视频| 无需播放器的av| 亚洲美免无码中文字幕在线| 一起操在线视频| dy888午夜| av网站在线不卡| 亚洲综合20p| 中文字幕av专区| 樱空桃在线播放| 久久久久久久久久久视频| 欧美三级理论片| 水蜜桃在线免费观看| 日本人视频jizz页码69| 免费观看国产视频在线| 国产精品亚洲αv天堂无码| 老司机久久精品| 久草视频国产在线| 国产aⅴ爽av久久久久| 蜜臀av无码一区二区三区| 妓院一钑片免看黄大片| 日韩精品福利片午夜免费观看| 日本精品一区二区三区四区| 国产高清免费在线| 手机在线免费毛片| 国产女女做受ⅹxx高潮| 四虎永久免费网站| 免费看a级黄色片| 国产女女做受ⅹxx高潮| 天天在线免费视频| 欧美成人乱码一二三四区免费| 亚洲人成无码网站久久99热国产| 国产一区二区在线观看免费视频| 日本日本19xxxⅹhd乱影响| 亚洲精品国产久| 中文字幕av专区| 最近免费中文字幕中文高清百度| 菠萝蜜视频在线观看入口| 久久久久久人妻一区二区三区| 九九精品久久久| 一级特黄性色生活片| 337p粉嫩大胆噜噜噜鲁| 免费人成在线观看视频播放| 91视频福利网| 亚洲黄色片免费看| 亚洲天堂网2018| 日韩av卡一卡二| 天天干天天爽天天射| 99热这里只有精品在线播放| mm1313亚洲国产精品无码试看| 夫妻免费无码v看片| 亚洲自偷自拍熟女另类| 日本午夜激情视频| 国产极品尤物在线| 无码aⅴ精品一区二区三区浪潮 | 天天爱天天做天天操| 日本成人性视频| 天堂av在线中文| 成人网站免费观看入口| 激情伊人五月天| 国产精品亚洲αv天堂无码| 99精品视频播放| 精品日韩久久久| 99精品视频免费版的特色功能| 天堂v在线视频| 我的公把我弄高潮了视频| 青青草原av在线播放| 日本黄网站免费| 第一区免费在线观看| 激情六月天婷婷| 日韩免费毛片视频| 国产乱女淫av麻豆国产| 国产又粗又长又爽视频| 精品久久久久久久久久中文字幕| 人妻无码视频一区二区三区| 国产精品视频分类| 国产女教师bbwbbwbbw| 50路60路老熟妇啪啪| √天堂资源在线| www..com日韩| 毛片毛片毛片毛片毛| 久久精品免费一区二区| 肉色超薄丝袜脚交| 好吊妞无缓冲视频观看| 亚洲精品在线视频播放| 日本免费不卡一区二区| 青娱乐国产精品视频| 欧美一区二区三区爽大粗免费| 国产在线观看中文字幕| 丰满人妻中伦妇伦精品app| 欧美在线a视频| 日本激情视频在线| 国产精品网站免费| 成年人视频大全| 色婷婷一区二区三区av免费看| 国产精品网站免费| 国产精品一二三在线观看| 天堂av8在线| 欧洲av无码放荡人妇网站| 日本黄网站色大片免费观看| 久热精品在线观看视频| av网址在线观看免费| 国产美女在线一区| 国产在线拍揄自揄拍无码| 亚洲欧美自拍另类日韩| 一本久道中文无码字幕av| 丝袜老师办公室里做好紧好爽 | 五月婷婷丁香综合网| 日本在线视频www| 久久国产成人精品国产成人亚洲| wwwwww欧美| 日本熟妇人妻xxxx| 精品无码一区二区三区爱欲| 黄色网在线视频| 成人精品视频在线播放| 国产传媒久久久| 日本美女爱爱视频| bt天堂新版中文在线地址| 男人天堂网站在线| 欧美男女爱爱视频| 99999精品视频| 男人舔女人下面高潮视频| 国产成人精品无码播放| 婷婷丁香激情网| 久久久精品高清| 欧美日韩一区二区三区电影| 肉大捧一出免费观看网站在线播放| 日本丰满少妇黄大片在线观看| 桥本有菜av在线| 日本福利视频网站| 欧美日韩亚洲一| 成年人三级黄色片| 久久天天东北熟女毛茸茸| 99er在线视频| 男人操女人逼免费视频| 亚洲免费看av| 日韩在线视频在线| 日批视频在线免费看| 亚洲无在线观看| www.日本在线视频| 人妻无码视频一区二区三区| 天天色天天综合网| www插插插无码视频网站| 爱情岛论坛亚洲首页入口章节| 日韩成人av免费| 国内性生活视频| 欧美性受xxxx黑人猛交88| 国产精品丝袜久久久久久消防器材| www.色就是色| 人人妻人人做人人爽| 国产永久免费网站| 欧美大片在线播放| 性做爰过程免费播放| 成人免费无码av| 欧美国产日韩激情| 青娱乐国产精品视频| 国产真人无码作爱视频免费| 亚洲黄色网址在线观看| 国产成人精品视频ⅴa片软件竹菊| 日韩第一页在线观看| 国产日产欧美视频| 国产在线视频在线| 波多野结衣免费观看| 亚洲一区二区蜜桃| 欧美亚洲国产成人| 国产一区二区三区小说| 亚洲无在线观看| 奇米影音第四色| 男人插女人下面免费视频| 国产aaa免费视频| 国内精品国产三级国产aⅴ久| 人妻无码视频一区二区三区| 成年人网站免费视频| 欧美国产综合在线| 日韩极品视频在线观看| 欧洲xxxxx| 人妻无码一区二区三区四区| 91亚洲一区二区| 熟妇熟女乱妇乱女网站|