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

將資料表Copy到新的資料表再清除資料

答題得分者是:Justmade
sword185
一般會員


發表:36
回覆:81
積分:23
註冊:2002-06-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-26 10:04:30 IP:61.221.xxx.xxx 未訂閱
請問各位先進: 小弟用ADOQuery元件連接Access資料庫 Q1:想將其中的一個資料表(業績)Copy到新的資料表(200303業績表),如何 編撰程式碼呢? Q2:再將原本的資料表(業績)裡面的數值資料全部清除,如何編撰程式碼 呢?
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-26 10:14:21 IP:218.16.xxx.xxx 未訂閱
用sql就可以 (用 ADOQuery.SQL.Text := 'select...', ADOQuery.ExecSQL) Q1 select * into 業績表200303 from 業績 Q2 delete from 業績
sword185
一般會員


發表:36
回覆:81
積分:23
註冊:2002-06-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-26 11:14:34 IP:61.221.xxx.xxx 未訂閱
不好意思..若 Q1:Copy過去的資料表(200303業績表),剛好有重複的資料表,想做確認覆蓋的動作,如何編撰程式碼呢? Q2:想原本的資料表(業績)裡面的數值資料想留兩個資料欄位的數值, 例如:(日期、姓名、洗髮、染髮、剪髮、燙髮、總業績),想留下(日期、姓名)的資料欄位,如何編撰程式碼呢?
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-26 11:43:53 IP:210.243.xxx.xxx 未訂閱
引言: Q1:Copy過去的資料表(200303業績表),剛好有重複的資料表,想做確認覆蓋的動作,如何編撰程式碼呢? Q2:想原本的資料表(業績)裡面的數值資料想留兩個資料欄位的數值, 例如:(日期、姓名、洗髮、染髮、剪髮、燙髮、總業績),想留下(日期、姓名)的資料欄位,如何編撰程式碼呢?
1.要select into到暫存的table前先drop這個暫存table 2.執行select into 3.在執行insert into tmp select 日期、姓名 from 業績
sword185
一般會員


發表:36
回覆:81
積分:23
註冊:2002-06-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-26 11:51:24 IP:61.221.xxx.xxx 未訂閱
可以Show出 完整的程式碼嗎?
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-26 12:29:27 IP:218.16.xxx.xxx 未訂閱
不要用數字作名稱的開頭,很多語言不支援的很容易出錯。所以建議將200303業績表改為業績表200303,或在數字前加一字母    
引言: Q1:Copy過去的資料表(200303業績表),剛好有重複的資料表,想做確認覆蓋的動作,如何編撰程式碼呢?
procedure button1Click(Sender : TObject);
begin
  ADOQuery1.SQL.Text := 'Select * from 業績表200303'
  try
    ADOQuery1.Active := true; // 若沒這個table會跳過下面 finally 之前的程式碼
    if MessageBox(Handle,'已有該月資料,覆寫?','覆寫資料',MB_YESNO   MB_ICONQUESTION) = MRNO then
      exit // 若不覆寫則離開程序
    else
    begin
      ADOQuery1.Active := false;
      ADOQuery1.SQL.Text := 'drop table 業績表200303'; // 覆寫則先刪掉原資料表
      ADOQuery1.ExecSQL;      
    end;
  finally
    ADOQuery1.Active := false;
    ADOQuery1.SQL.Text := 'select * into 業績表200303 from 業績';
    ADOQuery1.ExecSQL;
  end;
end;
引言: Q2:想原本的資料表(業績)裡面的數值資料想留兩個資料欄位的數值, 例如:(日期、姓名、洗髮、染髮、剪髮、燙髮、總業績),想留下(日期、姓名)的資料欄位,如何編撰程式碼呢?
這樣做很大問題的,因為你刪除了洗髮等資料但不刪除日期姓名的話,沒有節省資料空間,而且到四月時你抄過 業積表200304 的資料會包括這些三月份的姓名日期,越積越多,引來資料混亂。建議將日期及姓名記錄在另一檔案。 select 日期、姓名 into 過往記錄 from 業績 記得這句要在 delete from 業績前執行。 修改: 1. 灟了紅色部份 2. 用Delphi執行時若沒有業積表200303會出現錯誤,但當獨立執行 exe 時不會出現。 發表人 - Justmade 於 2003/03/26 12:38:58
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-26 13:08:06 IP:210.243.xxx.xxx 未訂閱
引言: 可以Show出 完整的程式碼嗎?
流程可以是這樣 刪除old temp table -->產生tmp table 結構 -->將資料存入tmp table 用sql語法比較快而且單純,也可以在delphi裡面操控ttable,tfield物件逐欄 逐行處理. "可以Show出 完整的程式碼嗎?" 這.... 同學,良心的建議,先從流程去想好,程式碼最好自己多try try, 建議可行的流程給您,程式碼甚至是sql語法的部分 還是最好自己身體力行一番,真的... 不然,講嚴重一點,下次碰到類似的情況,你要怎麼辦呢? 加油,加油,加油.
sword185
一般會員


