Aller au contenu principal

Concevoir une requête

Objectif​

Construire une requête sans écrire de JSON : choisir la table, joindre les tables qui lui sont associées, choisir les colonnes renvoyées, la restreindre par des conditions et — lorsque la réponse est un nombre plutôt qu’une liste — la regrouper et la mesurer.

Où la trouver​

Ouvrez votre solution, choisissez Requêtes enregistrées, puis Nouveau — ou sélectionnez une requête et choisissez Modifier. Le concepteur occupe toute la page au lieu de glisser depuis le côté, car une requête a sa propre structure : des tables jointes à des tables, un arbre de conditions, une liste de colonnes ordonnée, des mesures. Dans un panneau étroit, une seule condition s’étale sur quatre lignes et ne ressemble plus à une condition.

Choisissez Fermer pour revenir à la liste. Rien n’est enregistré tant que vous ne choisissez pas Enregistrer.

Les trois onglets​

Ce sont trois vues d’une seule requête, et non trois éditeurs. Ce que vous modifiez dans l’un, les autres l’affichent — ils ne peuvent donc jamais diverger.

OngletÀ quoi il sert
SimpleLa requête de tous les jours : une table, ses colonnes, un filtre, un tri, une limite de lignes.
AvancéTout, avec en plus les tables associées, le regroupement avec des mesures, et les options.
JSONLe document lui-même, pour tout ce que le formulaire ne dessine pas.
RésultatsCe que renvoie la requête, sous forme de tableau. Celui-ci est une vue de la réponse, et non de la requête.

Une requête qui utilise déjà des tables associées, un regroupement ou des options s’ouvre sur Avancé, pour que rien de son contenu ne vous soit caché. Si vous passez une telle requête sur Simple, le formulaire indique ce qu’il n’affiche pas — et le laisse intact.

Étapes​

1. Choisir la table​

Sélectionnez le bouton Table et recherchez. Tout le reste de la requête se construit à partir de cette table et des tables qui lui sont jointes.

Changer de table efface le reste, et c’est délibéré : les colonnes, les conditions et les mesures nomment toutes des champs de l’ancienne table, et les conserver produirait une requête qui s’enregistre puis refuse de s’exécuter, en nommant un champ que vous voyez pourtant clairement à l’écran.

2. Ajouter des tables associées (Avancé)​

Choisissez Ajouter une table associée. La liste est tirée des relations que possède déjà votre environnement : vous ne saisissez donc jamais de nom de champ. Si rien n’est encore associé à votre table, la liste s’ouvre et l’indique — une table associée provient d’une colonne de recherche : ajoutez-en une sur l’une ou l’autre table et elle apparaîtra ici.

  • Un enregistrement associé — en suivant un champ de recherche, comme le compte d’une affaire. C’est la jointure habituelle, et elle est sans risque.
  • Plusieurs enregistrements associés — peut répéter des lignes — dans l’autre sens, comme les affaires d’un compte. Cela renvoie la ligne parente une fois par enfant, ce qui double silencieusement un total. Utilisez-la en connaissance de cause, et voir Des nombres qui semblent trop élevés ci-dessous.

Chaque table jointe reçoit :

  • Un nom (son alias). Ses colonnes s’appellent alias.column partout dans la requête. Vous pouvez la renommer ; le concepteur de requêtes vous avertit si quelque chose nomme encore l’ancien nom.
  • Un réglage de jointure — Conserver les lignes sans correspondance (par défaut) ou Uniquement les lignes correspondantes. Le réglage par défaut est le plus sûr : avec Uniquement les lignes correspondantes, une affaire sans compte disparaît entièrement des résultats, et rien à l’écran ne relie cette disparition à la jointure.
  • Ses propres conditions, ouvertes avec la flèche au début de la ligne. Elles restreignent la table associée à l’intérieur de la jointure : les lignes sans correspondance sont donc conservées lorsque la jointure est réglée pour les conserver. Placer la même condition dans le filtre principal éliminerait au contraire ces lignes.

Une requête peut joindre jusqu’à huit tables, imbriquées sur trois niveaux au plus.

3. Choisir les colonnes​

