在 ERPNext V-14 中开发新的查询报告。编写了一个 SQL 查询,它运行良好,但是当添加过滤器字段名并将其值保留为空时,会出现错误消息“KeyError:”,而如果在该字段中写入或选择任何值,则它运行良好。我想要什么,如果 fieldname 中没有值,那么它不应该在 SQL 中的 where 语句中考虑。
我相信,错误原因是未找到字段名/对象或由于没有值而未初始化,并且由于它正在检查 WHERE 语句,因此,会发生此错误,但不确定实际原因。
我需要知道有什么办法可以解决这个问题吗?我不想强制字段名称。
这是 SQL:
SELECT
j.company as company
, ja.account as account
, ja.debit as debit
, ja.credit as credit
FROM tabJournal Entry as j
inner join tabJournal Entry Account as ja on ja.parent=j.name
where ja.account=%(account)s ;
期望执行类似的操作或解决方法来检查字段名/对象是否存在?类似下面的SQL
select … from
where exists(%(account)s) or isnull(%(account)s)>0
此外,请参考下面的截图:
可能会发生这种情况,因为帐户过滤器不是强制性的,因此 Frappe 将运行您的 py 报告。有两种方法,即强制帐户:
{
"fieldname":"company",
"label": __("Company"),
"fieldtype": "Link",
"options": "Company",
"reqd": 1, // set filter to mandatory
"default": frappe.defaults.get_user_default("Company")
},
此代码示例用于过滤公司,您可以为公司设置默认值,也可以在 Frappe 运行报表之前强制执行此过滤器。
第二种方法是更改你的Python代码:
filter_report = ""
if filters.get("account"):
filter_report += "WHERE ja.account = {}".format(filters.get("account"))
sql = frappe.db.sql("""
SELECT
j.company as company
, ja.account as account
, ja.debit as debit
, ja.credit as credit
FROM tabJournal Entry as j
inner join tabJournal Entry Account as ja on ja.parent=j.name
{}
""".format(filter_report), as_dict=1)