Створення налаштованих звітів

SQL-представлення – це метод створення налаштованих звітів для відображення даних, які неможливо відобразити за допомогою полів та представлень існуючих моделей. Іншими словами, цей метод допомагає уникнути непотрібного створення та обчислення додаткових полів виключно для цілей аналізу даних.

Створити модель

SQL-представлення створюється аналогічно стандартній моделі:

from odoo import fields, models


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

Де атрибути:

  • _auto = False вказує на те, що ми не хочемо зберігати модель у базі даних

  • _rec_name вказує, яке з полів моделі представляє назву запису (тобто назву, яка буде використовуватися в навігаційних елементахпід час відкриття форми запису)

а його поля визначаються так само, як і у стандартній моделі, за винятком того, що кожне поле позначено як readonly=True.

Примітка

Не забудьте додати свою нову модель до файлу безпеки.

Заповнити модель

Існує 2 способи заповнення таблиці SQL-представлення:

  • перевизначити метод BaseModel.init(),

  • встановити властивість _table_query.

Незалежно від того, який спосіб використовується, для заповнення моделі буде виконано SQL-запит. Тому будь-які SQL-команди можна використовувати для збору та/або обчислення необхідних даних, і вам слід пам’ятати, що ви обходите ORM (тобто варто прочитати Безпека в Odoo, якщо ви ще цього не зробили). Стовпці, повернуті з SELECT, заповнять поля моделі, тому переконайтеся, що назви ваших стовпців відповідають назвам полів, або використовуйте псевдоніми, які збігаються.

У більшості випадків перевизначення методу BaseModel.init() є стандартним і кращим варіантом. Він вимагає імпорту tools і зазвичай записується так:

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 гарантує, що під час виконання SQL-запиту не буде створено конфліктуюче представлення. Стандартом є розділення різних частин запиту для спрощення розширення моделі. Точний спосіб розділення запиту на методи не стандартизований, але, як мінімум, методи _select та _from є поширеними, і, звичайно, всі ці методи повертатимуть рядки.

Використовуйте модель

Представлення та елементи меню для ваших SQL-представлень створюються та використовуються так само, як і для будь-якої іншої моделі Odoo. Ви готові почати використовувати своє SQL-представлення. Бажаю вам гарного проведення часу!

Додаткові поради

Порада

Поширеною помилкою в SQL-представленнях є неврахування дублювання певних даних через об’єднання таблиць. Це може призвести до неправильного підрахунку під час використання group_operator поля та/або представлення зведення. Найкраще протестувати ваше SQL-представлення з достатньою кількістю даних, щоб переконатися, що результуючі значення полів відповідають очікуванням.

Порада

Якщо у вас є поле, яке ви не хочете використовувати як міру (наприклад, у зведеному або графічному поданнях), додайте до нього store=False, і воно не відображатиметься.