IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Le composant TFDQBE de la version Delphi 12 (Athènes)
Un billet blog de SergioMaster

Le , par SergioMaster

0PARTAGES

La requête par l'exemple (QBE), à l'origine fournie avec BDE est encore actuelle même si obsolète.

Ci-dessous l'utilisation du programme dbd32.exe qui était fourni avec BDE sous d'anciennes versions.


Firedac qui, sur certains aspects, est proche des composants BDE, remet cette possibilité intéressante en selle grâce au nouveau composant FDQBE.

Ci-dessous mon programme d'essais


En pièce jointe, au bas du billet, vous trouverez les sources de la version FMX.

Reste à parler de la syntaxe utilisée par le composant, j'ai essayé d'en faire une synthèse, déduite de l'unité du composant et de mes essais.

Terme
Un terme permet d'indiquer la ou les valeurs recherchées pour une colonne ainsi que les conditions à appliquer.
Syntaxe d'un terme
NOT
OR
AND
Terme0 '!' Terme0 Terme0 '|' Terme0 Terme0 '&' Terme0
Terme0 = valeur | EQ valeur | direct | macro | masque | valeur '~' valeur | '(' valeur ')'
valeur = nombre | chaine de caractères
EQ = '=' | '>' | '<' | '>=' | '<=' | '<>'
masque = chaine de caractères pouvant contenir les charactères de substitution '%' ou '_'
direct = '[' instruction ']' *si [qoNoDirect] est exclu des Options
macro = '@' nom *nom = nom de la macro
Tri = '#' ('+'|'-') numéro *numéro = ordre de tri

Un terme commencera, la plupart du temps, par un comparateur '=','>','<','>=','<=' ou '<>' ou par une négation '!', généralement suivi d'une valeur.
Exemples :
Le terme =1 (le signe '=' est optionnel, le terme 1 est équivalent à =1) sera interprété en (A.nomcolonne = 1).
<>1 peut s'écrire !1. Ces deux termes seront interprétés de la même manière par (NOT A.nomcolonne = 1).

Il est possible de combiner plusieurs termes pour une même colonne par les opérateurs ('&' pour AND et '|' pour OR).
Exemples :
Le terme 1&>4 sera interprété en (A.nomcolonne = 1 AND A.nomcolonne > 4).
Le terme 1|4 sera interprété en (A.nomcolonne = 1 OR A.nomcolonne = 4).

Cas particuliers :

NULL
Pour obtenir une comparaison sur une valeur indéterminée (NULL) d'un champ annulable (pouvant avoir une absence de valeur), le terme ne contiendra que l'opérande '=','!=' ou '<>' permettant ainsi d'obtenir IS NULL dans le premier cas ou IS NOT NULL pour les deux autres

Intervalle de valeurs
Il est possible d'utiliser l'opérateur '~' pour obtenir un intervalle de valeurs
Exemple :
Le terme 1~5 sera interprété en (A.nomcolonne BETWEEN 1 AND 6).

Colonnes Chaîne de caractères

Par défaut, une valeur contenant une chaîne de caractères sera interprétée comme une recherche partielle.

Une recherche partielle utilisera les caractères de substitution '_' ou '%' pour remplacer, respectivement, un ou plusieurs caractères.
Par défaut, cette recherche ne sera pas sensible à la casse.
Exemples :
Le terme %o% recherchera toutes les valeurs (chaine de caractères) contenant 'o', interpété par ({fn UCASE(A.nomcolonne)} LIKE '%O%').
Le terme Co% recherchera toutes les valeurs (chaine de caractères) commençant par 'Co', interpété par ({fn UCASE(A.nomcolonne)} LIKE 'CO%').
Le terme _o% recherchera toutes les valeurs (chaine de caractères) dont la seconde lettre est 'o' ou 'O' , interpété par ({fn UCASE(A.nomcolonne)} LIKE '_O%').

Quid de cette expression {fn UCASE(A.CategoryName)} ? Ici, vous voyez en œuvre une des fonctionnalités de Firedac, le prétraitement de commandes.
Plus d'informations sur le prétraitement de Firedac ici

Il est possible de changer ce comportement en modifiant la propriété Options du composant FDQBE en retirant [qoPartial].
Exemples :
[qoPartial] inclus dans Options
Le terme Boissons sera interprété en ({fn UCASE(A.nomcolonne)} LIKE '%BOISSONS%').
Un moyen d'éviter le LIKE sans passer par la modification de la propriété Options est d'écrire le terme ainsi (Boissons) pour obtenir {fn UCASE(A.CategoryName)} = 'BOISSONS').
[qoPartial] non inclus
Le terme Boissons sera interprété en ({fn UCASE(A.nomcolonne)} = 'BOISSONS') à l'identique du terme (Boissons).

De même que pour la sensibilité à la casse, le comportement peut en être modifié en retirant la valeur [qoNocase] de la propriété Options.
Ainsi :
  • Le même terme Boissons ne fera plus d'appel à la fonction UCASE (A.nomcolonne LIKE '%Boissons%').
  • Le terme (Boissons) étant interprété en (A.nomcolonne='Boissons').


Colonnes de type numériques
le point décimal (si besoin) doit être utilisé dans le terme.
Exemple : <=19.75 sera interprété ainsi (A.ColonneNumerique <= 19.75).

Tri
Un tri peut être indiqué pour une colonne, soit seul, soit à la fin d'un terme ou d'une combinaison de terme.
Un tri s'exprime en ajoutant un '#' suivi du type '+' (optionnel) pour ASCendant ou '-' DESCendant et obligatoirement d'un numéro d'ordre.
Exemples :
Le terme #1 sera interprété par la clause ORDER BY A.nomcolonne.
Le terme #-1 sera interprété par la clause ORDER BY A.nomcolonne DESC.
Dans ce tableau
Colonne1 Colonne2
#-2 #1

[#-2][#1] sera interprété par la clause ORDER BY A.Colonne2,A.Colonne1 DESC.
Vous comprendrez donc qu'il est important de bien indiquer un numéro d'ordre unique pour chaque colonne.

Utilisation de fonctions
Une dernière possibilité s'offre à nous. Lors de mon paragraphe sur les recherches partielles, nous avons vu une utilisation du prétraitement des commandes.
Pour peu que, dans la propriété Options du composant FDQBE, la directive [qoNoDirect] ne soit pas incluse, nous pourrons utiliser cette fonctionnalité.
Le terme devra alors être entre crochets [ ]
Exemple : Le terme [{year(colonnedate)} = 1997] permettra une sélection sur la partie année d'une date et sera interprété ainsi (year(colonnedate)=1996).

Cette nouvelle syntaxe augmente considérablement les possibilités (même si toutes les fonctions ne sont peut-être pas valides).
Rubrique Description
Fonctions macro caractères Liste des fonctions utilisant des chaînes de caractères.
Fonctions macro numériques Liste des fonctions utilisant des nombres.
Fonctions macro date et heure Liste des fonctions utilisant la date et l'heure.
Fonctions macro système Liste des fonctions externes.
Fonction macro CONVERT Décrit la fonction CONVERT.
J'ai retrouvé dans mes archives MKQueryBuilder (D3-D6) que vous pouvez retrouver ici



Voilà le challenge posé, reste à savoir comment ce nouveau composant pourrait y répondre au sein d'une application proposant ce design.

Une erreur dans cette actualité ? Signalez-nous-la !