浅谈Powerbuilder数据窗口的默认值问题

PowerBuilder技术 专栏收录该内容
5 篇文章 0 订阅
    日前曾经遇到过因数据窗口保存时出现“其它错误”,跟踪发现数据窗口提示是Row Has Changed Between and update。即数据在更新之前已被修改的大概意思,其实是单机访问并无并发访问,令人费角。就此曾向多位PB界前辈请教,被告知与数据窗口默认值有关。当时未能具体了解其中的含义。今天再次遇到类似问题,入库单保存后,提示“是否直接确认”,如果选择确认,提示其它错误。跟踪仍然是“Row Has Changed Between and update”的错误。查看代码,发现数据窗口确实保存并Commit了数据,然后才提示是否确认,如果选是,会将主表、明细表中数据置审核标志为Y,然后保存,保存时出现问题。姚洁怀疑是否未重置Update状态。查看代码,Commit后主、从数据窗口均已调用“ResetUpdate”方法,看来不是这个问题。再次跟踪调试,将出错误的Update语句复制出来,逐项排除Where条件,发现是Invt06_c的Order_line这个条件造成的。这个字段在不用订单式管理的情况下是不显示的,也就是说数据窗口会置NULL,但数据库中是0……于是恍然大悟,这就是问题出现的原因,知道原因后就好办了。或者修改数据窗口的默认值,或者修改数据库表中的默认值,使两者一致即可。现就其中原理简单分析如下,供后来者参考。

    一般来讲,数据窗口的“Update”属性中,其更新的Where条件有三种方式,即Key Columns、Key and Updateable columns及Key and Modified Columns。分别是:主键、主键和可更新列、主键和修改列。一般来说常用第二种,因为如果单纯只用主键更新,可能会出现并发问题,造成无法预知的后果(如果A和B均用主键更新,那么谁在后谁的更新有效,这样有时先更新的就可能发生疑惑)。因此,使用第二种方法生成Where条件时,数据窗口会自动将可更新列放入Where条件,在A/B均取到数据修改后更新的情况下,如果A先更新,由于其生成的Where条件与数据库中一致,会保存成功,而由于生成的Where条件与数据库中记录已经不匹配(已被A所修改),就会出现错误提示,这样可让用户采取措施,是放弃更新还是重新更新,是由商业逻辑决定的。

    那么默认值是如何影响这一切的?举例来说,一个表有三个字段,分别为KeyField(字符型)、Field1(数字型)、Field2(数字型),其中KeyField为主键,其余的两个为普通字段,Field1无默认值,Field2默认为0。对应的数据窗口,由于Field2字段不常用,所以被隐藏起来。而某用户在数据窗口中先增加了一条记录,值分别为A、0。保存提交。这时数据库根据数据窗口提交的语句,在表中插入一条记录A、0、0。注意Field2的值是自动生成的默认值。在这个时候,此人又修改了Field1的值为3,根据Update属性,数据窗口可能会生成一条语句 Update TableName Set Field1=3 where KeyField='A' and Field1=0 and Field2 is Null。这里数据窗口之所以认为Field2应该是NULL,因为数据窗口本身没对Field2置默认值,也没有重新从数据库中取得Field2的值,它认为Where条件中就应该包括Field2 is null这一子句。显然,数据库中已经没有这样一条记录了,造成了上述错误。

    有时如果事先不知道数据库的字段增加,而该字段又是在数据窗口隐藏的,最容易出现此类问题。因此磁上这种情况,考虑一下默认值可能是不错的解决方法。

    以上分析只是一点浅薄之见,请各位大侠斧正之。 
  • 0
    点赞
  • 2
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 2 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

洛阳老马

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值