当预期值是False时,Odoo报表字段数据为“未定义”。

3

我已修改crm_opportunity_report

  • added a boolean field is_customer = fields.Boolean('Is customer', readonly=True)

  • added a field to the view

    CREATE VIEW crm_opportunity_report AS (
        SELECT
            <...>omitted<...>
            rp.customer as is_customer
        FROM
            "crm_lead" c                        
            LEFT JOIN "res_partner" rp ON rp.id = c.partner_id
            <...>omitted<...>                
        GROUP BY c.id, stage.name, is_customer
    
在报告中,当我点击“+”并选择“是否为客户”时,有时会出现值为Undefined的情况。
尝试过这个:COALESCE(rp.customer, FALSE) as is_customer(在Group by中也是如此),但“Undefined”仍然存在。
在Odoo报告中,我怎样才能使Undefined表示False,以便出现“Undefined”时显示“False”?
注意:当使用Firefox进行调试时,我可以观察到服务器从(jsonrpc)数据中返回了报告项目上的“is_customer: false”或“is_customer: true”。但是,那些在报告视图中具有“is_customer: false”的项目以某种方式被显示为“is_customer: Undefined”。
更新:
无意中,我发现了这个line
if (value === false) return _t("Undefined");

这个逻辑背后可能的原因是什么:“如果值为false,则返回“未定义””?

有趣的是,我可以添加if (value === true) return _t("Whatever"); :)


1
您的报告中是否有一些潜在客户没有partner_id,而是未定义为False - travisw
@travisw 没错,有些线索没有partner_id,因此它们不能将“is customer”(设置为true),因为“customer(boolean)”字段来自res_partner。无论如何,这些应该都是False,因为COALESCE(rp.customer, FALSE)。而且它们确实是这样的...但在报告中,false值显示为“未定义”。 - Developer Marius Žilėnas
你可以使用 COALESCE(rp.customer, 'f') 替代吗?正如你所发现的,Odoo 会将 False 翻译为“未定义”,但它应该将 'f' 翻译为“False”,因为这是它在数据库中存储的方式。 - travisw
@travisw 如果我尝试在SQL中添加fields.Char用于is_customerCASE rp.customer WHEN TRUE THEN 't' WHEN FALSE THEN 'f' ELSE 'f' END as is_customer,那么我会在报告中得到'f'和't'。但这不同,因为Char不是Boolean :/ :在Odoo筛选器中,使用fields.Char的情况下将出现Char的筛选器而不是Boolean的筛选器。 - Developer Marius Žilėnas
1
@travisw 谢谢 :)。 - Developer Marius Žilėnas
显示剩余3条评论
1个回答

2

虽然不是最理想的方法,但你可以在res.partner上创建一种计算的副本/虚拟字段,该字段存储Boolean字段的Char版本。

例如,采用以下计算方法,仅检查字段是否为True并根据其存储为't''f'

is_customer_string = fields.Char('Is a Customer? (text)', compute='_compute_is_customer_string', store=True)

@api.multi
@api.depends('is_customer')
def _compute_is_customer_string(self):
    for partner in self:
        partner.is_customer_string = 't' if partner.is_customer else 'f'

计算字段的文档

注意:使用store=True可能是可选的,但如果您存储该字段,则必须使用某个depends字段作为触发器进行重新计算。如果您不存储计算字段,则应省略depends


如果store=True,那么现有记录会有这个字段的值吗?还是只有新创建的记录才会有? - Developer Marius Žilėnas
假设您的 compute 方法在安装/升级模块时正常工作(没有错误),那么它将适用于所有记录,包括旧记录和新记录。如果由于某种原因您在安装/升级模块之前失败,则该字段将存储在数据库中,但没有值。在这种情况下,重新计算最简单的方法是(小心地)删除该列(ALTER TABLE res_partner DROP COLUMN is_customer_string),然后重新升级您的模块。 - travisw
谢谢:)!不过我还有一个问题:在Odoo透视表中,字段值被视为字符串吗?:) - Developer Marius Žilėnas
我相信是这样,但我不确定我完全理解你的问题。 - travisw
在Odoo透视报告中,如果我将所有值作为字符串返回(即使它们在内部是布尔值、整数等),是否会有任何区别? :) - Developer Marius Žilėnas
1
如果以字符串形式返回,Odoo可能会对它们进行不同的处理。我认为这主要是整数和浮点数的问题,因为在操作数据透视表时会对它们进行数学运算。不过,我需要尝试一下才能确定。 - travisw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接