4.4 · Commandes SQL & rapports multi-sources

Niveau 4 · Expert : sous-états, graphiques & multi-sources

4.4Commandes SQL & rapports multi-sources

Objectif : Utiliser une commande SQL (avec paramètres) et choisir la bonne approche multi-sources.
Temps estimé : 11 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

L'essentiel en 30 secondes

  • La commande SQL = écrire sa propre requête : au lieu de laisser Crystal Reports générer, on écrit SELECT, FROM, WHERE, JOIN — exécutée telle quelle comme une « table virtuelle ».
  • Contrôle et performance maximum : jointures exactes, filtres et agrégations poussés côté base — décisif sur gros volumes et pour les requêtes complexes (sous-requêtes, UNION).
  • Réflexe de Farès : paramètres Crystal dans la requête pour filtrer côté serveur ; sous-rapports pour les sources différentes — et jamais de credential en dur dans la commande.

Mini-cas filé — Farès et le top clients côté serveur

Farès, contrôleur de gestion à Alger, doit sortir le chiffre d'affaires par client sur l'année choisie : via l'interface, Crystal rapatrie toutes les lignes puis agrège — trop lent sur des centaines de milliers de commandes. Il ajoute une commande SQL qui filtre par année via un paramètre et agrège côté base (GROUP BY), ne rapatriant que les totaux. Pour la deuxième source (un fichier de remises non jointable), il garde un sous-rapport lié (voir 4.1). Quatrième jalon du fil rouge : Farès fait travailler la base, pas le poste client.

Suite des cas 4.1-4.3 — Farès passe du visuel à la performance côté base.

1. La commande SQL : écrire au lieu de cliquer

Pour les besoins avancés, la commande SQL (SQL Command) : au lieu de choisir des tables et de laisser Crystal Reports générer la requête, on écrit sa propre requête (SELECT … FROM … WHERE … JOIN …) qui devient la source du rapport, exécutée telle quelle comme une « table virtuelle ». On l'ajoute dans l'assistant de connexion.

Usages : contrôle total (jointures, filtres, calculs côté base), requêtes complexes impossibles ou pénibles via l'interface (jointures élaborées, sous-requêtes, regroupements SQL, UNION, fonctions spécifiques à la base), performance (pousser le travail vers la base, optimisée pour cela, et ne rapatrier que le résultat). On y intègre des paramètres Crystal pour un filtrage interactif exécuté côté serveur, comme le paramètre année de Farès.

2. Les rapports multi-sources : choisir selon la nature des sources

Combiner plusieurs origines selon le cas. Même base → jointures classiques ou commande SQL (performant : la base combine en une requête). Sources différentes non jointables (deux bases, base + fichier) → sous-rapports (voir 4.1), souvent la meilleure approche : chaque source dans son rapport, lié par un champ commun.

Crystal Reports permet aussi d'ajouter plusieurs connexions dans un même rapport (multi-connexions), mais les jointures inter-sources se font parfois côté client — coûteuses sur volumes importants, à réserver aux petits cas. Pour des combinaisons complexes, récurrentes ou volumineuses, le plus robuste est souvent de consolider en amont (vue de base, table de synthèse, ETL) puis de brancher le rapport sur une source unique.

3. Compétence et maintenance : le prix du contrôle

La commande SQL exige de maîtriser le SQL : la requête doit être valide et optimisée — une mauvaise requête donne un rapport lent ou faux — et c'est du code à maintenir (documenter, versionner), contrairement au glisser-déposer. En cas de doute, commencer par l'interface ; passer à la commande SQL seulement en butant sur une limite.

C'est le niveau où le reporting rejoint la maîtrise des bases de données — puissant, mais exigeant en compétences et en rigueur. Côté sécurité : compte de lecture seule, paramètres plutôt que concaténation, aucun mot de passe en dur (voir prudence ci-dessous).

Erreur d'interprétation fréquente : « La commande SQL, c'est juste pour les experts qui aiment taper du code : je concatène mes paramètres et mes identifiants dedans, ça ira plus vite ». Non. Une requête mal écrite (produit cartésien, filtre côté client, agrégation rapatriée en masse) rend le rapport plus lent que l'interface — et concaténer des valeurs ou écrire un mot de passe dans la commande ouvre la porte à l'injection et expose des credentials. Paramètres liés, compte en lecture seule, requête testée et documentée : c'est ce qui distingue une commande SQL pro d'un bricolage risqué.
Combiner les données Selon la nature des sources Même base Jointures oucommande SQLSources différentes Sous-rapportsliésCas complexes Consolideren amontSécuriser Lectureseule, paramètres
Selon la nature des sources
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) Farès commence par l'interface ; butant sur la lenteur (tout rapatrié puis agrégé), il écrit une commande SQL qui filtre par année via un paramètre et agrège côté base. 2) Il teste la requête (justesse + temps) avant de construire le rapport dessus. 3) Pour le fichier de remises non jointable, il garde un sous-rapport lié au lieu d'une multi-connexion coûteuse. 4) Il documente la commande et utilise un compte en lecture seule, sans credential en dur. Leçon : même base = SQL côté serveur ; sources différentes = sous-rapports ; cas lourds = consolider en amont.

