カスタムレポートを作成

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 ビューのテーブルには、以下の 2 つの方法があります。

  • `BaseModel.init()`メソッドをオーバーライドします

  • _table_query プロパティを設定します。

どちらの方法を使用しても、SQLクエリが実行されてモデルが生成されます。 そのため、 任意のSQLコマンドを使用して必要なデータを収集および/または計算することができ、ORMをバイパスしていることに留意してください。 :ref:`reference/security`を読むのは良いアイデアです。 `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`メソッドは一般的で、もちろんこれらのメソッドはすべて文字列を返します。

関連項目

例: BaseModel.init() のオーバーライドを使用する SQL ビュー

モデルを使用

SQL ビューのビューとメニューアイテムは、他のどのOdoo モデルと同じ方法で作成され、使用されます。 SQLビューを使用するように設定されています。楽しんでください!

Extra tips

ちなみに

SQLビューでよくある間違いは、テーブルJOINに起因する特定のデータの重複を考慮していないことです。 フィールドの「aggregator」および/またはピボットビューを使用すると、誤カウントを引き起こす可能性があります。 SQLビューを十分なデータでテストして、結果として得られるフィールド値が期待どおりであることを確認することが最善です。

ちなみに

指標として望まない項目がある場合 (例: ピボットまたはグラフビューで、`store=False`を追加すると、表示されません。