ایجاد گزارشهای سفارشی¶
نماهای 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 رایجاند و البته همهٔ این متدها رشته بازمیگردانند.
ویژگی _table_query زمانی استفاده میشود که نما به context وابسته است. معمولاً بهصورت زیر نوشته میشود:
@property
def _table_query(self):
return 'SELECT %s FROM %s' % (self._select(), self._from())
و از همان استانداردهای متدهای _select و _from که در BaseModel.init() استفاده شدند پیروی میکند.
نمونهای از زمانی که این ویژگی باید بهجای بازنویسی BaseModel.init() استفاده شود، در محیط چندشرکتی و چندارزی است که مبالغ مرتبط با ارز هنگام جابهجایی کاربر بین شرکتها باید با استفاده از نرخهای مبادله ارز تبدیل شوند.
همچنین ببینید
استفاده از مدل¶
نماها و آیتمهای منو برای نماهای SQL شما به همان شیوهٔ هر مدل دیگر Odoo ایجاد و استفاده میشوند. همه چیز برای شروع استفاده از نمای SQL خود آماده است. لذت ببرید!
نکات اضافی¶
نکته
یک اشتباه رایج در نماهای SQL، در نظر نگرفتن تکراری شدن برخی دادهها در اثر JOINهای جدول است. این میتواند هنگام استفاده از aggregator یک فیلد و/یا نمای محوری، منجر به شمارش نادرست شود. بهتر است نمای SQL خود را با دادههای کافی آزمایش کنید تا اطمینان حاصل کنید مقادیر فیلدها همانگونه که انتظار دارید، هستند.
نکته
اگر فیلدی دارید که نمیخواهید بهعنوان معیار (یعنی در نماهای محوری یا گرافی) ظاهر شود، store=False را به آن اضافه کنید تا نمایش داده نشود.