🔎 Exemple concret — 🔎 Exemple concret — Filtrer côté serveur en SQL

Le top clients de Farès : un paramètre dans la requête, l'agrégation côté base.

SELECT client, SUM(montant) AS total
FROM commandes
WHERE annee = {?Annee}
GROUP BY client

→ La base filtre et agrège ; Crystal reçoit le minimum.

Lecture : WHERE paramétré + GROUP BY côté base = seules les totaux transitent.

Leçon : contrôle et performance maximum sur gros volumes — requête valide, optimisée, documentée.

Vocabulaire de la section

Commande SQL (SQL Command)
Écrire SA PROPRE requête SQL (SELECT, FROM, WHERE, JOIN) comme source du rapport, exécutée telle quelle par la base.

Exemple simple : Farès écrit le top clients par année au lieu de laisser Crystal générer la requête.

Ce que ce n'est pas : une sélection de tables par glisser-déposer.

Réflexe : limite de l'interface ou lenteur : passer à la commande SQL.

Filtrage côté serveur
Paramètres Crystal intégrés à la requête : la base filtre et agrège, Crystal ne reçoit que le résultat nécessaire.

Exemple simple : L'année choisie par Farès filtre dans le WHERE exécuté par la base.

Ce que ce n'est pas : rapatrier toutes les lignes puis filtrer dans le rapport.

Réflexe : gros volume : WHERE paramétré + agrégation côté base.

Rapports multi-sources
Combiner plusieurs origines : jointures ou SQL (même base), SOUS-RAPPORTS (sources différentes), multi-connexions (jointures côté client, coûteuses).

Exemple simple : Farès : commande SQL pour la base commandes, sous-rapport pour le fichier de remises.

Ce que ce n'est pas : tout mélanger dans une seule connexion multi-sources sur gros volumes.

Réflexe : sources différentes non jointables : d'abord les sous-rapports.

Consolidation en amont
Préparer les données avant Crystal (vue, table de synthèse, ETL) puis brancher le rapport sur une source unique — le plus robuste pour les cas lourds.

Exemple simple : Farès fait créer une vue annuelle des ventes pour les rapports récurrents.

Ce que ce n'est pas : combiner à chaque exécution des volumes hétérogènes côté client.

Réflexe : combinaison complexe ou récurrente : consolider une fois, rapporter souvent.

En pratique — En pratique — Utiliser une commande SQL

  1. Dans l'assistant de connexion, ajoutez une COMMANDE SQL : écrivez votre requête (SELECT … FROM … JOIN … WHERE …) — elle devient la source du rapport.
  2. Intégrez des PARAMÈTRES Crystal dans la requête pour un filtrage interactif poussé côté serveur.
  3. Vérifiez que la requête est VALIDE et OPTIMISÉE (jointures, filtres, agrégations côté base) ; testez le résultat et la performance.
  4. Pour des sources DIFFÉRENTES non jointables, préférez des SOUS-RAPPORTS (4.1) plutôt que le multi-connexions (jointures côté client coûteuses).
Vous traitez les cas complexes et exigeants (requêtes élaborées, performance critique, données hétérogènes) via les commandes SQL et les approches multi-sources.

Script prêt à dire — expliquer la commande SQL à la DSI (30 s)

« C'est Farès : pour le top clients annuel, j'ai écrit une commande SQL qui filtre par année et agrège côté base — on ne rapatrie que les totaux au lieu de centaines de milliers de lignes. La requête est testée, documentée, et le rapport tourne avec un compte en lecture seule, sans mot de passe en dur. »

À dire pour faire valider l'accès base : présentez la requête, le compte utilisé et le gain mesuré.

Modèle copier-coller — commande SQL paramétrée (valide)

SELECT c.nom_client AS client,
       SUM(l.montant) AS total
FROM clients AS c
INNER JOIN commandes AS l
  ON l.id_client = c.id_client
