大家好!
问题:在applyupdate(0)更新入库单(主从表)时,一切正常,由于要增减库存,所以在明细表上编写了触发器,问题也因此出现,在更新时出现:record not found or changed by another user错误!在SQL中调试触发器正常,请问问题出在那?
因为时间紧迫,我就尝试了别的处理方式和解决办法,大体如下,但也引出了一些问题,希望能解答:
1、改为用非主从表或雀巢表,对带有触发器的明细表applyupdate(0)出现同样错误。
2、去掉触发器,在DataSetProvider的afterapplyupdate事件对更新解包,可是明细表的更新是以字段的方式存在主表更新包中,问题是如何对主从delta如何解包?
3、改为用非主从表或雀巢表,去掉触发器,分别更新,在连接明细表的dataSetProvider的afterapplyupdate中可对细目数据解包,从而可以通过程序增减库存。但不足处是通过程序增减库存好象没有被包含在内在的事务中,那如何在多层中自己控制事务,并不与内在事务冲突?
问题:在applyupdate(0)更新入库单(主从表)时,一切正常,由于要增减库存,所以在明细表上编写了触发器,问题也因此出现,在更新时出现:record not found or changed by another user错误!在SQL中调试触发器正常,请问问题出在那?
因为时间紧迫,我就尝试了别的处理方式和解决办法,大体如下,但也引出了一些问题,希望能解答:
1、改为用非主从表或雀巢表,对带有触发器的明细表applyupdate(0)出现同样错误。
2、去掉触发器,在DataSetProvider的afterapplyupdate事件对更新解包,可是明细表的更新是以字段的方式存在主表更新包中,问题是如何对主从delta如何解包?
3、改为用非主从表或雀巢表,去掉触发器,分别更新,在连接明细表的dataSetProvider的afterapplyupdate中可对细目数据解包,从而可以通过程序增减库存。但不足处是通过程序增减库存好象没有被包含在内在的事务中,那如何在多层中自己控制事务,并不与内在事务冲突?
解决方案 »
- 求助!如何在动态改变大小的Image上画图!
- 关于DBGRIDEH,ONEditButtonClick事件丢失的问题。
- 关于动态库中应用DBGrid中Column的PickList属性的问题
- 用ADO连接的一个ACCESS库,另一个连接SQL库,怎样快速将ACCESS库中的一个表整个导到SQL库中?
- 紧急求助,如何从SQL数据库中,将表中记录插入到ACCESS数据库表中?
- DELPHI开发单机数据库软件,怎么样才在没有装DELPHI的机器上运行!
- 请问如何在文本框中加按扭?
- 如何进行将Integer变量转换成array [0..3] of Byte
- 如何测试CPU的速度?
- 小弟问?
- 非技术问题,请大家帮助
- 关于pagecontrol的问题
http://expert.csdn.net/Expert/topic/1964/1964802.xml?temp=.9070703
leon2k(LEON) 贴中解释了其中大部分问题那么 delphi 是通过什么判断更新了几条记录? 在 ms sql server 中有 EffectRecords 返回, 是0 就是record changed by another user. 可是 ms sql 恶心之处就是触发器也影响这个返回值, 也就是说你的触发器中最后一条语句的影响行数是 0另一种可能就是 Update effect more than 1 record, 也是触发器最后一条语句造成, 这种情况可以设 DataSetProvider Options 中 AllowMutipleRecordUpdates
DataSetProvider定位原记录时有三中方法(也就是WHERE语句中的条件)upWhereAll:即所有字段原来的值匹配
upWhereChanged:改变了的字段原来的值匹配
upWhereKeyOnly:主键字段原来的值匹配(TQuery不能用)在单用户时,有两种情况也会产生不正常的record not found or changed by another user错误
1、使用自动增长字段,新增记录保存后立即修改记录又保存时
2、日期字段,特别是数据库中产生的日期,主要的毫秒的问题可以使用upWhereChanged,upWhereKeyOnly更新的方式来解决问题,
另外也可以设置upWhereAll的更新方式,然后设置字段是否作为原记录的查找条件。办法为:Field.ProviderFlags := Field.ProviderFlags-[pfInUpdate];另外有些字段在客户端临时使用,不想更新到数据库中,可以使用办法Field.ProviderFlags := [];
想说的已经被comanche(太可怕)说了:)
另外还有一个错误是在operfume(橘子香水) 说得,如果数据库中有缺省值,不管是自增还是什么,只要增加后客户端和数据库端不符,必然出错。
也是用三层架构开发的。提交方法也一样。可是我没有问题啊。
你可以先找问题出在哪里,先把触发器注释掉,不要让它执行,看看是否有出发器的原因。
第二:假如你的主键不是自增长,可以考虑用updatemode为upWhereKeyOnly,要不就用upwhereall,但这种方法假如两人以上同时对同一单据操作时,就会出现你现在提示的问题.
最终的原因是没有找到要更新的记录.
补充一名TQuery能用的不过要加永久字段
问题出在你的触发器上,由于你在更新记录时,触发器中的SQl语句在更新相关表时,没有找到相关记录,此时你的更新操作就会出错。
解决此问题就是在触发器中先检测相关表的记录是否成在,不成在时就跳过好了。