version 5
CHERCHER ({table}{; critèreRecherche{; *}})
Paramètre | Type | Description | |
table | Table | Table dans laquelle la sélection est créée ou | |
Table par défaut si ce paramètre est omis | |||
critèreRecherche | Critère de recherche | ||
* | Attente d'exécution de la recherche |
Description
La commande CHERCHER recherche les enregistrements répondant au(x) critère(s) de recherche spécifié(s) dans critèreRecherche et retourne une sélection d'enregistrements de table. CHERCHER modifie la sélection courante de table pour le process courant. Le premier enregistrement de la nouvelle sélection devient l'enregistrement courant.
Si vous omettez le paramètre table, la commande s'applique à la table par défaut. Si aucune table par défaut n'a été définie, une erreur est générée.
Si vous ne passez ni le paramètre critèreRecherche ni le paramètre *, CHERCHER affiche la boîte de dialogue de l'Editeur de recherches de 4D pour table (sauf lorsqu'il s'agit de la dernière ligne d'une recherche complexe, cf. ci-dessous). Voici cet éditeur du mode Utilisation :
Pour plus d'informations sur l'utilisation de cet éditeur, reportez-vous au manuel Mode Utilisation de 4D.
L'utilisateur construit la recherche puis clique sur le bouton Rechercher ou Chercher dans sélection. Si la recherche est correctement effectuée et n'est pas interrompue, la variable système OK prend la valeur 1. Si l'utilisateur clique sur Annuler, la commande CHERCHER est interrompue sans effectuer de recherche et la variable OK prend la valeur 0 (zéro).
Exemples
(1) L'exemple suivant affiche l'Editeur de recherches pour la table [Produits] :
CHERCHER([Produits])
(2) L'exemple suivant affiche l'Editeur de recherches pour la table par défaut (si elle a été définie) :
CHERCHER
Si vous spécifiez le paramètre critèreRecherche, l'Editeur de recherches ne s'affiche pas et la recherche est entièrement définie par programmation. Pour des recherches simples (recherches sur un seul champ), vous appelez CHERCHER une seule fois avec le paramètre critèreRecherche construit de la manière décrite plus bas. Pour des recherches complexes (recherches sur de multiples champs ou avec de multiples conditions), vous appelez CHERCHER autant de fois que nécessaire avec le paramètre critèreRecherche et le paramètre optionnel * sauf pour la dernière ligne CHERCHER (qui déclenche la recherche).
Exemples
(3) L'exemple suivant recherche les [Personnes] dont le nom commence par "a" :
CHERCHER([Personnes];[Personnes]Nom="a@")
(4) L'exemple suivant recherche les [Personnes] dont le nom commence par "a" ou "b" :
CHERCHER([Personnes];[Personnes]Nom="a@";*) ` * indique qu'il y a un autre critère de recherche CHERCHER([Personnes]; |;[Personnes]Nom="b@") ` Pas de * : indique la fin de la définition des critères et lance l'exécution de la recherche
Construction d'une ligne de recherche
Le paramètre critèreRecherche utilise la syntaxe suivante :
{opérateur ; } champ comparateur valeur
L'opérateur est utilisé pour lier deux appels à CHERCHER lors d'une définition de recherche complexe. Les opérateurs disponibles sont les mêmes que ceux proposés dans l'Editeur de recherches en mode Utilisation :
Opérateur | Symbole |
ET | & |
OU | | |
Sauf | # |
L'opérateur est optionnel et n'est pas nécessaire pour le premier appel à CHERCHER pour une recherche complexe. Il est également inutile si votre recherche s'écrit sur une seule ligne.
Le champ est le champ sur lequel va porter la recherche. Il peut provenir d'une autre table si celle-ci est la table 1 d'une table liée à table par un lien automatique (la table à laquelle CHERCHER est appliquée doit être la table N).
Le comparateur est l'élément qui va permettre de confronter champ et critèreRecherche. Voici la liste des comparateurs possibles :
Comparateur | Symbole à utiliser avec CHERCHER | |
Egal à | = | |
Différent de | # | |
Inférieur à | < | |
Supérieur à | > | |
Inférieur ou égal à | <= | |
Supérieur ou égal à | >= |
La valeur représente ce qui va être confronté au contenu de champ. La valeur peut être toute expression du même type que champ. Le type de la valeur n'est évalué qu'une seule fois, au démarrage de la recherche, et ne l'est donc pas pour chaque enregistrement. Si la recherche porte sur le contenu d'une chaîne de caractères, utilisez dans 'valeur' le symbole "@" pour isoler le contenu à rechercher, par exemple "@Dupon@". Il est à noter, dans ce cas, que vous ne bénéficierez pas d'une recherche indexée.
Voici les règles à observer pour la construction de séquences de recherche :
La première ligne ne doit pas contenir d'opérateur.
Les suivantes doivent débuter par un opérateur.
Toutes les lignes, à l'exception de la dernière, doivent s'achever par le symbole *.
Pour lancer la recherche, ne passez pas le paramètre * lors de la construction de votre dernière ligne. Autre solution : vous pouvez exécuter la commande CHERCHER sans autre paramètre que la table (l'Editeur de recherches ne s'affiche pas ; au lieu de cela, les lignes de recherche complexes définies auparavant sont exécutées).
Note : Chaque table maintient sa propre construction de recherche courante. Cela signifie que vous pouvez créer de multiples recherches simultanément, une pour chaque table. Dans ce cas, vous devez passer le paramètre table ou spécifier une table par défaut.
Quelle que soit la manière dont la recherche a été définie :
Si l'exécution d'une commande CHERCHER nécessite un certain temps, 4e Dimension affiche automatiquement un message contenant un thermomètre de progression. Ces thermomètres peuvent être cachés à l'aide des commandes SUPPRIMER MESSAGES et LAISSER MESSAGES. Si le thermomètre de progression est affiché, l'utilisateur peut cliquer sur le bouton Stop pour interrompre l'opération. Si la recherche s'est correctement déroulée, la variable système OK prend la valeur 1. Sinon, si la recherche est interrompue, OK prend la valeur 0 (zéro).
Si des champs indexés sont spécifiés, la recherche est optimisée à chaque fois que c'est possible (la recherche commence par les champs indexés), réduisant au maximum la durée de l'opération.
Exemples
(5) Nous recherchons tous les enregistrements dont le nom correspond à "Dupont" :
CHERCHER([Personnes]; [Personnes]Nom = "Dupont")
Note : Si le champ Nom est indexé, nous bénéficions donc d'une recherche accélérée tirant parti de l'index.
Rappel : Cette recherche trouvera les enregistrements tels que "Dupont", "dupont", "DUPONT", etc. Si vous voulez que la recherche tienne compte des majuscules/minuscules, définissez des critères supplémentaires utilisant les codes ASCII.
(6) Nous recherchons les personnes se nommant "Dupont" et se prénommant "Jean". Le champ Nom est indexé. En revanche, le champ Prénom ne l'est pas :
CHERCHER ([Personnes]; [Personnes]Nom = "Dupont"; *) ` Chercher toute personne qui s'appelle Dupont CHERCHER ([Personnes]; &;[Personnes]Prénom = "Jean") ` dont le prénom est Jean
Cet exemple effectue dans un premier temps une recherche rapide sur le champ indexé Nom, ce qui réduit la sélection d'enregistrements à ceux des personnes s'appelant Dupont. La recherche s'effectue ensuite séquentiellement sur le champ Prénom, mais nous serons peu pénalisés puisqu'elle s'exécute parmi une présélection d'enregistrements.
(7) L'exemple suivant recherche les personnes se nommant Dupont ou Blanc. Le champ Nom est indexé :
` Chercher toute personne qui s'appelle Dupont CHERCHER ([Personnes]; [Personnes]Nom = "Dupont"; *) CHERCHER ([Personnes]; |;[Personnes]Nom = "Blanc") ` ou Blanc
La commande utilise l'index du champ Nom pour les deux recherches. Les deux recherches sont effectuées, et leurs résultats sont placés dans des ensembles internes qui sont finalement combinés par l'intermédiaire d'une opération Union.
(8) L'exemple suivant recherche des personnes qui ne travaillent pas pour une société. La recherche est effectuée en testant si le nom de la société est une chaîne vide.
CHERCHER ([Personnes]; [Personnes]Société = "") ` Chercher les personnes sans société
(9) L'exemple suivant recherche chaque personne se nommant "Dupont" et travaillant dans une société basée à Paris. La deuxième recherche utilise un champ venant d'une autre table. Cette recherche peut être effectuée parce que la table [Personnes] est liée à la table [Société] par un lien de N vers 1 :
CHERCHER ([Personnes]; [Personnes]Nom = "Dupont"; *) ` Chercher toute personne qui s'appelle Dupont CHERCHER ([Personnes]; &;[Société]Ville = "Paris") ` ...qui travaille pour une société à Paris
(10) L'exemple suivant recherche l'enregistrement de chaque personne dont l'initiale du nom est située entre les lettre A (incluse) et M (incluse) :
CHERCHER ([Personnes]; [Personnes]Nom < "n") ` Trouver toute personne entre A et M
(11) L'exemple suivant recherche les enregistrements des personnes habitant soit Paris soit Lyon :
CHERCHER ([Personnes]; [Personnes]CodePostal = "75@"; *) ` Trouver ceux qui habitent Paris CHERCHER ([Personnes]; |;[Personnes]CodePostal = "6900@") ` ou Lyon
(12) Cette recherche porte sur le contenu d'un sous-champ indexé. Cette recherche ne nous retournera pas une sélection de sous-enregistrements mais une sélection d'enregistrements parents (de la table [Personnes]) dont les sous-enregistrements répondent au critère de recherche.
CHERCHER ([Personnes]; [Personnes]Enfant'Nom = "Marjorie") ` Trouver les personnes qui ont un enfant qui s'appelle Marjorie
(13) Nous recherchons les enregistrements correspondant à la réponse fournie dans une boîte de dialogue :
vTrouvé := Demander ("Saisissez un code de facture :") `Demander un code de facture à l'utilisateur Si (OK = 1) ` Si l'utilisateur clique sur OK CHERCHER ([Factures]; [Factures]Code = vTrouvé) `Trouver le code qui correspond à vTrouvé Fin de si
(14) Cet exemple recherche tous les enregistrements des factures saisies en 1996. Nous recherchons les dates entre le 31/12/95 et le 1/1/97 :
CHERCHER ([Factures]; [Factures]DateFacture > !31/12/95!; *) ` Trouver des factures après le 31/12/95 CHERCHER ([Factures]; &;[Factures]DateFacture < !1/1/97!) ` et avant 1/1/97
(15) L'exemple suivant trouve les employés qui ont un salaire entre 20 000 et 40 000 Euros. La recherche inclut les employés qui gagnent 20 000 Euros et exclut ceux qui gagnent 40 000 Euros :
CHERCHER ([Employés]; [Employés]Salaire >= 20000; *) ` Trouver les employés qui ont un salaire entre CHERCHER ([Employés]; &;[Employés]Salaire < 40000) ` 20 000 et 40 000 Euros
(16) L'exemple suivant cherche les employés du service Marketing qui ont un salaire supérieur à 30 000 Euros. Le champ Salaire est utilisé dans un premier temps car il est indexé. Notez que la seconde recherche utilise un champ venant d'une autre table. Le champ [Service]Nom est lié à la table [Employés] par un lien automatique de N vers 1. Le champ [Service]Nom est indexé, mais la recherche n'est pas indexée car le lien doit être activé séquentiellement pour chaque enregistrement dans la table [Employés] :
CHERCHER ([Employés]; [Employés]Salaire > 30000; *) ` Trouver les employés qui ont un salaire supérieur à 30 000 Euros CHERCHER ([Employés]; &;[Service]Nom = "marketing") ` et qui travaillent dans le service marketing
(17) La recherche suivante recherche les informations égales à la valeur de la variable mavar.
CHERCHER ([Lois]; [Lois]Texte = mavar) ` Trouver toutes les lois qui sont égales à la valeur de mavar
La recherche peut avoir des résultats différents selon la valeur de mavar. Elle sera également exécutée différement. Par exemple :
Si mavar est égale à "Copyright@", la sélection contient toutes les lois qui commencent par Copyright.
Si mavar est égale à "@Copyright@", la sélection contient toutes les lois qui contiennent au moins une occurrence de Copyright.
Référence