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

請問一個架構問題?

尚未結案
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-09 20:53:23 IP:202.145.xxx.xxx 未訂閱
小弟有一個程式的須求如下: 資料庫sql server; 當退料單被新增修改刪除後能抓出變動的資訊並存在sql內的一個table中 如新增一筆退料單後就把這筆的資訊變成123-0001 義意如下: 123-0001 [1]表示新增 [2]表示退料單table [3]表示退料數量 [-0001]表示退料單編號 小弟不知做如何才能做得到這種功能? 只要有大架構的做法小弟或可做的出來.感謝 堅持從洗馬桶做起 Eric
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-09 22:55:56 IP:218.32.xxx.xxx 未訂閱
huangeider 你好:    可考慮用 MSSQL 的 觸發器(Trigger), 如:    
create trigger [TriggerName] on [TableName]
  for insert,update,delete
  as
begin
  declare  @ins_count int,
           @del_count int,
           .....
  if @@rowcount = 0 return -- No Rows Effected
  select @ins_count=count(*) from inserted
  select @del_count=count(*) from deleted
  if @del_count=@ins_count begin
-- Update
  end
  if @del_count=0 begin
-- Insert
  end
  if @ins_count=0 begin
-- Delete
  end
end
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-09 23:04:15 IP:202.145.xxx.xxx 未訂閱
請教可以把異動的資料另存一個檔嗎 因為小弟不只是要把異動的資料另存一個檔 而且還得把異動的資料 截取其record內某些欄位的資料 而另存在一個已建好的檔案 有可能直接用sql trigger做到嗎? 另寫程式行嗎? 目前小弟只知道可新建一個已select資料中的table
create table sales_staff as
select employee_id,
first,
last_name,
from l_employees
where delp_code='sal';
堅持從洗馬桶做起 Eric 發表人 - huangeider 於 2004/04/09 23:18:00
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-10 10:56:28 IP:218.32.xxx.xxx 未訂閱
引言: 請教可以把異動的資料另存一個檔嗎
應該可以, 我手邊沒有 MSSQL, 試試看 : select * into [NewTable] from inserted -- 新增之資料 select * into [OldTable] from deleted -- 刪除之資料 不過須注意 實體 Table ([NewTable]/[OldTable]) 已存在的問題. 如果異動之資料量不大, 也可考慮用 暫存 Table (Temporary Table), 搜尋一下, 我記得本站已有一些討論.
引言:
create table sales_staff as
select employee_id,
first,
last_name,
from l_employees
where delp_code='sal';
這...應該是 Oracle 的 PL/SQL 的語法, 與 Sybase / Mssql "select into" 語法異曲同工.
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-10 17:38:32 IP:202.145.xxx.xxx 未訂閱
create trigger [test] on [退庫單] for insert,update,delete as begin declare @ins_count int, @del_count int, if @@rowcount = 0 return select @ins_count=count(*) from inserted select @del_count=count(*) from deleted if @del_count>0 begin select * into [退庫單del] from deleted end if @ins_count>0 begin select * into [退庫單ins] from inserted end end 出現這個問題 伺服器: 訊息 156,層級 15,狀態 1,程序 test,行 8 關鍵字 'if' 附近的語法不正確。 不知為何? 堅持從洗馬桶做起 Eric
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-10 22:18:06 IP:218.32.xxx.xxx 未訂閱
引言: create trigger [test] on [退庫單] for insert,update,delete as begin declare @ins_count int, @del_count int --多了 "," 號 if @@rowcount = 0 return select @ins_count=count(*) from inserted select @del_count=count(*) from deleted if @del_count>0 begin select * into [退庫單del] from deleted end if @ins_count>0 begin select * into [退庫單ins] from inserted end end 出現這個問題 伺服器: 訊息 156,層級 15,狀態 1,程序 test,行 8 關鍵字 'if' 附近的語法不正確。 不知為何? 堅持從洗馬桶做起 Eric
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-11 10:42:10 IP:202.145.xxx.xxx 未訂閱
create trigger [test] on [退庫單]
for insert,update,delete
as
begin
declare @ins_count int,
        @del_count int
if @@rowcount = 0 return
select @ins_count=count(*) from inserted 
select @del_count=count(*) from deleted    if @del_count>0 begin
select * into [退庫單del] from deleted    end
if @ins_count>0 begin
select * into [退庫單ins] from inserted    end
end
可以執行了但是如果小弟在 退庫單中新增一筆沒問題但新增第二筆時就有錯誤訊息了 :資料庫已有相同的[退庫單ins]了 發覺只有在沒有建立[退庫單ins]之前才能去TRIGGER一次 而再TRIGGER第二次時因已有[退庫單ins]了所以沒法再TRIGGER了 不知能否再把有關新增的資料再APPEND在[退庫單ins]中的TABLE中 也就是說若TRIGGER時就能持續的加入異動的資料在[退庫單ins]中 而不是只有一筆 堅持從洗馬桶做起 Eric 發表人 - huangeider 於 2004/04/11 10:45:04
huangeider
高階會員


發表:288
回覆:492
積分:231
註冊:2003-02-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-04-11 10:58:17 IP:202.145.xxx.xxx 未訂閱
小弟有解了: CREATE trigger [test] on [oo] for insert,delete,update as begin declare @ins_count int, @del_count int if @@rowcount = 0 return select @ins_count=count(*) from inserted select @del_count=count(*) from deleted if @del_count>0 begin insert into oodel select * from deleted end if @ins_count>0 begin insert into ooins select * from inserted end end 堅持從洗馬桶做起 Eric
系統時間:2024-07-01 10:44:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!