關于刪除觸發器(50分)

  • 主题发起人 主题发起人 brainpower
  • 开始时间 开始时间
B

brainpower

Unregistered / Unconfirmed
GUEST, unregistred user!
以下是DELPHI5.0/SQLserver7.0
我有一主從表 ord_hd/ord_detail,以 no相連
當刪除主表一條記錄后要刪除 detail中所有no相同的記錄,
可用如下代碼;
if not DBase.InTransaction Then DBase.StartTransaction;
Qy_ord_detail.First;
while not(Qy_ord_detail.Eof) do  //先刪明細表
begin
Modi_stock; //先減庫存的過程,再刪明細記錄
Qy_ord_detail.Delete;
Qy_ord_detail.ApplyUpdates;
Qy_ord_detail.CommitUpdates;
end;
Qy_ord_hd.Delete;        //再刪主表 
Qy_ord_hd.ApplyUpdates;
Qy_ord_hd.CommitUpdates;
if DBase.InTransaction then DBase.Commit;
這段代碼可用如下觸發器:
CREATE TRIGGER TR_ord_hd ON dbo.ord_hd
FOR DELETE
AS
DELETE ord_detail
FROM ord_detail
WHERE no IN (SELECT no FROM DELETED)
但是DELETE-SQL語句是批次更新數據庫的呀,如何實現減庫存的動作(Modi_stock)?
因為每刪除一筆明細記錄,庫存數要變化!
對不起我現在只有50分,快斷炊了
 
庫存的過程是什么,把代码贴出来,看看有没有办法加到TRRIGER中去
 
Modi_stock過程代碼如下:
with Datam do
begin
xGoods_no:=Qy_ord_detail.FieldByName('goods_no').AsString;
xQty:=Qy_ord_detail.FieldByName('In_qty').AsFloat;
if Qy_goods.Locate('goods_no',xGoods_no,[loCaseInsensitive]) then
begin //找到該料號的庫存,減數量
Qy_goods.edit;
Qy_goods.FieldByName('curr_in').Asfloat:=Qy_goods.FieldByName('curr_in').Asfloat-xQty;
Qy_goods.FieldByName('on_hand').Asfloat:=Qy_goods.FieldByName('on_hand').Asfloat-xQty;
Qy_goods.ApplyUpdates;
Qy_goods.CommitUpdates;
end
else
Begin
    .....
end;
end;
 
为什么不用存储过程?
Create procedure Proc_del
(@goods_no char(10),@no char(10),@CountNumber float)
As
Begin
Update goods Set curr_in=curr_in-@CountNumber where goods_no=@goods_no
Update goods Set on_hand=on_hand-@CountNumber where goods_no=@goods_no
Delete ord_Detail where no=@no
Delete ord_hd where no=@no
End
然后分别把ord_detail和ord_hd要删除的no,goods中查找出来的xGoods_no,xQty做为实参
代入Proc_del就行
 
ziyu的办法可行
 
ziyu 的方法是個新思路,不過好象要加一個參數來判斷是刪主表還是從表
且這代代碼放在in_de的beforedelete才可.
 
没有办法,你的Modi_stock過程牵涉到要用动态的参数,触发器完成不了。所以我提议用Procedure
 
向ziyu敬礼.
 
ziyu是個高手,我還是個菜鳥,不知你們有沒有碰到類似問題.
 
brainpower:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
请认真阅读大富翁论坛规则说明 http://www.delphibbs.com/delphibbs/rules.htm
 
若你的东西很复杂,最好还是自己写过程或程序中直接控制好一些。有时候你的一些限制性
条件会与触发器冲突,出些毛病出来。
 
這個問題以后再貼出來
 
后退
顶部