脚本报表

您可以通过创建新的报表,使用服务器端脚本来生成表格形式的报表。

注意:您需要拥有管理员权限才能执行此操作。

由于这些报表通过 Python 脚本为您提供不受限制的访问权限,因此只能由管理员创建。报表的脚本部分会成为应用程序代码库的一部分。如果您尚未创建应用程序,请阅读此文档。

注意:您必须处于开发者模式才能执行此操作。

1. 创建新报表

  1. 将“报表类型”设置为“脚本报表”
  2. 将“是否标准”设置为“是”
  3. 选择您要添加此报表的模块
  4. 在模块文件夹中(例如,如果是在 ERPNext 的 Accounts 模块中,文件夹将为 erpnext/accounts/report/[report-name]),您会看到将创建报表文件的模板。
  5. 在 .js 文件中,您可以为报表设置筛选条件。
  6. 在 .py 文件中,您可以编写用于生成报表的脚本。

2. 添加筛选条件

您可以在 .js 中添加筛选条件。示例如下:

frappe.query_reports["Accounts Receivable"] = {
    "filters": [
        {
            "fieldname":"company",
            "label": ("Company"),
            "fieldtype": "Link",
            "options": "Company",
            "default": frappe.defaults.getuserdefault("company")
        },
    ]
}
  1. 这些属性的设置方式与您在 DocType 中设置 DocField 时相同。

3. 添加脚本

在 .py 文件中,您可以添加用于生成报表的脚本。

  1. 在 execute 方法中,会返回两个列表 columns 和 data。
  2. 列必须是一个字典列表,其中包含 fieldname、label、fieldtype、options、width 等字段。例如:
[
    {
        "fieldname": "account",
        "label": _("Account"),
        "fieldtype": "Link",
        "options": "Account",
        "width": 300,
    },
    {
        "fieldname": "currency",
        "label": _("Currency"),
        "fieldtype": "Link",
        "options": "Currency",
    },
]
  1. 您可以使用所有服务器端模块来构建您的报表。
  2. 例如,请参阅现有报表(如资产负债表)。

  1. 在模块文件夹中(例如,如果是在 ERPNext 的 Accounts 模块中,文件夹将为 erpnext/config/accounts.py),您会看到各个部分的标签和项目。新报表可以添加到项目列表中,如下例所示:
def get_data():
    return [
        {
            "label": _("Accounting Statements"),
            "items": [
                {
                    "type": "report",
                    "name": "Balance Sheet",
                    "doctype": "GL Entry",
                    "is_query_report": True,
                }
            ],
        }
    ]

预生成报表

某些脚本报表在浏览器中运行时间过长。预生成报表 会将执行过程移至后台任务,这样用户在报表运行时就不会被阻塞。

当在报表上勾选预生成报表选项时,每次运行都会被加入队列,而不是同步执行。用户会看到进度指示器,并在结果准备好时收到通知。完成的结果会作为预生成报表文档存储,之后可以使用相同的筛选条件重新打开。

预生成报表还解锁了以下功能:

  • 生成 CSV — 可选择在 JSON 结果之外同时生成 CSV 附件
  • 超时时间(秒) — 后台任务在被视为失败之前可以运行的时间长度(默认值:1500 秒)

预生成报表适用于运行缓慢但稳定的报表。用户需要等待并稍后回来查看结果,而不是在浏览器中立即获得表格。

报表打印格式

在 4.1 版本中,我们引入了报表打印格式。这些是 HTML 模板,您可以使用它们来格式化查询报表数据以供打印。

1. 创建新的打印格式

要创建新的打印格式,只需在查询报表的文件夹中放入一个 .html 文件。例如,对于 ERPNext 中的总分类账报表,您可以在 .js 和 .py 文件旁边放入一个名为 general_ledger.html 的文件。

erpnext/accounts/general_ledger 的目录结构
general_ledger/
├── __init__.py
├── general_ledger.html
├── general_ledger.js
├── general_ledger.json
└── general_ledger.py

2. 模板语法

