將資料表Copy到新的資料表再清除資料 |
答題得分者是:Justmade
|
sword185
一般會員 發表:36 回覆:81 積分:23 註冊:2002-06-05 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
sword185
一般會員 發表:36 回覆:81 積分:23 註冊:2002-06-05 發送簡訊給我 |
|
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
不要用數字作名稱的開頭,很多語言不支援的很容易出錯。所以建議將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 發送簡訊給我 |
引言: 可以Show出 完整的程式碼嗎?流程可以是這樣 刪除old temp table -->產生tmp table 結構 -->將資料存入tmp table 用sql語法比較快而且單純,也可以在delphi裡面操控ttable,tfield物件逐欄 逐行處理. "可以Show出 完整的程式碼嗎?" 這.... 同學,良心的建議,先從流程去想好,程式碼最好自己多try try, 建議可行的流程給您,程式碼甚至是sql語法的部分 還是最好自己身體力行一番,真的... 不然,講嚴重一點,下次碰到類似的情況,你要怎麼辦呢? 加油,加油,加油. |
sword185
一般會員 發表:36 回覆:81 積分:23 註冊:2002-06-05 發送簡訊給我 |
小小的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 發送簡訊給我 |
不用 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 發送簡訊給我 |
|
BCool
一般會員 發表:4 回覆:6 積分:2 註冊:2003-04-14 發送簡訊給我 |
引言: 不用 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 ~ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |