什么是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提供了一种强大的方式来创建动态和高度定制的报告。这种方法不仅提高了报告的灵活性,还确保了数据的实时准确性