全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1817
推到 Plurk!
推到 Facebook!

請教兩個或多個資料表資料的比對問題

尚未結案
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-17 20:44:36 IP:63.84.xxx.xxx 未訂閱
請教各位前輩.    小弟目前在實做專案中, 遇到一些困難, 請教各位前輩, 勞煩幫忙解答. 目前在做一個薪資計算的系統, 因為薪水發放的制度是半月一次, 所以在第二次薪資計算出來后, 需要再做整個月的薪資總計, 并加入到整月合計的資料表中, 以用于處理所得稅和醫療保險之扣除動作和整月薪資合計的保存. 另外, 還有一個職員基本資料表, 存放職員的工號, 姓名, 對應上下半月薪資資料表中的工號, 姓名欄位, 即是一對一的索引, 小弟現在是做法是在每個月要處理薪資計算的時候, 將職員資料表中的工號和姓名欄位通過ADOQuery元件的Insert Into...Select...的SQL語法來加入空的薪資計算資料表(在薪資計算資料表不允許使用者刪除或新增資料), 因為涉及到修改部分的需要, 小弟需要做一個資料表內容的比對, 就是將職員資料表之鍵值欄位工號和薪資計算資料表的鍵值欄位工號做一個比對, 以職員資料表為依据, 增加或刪除薪資資料表中不一樣的資料, 請問該用何方法如何處理?     因為蠻急的, 所以還請各位前輩多多幫忙, 小弟萬分感謝!    ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-17 23:17:04 IP:211.76.xxx.xxx 未訂閱
您好: 如您所說 職員資料表中的工號和姓名欄位通過ADOQuery元件的Insert Into...Select...的SQL語法來加入空的薪資計算資料表 既然『在薪資計算資料表不允許使用者刪除或新增資料』 為何KEY值會不相同? 比對時 以職員資料表為依据 那就將『職員資料表』left join 『薪資計算資料表』 再丟至另一TABLE,參考看看
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-18 00:00:15 IP:63.84.xxx.xxx 未訂閱
感謝回應!    之所以需要比對, 是因為比如說使用者在薪資計算資料表中出現錯誤的現象, 此錯誤是由之前職員基本資料表中已經存在的, 但沒有修改就將職員基本資料表中的工號和姓名用之前提到的Insert Into...Select...方法寫進了薪資計算資料表中, 但在薪資計算資料表中, 是不允許使用者對工號和姓名兩個欄位進行更改, 所以只能在職員基本資料表中更改, 然后再用比對資料表的方法更新薪資計算資料表, 以執薪資計算資料表的完整性和正确性.    您所說的Left Join的方法, 可以舉個例子嗎?    感謝了!    ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-18 10:15:33 IP:211.76.xxx.xxx 未訂閱
您好: 如下語法 SELECT dbo.薪資計算表.姓名 AS [薪_姓名], dbo.薪資計算表.工號 AS [薪_工],dbo.職員資料表.工號 AS [職_工], dbo.職員資料表.姓名 AS [職_姓名] FROM dbo.薪資計算表 RIGHT OUTER JOIN dbo.職員資料表 ON dbo.薪資計算表.工號 = dbo.職員資料表.工號 將兩TABLE JOIN後 再利用程式逐筆比對 當[薪_姓名] <>[職_姓名],[薪_工]<>[職_工]時 將職員資料表的資料insert 到薪資計算表 以職員資料表為依據 所以薪資計算表應該不至於有刪除的情形吧 參考看看
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-18 10:34:38 IP:63.84.xxx.xxx 未訂閱
感謝回應﹒    那如果職員基本資料表中有若干筆資料被刪除﹐因為在薪資計算資料表中不能做刪除動作﹐所以一定要在職員資料表做刪除之后﹐再用此表為依据﹐對薪資計算資料表進行比對﹐如果在薪資資料表中出現的某筆資料﹐對應不上職員資料表中的資料﹐即職員資料表中找不到相關鍵值欄位的資料﹐則需要將薪資資料表中的此筆資料刪除﹒    還有一個需要﹐就是職員資料表中的姓名更改﹐也需要通過比對得知﹐再將更改的部分在薪資資料表中也做同樣的更新﹒    需要做的要求蠻多的﹐所以還有更好的比對方法嗎﹖感謝了﹗    ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-18 10:58:27 IP:211.76.xxx.xxx 未訂閱
您好 就小弟所知的比對方式有兩種 一、就是用SQL語法直接比對出來,但您的需求似乎難以完成 二、就是將需要的欄位JOIN出來,然後在依需要進行欄位的比對(如上述提供之方法) 您的需求雖然多,但第二種方式應該都可以達成 方法也許笨了點,但應該實用參考看看
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-18 11:17:53 IP:63.84.xxx.xxx 未訂閱
感謝回應﹒    小弟目前的工作情況是這樣的﹐通過使用在ComboBox中的選擇判斷TableName﹐然后用ADOTable去查詢對應的薪資資料表中是否為空的資料表﹐若是空表﹐則利用ADOQuery的相關SQL語法動態地將其職員資料表中相符的資料Insert Into到此表﹐若不是空的﹐則需要做兩個資料表的比對﹐以職員資料表為依据﹐刪除薪資資料表中工號對應不到職員資料表工號的資料﹐新增職員資表中新增入的資料至薪資資料表﹐更新薪資資料表中對應職員資料表中工號(鍵值欄位)沒有更改﹐但姓名更改的資料﹒目前相關的程式碼如下﹐但比對的部分不知道該如何寫﹐請各位前輩多多指教﹗
procedure TForm6.ComboBoxSelectMonthChange(Sender: TObject);
begin
  if ComboBoxSelectMonth.ItemIndex <> -1 then
    begin
      BitBtn1.Enabled := True;
      Case ComboBoxSelectMonth.ItemIndex of
        0 : begin
              TableName := 'Salary_Jan';
              TableNameFirst := 'Salary_Jan_First';
              TableNameSecond := 'Salary_Jan_Second';
            end;
        1 : begin
              TableName := 'Salary_Feb';
              TableNameFirst := 'Salary_Feb_First';
              TableNameSecond := 'Salary_Feb_Second';
            end;
        2 : begin
              TableName := 'Salary_Mar';
              TableNameFirst := 'Salary_Mar_First';
              TableNameSecond := 'Salary_Mar_Second';
            end;
        3 : begin
              TableName := 'Salary_Apr';
              TableNameFirst := 'Salary_Apr_First';
              TableNameSecond := 'Salary_Apr_Second';
            end;
        4 : begin
              TableName := 'Salary_May';
              TableNameFirst := 'Salary_May_First';
              TableNameSecond := 'Salary_May_Second';
            end;
        5 : begin
              TableName := 'Salary_Jun';
              TableNameFirst := 'Salary_Jun_First';
              TableNameSecond := 'Salary_Jun_Second';
            end;
        6 : begin
              TableName := 'Salary_Jul';
              TableNameFirst := 'Salary_Jul_First';
              TableNameSecond := 'Salary_Jul_Second';
            end;
        7 : begin
              TableName := 'Salary_Aug';
              TableNameFirst := 'Salary_Aug_First';
              TableNameSecond := 'Salary_Aug_Second';
            end;
        8 : begin
              TableName := 'Salary_Sep';
              TableNameFirst := 'Salary_Sep_First';
              TableNameSecond := 'Salary_Sep_Second';
            end;
        9 : begin
              TableName := 'Salary_Oct';
              TableNameFirst := 'Salary_Oct_First';
              TableNameSecond := 'Salary_Oct_Second';
            end;
        10: begin
              TableName := 'Salary_Nov';
              TableNameFirst := 'Salary_Nov_First';
              TableNameSecond := 'Salary_Nov_Second';
            end;
        11: begin
              TableName := 'Salary_Dec';
              TableNameFirst := 'Salary_Dec_First';
              TableNameSecond := 'Salary_Dec_Second';
            end;
      end;
      ADOTable1.Close;
      ADOTable1.TableName := TableName;
      ADOTable1.Open;
        if not ADOTable1.IsEmpty then
          begin
            BitBtn1.Caption := '進入薪資資料表';
          end
        else
          begin
            BitBtn1.Caption := '新增資料至薪資資料表';
          end;
    end
  else
    begin
      BitBtn1.Enabled := False;
    end;
