線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1409
推到 Plurk!
推到 Facebook!

有關比對資料庫有無相同資料問題

答題得分者是:pedro
Fen
一般會員


發表:18
回覆:17
積分:7
註冊:2003-10-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-20 10:26:47 IP:61.219.xxx.xxx 未訂閱
各位大大: 我現在要做一個功能,是讓使用者修改DBGrid中的資料,當使用者按下存檔後,先去比對資料庫中有無相同的資料,但是因為DBGrid一變更,游標一移動,就會自動存回資料庫,所以不管怎麼比對都有資料;若將Locktype改成ltBatchOptimistic,則在第一筆修改後按存檔,他會跑去比對第二筆,下面附上我程式,請各位大大幫忙一下,看我哪裡有錯。 tableDetail2D.First; while not tableDetail2D.Eof do begin if QueryCheck.Active then QueryCheck.Active := False; QueryCheck.SQL.Clear; begin QueryCheck.SQL.Add('SELECT A.* , B.* FROM MoldIssueNotice A,MoldIssueNoticePartsDetail B'); QueryCheck.SQL.Add('WHERE A.IssueNotice=B.IssueNotice AND DevCode = :PARA1 AND Gender = :PARA2 AND Size = :PARA3 '); QueryCheck.SQL.Add('AND MoldPurpose = :Para4 AND MoldCycle = :Para5 '); end; QueryCheck.Parameters.ParamByName('PARA1').Value := txtDevCode.Text; QueryCheck.Parameters.ParamByName('PARA2').Value := txtGender.Text; QueryCheck.Parameters.ParamByName('PARA3').Value := txtSize.Text; QueryCheck.Parameters.ParamByName('PARA4').Value := DBGridDetail2D.Fields[5].AsInteger; QueryCheck.Parameters.ParamByName('PARA5').Value := DBGridDetail2D.Fields[6].AsString; QueryCheck.Active := True; if not QueryCheck.Eof then begin MessageDlg('部位編號: ' IntToStr(tableDetail2D.FieldValues ['PrtId']) ',開模目的:' tableDetail2D.FieldValues ['MoldPurpose'] ',模具輪次:' tableDetail2D.FieldValues ['MoldCycle'] ',於系統中存在相同記錄!! (開模通知單編號: ' IntToStr(QueryCheck.FieldValues['IssueNotice']) ' )', mtInformation, [mbOK], 0); exit; end else begin tableDetail2D.Next; end; end; 我是用D5 SQLServer!!
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-20 11:06:01 IP:210.61.xxx.xxx 未訂閱
Fen您好, 您這段程式碼是不是放在要檢查的table之OnBeforePost事件之中? 還有遇到資料庫有相同資料時, 是否用abort使程式不去post相同資料 到table裡?    
tableDetail2D.First;
while not tableDetail2D.Eof do
  begin
    if QueryCheck.Active then
       QueryCheck.Active := False;
       QueryCheck.SQL.Clear;
     begin
       QueryCheck.SQL.Add('SELECT A.* , B.* FROM MoldIssueNotice   
                      A,MoldIssueNoticePartsDetail B');
       QueryCheck.SQL.Add('WHERE A.IssueNotice=B.IssueNotice AND 
            DevCode = :PARA1 AND Gender = :PARA2 AND Size = :PARA3 ');
       QueryCheck.SQL.Add('AND MoldPurpose = :Para4 AND MoldCycle 
            = :Para5 ');
     end;     QueryCheck.Parameters.ParamByName('PARA1').Value := txtDevCode.Text;
 QueryCheck.Parameters.ParamByName('PARA2').Value := txtGender.Text;
 QueryCheck.Parameters.ParamByName('PARA3').Value := txtSize.Text;
 QueryCheck.Parameters.ParamByName('PARA4').Value := 
                                  DBGridDetail2D.Fields[5].AsInteger;
 QueryCheck.Parameters.ParamByName('PARA5').Value := 
                                   DBGridDetail2D.Fields[6].AsString;
 QueryCheck.Active := True;     if not QueryCheck.Eof then
   begin
      MessageDlg('部位編號: '   IntToStr(tableDetail2D.FieldValues
      ['PrtId'])   ',開模目的:'   tableDetail2D.FieldValues
      ['MoldPurpose']  ',模具輪次:'   tableDetail2D.FieldValues
      ['MoldCycle']  ',於系統中存在相同記錄!! (開模通知單編號: '    
      IntToStr(QueryCheck.FieldValues['IssueNotice'])   ' )', 
      mtInformation, [mbOK], 0);
     exit;
   end
   else
   begin
      tableDetail2D.Next;
   end;
   end;
chun0che
一般會員


發表:0
回覆:2
積分:0
註冊:2003-05-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-20 11:35:46 IP:61.219.xxx.xxx 未訂閱
您好~ 將此段程式放在tableMaster2D的BeforePost內試試~
Fen
一般會員


發表:18
回覆:17
積分:7
註冊:2003-10-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-20 11:52:11 IP:61.219.xxx.xxx 未訂閱
我試過了,可是會出現stack overflow的錯誤訊息,這是什麼意思呢?
ying0515
中階會員


發表:90
回覆:168
積分:81
註冊:2003-01-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-20 11:57:59 IP:61.218.xxx.xxx 未訂閱
stack overflow可能是無窮回圈造成! 將TQuery改成CacheUpdate用批次Update資料庫, 或用TClientDataSet. Delphi follower
------
Delphi
Fen
一般會員


發表:18
回覆:17
積分:7
註冊:2003-10-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-20 12:06:30 IP:61.219.xxx.xxx 未訂閱
我用的是ADOQuery,應該要如何做ㄋ? 抱歉,新手問題比較多
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-20 12:20:35 IP:210.61.xxx.xxx 未訂閱
Fen 我的看法是, 您在OnBeforePost裡 用另一個TADOQuery用SQL語法限定調閱的範圍 然後去判斷adoquerycheck.RecCount數就知道有無重複資料 因為您在BeforePost用 while not tableDetail2D.Eof do ...... 這會導致效能不彰 所以在這檢驗程式碼能儘量縮小範圍, 那是最好的 也或許可以解決您的stack overflow訊息
chun0che
一般會員


發表:0
回覆:2
積分:0
註冊:2003-05-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-20 12:23:57 IP:61.63.xxx.xxx 未訂閱
不好意思~沒看清楚您用的元件! 發表人 -
ying0515
中階會員


發表:90
回覆:168
積分:81
註冊:2003-01-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-20 15:30:38 IP:61.218.xxx.xxx 未訂閱
TADOQuery and TClientDataSet範例可參考官方範例 \Delphi7\Demos\Ado\AdoTest\AdoTest.dpr Delphi follower
------
Delphi
系統時間:2024-06-29 14:24:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!