对于模板,我们使用了 John Resig 的微模板脚本的改编版本。如果您了解 Javascript,那么掌握这种模板语言会非常容易。

以下是一些示例(来自 John Resig 的博客):

示例:属性:

![](<%=profile_image_url%>)

**[<%=from_user%>](<%=from_user%>):** <%=text%>

示例:代码结构、循环

<% for ( var i = 0; i < users.length; i++ ) { %>
- [<%=users[i].name%>](<%=users[i].url%>)
<% } %>

注意:请务必注意,您不应在模板中使用单引号(’),因为引擎无法有效处理它们。

3. 数据

模板可用的数据如下:

  • data:这是一个记录列表,每条记录是一个对象,其属性由标签转换为 slug 格式。例如,“过账日期”变为“posting_date”
  • filters:报表中设置的筛选条件
  • report:报表视图对象

4. 示例

以下是总分类账报表的构建方式:

总分类账打印格式模板

报表效果如下:

注释:
  1. Bootstrap 样式表已预先加载。
  2. 您可以使用所有全局函数,如 fmt_money 和 dateutil。
  3. 可翻译的字符串应写成 __("text") 的形式。
  4. 您可以使用 {% include "templates/includes/formats/common_format" %} 创建模块并进行导入。

如何制作查询报表

您可以通过创建新的报表,使用复杂的 SQL 查询来生成表格形式的报表。这些报表可由系统管理员创建,并存储在数据库中。

注意:您需要拥有系统管理员权限才能执行此操作。

要创建新的查询报表:

1. 创建新报表

  1. 将类型设置为“查询报表”
  2. 设置参考文档类型 – 拥有该参考文档类型访问权限的用户将可以访问此报表
  3. 设置模块 – 该报表将出现在模块的“自定义报表”部分中。
  4. 添加您的查询语句

2. 设置查询

您可以定义复杂的查询,例如:

SELECT
tabProduction Order.name as “生产订单:Link/生产订单:200”,
tabProduction Order.creation as “日期:Date:120”,
tabProduction Order.production_item as “物料:Link/物料:150”,
tabProduction Order.qty as “待生产数量:Int:100”,
tabProduction Order.produced_qty as “已生产数量:Int:100”
FROM
tabProduction Order
WHERE
tabProduction Order.docstatus=1
AND ifnull(tabProduction Order.produced_qty,0) = tabProduction Order.qty
AND EXISTS (SELECT name from tabStock Entry where production_order =tabProduction Order.name)

  1. 要格式化列,请按以下格式为每列设置标签:[标签]:[字段类型]/[选项]:[宽度]

3. 检查报表

4. 高级(添加筛选器)

如果您正在制作标准报表,可以通过在查询报表文件夹中添加 .js 文件,像脚本报表一样在查询报表中添加筛选器。要在查询中包含筛选器,请使用 %(filter_key)s,该位置将显示您的筛选值。

例如

SELECT … FROM … WHERE item_code = %(item_code)s ORDER BY …


注意:标准脚本报表

如果您正在为某个应用开发标准报表,请务必将“是否标准”设置为“是”

在哪里找到标准打印格式

标准打印格式是根据 DocType 的布局自动生成的。您可以通过以下方式自定义标准格式:

1. 自定义标准打印

前往 设置 > 自定义 > 自定义表单视图,您可以:

  1. 通过拖放重新排列字段
  2. 通过添加 HTML 类型字段并在选项中添加您的 HTML 来添加静态元素
  3. 通过设置打印隐藏属性来隐藏字段

2. 基于打印格式创建新布局

由于标准打印格式没有生成的模板,您需要使用 Jinja 模板语言从头创建新模板,具体操作如下:

设置 > 打印和品牌 > 打印格式

  1. 查看打印格式帮助。
  2. 您可以使用 Bootstrap CSS 框架来布局您的打印格式

提示:您可以导入标准模板宏来构建您的打印格式。

例如,添加标准页眉:

{%- from "templates/print_formats/standard_macros.html" import add_header -%}

{{ add_header() }}