Створення налаштованих звітів¶
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
є поширеними, і, звичайно, всі ці методи повертатимуть рядки.
Властивість _table_query
використовується, коли представлення залежить від контексту. Зазвичай вона записується так:
@property
def _table_query(self):
return 'SELECT %s FROM %s' % (self._select(), self._from())
та дотримується тих самих стандартів методів _select
та _from
, що й BaseModel.init()
.
Прикладом того, коли властивість слід використовувати замість перевизначення BaseModel.init()
, є середовище з кількома компаніями та кількома валютами, де суми, пов’язані з валютою, потрібно конвертувати за допомогою обмінних курсів валют, коли користувач перемикається між компаніями.
Перегляньте також
Використовуйте модель¶
Представлення та елементи меню для ваших SQL-представлень створюються та використовуються так само, як і для будь-якої іншої моделі Odoo. Ви готові почати використовувати своє SQL-представлення. Бажаю вам гарного проведення часу!
Додаткові поради¶
Порада
Поширеною помилкою в SQL-представленнях є неврахування дублювання певних даних через об’єднання таблиць. Це може призвести до неправильного підрахунку під час використання group_operator
поля та/або представлення зведення. Найкраще протестувати ваше SQL-представлення з достатньою кількістю даних, щоб переконатися, що результуючі значення полів відповідають очікуванням.
Порада
Якщо у вас є поле, яке ви не хочете використовувати як міру (наприклад, у зведеному або графічному поданнях), додайте до нього store=False
, і воно не відображатиметься.