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

請教Accsee如何在Delphi用SQL語法複製一筆紀錄

尚未結案
marklue
一般會員


發表:33
回覆:55
積分:17
註冊:2005-02-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-01 19:20:16 IP:203.73.xxx.xxx 未訂閱
各位前輩好: 請問在產品檔維護畫面,發現新產品跟某舊有產品欄位很接近,如何用SQL語法將舊資料複製一份以便修改,小弟是用Query。 謝謝!
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-01 20:08:28 IP:220.134.xxx.xxx 未訂閱
小弟拙見 有錯請指正
Query1.Sql.Add('Select *  Into NewTableName From OldTableName Where 條件.....');
發表人 - likush 於 2005/08/01 20:11:44
marklue
一般會員


發表:33
回覆:55
積分:17
註冊:2005-02-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-01 23:16:57 IP:203.73.xxx.xxx 未訂閱
likush 前輩您好: 請問我是同一個TABLE能這樣用否? 我的目的就像某些軟體有提供COPY功能一樣,方便建檔用。 謝謝您!
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-02 08:17:32 IP:218.15.xxx.xxx 未訂閱
marklue您好: 1、在DBGrid中输入记录时,可采用 参考:http://delphi.ktop.com.tw/topic.php?topic_id=40256 转贴cmj前辈所答,
1.定義 OldFds:variant;
2.在TForm Create事件中
  OldFds := VarArrayCreate([0, DataSet.FieldCount-1], varVariant);
3.保存記錄值在DataSet之BeforePost事件中
  for i:=0 to DataSet.FieldCount-1 do
      OldFds[i]:=DataSet.Fields[i].Value;
4.下一筆新增中在Dataset之OnNewRecord事件中
  for i:=0 to DataSet.FieldCount-1 do
      DataSet.Fields[i].Value:=OldFds[i];
2、如果想复制整个表,可采用: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=74130 里有小弟之所答 ============================ 为什么经过多年以后,得失的过程如此冷漠 ============================ 發表人 - deity 於 2005/08/02 08:22:01
cashxin2002
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-02 08:55:05 IP:202.62.xxx.xxx 未訂閱
引言: likush 前輩您好: 請問我是同一個TABLE能這樣用否? 我的目的就像某些軟體有提供COPY功能一樣,方便建檔用。 謝謝您!
您好﹗ 擷取同一個資料表中的資料做以复制﹐可用如下SQL敘述﹕ Insert Into 資料表名稱 Select * From 資料表名稱 Where ... ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
marklue
一般會員


發表:33
回覆:55
積分:17
註冊:2005-02-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-02 09:48:34 IP:203.73.xxx.xxx 未訂閱
deity 前輩您好: 謝謝您提供的方式,可是我傾向用SQL完成,因為在DELPHI完成會觸發很多事件,控制上很麻煩,而且會降低效率,所以暫時還是希望用SQL語法完成。 cashxin2002版主您好: 我試過您說的方式,但是就是不知道WHERE後面需要怎麼下,試過insert into Cus select * from Cus where no='新編號' 但是無效,還有,就是需要在另外ㄧ個QUERY下SQL語法還是目前的QUERY?,如果在另一個QUERY下那樣欄位的值可以帶到新紀錄否?如果在目前的QUERY做那樣是否會讓本來的工作中斷。 謝謝!
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-02 11:32:02 IP:218.15.xxx.xxx 未訂閱
marklue您好:
 begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('insert into Cus select * from Cus where no ="001"');  <--where里表示您所想要复制的记录no
  ADOQuery1.ExecSQL;      ADOQuery2.Close;
  ADOQuery2.SQL.Clear;
  ADOQuery2.SQL.Add('select * from table1');
  ADOQuery2.Open;
end;
其中有同一个ADOQuery也行,分开也可以。小弟建议分开好点。 您所说的无效,不只是如何判别出来的,您可以直接打开表或用一个DBGrid显示出表记录是否已增加了一条。 ============================ 为什么经过多年以后,得失的过程如此冷漠 ============================
cashxin2002
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-02 11:55:05 IP:202.62.xxx.xxx 未訂閱
您好﹗    無效﹖不會吧﹒ 記得在此類SQL語法之后使用資料集元件的ExecSQL方法﹐不要使用Open方法﹒ Where之后的是條件式﹐符合Where條件式的資料錄才會被Insert到資料表中﹐條件式中的資料形態要正确﹒    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
marklue
一般會員


