Egyedi jelentések létrehozása

Az SQL nézetek egy technika az egyedi jelentések létrehozására, hogy olyan adatokat jelenítsenek meg, amelyeket a meglévő modellek mezőivel és nézeteivel nem lehet megjeleníteni. Más szavakkal, ez a technika segít elkerülni a további mezők felesleges létrehozását és számítását kizárólag adatelemzési célokra.

Modell létrehozása

Egy SQL nézet hasonló módon jön létre, mint egy standard modell:

from odoo import fields, models


class ModuleReport(models.Model):
    _name = 'module.report'
    _description = "Module Report"
    _rec_name = 'module_field'
    _auto = False

Ahol az attribútumok:

  • _auto = False jelzi, hogy nem akarjuk a modellt az adatbázisban tárolni

  • _rec_name jelzi, hogy a modell melyik mezője képviseli a rekord nevét (azaz a nevet, amelyet a navigációs morzsában használnak, amikor megnyitnak egy rekord űrlap nézetét)

és mezői ugyanúgy vannak definiálva, mint egy standard modell esetében, kivéve, hogy minden mező readonly=True jelöléssel van ellátva.

Megjegyzés

Ne felejtsd el hozzáadni az új modellt a biztonsági fájlodhoz.

Töltsd fel a modellt

Két módja van egy SQL nézet táblájának feltöltésére:

  • felülírni a BaseModel.init() metódust,

  • beállítani a _table_query tulajdonságot.

Függetlenül attól, hogy melyik módot használjuk, egy SQL lekérdezés fog végrehajtódni a modell feltöltésére. Ezért bármilyen SQL parancs használható az adatok összegyűjtésére és/vagy kiszámítására, és fontos szem előtt tartani, hogy megkerüljük az ORM-et (azaz érdemes átolvasni a Biztonság az Odoo-ban részt, ha még nem tetted meg). A SELECT által visszaadott oszlopok fogják feltölteni a modell mezőit, ezért győződj meg róla, hogy az oszlopnevek megegyeznek a mezőnevekkel, vagy használj olyan alias neveket, amelyek megegyeznek.

A legtöbb esetben a BaseModel.init() metódus felülírása a szokásos és jobb megoldás. Ehhez szükséges a tools importálása, és általában a következőképpen van megírva:

def init(self):
    tools.drop_view_if_exists(self.env.cr, self._table)
    self.env.cr.execute("""CREATE or REPLACE VIEW %s as (
                           SELECT
                              %s
                           FROM
                              %s
        )""" % (self._table, self._select(), self._from()))

tools.drop_view_if_exists biztosítja, hogy ne jöjjön létre ütköző nézet az SQL lekérdezés végrehajtásakor. Általános gyakorlat, hogy a lekérdezés különböző részeit elválasztjuk, hogy megkönnyítsük a modell kiterjesztését. Az, hogy pontosan hogyan van felosztva a lekérdezés a metódusok között, nincs szabványosítva, de minimum az _select és _from metódusok gyakoriak, és természetesen ezek a metódusok mind sztringeket fognak visszaadni.

Használja a modellt

Az SQL nézetekhez tartozó nézetek és menüpontok ugyanúgy jönnek létre és használhatók, mint bármely más Odoo modell. Készen állsz az SQL nézet használatára. Jó szórakozást!

Extra tippek

Javaslat

A common mistake in SQL views is not considering the duplication of certain data due to table JOINs. This can lead to miscounting when using a field’s aggregator and/or the pivot view. It is best to test your SQL view with sufficient data to ensure the resulting field values are as you expect.

Javaslat

Ha van egy meződ, amelyet nem szeretnél mérőszámként használni (azaz a pivot vagy grafikon nézetekben), adj hozzá store=False értéket, és nem fog megjelenni.