创建自定义报表

SQL 视图是一种创建自定义报表的技术,用于显示现有模型的字段和视图无法显示的数据。换言之,该技术有助于避免仅为数据分析目的而创建和计算不必要的额外字段。

创建模型

SQL 视图的创建方式与标准模型类似:

from odoo import fields, models


class ModuleReport(models.Model):
    _name = 'module.report'
    _description = "Module Report"
    _rec_name = 'module_field'
    _auto = False

其中属性:

  • _auto = False 表示我们不想将模型存储在数据库中

  • _rec_name 指明模型的哪个字段表示记录的名称(即在打开记录的表单视图时,用于导航面包屑的名称)

其字段的定义方式与标准模型相同,只是每个字段都标记为 readonly=True。

注解

不要忘记将新模型添加到您的安全文件中。

填充模型

填充 SQL 视图的表有 2 种方式:

  • 重写 BaseModel.init() 方法,

  • 设置 _table_query 属性。

无论使用哪种方式,都会执行 SQL 查询来填充模型。因此,可以使用任何 SQL 命令来收集和/或计算所需的数据,同时您应记住,这样做是在绕过 ORM(即,如果您尚未阅读,最好通读 Odoo 中的安全性)。SELECT 返回的列将填充模型的字段,因此请确保您的列名与字段名匹配,或使用与之匹配的别名。

在大多数情况下,重写 BaseModel.init() 方法是标准且更好的选择。它需要导入 tools,通常的写法如下:

def init(self):
    tools.drop_view_if_exists(self.env.cr, self._table)
    self.env.cr.execute("""CREATE or REPLACE VIEW %s as (
                           SELECT
                              %s
                           FROM
                              %s
        )""" % (self._table, self._select(), self._from()))

tools.drop_view_if_exists 确保在执行 SQL 查询时不会创建冲突的视图。通常会将查询的不同部分分开,以便更轻松地扩展模型。查询在各方法之间如何拆分并没有统一标准,但至少 _select 和 _from 方法是常见的,当然,所有这些方法都会返回字符串。

使用模型

SQL 视图的视图和菜单项的创建与使用方式与任何其他 Odoo 模型相同。现在您可以开始使用 SQL 视图了。祝您使用愉快!

额外提示

小技巧

SQL 视图中的一个常见错误是未考虑表 JOIN 导致的某些数据重复。这可能会在使用字段的 aggregator 和/或透视视图时导致计数错误。最好使用足够的数据测试 SQL 视图,以确保生成的字段值符合您的预期。

小技巧

如果您有某个字段不想用作度量(即,在透视视图或图形视图中),请为其添加 store=False,它就不会显示。