自定义报表

Odoo 配备了一个强大且易于使用的报表框架。该引擎允许您创建新的报表,例如 税务报表资产负债表损益表,并支持 特定的分组方式布局设计

重要

启用 开发者模式 以访问会计报表创建界面。

要创建一个新的报表,请转到 会计 ‣ 配置 ‣ 会计报表管理。在此处,您可以创建一个 根报表 或一个 变体

会计报表引擎。

根报表

根报表可以被视为通用的、中性的会计报表。它们作为本地会计版本的基础模型。如果一个报表没有根报表,那么它本身就被视为根报表。

Example

比利时和美国的税务报告都将使用相同的通用版本作为基础,并根据各自的国内法规进行调整。

创建新根报表时,需要为其创建一个 菜单项。要执行此操作,请打开该报表,然后在该报表的同一页面上,点击 操作 ‣ 创建菜单项。刷新页面;现在该报表已出现在 会计 ‣ 报表 下。

注解

需要创建新根报告的情况很少,例如当某个国家的税务机关要求一种新的特定类型报告时。

创建菜单项按钮

变体

变体是根报表的国家特定版本,因此始终指向一个根报表。要创建变体,请在创建新报表时,在 根报表 字段中选择一个通用(根)报表。

当从会计应用的主要菜单中打开一个主报表时,所有相关的变体都会在视图右上角的变体选择器中显示。

Example

在下图中,增值税报告(比利时) 是根 通用税务报告 的变体。

报告变体选择。

在创建了报表(无论是主报表还是变体报表)之后,您需要为其添加行。您可以点击 添加一行 来创建新行,或者通过点击现有行来对其进行修改。所有行都 必须 包含一个 名称,如果您希望在公式中使用其值,还可以选择性地添加一个自定义的 代码

发动机行选项。

表达式

每行可以包含一个或多个 表达式。表达式可以看作是报表行所需的 子变量。要创建一个表达式,请在报表行内点击 添加一行

When creating an expression, you must attribute a label used to refer to that expression. Therefore, it has to be unique among the expressions of each line. Both a Computation Engine and a Formula must also be indicated. The engine defines how your formula(s) and subformula(s) are interpreted. It is possible to mix expressions using different computation engines under the same line if you need to.

注解

根据引擎的不同,可能还需要 子公式

"Odoo 领域" 引擎

通过此引擎,公式会被解释为一个指向 account.move.line 对象的 Odoo 域

子公式允许您定义如何使用与域匹配的分录行来计算表达式的值:

求和

结果是所有匹配分录行余额的总和。

满足条件的求和

结果是所有匹配分录行余额的总和,如果该金额为正数。否则,结果为 0

求和如果为负

结果是所有匹配分录行余额的总和,如果该金额为负数。否则,结果为 0

统计行数

结果是该表达式的子行数量。如果父行具有分组值,这将对应于匹配的会计分录行中不同分组键的数量。否则,这将是匹配的会计分录行的数量。

你也可以在子公式的开头添加一个 - 号,以**反转**结果的符号。

报表中的表达式行

"税项标签" 引擎

此引擎使用的公式包含一个用于匹配税项标签的名称。如果在创建表达式时不存在此类标签,它们将被自动创建。

在计算表达式时,表达式的计算可以大致表示为:(带有 `+` 标签的分录行金额) - (带有 `-` 标签的分录行金额)

Example

如果公式为 tag_name,引擎将匹配税标签 +tag_name-tag_name,并在必要时创建这些标签。进一步举例说明:公式将匹配两个标签。如果公式为 A,则会要求(并在需要时创建)标签 +A-A

“其他公式”汇总引擎

在需要对其他表达式获得的金额执行算术运算时,请使用此引擎。此处的公式由用四种基本算术运算符(加法 +、减法 -、除法 / 和乘法 *)分隔的表达式引用组成。要引用一个表达式,请在其父行的 代码 后面输入一个句点 .,然后输入该表达式的 标签**(例如 **code.label)。

**子公式**可以是以下其中一种:

如果金额大于等于当前值

如果算术表达式的值大于提供的边界值,则将返回该值;否则,结果将为 0

如果金额低于(CUR(金额))

如果算术表达式的值低于提供的上限,则会返回该值。否则,结果将为 0

如果在(CUR1(金额1), CUR2(金额2))之间

如果算术表达式的值严格位于提供的边界范围内,将返回该值;否则,该值将被调整为最接近的边界值。

如果其他表达式在上方(LINE_CODE.表达式标签,当前(金额))

只有当由提供的行代码和表达式标签表示的表达式的值大于提供的边界值时,算术表达式的值才会被返回。否则,结果将为 0