發表:33
回覆:55
積分:17
註冊:2005-02-09

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-08-02 13:29:51 IP:203.73.xxx.xxx 未訂閱
deity前輩 cashxin2002版主 您們好: 小弟在ACCESS用SQL模式這樣下'insert into Cus select * from Cus where no ="001",當001是新的編號時會出現新增0筆資料,當001已存在資料庫則出現新增一筆資料視窗,回答『是』之後,卻說索引重複,所以我在想這樣的語法是不是ACCESS不接受? 程式中我有用ExecSQL,可是查資料庫也沒多一筆!我對SQL不熟,如果從字面解釋上面的語法讓人感覺好像說『當no='001'時才複製』如果這樣解釋就符合他跳出來的提示視窗!但是卻無法達到我要做的動作! 謝謝!
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-08-02 14:25:48 IP:218.15.xxx.xxx 未訂閱
引言: 小弟在ACCESS用SQL模式這樣下'insert into Cus select * from Cus where no ="001",當001是新的編號時會出現新增0筆資料,當001已存在資料庫則出現新增一筆資料視窗,回答『是』之後,卻說索引重複,所以我在想這樣的語法是不是ACCESS不接受? 程式中我有用ExecSQL,可是查資料庫也沒多一筆!我對SQL不熟,如果從字面解釋上面的語法讓人感覺好像說『當no='001'時才複製』如果這樣解釋就符合他跳出來的提示視窗!但是卻無法達到我要做的動作! 謝謝!
用where no ="001"指新增no=001的一笔记录,如果没有的话当然新增0笔了,都没有符合条件的记录,哪有可能还有新增出来。如果有符合的记录,如果表有索引的话当然也会提示出重复,但您不就是要这样的吗(新增一笔和某笔一模一样的记录么)?如果想避免这个提示框,您可以在下'insert into Cus select field1,field2,field3 from Cus where no ="001" //假如表的索引字段为no,而field1,field2,field3为非索引字段,而索引字段只好自己手写过了。 这些出现的问题都是正常的。而此类语法在ACCESS下也支持! 另:您所要的动作,具体是什么?不是新增一笔和某笔一模一样的记录么?给您都搞糊涂了 <> ============================ 为什么经过多年以后,得失的过程如此冷漠 ============================
marklue
一般會員


發表:33
回覆:55
積分:17
註冊:2005-02-09

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-08-02 14:44:38 IP:203.73.xxx.xxx 未訂閱
deity 前輩您好: SORRY,表達不明確,我的目的是要把001(舊有的資料)copy成002(新產品資料),這樣有些相同的欄位就可以不用重KEY,只要修改相異處即可,不知道這樣deity前輩了解我的目的否? 謝謝!
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-08-02 15:02:58 IP:218.15.xxx.xxx 未訂閱
引言: deity 前輩您好: SORRY,表達不明確,我的目的是要把001(舊有的資料)copy成002(新產品資料),這樣有些相同的欄位就可以不用重KEY,只要修改相異處即可,不知道這樣deity前輩了解我的目的否? 謝謝!
marklue 兄您好,您大我那么多,别叫前辈了< >小弟也是初学者< > 对于您的问题,上面的回答应该都可以解决了,假如您的表 Cus中no为索引字段,其余的为非索引字段
Cus
 no(索引字段)    field2       field3     field4
