0

我想更新isproven到表中的 Nm_requisition

m_requisition_id在哪里xx_reqverification = 'value from input'

并且docstatusxx_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数据库

当我将 s 打印到控制台时

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;

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

4

1 回答 1

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();

我还可以推荐阅读 wiki 中关于扩展 Adempiere的以下页面

最后一点,通常与文档状态更改相关的逻辑可能也值得调查!

于 2019-03-07T10:00:18.383 回答