一个文档对应多行的报表

有时,报表中同一单据编号可能会出现在多行中。这通常并不意味着单据被重复了,而是表示该报表针对该单据显示了多条匹配的数据行。

这种情况在包含子表字段、链接记录或详细的会计和库存分录的报表中很常见。

最常见原因:选择了子表

许多 ERPNext 单据都有子表。例如:

  • 一张销售发票包含多个销售发票项目
  • 一张采购订单包含多个采购订单项目
  • 一个付款计划可以有多个到期日。
  • 一笔交易可以有多个税费、扣款或会计行。

当报表包含子表中的字段时,报表会为每个子表行显示一行。

例如,如果销售发票 SINV-0001 有 3 个项目行,并且报表包含销售发票项目中的字段,则报表可能会显示:

SINV-0001    Item A
SINV-0001    Item B
SINV-0001    Item C

该发票仍然是一个单据。报表只是针对每个项目行显示了一次该发票。

为什么会这样

报表是基于数据库行构建的。父单据和子表之间是一对多的关系。

一个父单据可以对应多个子表行:

Sales Invoice
  - Item 1
  - Item 2
  - Item 3

当报表包含子表数据时,Frappe 需要分别显示每个子表行,以便子表值可见。这是预期行为。

报表显示多行的其他原因

1. 包含了多个子表

如果报表包含多个子表中的字段,行数可能会进一步增加。

例如,如果一张发票有 3 个项目行和 2 个税行,一个结构不佳的自定义报表可能会显示比预期更多的行,因为两个子表被连接在一起了。

在这种情况下,请检查报表设计,只包含所需的子表。

2. 报表显示分类账或明细分录

有些报表本身就是明细级别的报表,并非设计为每个单据显示一行。

例如:

  • 总分类账样式的报表可能为每个会计分录显示一行。
  • 库存报表可能为每个库存分类账分录显示一行。
  • 应收或应付报表可能根据发票、付款或未结引用显示行。

同一个凭证号可能出现多次,因为一个单据可以生成多个分类账分录。

3. 报表包含具有多个匹配项的链接记录

一个单据可能连接到多个相关记录。例如,一张发票可以链接到多个付款分录、交货单、序列号、批次或会计引用。

如果报表包含来自这些链接记录的数据,则父单据可能会针对每个匹配的链接记录显示一次。

4. 自定义查询报表存在连接问题

在自定义查询报表中,如果 SQL 查询在没有正确条件的情况下连接表,则可能会出现重复行。

例如,连接父表和子表时,如果没有将子表行与其父单据匹配,可能会产生过多行。

请检查查询是否使用正确的父字段连接子表,例如:

child.parent = parent.name

当子表是共享的或查询需要更具体时,还要检查 parenttypeparentfield 等字段。

5. 报表未进行分组

如果目标是每个单据显示一行,则报表可能需要进行分组或聚合。

例如,报表可以不单独显示每个项目行,而是按销售发票分组并显示:

  • 总数量
  • 总金额
  • 项目行数
  • 首个或最后一个日期

这取决于您需要的是汇总报表还是明细报表。

如何检查行重复的原因

  1. 打开其中一个重复的单据。
  2. 检查其子表中是否有多行,例如项目、税费、付款计划或其他明细表。
  3. 在报表中,检查是否有任何选定的列来自子表。
  4. 如果是自定义报表,请检查连接和筛选条件。
  5. 确定报表应显示明细行还是每个单据一行汇总行。

如何实现每个单据显示一行

如果您希望每个单据显示一行,请尝试以下方法之一:

  • 从报表中移除子表列。
  • 仅使用父 DocType 中的字段。
  • 使用分组,例如按单据名称分组。
  • 使用聚合值,如求和、计数、最小值或最大值。
  • 构建一个自定义查询报表或脚本报表,使其每个父单据返回一行。

总结

当报表包含子表数据或其他明细级记录时,同一单据出现多行通常是预期行为。

关键问题是:报表应显示每一行明细,还是应将单据汇总为一行?

如果报表旨在回答项目级、税务级、分类账级或库存条目级的问题,则多行是正确的。如果旨在回答单据级的问题,请使用父字段、分组或自定义报表设计。

  • 报表
  • 报表生成器
  • 查询报表
  • 脚本报表
  • 子表 / 表格 DocType