什么是SQL视图?

SQL视图是基于SQL查询的虚拟表。它们不存储数据,而是每次访问时动态生成。在Odoo中,我们可以利用SQL视图来创建复杂的报告,这些报告直接从数据库中提取数据,提供实时的业务洞察。

创建Odoo模型

首先,我们需要在Odoo中创建一个新的模型来表示我们的报告。这个模型不会对应于实际的数据库表,而是映射到我们将要创建的SQL视图。

from odoo import models, fields, api

class MaterialDetailReport(models.Model):
    _name = 'material.detail.report'
    _description = 'Material Detail Report'
    _auto = False  # 防止Odoo尝试创建表

    material_name = fields.Char(string='物料名称')
    material_code = fields.Char(string='物料编码')
    material_attribute = fields.Char(string='物料属性')
    sku = fields.Char(string='SKU')
    brand = fields.Char(string='品牌')

定义SQL视图

接下来,我们在模型中定义init方法来创建SQL视图。这个视图基于一个SQL查询,该查询联结了多个表来提供所需的数据。

class MaterialDetailReport(models.Model):
    # ...(其他模型定义)

    @api.model_cr
    def init(self):
        self._cr.execute(""" 
            CREATE OR REPLACE VIEW material_detail_report AS (
                SELECT
                    row_number() OVER () as id,
                    pt.name AS material_name,
                    product.default_code AS material_code,
                    pt.origin AS material_attribute,
                    pt.sku AS sku,
                    branch.name AS brand
                FROM
                    product_product product
                    JOIN product_template pt ON product.product_tmpl_id = pt.id
                    LEFT JOIN product_brand branch ON pt.brand_id = branch.id
                    LEFT JOIN mrp_bom_line bom_line ON bom_line.product_id = product.id
                WHERE
                    bom_line.id IS NOT NULL
                    AND pt.origin = 'mpo'
            )
        """)

创建Odoo视图和菜单项

为了在Odoo界面中访问这个报告,我们需要定义一个树状视图和一个菜单项。

<!-- 添加在XML文件中的视图和菜单定义 -->
<record id="view_material_detail_report_tree" model="ir.ui.view">
    <field name="name">material.detail.report.tree</field>
    <field name="model">material.detail.report</field>
    <field name="arch" type="xml">
        <tree>
            <field name="material_name"/>
            <field name="material_code"/>
            <field name="material_attribute"/>
            <field name="sku"/>
            <field name="brand"/>
        </tree>
    </field>
</record>

<record id="action_material_detail_report" model="ir.actions.act_window">
    <field name="name">Material Detail Report</field>
    <field name="res_model">material.detail.report</field>
    <field name="view_mode">tree</field>
    <field name="view_id" ref="view_material_detail_report_tree"/>
</record>

<menuitem id="menu_material_detail_report" name="Material Detail Report"
          parent="base.menu_custom" action="action_material_detail_report"/>

结论

通过使用SQL视图,Odoo提供了一种强大的方式来创建动态和高度定制的报告。这种方法不仅提高了报告的灵活性,还确保了数据的实时准确性