Le volet de gauche liste toutes les colonnes que la requête peut nommer — celles de la table et celles de chaque table jointe, regroupées par table et filtrées pendant la saisie. Cochez une colonne et elle apparaît à droite, qui représente ce que la requête renvoie, dans l’ordre ; le × en retire une.

L’ordre compte — c’est l’ordre dans lequel les colonnes reviennent, et celui dans lequel un rapport les imprime. Faites glisser une ligne par sa poignée pour la déplacer, le même geste que pour les valeurs d’un groupe d’options ou la navigation d’une application. Sans souris : placez le focus sur la poignée, appuyez sur Espace pour saisir la ligne, sur les flèches pour la déplacer, puis de nouveau sur Espace pour la déposer.

Laissez le volet de droite vide pour renvoyer les colonnes propres à la table.

Vous n’avez pas besoin de savoir à quelle table appartient une colonne. Cochez « Account · Industry » et la requête l’écrit sous la jointure du compte pour vous.

4. La restreindre​

La section Filtre est le même générateur de conditions ET/OU qu’une Recherche avancée ou le filtre d’une vue, et elle propose désormais toutes les colonnes de la requête — celles des tables jointes comme celles de la table elle-même.

Chaque condition est une ligne : champ, opérateur, valeur, et un × pour la retirer.

Fait partie de accepte plusieurs valeurs à la fois. Sur une colonne de choix, il ouvre une liste avec recherche que vous pouvez cocher ; sur une colonne texte ou nombre, vous saisissez une valeur et appuyez sur Entrée pour l’ajouter, et chaque valeur devient une pastille que vous pouvez retirer. C’est une seule condition avec plusieurs valeurs, et non plusieurs conditions à combiner à la main par OU.

Est au moins et Est au plus existent parce qu’écrire « au moins 5 » sous la forme « supérieur à 4 » n’est juste que sur des nombres entiers, et discrètement faux sur un décimal ou une date.

5. Regrouper et mesurer (Avancé)​

Cochez Renvoyer des groupes plutôt que des enregistrements lorsque la réponse est un nombre plutôt qu’une liste — c’est à partir de cela que se dessinent un graphique et une vignette d’indicateur.

  • Mesures — ce qu’il faut calculer. Count n’a besoin d’aucun champ (il compte les enregistrements) mais en accepte un (il compte alors les lignes où ce champ est renseigné). Sum et Average ne proposent que des colonnes numériques. Chaque mesure a un nom court ; c’est le nom sous lequel revient le résultat, et ce à quoi se lie un graphique.
  • Regrouper par — jusqu’à deux clés. Laissez vide pour obtenir un seul total sur toute la table. Une colonne de date propose aussi une période — par jour, semaine, mois, trimestre ou année.
  • Conditions sur les mesures — voir ci-dessous.

6. Conditions sur les mesures (Avancé)​

C’est la question qu’un filtre ne peut pas poser.

Un filtre décide quels enregistrements entrent dans un groupe. Une condition sur une mesure décide quels groupes sortent. « Les clients qui ont commandé plus de dix fois » ne peut pas du tout s’écrire comme un filtre, car aucune commande ne sait combien de commandes son client a passées.

Donc : regroupez par client, mesurez Count sous le nom orders, puis ajoutez une condition — orders est au moins 10.

Les conditions ne peuvent nommer que des mesures que cette requête calcule. Si vous voulez comparer ici une colonne ordinaire, sa place est dans le filtre.

7. Trier et limiter​

Triez par n’importe quelle colonne renvoyée par la requête. Une requête groupée n’a pas de colonnes par lesquelles trier — ses lignes sont des groupes — : elle propose donc à la place les clés de regroupement et les noms des mesures, qui sont les seuls noms dont elle dispose.

Renvoyer au plus plafonne les lignes, ou les groupes. Trier par une mesure en ordre décroissant et plafonner à cinq, c’est la requête des « cinq meilleurs clients ».

