4D v16.3

QUERY BY FORMULA

Accueil

 
4D v16.3
QUERY BY FORMULA

QUERY BY FORMULA 


 

QUERY BY FORMULA ( laTable {; formule} ) 
Paramètre Type   Description
laTable  Table in Table dans laquelle effectuer la recherche
formule  Booléen in Formule de recherche

QUERY BY FORMULA effectue une recherche d'enregistrements dans laTable. QUERY BY FORMULA modifie la sélection courante de laTable pour le process courant et fait du premier enregistrement le nouvel enregistrement courant.

QUERY BY FORMULA et la commande QUERY SELECTION BY FORMULA fonctionnent exactement de la même manière, à la différence près que QUERY BY FORMULA effectue sa recherche parmi la totalité des enregistrements de la table alors que QUERY SELECTION BY FORMULA se cantonne aux enregistrements de la sélection courante.

Les deux commandes appliquent formule à chaque enregistrement de la table ou de la sélection. formule est une expression booléenne qui doit retourner VRAI ou FAUX. Si formule retourne Vrai, l'enregistrement est inclus dans la nouvelle sélection.

formule peut être simple (par exemple la comparaison d'un champ à une valeur) ou complexe (réalisation d'un calcul ou même évaluation de valeurs dans une table liée). Ce peut être une fonction 4D, ou une fonction ou une expression que vous avez créée. Lorsque vous travaillez avec des champs de type Alpha ou Texte, vous pouvez utiliser dans formule des jokers (@) ainsi que l'opérateur "contient" (%) pour la recherche par mots-clés. Pour plus d'informations, reportez-vous à la description de la commande QUERY.

Si vous omettez le paramètre formule, 4D affiche la boîte de dialogue de recherche (l'utilisateur peut ajouter une ligne de formule en effectuant Alt+clic sur le bouton [+]).

Lorsque la recherche est terminée, le premier enregistrement de la nouvelle sélection est chargé depuis le disque et devient l'enregistrement courant.

Ces commandes sont optimisées et peuvent notamment tirer parti des index. Lorsque le type de requête le permet, ces commandes exécutent des requêtes équivalentes à un QUERY. Par exemple, l’instruction QUERY BY FORMULA([matable]; [matable]monchamp=valeur) sera exécutée comme QUERY([matable]; [matable]monchamp=valeur), ce qui permettra d’utiliser l’index. 4D pourra également optimiser les requêtes contenant des parties non optimisables, en exécutant d’abord les parties optimisables puis en combinant les résultats avec le reste de la requête. Par exemple, l’instruction QUERY BY FORMULA([matable];Longueur(monchamp)=valeur) ne sera pas optimisée. En revanche, QUERY BY FORMULA([matable];Longueur(monchamp)=valeur1 | monchamp=valeur2) sera partiellement optimisée.

Ces commandes effectuent par défaut des "jointures" à la manière du SQL lorsque vous comparez des champs de tables différentes. Avec ce principe, les recherches sont optimisées et il n’est pas nécessaire qu’un lien automatique structurel existe entre les tables. Par exemple, vous pouvez exécuter une instruction du type QUERY BY FORMULA([Table_A];([Table_A]champ_X = [Table_B]champ_Y) & ([Table_B]champ_Y = "abc")) (cf. exemple 3). La première partie de la formule ([Table_A]champ_X = [Table_B]champ_Y) établit la jointure entre les deux champs et la seconde partie ([Table_B]champ_Y = "abc") définit le ou les critère(s) de recherche (au moins un critère doit être défini).
S'ils existent, les liens entre les tables ne sont en principe pas utilisés. Toutefois, ces commandes utilisent les liens automatiques dans les cas suivants :
- si la formule ne peut se décomposer en éléments de la forme { champ ; comparateur ; valeur}
- si deux champs de la même table sont comparés.

Note : Pour des raisons de compatibilité, il est possible de désactiver le mécanisme de jointures, soit globalement via les Propriétés de la base (bases de données converties uniquement) soit par process via la commande SET DATABASE PARAMETER.

4D Server : Cette commande est exécutée sur le serveur, ce qui optimise son exécution. A noter qu’en cas d’appel direct de variables dans la formule, la requête est calculée avec la valeur de la variable sur le poste client. Par exemple, l’instruction QUERY BY FORMULA([matable];[matable]monchamp=mavariable) sera exécutée sur le serveur mais avec le contenu de la variable mavariable du client.
Note de compatibilité : Jusqu'à 4D Server v11, cette commande était exécutée sur le poste client. Par compatibilité, ce fonctionnement est maintenu dans les bases de données converties. Toutefois, une propriété de compatibilité et un sélecteur de la commande SET DATABASE PARAMETER permettent d'adopter l'exécution sur serveur dans les bases de données converties.

L'exemple suivant recherche les enregistrements de toutes les factures qui ont été saisies au mois de décembre, sans tenir compte de l'année. Le principe est d'appliquer la fonction Month of à chaque enregistrement. Cette recherche ne pourrait pas être effectuée d'une autre manière sans créer un champ séparé pour le mois :

 QUERY BY FORMULA([Factures];Month of([Factures]Saisie)=12)
  ` Chercher les factures saisies en décembre

L'exemple suivant recherche les enregistrements de toutes les personnes dont le nom comporte plus de dix caractères :

 QUERY BY FORMULA([Personnes];Length([Personnes]Nom)>10)
  ` Chercher les personnes dont le nom fait plus de dix caractères

Cet exemple active les jointures SQL pour une recherche par formule spécifique :

 $valcourante:=Get database parameter(QUERY BY FORMULA Joins)
 SET DATABASE PARAMETER(QUERY BY FORMULA Joins;2) //Activer les jointures SQL
  //Chercher toutes les lignes de factures du client "ACME" alors que les tables ne sont pas liées
 QUERY BY FORMULA([ligne_factures];([ligne_factures]facture_id=[facture]id) & ([facture]client="ACME"))
 SET DATABASE PARAMETER(QUERY BY FORMULA Joins;$valcourante//on rétablit le paramétrage courant



Voir aussi  

QUERY
QUERY BY SQL
QUERY SELECTION
QUERY SELECTION BY FORMULA

 
PROPRIÉTÉS 

Produit : 4D
Thème : Recherches et tris
Numéro : 48

Cette commande change l'enregistrement courantCette commande change la sélection couranteCommande(s) éligible(s) à l'exécution dans un process préemptifComportement différent en mode distant

 
HISTORIQUE 

Modifié : 4D v11 SQL Release 2

 
UTILISATION DE L'ARTICLE

4D - Langage ( 4D v16)
4D - Langage ( 4D v16.1)
4D - Langage ( 4D v16.2)
4D - Langage ( 4D v16.3)