2012-04-04 64 views
1

我遇到的问题是:我有一个DataWindow在窗口打开检查是否存在任何行,如果不存在,我手动插入一行。在某些时候,在我调用DataWindow上的更新之前,会将一行插入表中。当我呼叫更新时,一行已经存在,我的更新无法保存,因为它使用插入而不是更新。有没有办法来减轻这一点?当需要更新时使用插入PowerBuilder DataWindow

dw_dates.SetTransObject(SQLCA); 
dw_dates.Retrieve(gs_facility_pfi, is_pcn);  

if(dw_dates.rowcount() = 0) then 
    int row; 
    row = dw_dates.InsertRow(1);  
    dw_dates.setitem(row, 'patient_ctrl_num', is_pcn); 
    dw_dates.setitem(row, 'pfi_num', gs_facility_pfi); 
end if 
+0

特里正与ItemStatus(获取/设置)。但是我注意到你的代码有些奇怪。如果dw_dates没有行,但在第一行之后尝试插入一行,则会发生。我忘记PB如何处理使用高于行数的数字,但如果没有行,我会将其更改为InsertRow(0)。正如Terry所说,如果itemstatus有错误,您可以使用SetItemStatus来处理它,但请确保查看哪些状态可以更改为哪些表,哪些需要执行两项操作。 – 2014-05-01 18:17:47

回答

1

PowerBuilder是不会,自动将知道是否存在具有相同键一行在那里。 DataWindow基于行状态生成INSERT或UPDATE语句(有关详细信息,请参阅帮助中的GetItemStatus())。

这不是很清楚你的要求是什么。如果你想要插入一条新记录或覆盖现有记录,我会建议从DataWindow获取一个存储过程更新,以确定是否需要插入或更新INSERT或UPDATE,并相应地执行。如果您希望此客户端始终插入新记录并适当调整主键值,以避免覆盖或冲突现有数据,建议您查看您的DBMS是否支持关键列的身份或序列值,并查看DataWindow的“更新属性”对话框上的“标识列”功能。

祝你好运,

特里。

0

您需要先回答业务问题。你想失去他人的更新吗?

如果您正在获取DW msg:行在Retrieve和Update之间更改...这是一个有效的味精。如果您查看数据窗口,默认情况下您会注意到更新使用的列是所有可编辑的列。您可以将其更改为主键。这将允许您的更新“工作”,但它也会覆盖其他人的更改。

这听起来像你的PK太泛泛。你可能想看看一个独特的,顺序驱动的方法。

杰森

0

不确定是否有人会使用“row = dw_dates.InsertRow(1);”,如果你想要一个虚拟行然后尝试使用row = dw_dates.InsertRow(0);这将在最后插入行。此外,您可能想要使用SetRow或ScrolltoRow来使其成为当前行。

0

所以你说的是其他用户已经插入了这一行。 然后,您必须在调用datawindow上的update()之前再次执行检查。 最好的解决方案是使用存储过程更新并在那里检查是否存在行并决定是否要执行INSERT或UPDATE。但是,再次,如果你更新你会覆盖别人的数据。

相关问题