首页 > 其他分享 >ODOO12 强制刷新计算字段

ODOO12 强制刷新计算字段

时间:2024-10-31 10:32:29浏览次数:5  
标签:customer purchase ODOO12 id delivery record 刷新 强制 order

昨天在工作中遇到一个问题:

 由于这是odoo12的架构,所以新加的这个字段还是个计算字段。
逻辑是: 客户优先引用“出运要求”关联的客户,如果这个客户没有值,则取 “采购合同” 关联的客户字段。这张表已经有13000条数据了。
即使增加了这个客户的计算逻辑,也无法触发这个计算字段。

@api.depends('delivery_order_id', 'purchase_order')
    def _compute_customer_id(self):
        for record in self:
            if record.delivery_order_id and record.delivery_order_id.customer_id:
                # 如果出运要求存在并且有客户信息
                record.customer_id = record.delivery_order_id.customer_id
                # _logger.debug('出运要求的客户: %s', record.customer_id)
            elif record.purchase_order_id and record.purchase_order.customer_id:
                # 如果出运要求没有客户信息,则取采购订单的客户信息
                record.customer_id = record.purchase_order.customer_id
                # _logger.debug('采购订单: %s', record.purchase_order)
                # _logger.debug('采购订单的客户: %s', record.purchase_order.customer_id)
            else:
                # 如果两个字段都为空,设置 customer_id 为空
                record.customer_id = False
                # _logger.info('未找到客户信息')

 


所以下面有两个方式:

1、通过odoo的shell 来运行Py代码触发:

  

# 查找所有 purchase.account.invoice 记录
records = env['purchase.account.invoice'].search([])

# 批量触发 _compute_customer_id 方法来重新计算 customer_id 字段
records._compute_customer_id()

如果这个字段是可存储的,那么还要提交到数据库

env.cr.commit()

但是这个shell环境,我测试了好多次,也没有成功。所以就用了下面的方法

 

2、执行SQL来触发

UPDATE purchase_account_invoice AS pai
-- 更新 purchase_account_invoice 表,设置别名为 pai,以便在后续引用该表时简化代码书写。

SET customer_id = COALESCE(
    -- 设置 customer_id 字段的值,优先级按以下两种情况决定:
    -- 使用 COALESCE 函数在多个选项中选择第一个非空值。
    
    (SELECT delivery_order.customer_id
     FROM delivery_order
     WHERE delivery_order.id = pai.delivery_order_id),
    -- 如果 delivery_order_id 字段有值:
    -- 在 delivery_order 表中查找匹配的 delivery_order.id 值对应的 customer_id,
    -- 并将其作为 customer_id 的值。
    
    (SELECT purchase_order.customer_id
     FROM purchase_order
     WHERE purchase_order.id = pai.purchase_order)
    -- 如果 delivery_order_id 字段为空,但 purchase_order 字段有值:
    -- 在 purchase_order 表中查找匹配的 purchase_order.id 值对应的 customer_id,
    -- 并将其作为 customer_id 的值。
)

WHERE pai.delivery_order_id IS NOT NULL OR pai.purchase_order IS NOT NULL;
-- 仅当 delivery_order_id 或 purchase_order 字段存在有效值时才进行更新。

用SQL方法快速,缺点是:无法执行orm中的方法保持数据的一致性,所以要清缓存。最直接有效果的方法是重启odoo服务。

SQL 知识点外延

  1. COALESCE 函数

    • COALESCE 是 SQL 中常用的函数,用于从多个表达式中返回第一个非空值。例如,COALESCE(A, B, C) 会依次检查 ABC,并返回第一个非空的值。如果所有值都为空,则返回 NULL。
    • 这是简化条件判断的一种方式,适用于需要多层判断优先级的场景。
  2. JOIN 和子查询的对比

    • 在这段代码中,COALESCE 使用了子查询的方式来查找客户信息,分别从 delivery_orderpurchase_order 表中获取。
    • 另一种方式是使用 JOIN 来完成同样的操作,但由于此处使用的 COALESCE 需要优先级判断(即优先选择第一个非空值),JOIN 可能不够简洁或不易表达这种逻辑。
  3. 条件更新

    • WHERE 子句控制了 UPDATE 的执行条件,确保只有 delivery_order_idpurchase_order 不为空的记录才会被更新。这在数据表的批量更新操作中非常重要,因为能够有效避免对无关记录的更新,保证数据处理的准确性。
  4. 外键关联与冗余数据更新

    • 这种方式更新 customer_id 字段通常是为了优化查询性能。虽然 customer_id 存在于其他表中,但通过冗余存储在 purchase_account_invoice 表中,减少了频繁查询其他表的需求,适合高频访问数据的场景。
  5. 性能优化

    • 对大量数据进行批量更新时,SQL 的写法会影响性能。使用 COALESCE 和条件限制更新的方式可以显著减少更新的记录数量,这在大规模数据处理中尤为重要。

