大家好!
问题:在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中可对细目数据解包,从而可以通过程序增减库存。但不足处是通过程序增减库存好象没有被包含在内在的事务中,那如何在多层中自己控制事务,并不与内在事务冲突?
解决方案 »
- DBGridEH 如何设置某一行的颜色
- if else语句
- 想问一下,如果兼职的话,工资应该怎么计算啊??各位有经验的进来帮助小弟一下!(来者有分)
- quickReport问题,为什么生成的报表,只显示一行数据。
- 请问如何将OleVariant类型数据转换为BYTE类型?请解答
- 高分求助!!winexec函数的第一个参数可以设置为相对路径吗(例如主文件所在目录或其上一层)?谢谢!
- 【转】笑一笑:索爱T618 R3C之重大发现
- 再散分,NO(1)10分,NO(2)15分,NO(7)15分,NO(20)20分,NO(50)40分,马上结.
- 一个关于菜单的很简单的问题?
- 敬请加入'上海市软件沙龙学院'
- 非技术问题,请大家帮助
- 关于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语句在更新相关表时,没有找到相关记录,此时你的更新操作就会出错。
解决此问题就是在触发器中先检测相关表的记录是否成在,不成在时就跳过好了。