DB.executeUpdate中的where子句进行错误更新

时间:2018-09-11 15:21:44

标签: sql postgresql sql-update adempiere

我想将isproven表中的m_requisition更新为N

m_requisition_id中的xx_reqverification = 'value from input'

docstatus中的xx_reqverification = 'VO'

StringBuffer s = new StringBuffer("UPDATE M_Requisition R SET")
    .append(" IsProven=").append("'N'")
    .append(" FROM XX_ReqVerification AS RV")
    .append(" WHERE RV.DocStatus='VO'")
    .append(" AND RV.XX_ReqVerification_id=")
    .append(veri.getXX_ReqVerification_ID())
    .append(" AND R.M_Requisition_id = RV.M_Requisition_id").append(";");
DB.executeUpdate(s.toString(), null);

但是此代码会引发错误

  

DB.saveError:DBExecuteError-错误:“ where”处或附近的语法错误

我正在将postgresql用于数据库

当我打印到控制台时

UPDATE M_Requisition R SET IsProven='N' 
FROM XX_ReqVerification AS RV 
WHERE RV.DocStatus='VO' AND RV.XX_ReqVerification_id =1000040 
      AND R.M_Requisition_id = RV.M_Requisition_id;

我不知道我的代码有什么问题,请帮助我解决此问题。

1 个答案:

答案 0 :(得分:0)

虽然这不是对您问题的专门回答-请参阅我对上述问题的评论/问题...

像这样直接更新数据库不是推荐的自定义Adempiere的方法。由于您将绕过应用程序的内置机制,例如WorkFlowsModelValidators甚至是Callouts,因此有可能破坏应用程序的一致性。这些机制与“应用程序字典”一起存在,以允许自定义ERP应用程序而不会带来不一致的风险。

如果使用内置机制保存实体,则不会有破坏应用程序的风险。应用程序模型中的每个“实体”都会扩展一个名为PO(持久对象)的类,该类具有save()方法。使用此方法代替直接的数据库更新将确保遵循应用程序字典中定义的所有规则,并确保运行通过上述机制所需的功能。

实际上应该是一条更简单的路线,例如...

MRequisition req = new MRequistion(getCtx(), requisition_id, get_TrxName());
req.setDocStatus(DOCSTATUS_Voided);
req.setIsApproved(false);
req.save();

我还建议您从extending Adempiere上的Wiki阅读以下页面

最后一点,通常是与文档状态更改相关的逻辑,这也许也值得研究!