WHERE l.annee = {?Annee}
GROUP BY c.nom_client
ORDER BY total DESC

Top clients annuel

Comme Farès : WHERE sur l'année paramétrée + GROUP BY côté base — seuls les totaux transitent.

Requête complexe (UNION)

Combiner deux SELECT compatibles par UNION dans la commande quand l'interface ne le permet pas.

Sources hétérogènes

Base d'un côté, fichier de l'autre : sous-rapport lié plutôt que multi-connexion coûteuse.

Cas récurrent volumineux

Demander une vue ou une table de synthèse en amont : le rapport se branche sur une source unique et rapide.

Prudence : Une commande SQL s'exécute avec les droits de la connexion : utilisez un compte en lecture seule, ne concaténez jamais une saisie dans la requête (risque d'injection SQL — passez par les paramètres Crystal), et ne stockez jamais de mot de passe ni d'identifiant en dur dans la commande (renseignez la connexion par le mécanisme prévu, sans l'écrire dans le SQL). Testez la requête sur un échantillon avant la production.

✓ Bonnes pratiques

  • Commencez par l'interface ; passez à la commande SQL si vous butez sur une limite.
  • Poussez jointures, filtres et agrégations côté base ; exploitez les index.
  • Consolidez en amont (vue, table) pour les combinaisons complexes ou volumineuses.

✗ Pièges fréquents

  • Une requête SQL mal écrite (rapport lent ou faux).
  • Multi-connexions sur gros volumes (jointures côté client).
  • Oublier que la commande SQL est du code à maintenir.

Points clés à retenir

  • La COMMANDE SQL = écrire SA PROPRE requête comme source. Contrôle et PERFORMANCE maximum : jointures, filtres, agrégations et sous-requêtes côté BASE.
  • Usages : requêtes COMPLEXES (sous-requêtes, UNION, agrégations, fonctions), contrôle total, performance. PARAMÈTRES intégrés (filtrage côté serveur).
  • MULTI-SOURCES : jointures ou SQL (même base) ; SOUS-RAPPORTS pour sources DIFFÉRENTES ; multi-connexions possible mais jointures CÔTÉ CLIENT (coûteuses) ; consolider en amont pour les cas lourds.
  • Exige de MAÎTRISER le SQL (requête valide et optimisée) et c'est du CODE à MAINTENIR.

Défi 48h — appliquez demain

Convertissez un rapport lent : réécrivez sa source en commande SQL (filtre paramétré + agrégation côté base), mesurez le gain et documentez la requête.

Checklist sortie de section
  • Je sais écrire une commande SQL valide et optimisée avec paramètres.
  • Je sais choisir l'approche multi-sources selon la nature des sources.
  • Je travaille en lecture seule, sans credential en dur, requête documentée.
Auto-évaluation 1-5 : ma dernière requête agrège-t-elle côté base ou rapatrie-t-elle tout ?ai-je documenté et testé ma commande SQL avant diffusion ?

Questions fréquentes

Quand écrire une commande SQL plutôt que d'utiliser l'interface de sélection des tables ?

L'INTERFACE (tables + liens, Crystal génère la requête) est accessible, visuelle et facile à maintenir : le choix par défaut pour la majorité des rapports. Écrivez une COMMANDE SQL pour : les requêtes COMPLEXES que l'interface gère mal (sous-requêtes, UNION, agrégations avancées, fonctions spécifiques), la PERFORMANCE maximale (pousser jointures, filtres et agrégations à la base — décisif sur gros volumes), le CONTRÔLE précis sur la requête. Condition : maîtriser le SQL (requête valide, optimisée, documentée). En cas de doute, commencez par l'interface et passez au SQL en butant sur une limite.

Comment combiner des données de plusieurs sources différentes ?

Selon la nature des sources. MÊME base → JOINTURES ou commande SQL : la base combine en une requête (performant). Sources DIFFÉRENTES non jointables → SOUS-RAPPORTS liés (chaque source dans son rapport, lié par un champ commun ; performance au niveau du groupe) ou multi-connexions (Crystal combine CÔTÉ CLIENT — lent sur gros volumes, petits cas uniquement). Pour des combinaisons complexes, récurrentes ou volumineuses, le plus robuste est de CONSOLIDER en amont (vue, table de synthèse, ETL) puis de brancher un rapport sur source unique.

Vérifiez votre compréhension

Que permet une commande SQL par rapport à la sélection de tables ?

Ressources supplémentaires (optionnel, pour aller plus loin)

Examen du niveau 4Questions inédites et durcies pour valider vos acquis