2.2Éditeur de requêtes & SQL
L'essentiel en 30 secondes
- Une requête est une interrogation de la base ; WinDev offre deux approches complémentaires : l'éditeur de requêtes visuel (qui génère le SQL) et le SQL direct pour les cas complexes.
- Les briques SQL essentielles : SELECT (quoi), FROM (où), WHERE (filtrer), ORDER BY (trier), JOIN (combiner des fichiers liés), GROUP BY + agrégats (SUM, COUNT, AVG, MIN/MAX).
- Deux bonnes pratiques majeures : rendre la requête paramétrée (réutilisable) et filtrer côté base avec WHERE plutôt que tout ramener puis trier en WLangage.
Mini-cas filé — Yacine interroge les ventes de son négoce
Yacine, développeur WinDev dans une PME de négoce de matériel électrique à Oran, doit afficher, à côté de chaque commande, le nom du client et non son seul code. Il ouvre l'éditeur de requêtes visuel, choisit les fichiers Commande et Client, coche les rubriques utiles et pose une jointure sur le code client : WinDev génère le SQL, sans risque d'erreur de syntaxe. Pour le tableau de bord du patron, il ajoute un GROUP BY avec SUM afin d'obtenir le chiffre d'affaires par client. Il réalise ensuite que la requête est écrite en dur sur une période : il la rend paramétrée ({pDateDebut, pDateFin}) pour la réutiliser d'un mois sur l'autre, et veille à laisser le filtrage côté base (WHERE) plutôt que de ramener toutes les lignes et de trier en WLangage.
Cas autonome de cette section : il revient dans le cours, le schéma, le script et le défi 48h de la section 2.2.
1. Deux façons d'écrire une requête
Une requête est une interrogation de la base : « donne-moi les commandes de plus de 1000 € avec le nom du client ». WinDev offre (1) l'éditeur de requêtes : un outil visuel où l'on choisit les fichiers, coche les rubriques, définit conditions, tris et regroupements — WinDev génère le SQL correspondant, idéal pour démarrer sans erreur de syntaxe ; (2) le SQL direct (SELECT, FROM, WHERE, ORDER BY…), pour les cas complexes ou quand on maîtrise le langage. HFSQL supportant le SQL, les deux cohabitent.
2. Les briques SQL et la jointure
Les notions essentielles : SELECT (quelles rubriques), FROM (quels fichiers), WHERE (filtrer les lignes), ORDER BY (trier). La jointure (JOIN) combine plusieurs fichiers liés — indispensable pour afficher le nom du client à côté de sa commande. GROUP BY avec les agrégats (SUM, COUNT, AVG, MIN/MAX) produit les statistiques et totaux par catégorie.
3. Réutiliser et filtrer côté base
Une requête est réutilisable partout : source d'un champ Table, source d'un état, ou parcourue en WLangage. Deux bonnes pratiques : les paramètres (la ville ou la période devient une variable au lieu d'être écrite en dur — une requête réutilisable au lieu de dix) et le filtrage côté base (laisser le moteur filtrer avec WHERE plutôt que tout ramener et trier en WLangage : infiniment plus rapide).
🔎 Exemple concret — 🔎 Exemple concret — Jointure & paramètres
Afficher le nom du client et calculer le CA par client : Yacine écrit le SQL correspondant.
SELECT C.NomClient, SUM(L.MontantLigne) AS ChiffreAffaires
FROM Client C
JOIN Commande CD ON CD.CodeClient = C.CodeClient
JOIN LigneCommande L ON L.NumCommande = CD.NumCommande
WHERE CD.DateCommande >= {pDateDebut} // parametre, pas en dur
GROUP BY C.NomClient
ORDER BY ChiffreAffaires DESC
Lecture : JOIN affiche le nom du client ; GROUP BY + SUM donnent le CA
Reflexe : filtrer C0TE BASE (WHERE) et parametrer la periode
Lecture : JOIN combine les fichiers liés pour afficher le nom du client ; GROUP BY + SUM totalisent le chiffre d'affaires par client.
Leçon : le paramètre {pDateDebut} rend la requête réutilisable, et WHERE laisse le moteur filtrer côté base — bien plus rapide.
Vocabulaire de la section
- Requête
- Une interrogation de la base : sélectionner, filtrer, trier, regrouper des données ; réutilisable comme source de table, d'état ou en WLangage.
Exemple simple : Yacine écrit une requête « chiffre d'affaires par client ».
Ce que ce n'est pas : un simple affichage de fichier sans condition ni tri.
Réflexe : interroger les données → une requête.
- Éditeur de requêtes
- L'outil visuel de WinDev : on choisit les fichiers, coche les rubriques, définit conditions, tris et regroupements ; WinDev génère le SQL.
Exemple simple : Yacine joint Client et Commande sans écrire une ligne de SQL.
Ce que ce n'est pas : taper la requête à la main en SQL direct.
Réflexe : créer visuellement et sans erreur de syntaxe → l'éditeur de requêtes.
- WHERE (filtrage)
- La condition qui ne garde que certaines lignes ; posée côté base, elle laisse le moteur utiliser ses index et ne transmettre que l'utile.
Exemple simple : Yacine n'affiche que les commandes de la période voulue.
Ce que ce n'est pas : tout charger puis filtrer en WLangage après coup.
Réflexe : réduire le volume transmis → filtrer côté base avec WHERE.
- Jointure (JOIN)
- Combiner plusieurs fichiers liés dans une même requête — indispensable pour afficher le nom du client à côté de sa commande.
Exemple simple : Yacine joint Commande et Client sur le code client.
Ce que ce n'est pas : afficher le seul identifiant du client, sans son nom.
Réflexe : croiser des informations de plusieurs fichiers → une jointure.
- GROUP BY + agrégats
- Regrouper pour calculer des statistiques : SUM (somme), COUNT (nombre), AVG (moyenne), MIN/MAX.
Exemple simple : Yacine totalise le chiffre d'affaires par client.
Ce que ce n'est pas : lister chaque commande ligne à ligne sans total.
Réflexe : totaux par catégorie → GROUP BY avec agrégats.
En pratique — En pratique — Créer et exploiter une requête
- Créez une requête avec l'éditeur visuel : choisissez les fichiers, cochez les rubriques utiles, ajoutez les conditions de sélection et le tri, comme Yacine.
- Ajoutez une jointure si vous avez besoin d'informations de plusieurs fichiers liés (afficher le nom du client sur la ligne de commande).
- Pour des statistiques, utilisez GROUP BY avec les agrégats (SUM, COUNT, AVG) — par exemple le chiffre d'affaires par client ou par commercial.
- Rendez la requête paramétrée (la ville, la période deviennent des paramètres) pour la réutiliser, et laissez le filtrage se faire côté base (WHERE).
Script pas-à-pas — écrire la requête de Yacine (5 min)
1) Ouvrez l'éditeur de requêtes, ajoutez les fichiers Client, Commande et LigneCommande. 2) Cochez NomClient et posez une jointure sur le code client. 3) Ajoutez un GROUP BY sur NomClient avec SUM(MontantLigne) pour le chiffre d'affaires. 4) Déclarez un paramètre {pDateDebut} au lieu d'écrire la période en dur. 5) Laissez le filtrage côté base (WHERE) et testez le résultat.
Cette requête servira de source à un champ Table (2.4) et à un état (2.3) : écrivez-la une fois, réutilisez-la partout.
Modèle copier-coller — ma requête paramétrée
SELECT C.NomClient, SUM(L.MontantLigne) AS CA
FROM Client C JOIN Commande CD ON CD.CodeClient = C.CodeClient
JOIN LigneCommande L ON L.NumCommande = CD.NumCommande
WHERE CD.DateCommande >= {pDateDebut}
GROUP BY C.NomClient ORDER BY CA DESC
Regles : (1) requete parametree = reutilisable
(2) filtrage COTE BASE (WHERE) > tout ramener et trier en WLangage
Sélection simple
Yacine liste les produits dont le stock est inférieur au seuil, avec un simple WHERE, sans jointure.
Jointure client
Yacine affiche le nom du client à côté de chaque commande en joignant Commande et Client.
Statistiques par commercial
Yacine regroupe avec GROUP BY et SUM pour le chiffre d'affaires par commercial.
Requête paramétrée
Yacine remplace la période écrite en dur par {pDateDebut, pDateFin} : la requête sert chaque mois.
✓ Bonnes pratiques
- Commencer par l'éditeur visuel : il génère le SQL sans erreur de syntaxe.
- Utiliser une jointure pour afficher les informations liées (nom du client).
- Paramétrer la requête et filtrer côté base (WHERE).
✗ Pièges fréquents
- Tout ramener puis trier en WLangage (saturation réseau/mémoire).
- Écrire les critères en dur au lieu de paramétrer la requête.
- Oublier la jointure et n'afficher que le code client.
Points clés à retenir
- Deux approches complémentaires : éditeur de requêtes visuel (génère le SQL) et SQL direct.
- Notions clés : SELECT, FROM, WHERE, ORDER BY, JOIN, GROUP BY + agrégats (SUM, COUNT, AVG, MIN/MAX).
- Une requête est réutilisable comme source de table, d'état ou parcourue en WLangage.
- Bonnes pratiques : requêtes paramétrées et filtrage côté base (WHERE).
Défi 48h — appliquez demain
Comme Yacine, créez une requête qui joint deux fichiers liés (par exemple Commandes et Clients) pour afficher le nom du client, puis ajoutez un GROUP BY avec SUM pour un total par client. Transformez enfin la période en paramètre {pDateDebut} et expliquez en une phrase pourquoi filtrer côté base est plus rapide que de tout ramener et trier en WLangage.
- Je crée une requête avec l'éditeur visuel et je lis le SQL généré.
- Je sais utiliser une jointure et des agrégats (GROUP BY, SUM).
- Je paramètre mes requêtes et filtre côté base.
Questions fréquentes
Pourquoi faut-il filtrer côté base plutôt que ramener toutes les données ?
Parce que le moteur utilise ses index et ne transmet que les lignes utiles, alors que tout ramener sature le réseau et la mémoire pour finalement jeter la majorité des données — l'erreur de performance la plus courante. Mettez les conditions dans la requête (WHERE), faites trier par la base (ORDER BY) et déléguez les agrégats.
L'éditeur de requêtes suffit-il, ou faut-il écrire du SQL direct ?
L'éditeur visuel suffit pour la grande majorité des besoins (sélection, filtres, tris, jointures, regroupements) et génère le SQL sans erreur de syntaxe. Le SQL direct sert aux cas complexes ou lorsque vous voulez un contrôle fin ; les deux approches cohabitent puisque HFSQL supporte le SQL.
Pourquoi faut-il filtrer côté base plutôt que ramener toutes les données ?