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.