• odoo 报表


    报表引擎

    odoo的报表引擎使用的是QWeb,关于QWeb的的更多内容,会在第二部分中有单独的篇章介绍,目前只需要知道,QWeb是odoo自己开发的一套模板渲染引擎即可。

    创建报表

    下面介绍一下编写报表的步骤

    定义报表动作

    首先,我们需要定义一个报表:

    <record model="ir.actions.report" id="sale_tag_report.report">
        <field name="name">标签打印</field>
        <field name="model">sale.order</field>
        <field name="report_type">qweb-pdf</field>
        <field name="report_name">sale_tag_report.tag</field>
        <field name="print_report_name">(object.name)</field>
        <field name="binding_model_id" ref="sale.model_sale_order"/>
    </record>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    报表定义有简化的写法:

    <report id="report_product_packaging"
                string="Product Packaging (PDF)"
                model="product.packaging"
                report_type="qweb-pdf"
                name="product.report_packagingbarcode"
                file="product.report_packagingbarcode"
                print_report_name="'Products packaging - %s' % (object.name)"/>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这在系统中将会生成一条记录(系统设置-技术-报表):
    在这里插入图片描述

    其中,binding_model_id决定了该按钮绑定在那个模型上面显示。

    绘制报表页面

    Odoo的报表页面想要自己画还是比较繁琐的,通常我们可以参考既有的报表格式进行参照修改。
    看一个我自己写的报表页面:

    <template id="sale_tag_report.tag" name="sale_tag_report.tag">
        <t t-call="web.html_container">
            <div class="article o_report_layout_clean">
                <t t-raw="0"/>
                <t t-foreach="docs" t-as="doc">
                    <t t-foreach="doc.order_line" t-as="line">
                        <div class="page" style="page-break-before: always;">
                            <h1>
                                <t t-esc="line.sale_collection"/>
                            </h1>
                            <div>
                                <strong>面料号:</strong>
                                <p t-field="line.product_id.name"/>
                            </div>
                            <div>
                                <strong>数量:</strong>
                                <p t-field="line.product_uom_qty"/>
                            </div>
                            <div>
                                <strong>客户名称:</strong>
                                <p t-field="doc.partner_id.name"/>
                            </div>
                            <div>
                                <strong>备注:</strong>
                                <p t-field="line.client_description"/>
                            </div>
                        </div>
                    </t>
                </t>
            </div>
        </t>
    </template>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • web.html_container: 是我们编写报表最外层的嵌套容器,直接引用即可。
    • docs:报表默认会将我们绑定的模型当前记录赋值给变量docs,我们在编写报表时可以直接引用
    • style=“page-break-before: always;” : 将页面分隔,每页一条记录。
      这样就完成了一个简单的报表编写过程。关于报表,其实还有纸张格式、变量赋值等更多更深的内容,后边会讲到。

    修改报表

    对于我们需要修改的报表,可以在设置中-动作-报表中根据模型找到对应的模板文件。

    由上图中的按钮Qweb视图可以找到对应的Qweb代码文件,我们可以通过修改Qweb代码的方式来修改报表。

    修改报表字体

    想要修改PDF的报表字体,只需要在div的样式表中添加如下的样式:

    <div class="font-size: 35px !important;">
    </div>
    
    • 1
    • 2

    报表的修改通常是个耗费时间精力的事情,读者要是没有耐心,亦可选购笔者提供的报表修改服务。
    在报表中添加条码
    odoo中内置了在报表中添加条码的功能,原理很简单,即使用img标签,将带有条码的URL链接添加到img的url属性中。

    @http.route(['/report/barcode', '/report/barcode/<type>/<path:value>'], type='http', auth="public")
    def report_barcode(self, type, value, width=600, height=100, humanreadable=0, quiet=1):
        pass
    
    • 1
    • 2
    • 3

    从源代码层面上分析可以得出,条码的引用接受6个参数:

    • type: 可选的参数有 ‘Codabar’, ‘Code11’, ‘Code128’, ‘EAN13’, ‘EAN8’, ‘Extended39’,
      ‘Extended93’, ‘FIM’, ‘I2of5’, ‘MSI’, ‘POSTNET’, ‘QR’, ‘Standard39’, ‘Standard93’,
      ‘UPCA’, ‘USPS_4State’

    • value: 生成的条码内容

    • width: 条码宽度

    • height: 条码高度

    • humanreadable: 0 或 1,是否在条码中添加可读性文本

    • quiet: 0 或 1,是否添加页面留白
      例如:

    <td>
    <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s&amp;humanreadable=1' % ('Code128', object.quantity, 600, 50)" style="width:100%;height:4rem" alt="Barcode"/>
    </td>
    
    • 1
    • 2
    • 3

    报表中的特殊字符
    xml中不能出现特殊字符,像&、>,< 等符号需要转义:
    在这里插入图片描述
    &和amp;中间没有空格

    报表中日期字段的格式化

    如果想要把模型中的datetime类型的字段格式化成date类型,那么可以使用t-options选项。
    例子:

    <span t-field="o.date_invoice" t-options='{"format": "MM/dd/yyyy"}'/>
    
    • 1

    报表样式文件

    我们可以自己定义报表的样式,但是不是像普通的后台样式文件一样的继承方式,而是需要继承自web.report_assets_common。

  • 相关阅读:
    Ubuntu Server 20.04 LTS 64bit安装ftp服务
    13 套接字Socket
    C++ 特殊类设计
    Java SPI服务发现与扩展的利器
    ASEMI整流桥GBPC2510W规格书,GBPC2510W应用领域
    如何用python连接Linux服务器
    java基本微信小程序的心理服务平台 uniapp 小程序
    【PID优化】基于头脑风暴算法PID控制器优化设计含Matlab源码
    todolist案例——vue脚手架(1)
    环境配置 | VS2017配置OpenMesh源码和环境
  • 原文地址:https://blog.csdn.net/ekcchina/article/details/125536139