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

有無比較好的方法交換兩張單據內容

答題得分者是:VICSYS
pedro
尊榮會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-09 09:16:45 IP:60.248.xxx.xxx 未訂閱
已知兩張A、B單據要交換內容,
辦法有二
1.新增另一張單號C
2.Insert C from B
3.Delete B
4.Insert B from A
5.Delete A
6.Insert A from C
第二個辦法
Update B
from table Set FieldA=t.FieldA.......
( select * from table where BilNO=A
) as t
where BilNO=B
第二個辦法比較簡便,問題是MS-Sql2000語法檢查沒辦法過

請問前輩有無好的意見...Delphi端或Sql端皆可..謝謝您!
ace33022
一般會員


發表:2
回覆:41
積分:23
註冊:2004-05-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-09 10:58:38 IP:59.125.xxx.xxx 訂閱

===================引 用 pedro756901 文 章===================
已知兩張A、B單據要交換內容,
辦法有二
1.新增另一張單號C
2.Insert C from B
3.Delete B
4.Insert B from A
5.Delete A
6.Insert A from C
第二個辦法
Update B
from table Set FieldA=t.FieldA.......
( select * from table where BilNO=A
) as t
where BilNO=B
第二個辦法比較簡便,問題是MS-Sql2000語法檢查沒辦法過

請問前輩有無好的意見...Delphi端或Sql端皆可..謝謝您!

//--------------------------------------------------------------------------
第二個方法好像是蓋過去,不太像是交換 @@a

個人的話會採用第一種,用Delphi的TQuery來組出Insert與Update語法,再來處理應該比較簡便。
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-09 10:58:48 IP:219.130.xxx.xxx 訂閱
update  A set  FieldA=b.FieldA   from   A   a   inner   join   B   b   on   a.Id=b.Id   



===================引 用 pedro756901 文 章===================
已知兩張A、B單據要交換內容,
辦法有二
1.新增另一張單號C
2.Insert C from B
3.Delete B
4.Insert B from A
5.Delete A
6.Insert A from C
第二個辦法
Update B
from table Set FieldA=t.FieldA.......
( select * from table where BilNO=A
) as t
where BilNO=B
第二個辦法比較簡便,問題是MS-Sql2000語法檢查沒辦法過

請問前輩有無好的意見...Delphi端或Sql端皆可..謝謝您!
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-09 14:16:50 IP:211.75.xxx.xxx 訂閱
一張單據 需要用一個Table存?
兩張單據要用到兩個 Table???
理論上 應該是在同一個Table吧
Update PK_Field_Value = c From Table Where PK_Field_Value = a
Update PK_Field_Value = a From Table Where PK_Field_Value = b
Update PK_Field_Value = b From Table Where PK_Field_Value = c


------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
pedro
尊榮會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-08-09 14:27:14 IP:60.248.xxx.xxx 未訂閱
謝謝ace33022、chamstar、eaglewolf大大的回應

單據有表頭表身,為了簡化問題,才陳述成一個檔
本來想說如果有類似Exchange,Swap魔術指令那就好

第二個概念是想說如果有單一個語法可以交換單據內容就好,一直試不出來

後來還是用第一個概念搬來搬去

應該有人做過類似的案例吧? 大概就如同ace33022大大所言,組對應的語法

>一張單據 需要用一個Table存?
>第二個方法好像是蓋過去,不太像是交換 @@a
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-08-09 15:28:34 IP:211.75.xxx.xxx 訂閱
就小弟的理解
假設有兩張進貨單因故
表頭的部份資料及表身的全部資料要互換
其實就是表頭資料表的某兩筆資料的某些欄位的資料要互換
以及表身的表單編號欄位的資料要互換

<textarea class="delphi" rows="10" cols="60" name="code"> update PurchaseDetail Set Purchase_No = '20070800003' where Purchase_No = '20070800001'; update PurchaseDetail Set Purchase_No = '20070800001' where Purchase_No = '20070800002'; update PurchaseDetail Set Purchase_No = '20070800002' where Purchase_No = '20070800003'; update PurchaseMaster Set Total_Cost = (select sum(price * quantity) from PurchaseDetail Where Purchase_No = '20070800001') Where Purchase_No = '20070800001'; update PurchaseMaster Set Total_Cost = (select sum(price * quantity) from PurchaseDetail Where Purchase_No = '20070800002') Where Purchase_No = '20070800002'; declare @vendor_id as varchar(10); declare @warehouse as tinyint; select @vendor_id = vendor , @warehouse = warehouse from PurchaseMaster where Purchase_No = '20070800001'; update PurchaseMaster set vendor = (select vendor from PurchaseMaster where Purchase_No = '20070800002') , warehouse = (select warehouse from PurchaseMaster where Purchase_No = '20070800002') where Purchase_No = '20070800001'; update PurchaseMaster set vendor = @vendor_id , warehouse = @warehouse where Purchase_No = '20070800002'; </textarea>

------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
編輯記錄
eaglewolf 重新編輯於 2007-08-09 15:42:16, 註解 補充表頭資料互換‧
VICSYS
初階會員


發表:21
回覆:64
積分:32
註冊:2002-10-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-08-09 18:34:20 IP:219.68.xxx.xxx 未訂閱
提拱一個方式

1.新增另一張單號C
2.UPDATE B TO C
3.UPDATE A TO B
4.UPDATE C TO A
5.DELETE C

其中 UPDATE 只要針對 單號(主鍵) 即可, 其他欄位不需要!

如果沒有 FOREIGN KEY!

1.UPDATE B TO NEW_NO
2.UPDATE A TO B
3.UPDATE NEW_NO TO A
這個跟 eaglewolf 大大所提供的方式一樣
pedro
尊榮會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-08-10 09:57:03 IP:60.248.xxx.xxx 未訂閱
謝謝VICSYS,eaglewolf大大的回應

理想中的狀況是前端UI按一個Button就做eaglewolf大大後端的Sql Script
最簡便的方法應是VICSYS大大所提的

但我的單號有一堆強制關連,所以步驟會比VICSYS大大所提的多一些

目前想不到好的辦法
系統時間:2024-05-17 14:47:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!