500分求救。这是什么错误???Row cannot be located for updating. Some values may have been ch

  • 主题发起人 主题发起人 chenanyun
  • 开始时间 开始时间
C

chenanyun

Unregistered / Unconfirmed
GUEST, unregistred user!
500分求救。这是什么错误???Row cannot be located for updating. Some values may have been changed since it was last read ( 积分: 200 )<br />各位大侠,求救啊

我写的一个程序,数据库是SQLSERVER7,有一进货单模块(主、明细结构),我在明细表里写了一个触发器是用来更新库存的,但保存单时出现“Row cannot be located for updating. Some values may have been changed since it was last read.”,不要触发器就没问题。 各位大哥,请问什么原因? 如何解决?
 
各位大侠,求救啊

我写的一个程序,数据库是SQLSERVER7,有一进货单模块(主、明细结构),我在明细表里写了一个触发器是用来更新库存的,但保存单时出现“Row cannot be located for updating. Some values may have been changed since it was last read.”,不要触发器就没问题。 各位大哥,请问什么原因? 如何解决?
 
可能你的触发器有问题吧,按照提示,应该是“无法定为到要更新的行,某些值在最后一次读取后已经改变”。
 
你的触发器写的有问题。
 
是不是更改了主索引的值
 
解决问题的方法可以
const
adoCriteriaString = 'Update Criteria';
adoCriteriaKey = $00000000;
adoCriteriaAllCols = $00000001;
adoCriteriaUpdateCols = $00000002;
adoCriteriaTimeStamp = $00000003;
procedure SetUpdateOnlyKey(DataSet: TDataSet);
begin
if DataSet is TADODataSet then
(DataSet as TADODataSet).Recordset.Properties.Get_Item( adoCriteriaString ).Value := adoCriteriaKey;
end;
在AfterOpen事件里调用SetUpdateOnlyKey

看看这个帖子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=413332
 
我使用的是TAdoQuery组件,也是一样的吧?

我先试一试。
 
呵呵,用ADO控件常见的问题,C/S结构一般很容易这样。我也是瞎解决的,听课!
 
你的明细表里没有主键吗?
 
主表的主键是billno(单号),明细表的主键是sno(随机生成)和billno(对应主表)。

取消触发器就是正常的,能保存整张单,但使用触发器后就有问题了。

使用BDE就不会出问题,触发器有效,库存也正常更新。
 
把你的问题做个小的工程,发给我.呵呵.我来帮你排错吧
 
触发器的问题,贴出来看看啊。
 
CREATE TRIGGER UT_GoodInDetail_UDI ON tPurInDetail /*建立采购进货触发器*/
FOR DELETE , INSERT , UPDATE
AS
BEGIN
DECLARE @IBillNo_I VARCHAR (20) , @IProdNO_I VARCHAR(20) , @ISTORENO_I VARCHAR(20) , @QTN_I Numeric (8,0)
DECLARE @IBillNo_D VARCHAR (20) , @IProdNO_D VARCHAR(20) , @ISTORENO_D VARCHAR(20) , @QTN_D Numeric (8,0)
UPDATE tStorage Set Qtn = 0 WHERE Qtn IS NULL /*库存量中如果为NULL,则置为0;*/
--删除触发操作开始--
DECLARE DELETED_CURSOR CURSOR FOR /*删除临时表DELETED的游标*/
SELECT BILLNO ,StoreNo, ProdNo , Qtn FROM DELETED /*操作时,tPurInDetail中的临时表DELETED;*/
OPEN DELETED_CURSOR /*打开游标*/
FETCH NEXT FROM DELETED_CURSOR INTO @IBillNo_D ,@ISTORENO_D, @IProdNO_D , @QTN_D /*获取数据到变量中*/
WHILE @@FETCH_STATUS = 0 /*获取状态正常*/
BEGIN
/*iStore:仓库编号;从表中找仓库编号,满足条件:进货单编号等于DELETED临时表中的编号;
//确定库存表中有无相应记录,有则更新,无则插入;(以减的运算方式)*/
IF EXISTS(SELECT * FROM tStorage WHERE StoreNo = @ISTORENO_D AND ProdNo = @IProdNO_D)
UPDATE tStorage Set Qtn = Qtn - @QTN_D WHERE StoreNo = @ISTORENO_D AND ProdNo = @IProdNO_D
ELSE
INSERT INTO tStorage (StoreNo , ProdNo , Qtn ) VALUES ( @ISTORENO_D , @IProdNO_D , - @QTN_D )
FETCH NEXT FROM DELETED_CURSOR INTO @IBillNo_D ,@ISTORENO_D, @IProdNO_D , @QTN_D /*取下一记录;*/
END
CLOSE DELETED_CURSOR
DEALLOCATE DELETED_CURSOR
--删除触发操作完成--
--插入触发操作开始--
DECLARE INSERTED_CURSOR CURSOR FOR
SELECT BillNo ,StoreNo, ProdNo , Qtn FROM INSERTED /*插入临时表:INSERTED;*/
OPEN INSERTED_CURSOR
FETCH NEXT FROM INSERTED_CURSOR INTO @IBillNo_I ,@ISTORENO_I, @IProdNO_I , @QTN_I
WHILE @@FETCH_STATUS = 0 /*获取状态正常*/
BEGIN

/*存在则更新,不存在则插入;(以加的运算方式)*/
IF EXISTS(SELECT * FROM tStorage WHERE StoreNo = @ISTORENO_I AND ProdNo = @IProdNO_I)
UPDATE tStorage Set Qtn = Qtn + @QTN_I WHERE StoreNo = @ISTORENO_I AND ProdNo = @IProdNO_I
ELSE
INSERT INTO tStorage (StoreNo , ProdNo , Qtn ) VALUES ( @ISTORENO_I ,@IProdNO_I ,@QTN_I)
/*从临时表中获取下一记录*/
FETCH NEXT FROM INSERTED_CURSOR INTO @IBillNo_I ,@ISTORENO_I, @IProdNO_I , @QTN_I
END
CLOSE INSERTED_CURSOR
DEALLOCATE INSERTED_CURSOR
DELETE FROM tStorage WHERE Qtn = 0 /*当商品库存量为0时,则删除相应记录;*/
END


 
TO zhengmw:问题没有解决啊!

为何呢?

分不够可以再加,全部放出都可以,哪位大侠出来相救啊? 急!!!
 
只要问题能解决,我的所有分抛出!!!!!
 
大侠们,如何了?
由于时间安排得比较紧,我决定换BDE引擎了
 
先送上一点分吧,问题还未解决,先忙完这个程序再说吧。
 
后退
顶部