用自定义脚本覆盖链接查询

您可以通过工作台的客户端脚本 DocType 使用 set_query 来覆盖标准链接查询。

set_query 方法支持两种格式:set_query(field_name, options_function()) 用于常规字段,或 set_query(field_name, child_table_name, options_function()) 用于子表中的字段。

1. 添加筛选条件

您可以为查询添加筛选条件:

frappe.ui.form.on("Bank Reconciliation", "onload", function(frm) {
 frm.set_query("bank_account", function() {
 return {
 "filters": {
 "account_type": "Bank",
 "group_or_ledger": "Ledger"
 }
 };
 });
});

更复杂的查询示例:

frappe.ui.form.on("Bank Reconciliation", "onload", function(frm){
 frm.set_query("bank_account", function(){
 return {
 "filters": [
 ["Bank Account", "account_type", "=", "Bank"],
 ["Bank Account", "group_or_ledger", "!=", "Group"]
 ]
 }
 });
});

2. 调用其他方法生成结果

您还可以设置在查询时调用的服务器端方法:

frm.set_query("item_code", "items", function() {
 return {
 query: "erpnext.controllers.queries.item_query",
 filters: frm.doc.enquiry_type === "Maintenance" ?
 {"is_service_item": "Yes"} : {"is_sales_item": "Yes"}
 };
});

自定义方法

自定义方法应返回一个用于自动选择的项目列表。如果您想发送额外的数据,可以在列表中发送多个列。

自定义方法的参数如下:

def custom_query(doctype, txt, searchfield, start, page_len, filters)

示例:

# searches for leads which are not converted
@frappe.whitelist()
@frappe.validate_and_sanitize_search_inputs
def lead_query(doctype, txt, searchfield, start, page_len, filters):
 return frappe.db.sql("""
 SELECT name, lead_name, company_name
 FROM `tabLead`
 WHERE docstatus < 2
 AND ifnull(status, '') != 'Converted'
 AND ({key} LIKE %(txt)s
 OR lead_name LIKE %(txt)s
 OR company_name LIKE %(txt)s)
 {mcond}
 ORDER BY
 IF(LOCATE(%(_txt)s, name), LOCATE(%(_txt)s, name), 99999),
 IF(LOCATE(%(_txt)s, lead_name), LOCATE(%(_txt)s, lead_name), 99999),
 IF(LOCATE(%(_txt)s, company_name), LOCATE(%(_txt)s, company_name), 99999),
 name, lead_name
 LIMIT %(start)s, %(page_len)s
 """.format(**{
 'key': searchfield,
 'mcond':get_match_cond(doctype)
 }), {
 'txt': "%{}%".format(txt),
 '_txt': txt.replace("%", ""),
 'start': start,
 'page_len': page_len
 })

注意: @frappe.whitelist() 用于向客户端暴露 lead_query
并且 @frappe.validate_and_sanitize_search_inputs 装饰器用于验证和清理通过 API 或客户端请求发送的用户输入,以避免潜在的 SQL 注入。

更多示例请参见:

https://github.com/frappe/erpnext/blob/develop/erpnext/controllers/queries.py