8. Options (Avancé)​

  • Supprimer les lignes en double — n’a d’effet qu’avec une jointure comportant plusieurs enregistrements par ligne. Cela ne corrige pas un total : une requête groupée compte toujours les lignes répétées, car supprimer les doublons et compter sont deux questions différentes.
  • Inclure le texte des colonnes de recherche — activé par défaut, car une colonne d’identifiants d’enregistrements n’est une vue de rien du tout. Désactivez-le pour une exportation indexée par identifiant.
  • Fuseau horaire — utilisé pour les périodes de dates. Sans fuseau, elles sont calculées en UTC : un enregistrement créé à neuf heures du soir tombe le lendemain, et un graphique quotidien est faux d’une fraction chaque jour, d’une façon que personne ne remarque.

9. Enregistrer, puis afficher l’aperçu​

Enregistrer vérifie la requête de trois façons : que c’est un document bien formé, que c’est une requête valide, et qu’elle s’exécuterait réellement ici — chaque champ, jointure, regroupement et mesure étant résolu par rapport aux vraies tables de votre environnement.

Aperçu exécute la requête et ouvre l’onglet Résultats, qui présente sous forme de tableau ce qui est revenu : une colonne par colonne renvoyée par la requête, sous son nom d’affichage, dans l’ordre où vous les avez placées. Les colonnes de recherche affichent le nom de l’enregistrement, et non l’identifiant stocké derrière.

  • Une requête d’enregistrements est paginée, 25 lignes à la fois, avec le paginateur sous le tableau et le total au-dessus. Une requête groupée n’est pas paginée — elle renvoie tous les groupes qu’elle trouve — : son tableau est donc la réponse complète.
  • Elle exécute la requête telle qu’elle est enregistrée, avec vos propres autorisations. Enregistrez d’abord : les modifications non enregistrées ne sont pas incluses, et l’onglet l’indique au-dessus du tableau. Une requête jamais enregistrée n’a rien de stocké à exécuter, et Aperçu reste indisponible tant que vous ne l’avez pas enregistrée une première fois.

L’onglet JSON​

Le concepteur dessine presque tout le langage de requête, et l’onglet JSON couvre le reste — la pagination, et tout ce qu’une requête écrite à la main ou générée par une IA utilise sans que le formulaire ait de contrôle pour cela. Il s’agit du schéma parsware-query@1, le même document que vous remettriez à un assistant chargé d’écrire une requête pour vous.

Tout ce que le formulaire ne dessine pas est conservé exactement tel quel pendant que vous modifiez le reste. Un concepteur qui supprimerait discrètement une partie de votre requête serait la pire façon possible de découvrir qu’elle en avait une.

Des nombres qui semblent trop élevés​

Une jointure dans le sens « plusieurs enregistrements associés » répète la ligne parente une fois par correspondance, et les totaux comptent les répétitions : un compte avec cinq affaires est compté cinq fois.

Suivre un champ de recherche — le sens habituel — ne peut pas produire cela. Si un total semble gonflé, vérifiez si une jointure indique plusieurs enregistrements associés, et mesurez plutôt la table enfant ou posez la question dans l’autre sens.

Dépannage​

  • « This is not valid JSON, so the designer cannot show it. » — il manque une virgule ou un crochet dans l’onglet JSON. Corrigez-le à cet endroit ; le formulaire ne peut pas afficher un document qu’il ne sait pas lire, et en afficher un vide écraserait ce que vous avez saisi dès que vous toucheriez un contrôle.
  • « These are named by the query but no longer exist in it. » — vous avez retiré ou renommé une table associée, et quelque chose la nomme encore. Retirez ces éléments, ou rajoutez la table sous le même nom.
  • « Unknown field … » à l’enregistrement — le champ appartient à une table jointe et doit être précédé du nom de la jointure, ou la jointure a été retirée.
  • Une condition sur une mesure est refusée — elle nomme quelque chose qui n’est pas une mesure de cette requête. Renommez-la pour qu’elle corresponde, ou déplacez la condition dans le filtre si elle porte sur une colonne.
  • Ajouter une table associée ne propose rien — rien n’est encore associé à cette table, ce que la liste indique à son ouverture. Une table associée provient d’une colonne de recherche : voir Créer une relation entre des tables.
  • « This environment's relationships could not be loaded » — le concepteur n’a pas pu lire les relations de l’environnement : il n’a donc aucune jointure à proposer. Ce n’est pas une erreur de la requête ; fermez le concepteur et rouvrez-le.

Scénarios associés​