如果其他表达式在下方(LINE_CODE.EXPRESSION_LABEL, 当前金额)

只有当由提供的行代码和表达式标签所表示的表达式的值低于提供的边界值时,算术表达式的值才会被返回。否则,结果将为 0

CUR 是大写字母的货币代码,amount 是以该货币表示的金额。

你也可以使用 cross_report 子公式来匹配另一个报表中找到的表达式。

"账户代码前缀" 引擎

该引擎用于通过使用这些账户代码的前缀作为算术表达式中的变量,来匹配账户上的金额。

Example

21
算术表达式也可以是单个前缀,例如此处所示。

Example

21 + 10 - 5
该公式将账户代码以 2110 开头的会计分录的余额相加,并减去以 5 为前缀的会计分录的余额。

也可以选择忽略一部分子前缀。

Example

21 + 10\(101, 102) - 5\(57)
这个公式的工作方式与前面的示例相同,但会忽略前缀 10110257

你可以使用 CD 后缀对 借方和贷方 进行“子筛选”。在这种情况下,只有当科目的前缀匹配,并且该科目上的分录余额为 贷方/借方 时,该科目才会被考虑。

Example

账户 210001 的余额为 -42,账户 210002 的余额为 25。公式 21D 仅匹配账户 210002,因此返回 25。210001 不被匹配,因为其余额为 贷方

前缀排除可以与 CD 后缀混合使用。

Example

21D + 10\(101, 102)C - 5\(57)
该公式会将账户代码以 21 开头的分录行的借方(D)余额相加,以及以 10 开头的分录行的贷方(C)余额相加,但会忽略前缀为 101102 的账户。同时,它会减去账户前缀为 5 的分录行的余额,并忽略前缀为 57 的账户。

要在前缀中匹配字母 CD,并将其作为后缀使用,使用空的排除项 ()

Example

21D\()
此公式匹配所有代码以 21D 开头的账户,无论其余额符号如何。

除了使用代码前缀来包含账户外,您还可以通过**账户标签**进行匹配。这在某些情况下特别有用,例如,如果您所在国家没有标准化的会计科目表,同一前缀可能在不同公司中用于不同的目的。

Example

标签(25)
此公式匹配其关联标签包含ID为*25*的标签的账户。

如果所引用的标签是在数据文件中定义的,可以使用 xmlid 代替 id。

Example

标签(我的模块.我的标签)
此公式匹配其关联标签包含由 my_module.my_tag 表示的标签的账户。

你也可以使用带有标签的算术表达式,可能还会将它们与前缀选择结合使用。

Example

标签( my_module.my_tag ) + 标签(42) + 10
将标记为 my_module.my_tag 的账户余额与 ID 为 42 的标签相关联的账户余额,以及代码前缀为 10 的账户余额相加。

CD 后缀可以与标签以相同的方式使用。

Example

标签(我的模块.我的标签)C
此公式将带有标签 my_module.my_tag 且贷方余额的账户进行匹配。

前缀排除也适用于标签。

Example

标签(我的模块.我的标签)
此公式将与标签 my_module.my_tag 匹配的账户,且其代码不以 10 开头。

“外部值”引擎

“外部值”引擎用于引用 手动结转值。这些值不是通过 account.move.line 存储的,而是通过 account.report.external.value 存储的。每个此类对象直接指向它所影响的表达式,因此在此处对其选择所需做的工作非常少。

**公式**可以是以下其中一种:

求和

如果结果必须是该期间所有外部值的总和。

最近一次

如果结果必须是该期间最新外部值的值。

此外,**子公式**可以以两种方式使用:

四舍五入=X

X 替换为一个数字,表示将金额四舍五入到 X 位小数。

可编辑

表示此表达式可以手动编辑,这将触发报表中图标的显示,使用户能够执行此操作。

注解

手动输入的值是在报告中当前选择的 date_to 日期创建的。

两个子公式可以通过用 ; 分隔进行混合。

Example

可编辑;四舍五入=2
是一个正确混合两种行为的子公式。

“自定义 Python 函数”引擎

This engine is a means for developers to introduce custom computation of expressions on a case-by-case basis. The formula is the name of a python function to call, and the subformula is a key to fetch in the dictionary returned by this function. Use it only if you are making a custom module of your own.

Reports can have an indefinite number of columns to display. Each column gets its values from the expressions declared on the lines. The field expression_label of the column gives the label of the expressions whose value is displayed. If a line has no expression in that field, then nothing is displayed for it in this column. If multiple columns are required, you must use different expression labels.

报表的列。

在使用会计报表中 选项 选项卡下的 期间对比 功能时,所有列都会按每个期间重复显示。