Porque usar SQL... funciones agregadas - Haciendo rankings con SQL

22 de setiembre de 2025 por
Gustavo Orrillo
| Sin comentarios aún
 

Usar SQL en Odoo no es muy común y por lo general se recomiendo usar el ORM de Odoo por sobre SQL por cuestiones de seguridad y para que la base de datos esté en un estado consistente. Lo cual está bien, a menos que uno esté buscando mejorar la performance de los métodos (SQL es mucho más rápido que el ORM), o ahorrarse trabajo. Por ejemplo, como les voy a mostrar ahora con la función RANK del SQL.

Supongamos que querramos tenemos los partners, y queremos agregarle su ranking en las ventas de los últimos 12 meses. Solo necesitamos definir un campo nuevo (cs_ranking) y definir el método que la computa:

cs_ranking = fields.Integer('Ranking',compute='_compute_cs_ranking')				

def _compute_cs_ranking(self):
​for rec in self:
self.env.cr.execute("""​
​SELECT o.partner_id,
RANK() OVER (ORDER BY SUM(o.amount_untaxed) DESC) AS sales_rank
FROM sale_order o
WHERE o.date_order >= (CURRENT_DATE - INTERVAL '12 months')
group by 1;
​ """)
​rows = self.env.cr.fetchall()
​for row in rows:
​if rec.id == row[0]:
​rec.cs_ranking = row[1]

Vean que simple. Con muy pocas líneas. Piensen cuanto trabajo más tendríamos si definiesemos esta función mediante el ORM. Muchos dirán que con este ejemplo estamos procesando demás por medio del SQL, lo cual puede ser verdad. Pero el punto de este ejemplo es demostrar cuanto trabajo nos estamos ahorrando con el SQL, y si nos preocupa la performance, podemos llamar estos métodos con un cron y dejar los resultados almacenados. Al fin y al cabo las funciones de ranking se las utiliza con fines estadísticos, no para hacer facturas.

Gustavo Orrillo 22 de setiembre de 2025
Compartir
Archivar
Identificarse dejar un comentario