end;    procedure TForm6.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Form2.Show;
end;    procedure TForm6.BitBtn1Click(Sender: TObject);
begin
  OldSQL := ADOQuery1.SQL.Text;
  if BitBtn1.Caption = '新增資料至薪資資料表' then
    begin
      Try
        ADOQuery1.Close;
        ADOQuery1.SQL.Text := StringReplace(ADOQuery1.SQL.Text, 'TableName1', TableName, [rfReplaceAll, rfIgnoreCase]);
        ADOQuery1.SQL.Text := StringReplace(ADOQuery1.SQL.Text, 'TableName2', 'Employee', [rfReplaceAll, rfIgnoreCase]);
        ADOQuery1.ExecSQL;            ADOQuery1.Close;
        ADOQuery1.SQL.Text := StringReplace(ADOQuery1.SQL.Text, TableName, TableNameFirst, [rfReplaceAll, rfIgnoreCase]);
        ADOQuery1.ExecSQL;            ADOQuery1.Close;
        ADOQuery1.SQL.Text := StringReplace(ADOQuery1.SQL.Text, TableNameFirst, TableNameSecond, [rfReplaceAll, rfIgnoreCase]);
        ADOQuery1.ExecSQL;
      Finally
        ADOQuery1.SQL.Text := OldSQL;
      end;
    end;
  Case ComboBoxSelectMonth.ItemIndex of
    0 : Form7.Show;
    1 : Form8.Show;
    2 : From9.Show;
    ....略
  end;
  Form6.Hide;
end;
P.S ADOQuery的預設SQL String的內容是﹕ Insert Into TableName1 Select Idno, Name From TableName2 Where Salary_Style='Salary By Month' 目前動態將職員資料Insert Into到一個空的薪資計算資料表中沒有問題﹒小弟目前的專案部分卡在這里了﹐還請各位前輩多多幫忙指教﹗ 萬分謝謝﹗ <><>===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-19 01:39:54 IP:63.84.xxx.xxx 未訂閱
您好!    勞煩各位前輩指點一下小弟, 感謝了!    ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-19 16:21:06 IP:211.74.xxx.xxx 未訂閱
印象中可以這樣下SQL delete from 薪資 where 薪資.EmpID Not in (select 職員.EmpId from 職員) 來刪除對應不到的記錄 我是雪龍
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-10-22 01:37:25 IP:63.84.xxx.xxx 未訂閱
感謝兩位指教!    ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
系統時間:2024-05-04 17:18:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!