version 11.2 (Modifiée)
CHERCHER PAR FORMULE (laTable{; formule})
Paramètre | Type | Description | |
laTable | Table | Table dans laquelle effectuer la recherche | |
formule | Booléen | Formule de recherche |
Description
CHERCHER PAR FORMULE effectue une recherche d'enregistrements dans laTable. CHERCHER PAR FORMULE modifie la sélection courante de laTable pour le process courant et fait du premier enregistrement le nouvel enregistrement courant.
CHERCHER PAR FORMULE et la commande CHERCHER PAR FORMULE DANS SELECTION fonctionnent exactement de la même manière, à la différence près que CHERCHER PAR FORMULE effectue sa recherche parmi la totalité des enregistrements de la table alors que CHERCHER PAR FORMULE DANS SELECTION 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 CHERCHER.
Si vous omettez le paramètre formule, 4D affiche la boîte de dialogue standard de recherche.
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 CHERCHER. Par exemple, l'instruction CHERCHER PAR FORMULE([matable]; [matable]monchamp=valeur) sera exécutée comme CHERCHER([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 CHERCHER PAR FORMULE([matable];Longueur(monchamp)=valeur) ne sera pas optimisée. En revanche, CHERCHER PAR FORMULE([matable];Longueur(monchamp)=valeur1 | monchamp=valeur2) sera partiellement optimisée.
Ces commandes effectuent par défaut des "jointures" à la manière du SQL. Avec ce principe, les recherches sont optimisées et il n'est pas nécessaire qu'un lien automatique structurel existe entre la table A et la table B pour pouvoir exécuter une instruction du type CHERCHER PAR FORMULE([Table_A];[Table_A]champ_X = [Table_B]champ_Y) (cf. exemple 3).
S'ils existent, les liens définis dans l'éditeur de structure 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 Préférences de la base (bases de données converties uniquement) soit par process via la commande FIXER PARAMETRE BASE.
4D Server : A compter de la version 11 de 4D Server, ces commandes sont exécutées sur le serveur, ce qui optimise leur 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 CHERCHER PAR FORMULE([matable];[matable]monchamp=mavariable) sera exécutée sur le serveur mais avec le contenu de la variable mavariable du client.
En revanche, ce principe n'est pas appliqué pour les formules utilisant des méthodes qui, elles-mêmes, font appel à des variables (la valeur des variables est évaluée sur le serveur). Dans ce contexte, il peut être judicieux d'utiliser l'attribut de méthode "Exécuter sur serveur" permettant d'exécuter une méthode sur le serveur en lui passant des paramètres (variables) (cf. manuel Mode Développement).
Dans les versions précédentes de 4D Server, ces commandes étaient exécutées sur les postes clients. Par compatibilité, ce fonctionnement est maintenu dans les bases de données converties en version 11. Une préférence de compatibilité et un sélecteur de la commande FIXER PARAMETRE BASE permettent toutefois d'adopter le fonctionnement de la version 11 (exécution sur le serveur) dans les bases de données converties.
Exemples
(1) 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 Mois de à 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 :
CHERCHER PAR FORMULE ([Factures]; Mois de ([Factures]Saisie) = 12) ` Chercher les factures saisies en décembre
(2) L'exemple suivant recherche les enregistrements de toutes les personnes dont le nom comporte plus de dix caractères :
CHERCHER PAR FORMULE ([Personnes]; Longueur ([Personnes]Nom) > 10) ` Chercher les personnes dont le nom fait plus de dix caractères
(3) Cet exemple active les jointures SQL pour une recherche par formule spécifique :
$valcourante:= Lire parametre base(Jointures CHERCHER PAR FORMULE) FIXER PARAMETRE BASE(Jointures CHERCHER PAR FORMULE;2) `Activer les jointures SQL `Chercher toutes les lignes de factures du client "ACME" alors que les tables ne sont pas liées CHERCHER PAR FORMULE([ligne_factures] ; [ligne_factures]facture_id = [facture]id & [facture]client = "ACME") FIXER PARAMETRE BASE(Jointures CHERCHER PAR FORMULE;$valcourante) `on rétablit le paramétrage courant
Référence
CHERCHER, CHERCHER DANS SELECTION, CHERCHER PAR FORMULE DANS SELECTION, CHERCHER PAR SQL.