通过上述 SQL 查询, 可以将关联表中的信息冗余存储在当前表中以加速查询,同时可以灵活控制字段优先级和更新条件,实现数据优化。

标签:customer,purchase,ODOO12,id,delivery,record,刷新,强制,order
From: https://www.cnblogs.com/lyt263/p/18517180

相关文章

  • MYSQL 锁后记(慢、死锁、强制释放) - 《小猫钓鱼-猫王争霸》
    在美丽的森林中,小猫们的钓鱼大赛依旧如火如荼地进行着,而“猫王争霸”的诱惑让每只小猫都充满了斗志。随着时间的推移,围绕着MySQL鱼表的各种问题也逐渐浮现。一、慢查询之困最近,小猫们发现存鱼和查看鱼表的操作有时候会变得异常缓慢。花猫焦急地说:“这可怎么办呀?存个鱼都......
  • Prometheus源码专题精讲——监控系统 Prometheus 2.x/3.x 源码阅读和分析_配置文件的
    配置文件的加载与刷新——config/config.gohttps://github.com/prometheus/prometheus/blob/v2.55.0/config/config.goPrometheus配置文件的加载过程主要可以分为以下两步:1、初始化时加载2、运行时重新加载一、初始化时加载1.1、启动时加载1.2、配置初始化二、运行时加载......
  • vue 项目history模式刷新404问题解决办法
    前言vue项目history模式部署到服务器后,根路径访问没有问题,但是进入其他功能再刷新页面就会出现404,因为你没在nginx或者apache配置上面加上重定向跳转。解决办法,只需要加上这段配置:nginx配置内容:location/{try_files$uri$uri/@router;indexindex.html;}lo......
  • Java强制类型转换:深入理解与实践
    在Java编程中,类型转换是一个常见的操作,它允许我们将一个数据类型的值转换为另一个数据类型的值。Java提供了两种类型转换:自动类型转换(隐式类型转换)和强制类型转换(显式类型转换)。在这篇文章中,我们将重点探讨强制类型转换,包括它的使用场景、语法、以及在实际编程中的应用。什么......
  • 强制隐藏页面某些元素,放大想阅读的部分元素视图
    众所周知,现在的人越来越依赖ai提供思路、寻找问题、解决问题等。但有些页面的视图看的很难受,尤其在左右布局时阅读字体太小,想放大想看的部分内容,却被一些无用的元素占据空间。(小声)尤其这个通义烦的很,缩小时还不能滑动到右边看对话框。只需两个步骤,轻松解决。效果:图1、2之前。......
  • 在外包干了 3 年,被强制清场了。。。
    大家好,我是R哥。今天再分享一个励志的面试辅导案例:一个深圳的兄弟,双非二本,工作5年+,在外包干了3年,结果今年被甲方强制清场了,没有赔偿,边走劳动仲裁,边学习,最终拿下还不错的自研offer,脱离外包,太励志了。。在外包干了3年,被甲方清场,还没有赔偿,现在有的外包公司真的是够恶......
  • windows下python虚拟环境强制重新安装pip并安装paramiko
    环境:OS:Windows11python:3.6.81.切换到虚拟环境目录:cdC:\Users\huangxueliang\PycharmProjects\cmdbtest\venv 2.执行如下命令Scripts\activate 3.强制重新安装python-mpipinstall-U--force-reinstallpip 4.查看版本(venv)C:\Users\huangxueliang\PycharmPro......
  • iOS 回到主线程刷新UI
    在iOS里面,项目打开就会运行一个主线程,所有的UI都在主线程里进行.其他网络请求或者耗时操作理论上也可以在主线程运行,但是如果太耗时,那么就会影响主线程其他UI.所以需要开字线程来进行耗时操作,子线程进行完耗时操作之后,如果项目需求有需要刷新UI,或者改变UI,一定得回到主......
  • 前后端实现双Token无感刷新用户认证
    前后端实现双Token无感刷新用户认证本文记录了使用双Token机制实现用户认证的具体步骤,前端使用的Vue,后端使用SpringSecurity和JWT双Token分别指的是AccessToken和RefreshTokenAccessToken:每次请求需要携带AccessToken访问后端数据,有效期短,减少AccessToken泄露带来的风险Refres......
  • PBOOTCMS登录请求发生错误,您可按照如下方式排查: 1、试着删除根目录下runtime目录,刷新
    当您在使用PbootCMS时,后台登录请求发生错误,提示“表单提交校验失败,请刷新后重试”。这通常是由于缓存文件过多、会话文件存储目录权限问题或服务器环境问题引起的。解决方法删除 runtime 目录步骤:备份文件:在进行任何修改前,请先备份 runtime 文件夹,以防止意外情况......