ایجاد گزارش‌های سفارشی

نماهای 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 علامت‌گذاری می‌شود.

توجه

فراموش نکنید که مدل جدید خود را به فایل امنیتی خود اضافه کنید.

پُر کردن مدل

دو راه برای پُر کردن جدول نمای SQL وجود دارد:

  • بازنویسی متد BaseModel.init()،

  • تنظیم ویژگی _table_query.

صرف‌نظر از روشی که استفاده می‌شود، یک کوئری SQL برای پُر کردن مدل اجرا خواهد شد. بنابراین، هر دستور SQL را می‌توان برای جمع‌آوری و/یا محاسبهٔ داده‌های موردنیاز به‌کار برد و انتظار می‌رود به‌خاطر داشته باشید که دارید ORM را دور می‌زنید (یعنی اگر هنوز نخوانده‌اید، خواندن Security in Odoo ایدهٔ خوبی است). ستون‌های بازگردانده‌شده از SELECT فیلدهای مدل را پُر می‌کنند، بنابراین مطمئن شوید که نام ستون‌های شما با نام فیلدها مطابقت دارد، یا از نام‌های مستعار همگن استفاده کنید.

در بیشتر موارد، بازنویسی متد BaseModel.init() گزینهٔ استاندارد و بهتر است. این روش نیازمند import کردن 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، در نظر نگرفتن تکراری شدن برخی داده‌ها در اثر JOINهای جدول است. این می‌تواند هنگام استفاده از aggregator یک فیلد و/یا نمای محوری، منجر به شمارش نادرست شود. بهتر است نمای SQL خود را با داده‌های کافی آزمایش کنید تا اطمینان حاصل کنید مقادیر فیلدها همان‌گونه که انتظار دارید، هستند.

نکته

اگر فیلدی دارید که نمی‌خواهید به‌عنوان معیار (یعنی در نماهای محوری یا گرافی) ظاهر شود، store=False را به آن اضافه کنید تا نمایش داده نشود.