则您可以
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('insert into Cus select field2,field3,field4
 from Cus where no ="001"');  <--因field2、field3、field3为非索引字段,所以它不会有提示重复索引。
  ADOQuery1.ExecSQL;      ADOQuery2.Close;
  ADOQuery2.SQL.Clear;
  ADOQuery2.SQL.Add('select * from table1');
  ADOQuery2.Open;
end;
因为是索引字段的话,必须为不同的值,所以你也得重新KEY,所以新增的时候您只要将非索引的字段新增即可,索引字段不新增,手动KEY过!试试看,顺心~~
    <>
============================
 为什么经过多年以后,得失的过程如此冷漠
============================

        
marklue
一般會員


發表:33
回覆:55
積分:17
註冊:2005-02-09

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-08-02 15:28:26 IP:203.73.xxx.xxx 未訂閱
deity 兄您好: 請問如果已知要把no=001資料複製成no=002,在這SQL語法需要再補充什麼條件,也就是說no='002'要放在哪裡? 謝謝!
cashxin2002
版主


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-08-02 15:53:13 IP:202.62.xxx.xxx 未訂閱
您好﹗    如果'002'值是固定的﹐則可將程式碼改成如下﹕
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('Insert Into Select ''002'' as 欄位名稱1 ');
  ADOQuery1.SQL.Add('欄位名稱2, 欄位名稱3, 欄位名稱4 Where ');
  ADOQuery1.SQL.Add('欄位名稱1=''001''');
  //用正确的欄位名稱來代替以上的欄位名稱﹐如用no來代替以上的欄位名稱1
  ADOQuery1.ExecSQL;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
marklue
一般會員


發表:33
回覆:55
積分:17
註冊:2005-02-09

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-08-02 16:00:26 IP:203.73.xxx.xxx 未訂閱
cashxin2002版主 您好: 請問,沒有宣告TABLE電腦會寫到我要的TABEL否? 謝謝!
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-08-02 16:09:41 IP:218.15.xxx.xxx 未訂閱
引言: deity 兄您好: 請問如果已知要把no=001資料複製成no=002,在這SQL語法需要再補充什麼條件,也就是說no='002'要放在哪裡? 謝謝!
marklue 您好:
Cus
 no(索引字段)    field2       field3     field4
  001             李四         男         程序员
  002             李四         男         程序员 <--您想新增这一笔
                  李四         男         程序员 <--SQL语句得出的结果
no需要自己输入进去    上面给的方法就是只增field2,field3,field4,而no是要您自己KEY进去的。no=002不用写到SQL语法上,SQL语法也不用补充什么的,您可以试试看。    或者不用insert用Append也可以,方法如下:
begin
  ADOQuery2.Close;
  ADOQuery2.SQL.Clear;
  ADOQuery2.SQL.Add('select * from Cus where no="001"');
  ADOQuery2.Open;      ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('select * from Cus');
  ADOQuery1.Open;
  ADOQuery1.Edit;
  ADOQuery1.Append;
  ADOQuery1.FieldByName('no').AsString:='002';
  ADOQuery1.FieldByName('Field2').AsString:=ADOQuery2.FieldByName('Field2').AsString;
  ADOQuery1.FieldByName('Field3').AsString:=ADOQuery2.FieldByName('Field2').AsString;
  ADOQuery1.FieldByName('Field4').AsString:=ADOQuery2.FieldByName('Field4').AsString;
  ADOQuery1.Post;
end;     
或如版主所言:
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('insert into Cus select “002”as no,field2,field3,field4
 from Cus where no ="001"');  <--因field2、field3、field3为非索引字段,所以它不会有提示重复索引。
  ADOQuery1.ExecSQL;       
试试看,望您能早日解决问题~ <> ============================ 为什么经过多年以后,得失的过程如此冷漠 ============================ 發表人 -
marklue
一般會員


發表:33
回覆:55
積分:17
註冊:2005-02-09

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-08-02 16:23:49 IP:203.73.xxx.xxx 未訂閱
感恩各位先進的解答,謝謝!
cashxin2002
版主


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

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-08-02 17:30:34 IP:202.62.xxx.xxx 未訂閱
引言: cashxin2002版主 您好: 請問,沒有宣告TABLE電腦會寫到我要的TABEL否? 謝謝!
您好﹗ Sorry, 筆誤了﹐修正為如下﹕
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('Insert Into 資料表名稱 Select ''002'' as 欄位名稱1, ');
  ADOQuery1.SQL.Add('欄位名稱2, 欄位名稱3, 欄位名稱4 From 資料表名稱 ');
  ADOQuery1.SQL.Add('Where 欄位名稱1=''001''');
  //用正确的欄位名稱來代替以上的欄位名稱﹐如用no來代替以上的欄位名稱1
  ADOQuery1.ExecSQL;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================ 發表人 - cashxin2002 於 2005/08/02 17:42:41
------
忻晟
marklue
一般會員


發表:33
回覆:55
積分:17
註冊:2005-02-09

發送簡訊給我
#19 引用回覆 回覆 發表時間:2005-08-02 17:59:27 IP:203.73.xxx.xxx 未訂閱
cashxin2002版主 您好: 感謝您用心的說明 謝謝!
系統時間:2024-11-22 13:09:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!