根据自定义逻辑生成物料编码

将此自定义脚本添加到项目的脚本中,以便在项目保存前
自动生成新的项目代码。

 cur_frm.cscript.customvalidate = function (doc) {
  // clear itemcode (name is from itemcode)
  doc.itemcode = "";

  // first 2 characters based on itemgroup
  switch (doc.itemgroup) {
    case "Test A":
      doc.itemcode = "TA";
      break;
    case "Test B":
      doc.itemcode = "TB";
      break;
    default:
      doc.itemcode = "XX";
  }

  // add next 2 characters based on brand
  switch (doc.brand) {
    case "Brand A":
      doc.itemcode += "BA";
      break;
    case "Brand B":
      doc.itemcode += "BB";
      break;
    default:
      doc.itemcode += "BX";
  }
};

获取自定义字段上的完整地址文本

本文将通过三个步骤,帮助您在任何 DocType 上添加一个用于获取完整地址的自定义字段。

步骤 1:在所需 DocType 上进行外观自定义

首先,我们需要在 DocType 上添加两个新字段来获取地址:

a) 一个类型为“链接”的字段,指向我们的地址主数据

b) 一个类型为“只读”的字段,用于显示完整地址

请记下您创建的新字段的变量名。此信息将在后续步骤中用到。

有关在 DocType 上创建自定义字段的信息,您可以参考以下链接 – ERPNext 中的自定义字段

完成此步骤后,您应该在所选 DocType 上看到两个新字段,如下图所示:

步骤 2:添加客户端脚本以从地址主数据获取完整地址

在搜索栏中搜索“客户端脚本”,然后创建一个新的客户端脚本。选择需要获取地址的所需 DocType。

在脚本部分粘贴以下客户端脚本:

frappe.ui.form.on("DocType Name", "address_link_field", function(frm, cdt, cdn) {    if(frm.doc.address_link_field){     return frm.call({      method: "frappe.contacts.doctype.address.address.get_address_display",      args: {       "address_dict": frm.doc.address_link_field      },      callback: function(r) {       if(r.message)           frm.set_value("full_address_field", r.message);              }     });    }    else{        frm.set_value("full_address_field", "");    }});

这里,我们需要根据您的使用场景替换以下内容:

a) 将“DocType 名称”替换为需要获取地址的 DocType 的名称。例如:销售发票、采购订单等。

b) 将“addresslinkfield”替换为我们在步骤 1 中创建的自定义链接字段的变量名

c) 将“fulladdressfield”替换为我们在步骤 1 中创建的自定义只读字段的变量名

完成此操作后,您将得到一个如下所示的客户端脚本:

步骤 3:保存、启用并测试客户端脚本

根据您的使用场景修改客户端脚本后,我们可以保存它,并通过勾选“已启用”复选框来启用它。

前往所需的 DocType 并刷新页面,以使更改生效。

现在,当在我们的自定义链接字段中选择一个地址时,完整地址将显示在我们的自定义只读字段中,如下图所示:

从主数据获取值

要在选择时提取链接的值,请使用 add_fetch 方法。

add_fetch(link_fieldname, source_fieldname, target_fieldname)

示例

假设您在 客户销售发票 中创建了一个自定义字段 增值税号 (vat_id),并希望确保在销售发票中选择客户时,该值能自动更新。

要配置此功能,请在销售发票的自定义脚本中添加以下代码行:

cur_frm.add_fetch(‘customer’,’vat_id’,’vat_id’)

从主表获取子表字段值

示例脚本:从批次单据类型中获取到期日期字段并填入销售发票项目表

步骤 1:为销售发票(父级)单据类型创建自定义脚本

步骤 2:脚本如下所示并保存

frappe.ui.form.on("Sales Invoice Item", "batch_no", function(frm, cdt, cdn) {
 var d = locals[cdt][cdn];
 frappe.db.get_value("Batch", {"name": d.batch_no}, "expiry_date", function(value) {
 d.expiry_date = value.expiry_date;
 });
});

选择字段中的筛选选项

假设你有两个下拉字段,分别名为“州”和“城市”。州有两个值:卡纳塔克邦和马哈拉施特拉邦;城市有四个值:班加罗尔、迈索尔、孟买和浦那。如果你想根据州中选择的值来过滤城市中的选项,可以编写如下所示的自定义脚本。

frappe.ui.form.on("Lead", "state", function(frm) {
  if(frm.doc.state == "Karnataka") {
    set_field_options("city", ["Bangalore","Mysore"])
  } else if(frm.doc.state == "Maharashtra") {
    set_field_options("city", ["Mumbai","Pune"])
  } else if(frm.doc.state == "") {
    set_field_options("city", ["","Bangalore","Mysore","Mumbai","Pune"])
  }
});

以下是一个自定义脚本的示例,用于过滤子表中选择字段的选项:

frappe.ui.form.on('Parent DocType', {
    refresh: function (frm) {
        // Trigger this function when the form is refreshed or reloaded
        frm.fields_dict['child_table_fieldname'].grid.get_field('select_fieldname').get_query = function(doc, cdt, cdn) {
            return {
                filters: [
                    ['Some Field', '=', 'Some Value'] // Replace with your filter criteria
                ]
            };
        };
    }
});

示例场景

假设你有一个名为销售订单的父文档类型,其中包含一个名为项目的子表字段。该子表有一个名为项目代码的选择字段,你希望过滤选项,只显示特定类别中的项目。

你的脚本可能如下所示:

frappe.ui.form.on('Sales Order', {
    refresh: function (frm) {
        frm.fields_dict['items'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) {
            return {
                filters: [
                    ['Item Group', '=', 'Specific Category'] // Adjust the filter criteria as needed
                ]
            };
        };
    }
});

客户端脚本

客户端脚本是在浏览器中执行的小段代码,用于扩展或定制 ERPNext 的标准功能。

构建 > 脚本 > 客户端脚本

  1. 如何创建自定义脚本

创建自定义脚本(您必须拥有系统管理员角色才能执行此操作):

  1. 转到自定义脚本列表,然后点击新建。

  2. 您将被重定向到一个页面,在该页面中,系统会要求您输入要为其创建自定义脚本的文档类型。

  3. 输入您的自定义脚本,并确保它已启用。

  4. 保存。

  5. 注意事项


  • 服务器自定义脚本仅对管理员可用。
  • 客户端自定义脚本使用 JavaScript 编写,服务器自定义脚本使用 Python 编写。
  • 为了进行测试,请务必在更新自定义脚本后,前往工具 > 清除缓存并刷新。