Query Builder

Fonctions de date dans le Query Builder

Utilisez les fonctions de date MONTH, QUARTER et MONTHNAME dans frappe.get_list et frappe.get_all pour grouper ou filtrer vos données par période.

Fonctions de date dans le Query Builder

Les fonctions MONTH, QUARTER et MONTHNAME extraient le mois, le trimestre ou le nom du mois d'un champ date. Utilisez-les dans frappe.get_list et frappe.get_all pour grouper des enregistrements par période, sans SQL brut.

Elles fonctionnent sur MariaDB et PostgreSQL. Dodock produit le SQL adapté à la base du site.

Fonctions disponibles

FonctionClasse PythonRésultat
MONTHMonthMois, de 1 à 12 (nombre entier)
QUARTERQuarterTrimestre, de 1 à 4 (nombre entier)
MONTHNAMEMonthNameNom du mois en anglais, par exemple November
En v5, YEAR n'est pas encore accepté dans fields. Son ajout, déjà présent dans Frappe v16, est prévu dans une prochaine mise à jour de la v5. En attendant, pour grouper par année, écrivez la requête avec frappe.qb (voir plus bas).

Syntaxe dans fields

Passez un dictionnaire dans fields : la clé est le nom de la fonction, la valeur est le champ. La clé as donne un alias à la colonne. Utilisez cet alias dans group_by et order_by.

frappe.get_list(
    "Sales Order",
    fields=[
        {"MONTH": "transaction_date", "as": "mois"},
        {"COUNT": "*", "as": "nb_commandes"},
    ],
    filters={"docstatus": 1},
    group_by="mois",
)

Dodock refuse les fonctions SQL écrites en texte, comme "MONTH(creation)" ou "count(*) as total". Utilisez toujours la syntaxe dictionnaire.

Grouper des achats par trimestre

Le nom du fournisseur est fictif.

resultats = frappe.get_list(
    "Purchase Invoice",
    fields=[
        {"QUARTER": "posting_date", "as": "trimestre"},
        {"SUM": "grand_total", "as": "total_achats"},
    ],
    filters={"supplier": "Bureau Moderne", "docstatus": 1},
    group_by="trimestre",
)

Grouper par année avec frappe.qb

Le module frappe.query_builder.custom contient aussi une classe Year, utilisable avec le Query Builder :

import frappe
from frappe.query_builder.custom import Year
from frappe.query_builder.functions import Count

SalesInvoice = frappe.qb.DocType("Sales Invoice")

query = (
    frappe.qb.from_(SalesInvoice)
    .select(
        Year(SalesInvoice.posting_date).as_("annee"),
        Count("*").as_("nb"),
    )
    .where(SalesInvoice.docstatus == 1)
    .groupby(Year(SalesInvoice.posting_date))
)

resultats = query.run(as_dict=True)

SQL produit

BaseMONTH(posting_date) devient
MariaDBMONTH(posting_date)
PostgreSQLCAST(date_part('month', posting_date) AS INTEGER)

La liste des fonctions acceptées dans fields est le dictionnaire FUNCTION_MAPPING de frappe/database/query.py. Une application ne peut pas y ajouter de fonction.