發表:36
回覆:81
積分:23
註冊:2002-06-05

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-26 14:55:51 IP:61.221.xxx.xxx 未訂閱
小小的Try一下 procedure TFm_DataBaseManager.Btn_EasyBackupClick(Sender: TObject); Var ToMonth:TDateTime; Salary_Date,ToDayDate,Temp_Date:String; begin ToMonth:=Now; ToDayDate:=FormatDateTime('yyyymmdd',(ToMonth)); Temp_Date:=Copy(ToDayDate,1,6); Salary_Date:='業績表_' Temp_Date; ADOQ_DataBase.SQL.Text := 'Select * from ' Salary_Date ''; try ADOQ_DataBase.Active := true; // 若沒這個table會跳過下面 finally 之前的程式碼 if MessageBox(Handle,'已有該月資料,覆寫?','覆寫資料',MB_YESNO MB_ICONQUESTION) = MRNO then exit // 若不覆寫則離開程序 // ==紅色字型顏色=== else begin ADOQ_DataBase.Active := false; ADOQ_DataBase.SQL.Text := 'drop table ' Salary_Date ''; // 覆寫則先刪掉原資料表 ADOQ_DataBase.ExecSQL; end; // ==紅色字型顏色=== finally ADOQ_DataBase.Active := false; ADOQ_DataBase.SQL.Text := 'select * into ' Salary_Date ' from 業績'; ADOQ_DataBase.ExecSQL; end; end; 發現問題: 若資料庫中無(業績表_2003),則會顯示錯誤訊息,是否可以Debug掉 若資料庫中有(業績表_2003),選擇不要覆蓋,也會顯示錯誤訊息.. 發表人 - sword185 於 2003/03/26 15:02:26
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-26 15:13:50 IP:218.16.xxx.xxx 未訂閱
不用 try finally 而用 try except 可解決。 在 Delphi Run 時資料庫中無(業績表_2003)一樣會有 Error 但直接執行 exe 時不會。 若資料庫中有(業績表_2003),選擇不要覆蓋,現不會顯示錯誤訊息    
procedure TFm_DataBaseManager.Btn_EasyBackupClick(Sender: TObject);
Var
  ToMonth:TDateTime;
  Salary_Date,ToDayDate,Temp_Date:String;
begin
  ToMonth:=Now;
  ToDayDate:=FormatDateTime('yyyymmdd',(ToMonth));
  Temp_Date:=Copy(ToDayDate,1,6);
  Salary_Date:='業績表_' Temp_Date;
  ADOQ_DataBase.SQL.Text := 'Select * from ' Salary_Date '';
  try
    ADOQ_DataBase.Active := true; // 若沒這個table會跳過下面 finally 之前的程式碼
    if MessageBox(Handle,'已有該月資料,覆寫?','覆寫資料',MB_YESNO   MB_ICONQUESTION) = MRNO then
      exit // 若不覆寫則離開程序
    else
    begin
      ADOQ_DataBase.Active := false;
      ADOQ_DataBase.SQL.Text := 'drop table ' Salary_Date ''; // 覆寫則先刪掉原資料表
      ADOQ_DataBase.ExecSQL;
    end;
  except
  end;
  ADOQ_DataBase.Active := false;
  ADOQ_DataBase.SQL.Text := 'select * into ' Salary_Date ' from 業績';
  ADOQ_DataBase.ExecSQL;  
end;
sword185
一般會員


發表:36
回覆:81
積分:23
註冊:2002-06-05

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-03-26 16:57:21 IP:61.221.xxx.xxx 未訂閱
謝謝 Justmade 您... 當然"指定答題得分者為"您了
BCool
一般會員


發表:4
回覆:6
積分:2
註冊:2003-04-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-17 09:04:08 IP:61.230.xxx.xxx 未訂閱
引言: 不用 try finally 而用 try except 可解決。 在 Delphi Run 時資料庫中無(業績表_2003)一樣會有 Error 但直接執行 exe 時不會。 若資料庫中有(業績表_2003),選擇不要覆蓋,現不會顯示錯誤訊息
procedure TFm_DataBaseManager.Btn_EasyBackupClick(Sender: TObject);
Var
  ToMonth:TDateTime;
  Salary_Date,ToDayDate,Temp_Date:String;
begin
  ToMonth:=Now;
  ToDayDate:=FormatDateTime('yyyymmdd',(ToMonth));
  Temp_Date:=Copy(ToDayDate,1,6);
  Salary_Date:='業績表_' Temp_Date;
  ADOQ_DataBase.SQL.Text := 'Select * from ' Salary_Date '';
  try
    ADOQ_DataBase.Active := true; // 若沒這個table會跳過下面 finally 之前的程式碼
    if MessageBox(Handle,'已有該月資料,覆寫?','覆寫資料',MB_YESNO   MB_ICONQUESTION) = MRNO then
      exit // 若不覆寫則離開程序
    else
    begin
      ADOQ_DataBase.Active := false;
      ADOQ_DataBase.SQL.Text := 'drop table ' Salary_Date ''; // 覆寫則先刪掉原資料表
      ADOQ_DataBase.ExecSQL;
    end;
  except
  end;
  ADOQ_DataBase.Active := false;
  ADOQ_DataBase.SQL.Text := 'select * into ' Salary_Date ' from 業績';
  ADOQ_DataBase.ExecSQL;  
end;
請問一下~ 現在我也是遇到需要這樣程式,我也是copy 下來試試看了,不過沒有很順利,我的結果變成,if 沒資料表的話會copy 1個 table過去且顯示錯誤。 if 有資料表的話不會copy 沒顯示是否覆寫資料,也沒執行到下面的這行後面程式,就錯誤了~ if MessageBox(Handle,'已有該月資料,覆寫?','覆寫資料',MB_YESNO MB_ICONQUESTION) = MRNO then exit // 若不覆寫則離開程序 else begin ADOQ_DataBase.Active := false; ADOQ_DataBase.SQL.Text := 'drop table ' Salary_Date ''; // 覆寫則先刪掉原資料表 ADOQ_DataBase.ExecSQL; end; 加上我不會用try finally 而用 try except 的語法,messagebox 後面的MB_YESNO MB_ICONQUESTION) = MRNO 語法,慘 = = 也看不是很懂。 環境:D6 ACCESS ~
系統時間:2024-04-29 3:27:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!