Fonctions de date dans le Query Builder
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
| Fonction | Classe Python | Résultat |
|---|---|---|
MONTH | Month | Mois, de 1 à 12 (nombre entier) |
QUARTER | Quarter | Trimestre, de 1 à 4 (nombre entier) |
MONTHNAME | MonthName | Nom du mois en anglais, par exemple November |
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
| Base | MONTH(posting_date) devient |
|---|---|
| MariaDB | MONTH(posting_date) |
| PostgreSQL | CAST(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.