Sql server触发器,Ado问题,请教高手

zzao 2001-05-30 03:39:00
出库表 MoutD 结构 Mcode,batchcode,qty
动态库存阴 dynstock 结构 mcode,batch qty,触发器实现,出库时自动减库存表数量,写法如下:

CREATE TRIGGER MoutD_Ins ON dbo.MoutD
FOR INSERT AS
DECLARE @Mcode VARCHAR(13),@BatchCode VARCHAR(50),@Qty DECIMAL(10,4)

DECLARE cuMoutDIns CURSOR FOR SELECT Mcode,BatchCode,
Qty FROM inserted
OPEN cuMoutDIns
FETCH NEXT FROM cuMoutDIns INTO @Mcode,@BatchCode,@Qty

WHILE (@@fetch_status<>-1)
BEGIN
/*修改动态库存表*/
UPDATE DynStock SET Qty=Qty-@Qty WHERE Mcode=@Mcode And And
BatchCode=@BatchCode MQuality_KID=@MQuality_KID
FETCH NEXT FROM cuMoutDIns INTO @Mcode,@BatchCode,@Qty
END

CLOSE cuMoutDIns
DEALLOCATE cuMoutDIns

手动在MoutD表中添加记录时触发器执行正确
但在Dephi中用Ado插入多行记录时提示出错 无法为更新行集定位 一些值在最后读取后改变
请解决




...全文
70 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzao 2001-05-30
  • 打赏
  • 举报
回复
谢谢各位我已解决解决方法:
加入以下语句
if exists (select mcode from dynstock where mcode=@mcode and
batchcode=@batchcode)
update dynstock set qty=qty-@qty where mcode=@mcode and batchcode=@batchcode
在更新这前先判断该批号的物料是否存在,加入这行语句毫无道理但却能解决问题,我估计是dephi对 Ado 的封装极差导致这样的错误。
不能各位意见如何。
zzao 2001-05-30
  • 打赏
  • 举报
回复
谢谢各位,我已试过在sql server 中插入多条记录没有问题。我之所以要使用游标,是由于以下原因:
我要在出库的同时减少库存并且增加仓位表中的可用空间数。实际上我的触发器要将inserted 表与另一表material 关联计算出库时用掉了多少空间如下:
DECLARE cuMoutDIns CURSOR FOR SELECT A.Mcode,A.BatchCode,
A.Qty,ceiling(A.Qty/B.TrunkQty) AS Boards FROM inserted A INNER JOIN Material B ON A.Mcode=B.Mcode
open cumoutdins
fetch ...
while...
update dynstock set qty=qty-@qty
update storeloca set boards=boards+@boards
fetch...
end
.....
不知是否有更简单的方法请指教我已浪费一天时间了!

nononono 2001-05-30
  • 打赏
  • 举报
回复
你通过ADO得到的数据集, 如果你修改了数据集中的数据在SQL Server中引发了触发器对表数据进行了更新, 这时, 你的ADO数据集已经过时, 应该重新读取被变化了的相关数据集.
ericzou 2001-05-30
  • 打赏
  • 举报
回复
同意wwl007(疑难杂症)的,没有必要用游标
jcq 2001-05-30
  • 打赏
  • 举报
回复
你的这个触发器能通过,奇怪。不过你的解决思路是对的。如果在SQL中同时INSERT几笔不会出错的话,在DELPHI中也不会的。
wwl007 2001-05-30
  • 打赏
  • 举报
回复
我想知道的是你在sql server里面!添加多条纪录有没有问题!
你的trigger没有必要写成cursor

UPDATE DynStock SET DynStock.Qty=DynStock.Qty-inserted.Qty
from inserted
WHERE DynStock.Mcode=inserted.Mcode And
DynStock.BatchCode=inserted.BatchCode
DynStock.MQuality_KID=inserted.MQuality_KID
还有你的里面多了一个and你看看是不是问题那

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