ERPNext v14服务器脚本重写报价项金额计算函数求助
问题
我需要重写报价项的金额计算函数,把原逻辑「数量单价」改成「数量单价长度宽度」。已经在客户端完成修改,但保存报价时金额会恢复成原公式。尝试了两段服务器脚本,始终没法访问对应字段,求解决思路!
尝试的第一段文档类型事件脚本:
amount = flt(doc.quantity) * flt(doc.rate) * flt(doc.length) * flt(doc.width) frappe.db.set_value("Quotation Item", doc.name, "amount", amount) print("Script is working")
第二段脚本:
def before_save(doc, event): doc.amount = doc.quantity * doc.rate * doc.length * doc.width print("Script is working")
解决思路
- 先确认字段有效性:检查
length和width字段是否真的存在于「Quotation Item」文档类型中,且服务器脚本拥有访问权限。可以在Frappe的DocType编辑器里核对字段配置,确保字段状态为启用、权限设置为可读可写。 - 优化字段计算逻辑:第二段脚本修改
doc对象的方式更合理,但要处理字段为空的情况,避免类型错误。调整后的代码如下:
这里用def before_save(doc, event): doc.amount = flt(doc.quantity) * flt(doc.rate) * flt(doc.length or 0) * flt(doc.width or 0)or 0确保空字段不会导致计算出错。 - 排查逻辑覆盖问题:检查是否有其他脚本(比如默认的金额计算钩子)在你的脚本之后执行,覆盖了金额值。可以调整脚本的执行顺序,或者在系统设置里禁用报价项的默认金额自动计算。
- 验证脚本执行状态:查看Frappe的系统日志(如
frappe.log),确认你的脚本是否真的被触发。如果没执行,检查脚本的事件绑定是否正确——要绑定到「Quotation Item」文档类型,而非父级的「Quotation」。 - 换用
validate事件:如果before_save还是被后续逻辑覆盖,可以尝试用validate事件,它会在文档校验阶段更早触发:def validate(doc, event): doc.amount = flt(doc.quantity) * flt(doc.rate) * flt(doc.length or 0) * flt(doc.width or 0)
内容的提问来源于stack exchange,提问作者imo
相关产品推荐
相关产品推荐

