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

    技术2022-05-11  81

    日前曾经遇到过因数据窗口保存时出现“其它错误”,跟踪发现数据窗口提示是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)