Vous êtes sur le site Web historique de la documentation de 4D. Les documentations sont progressivement déplacées vers developer.4d.com |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20.6
CHERCHER PAR ATTRIBUT
|
CHERCHER PAR ATTRIBUT ( {laTable}{;}{opConj ;} champObjet ; cheminAttribut ; opRech ; valeur {; *} ) | ||||||||
Paramètre | Type | Description | ||||||
laTable | Table |
![]() |
Table dans laquelle la sélection est créée ou Table par défaut si ce paramètre est omis | |||||
opConj | Opérateur |
![]() |
Opérateur à utiliser pour combiner plusieurs requêtes (le cas échéant) | |||||
champObjet | Champ |
![]() |
Champ objet dont les attributs sont à utiliser pour la recherche | |||||
cheminAttribut | Chaîne |
![]() |
Nom ou chemin d'attribut | |||||
opRech | Chaîne, Opérateur |
![]() |
Opérateur de recherche (comparateur) | |||||
valeur | Texte, Numérique, Date, Heure |
![]() |
Valeur à comparer | |||||
* | Opérateur |
![]() |
Attente d'exécution de la recherche | |||||
La commande CHERCHER PAR ATTRIBUT recherche les enregistrements répondant au(x) critère(s) de recherche spécifié(s) à l'aide des paramètres champObjet, cheminAttribut, opRech et valeur et retourne une sélection d'enregistrements de laTable.
CHERCHER PAR ATTRIBUT modifie la sélection courante de laTable pour le process courant. Le premier enregistrement de la nouvelle sélection devient l'enregistrement courant. Si vous omettez le paramètre laTable, 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.
Le paramètre optionnel opConj est utilisé pour combiner plusieurs appels à CHERCHER PAR ATTRIBUT en cas de recherche multiple. Les opérateurs de conjonction utilisables sont les mêmes que ceux de la commande CHERCHER :
Conjonction | Symbole à utiliser avec CHERCHER PAR ATTRIBUT |
ET | & |
OU | | |
Sauf | # |
Le paramètre opConj n'est pas nécessaire pour le premier appel à CHERCHER PAR ATTRIBUT lors d'une recherche complexe, ou si la recherche ne comporte qu'une ligne. Si vous l'omettez à l'intérieur d'une recherche complexe, le ET (&) est utilisé par défaut.
Dans champObjet, passez le champ objet parmi les attributs duquel vous souhaitez effectuer la recherche. Il peut provenir d'une autre table si celle-ci est la table 1 d'une table liée à laTable par un lien automatique ou manuel.
CHERCHER PAR ATTRIBUT prend en charge les attributs utilisateurs de 4D Write Pro lorsque les documents sont stockés dans des champs de type Objet. Pour plus d'informations sur ce point, reportez-vous à la section Stocker les documents 4D Write Pro dans des champs objet 4D.
Dans cheminAttribut, passez le chemin de l'attribut dont vous souhaitez comparer les valeurs pour chaque enregistrement, par exemple "enfants.filles.age". Si vous passez un simple nom, par exemple "lieu", vous désignez l'attribut correspondant situé au premier niveau du champ objet.
Si un attribut "x" est un tableau, CHERCHER PAR ATTRIBUT cherchera les enregistrements contenant un attribut "x" dans lequel au moins un élément correspond aux critères. Pour effectuer une recherche parmi les attributs de tableaux, il est nécessaire d'indiquer à la commande CHERCHER PAR ATTRIBUT que l'attribut "x" est un tableau en ajoutant "[]" à son nom dans le paramètre cheminAttribut (voir exemple 3). Vous pouvez également insérer une lettre à l'intérieur des crochets (par exemple "[b]") pour lier des arguments (reportez-vous au paragraphe Lier les critères pour les recherches dans les éléments de tableau ci-dessous).
Notes :
Le paramètre opRech est l'opérateur qui va permettre de comparer champObjet et valeur. Vous pouvez utiliser l'un des symboles suivants :
Comparaison | Symbole à utiliser avec CHERCHER PAR ATTRIBUT |
Egal à | = |
Différent de(*) | # |
Inférieur à | < |
Supérieur à | > |
Inférieur ou égal à | <= |
Supérieur ou égal à | >= |
(*) Lorsqu'il est utilisé avec des éléments de tableau, l'opérateur # signifie "ne contient aucun".
Note : Il est possible de définir le comparateur sous la forme d'une expression texte au lieu d'un symbole. Reportez-vous à la description de la commande CHERCHER pour plus d'informations.
La valeur représente ce qui va être comparé au contenu de cheminAttribut. La valeur peut être toute expression du même type que cheminAttribut. 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 la recherche ne tire que partiellement parti de l'index (compacité du stockage des données).
Voici la structure type d'une recherche par attribut :
CHERCHER PAR ATTRIBUT([Table] ;[Table]ChampObjet ;"attribut1.attribut2";=;valeur)
Note : La présence de l'attribut dans le champ objet est un critère implicite pour tous les opérateurs (hormis #). En revanche, pour l'opérateur #, il peut être indéfini (cf. ci-dessous).
Lorsque vous effectuez une recherche par attribut à l'aide de l'opérateur #, vous devez prendre en considération les cas où un attribut n'est pas présent dans un enregistrement. Considérons par exemple ce qui suit :
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]Animaux;"chien.nom";#;"Médor")
Cette recherche retournera les enregistrements des personnes ayant un chien dont le nom n'est pas "Médor", mais ne retournera PAS les les enregistrements des personnes n'ayant pas de chien, ou ayant un chien sans nom, c'est-à-dire les enregistrements pour lesquels la valeur de la proprité "chien.nom" est null. Le concept est le suivant : le moteur de recherche ne peut pas comparer l'incomparable, à savoir les données manquantes ou inexistantes. Ainsi, les enregistrements qui ne peuvent pas être comparés aux critères de recherche sont exclus de la recherche.
Voici un exemple plus générique :
CHERCHER PAR ATTRIBUT([Table];[Table]ChampObjet;"attribut1.attribut2";#;valeur)
Ce principe s'applique également aux attributs tableaux. Par exemple, la recherche retournera les enregistrements des personnes ayant une ou plusieurs adresses, mais n'ayant aucune adresse à Paris.
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OB_Field;"locations[].city";#;"paris")
Voici les règles à observer pour la construction de recherche par attribut à lignes multiples :
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.
Quelle que soit la manière dont la recherche a été définie :
Les dates sont stockées dans les objets en fonction des paramètres de la base ; par défaut, la timezone est prise en compte (voir le sélecteur JSON fuseau horaire local dans la commande FIXER PARAMETRE BASE).
!1973-05-22! -> "1973-05-21T23:00:00.000Z"
Ce paramétrage est également respecté durant les recherches, donc vous n'avez pas à vous en préoccuper si vous utilisez toujours votre base dans la même zone et si les paramètres sont identiques sur chaque machine qui accède aux données. Dans ce contexte, la recherche suivante retournera bien les enregistrements dont l'attribut Anniversaire est égal à !1973-05-22! (stocké "1973-05-21T23:00:00.00Z") :
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OB_Info;"Anniversaire";=;!1973-05-22!)
Si vous ne souhaitez pas utiliser le paramétrage GMT, vous pouvez exécuter l'instruction suivante :
FIXER PARAMETRE BASE(JSON fuseau horaire local;0)
Attention, la portée de ce paramètre est limitée au process. Si vous exécutez cette instruction, le 1er Octobre 1965 sera stocké "1965-10-01T00:00:00.000Z" mais vous devrez fixer le même paramètre avant de lancer vos recherches :
FIXER PARAMETRE BASE(JSON fuseau horaire local;0)
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OB_Info;"Anniversaire";=;1976-11-27!)
Vous pouvez utiliser la propriété virtuelle "length" avec cette commande. Cette propriété est automatiquement disponible pour tous les attributs de type tableau, et retourne la taille du tableau, c'est-à-dire le nombre d'éléments qu'il contient. Elle peut être utilisée dans le contexte de l'exécution de la commande CHERCHER PAR ATTRIBUT (cf. exemple 4).
(Nouveauté 4D v16 R2) Lorsque vous effectuez des recherches multiples combinées via l'opérateur "ET" parmi des éléments de tableaux, vous pouvez souhaiter que seuls les enregistrements dont au moins un élément de tableau répond à tous les critères soient trouvés, et non ceux répondant à tous les critères mais dans différents éléments. Pour cela, vous devez lier les critères de recherche afin que seuls les éléments individuels contenant tous les critères liés soient trouvés.
Par exemple, avec les deux enregistrements suivants :
Enregistrement 1 :
[Personnes]nom : "Martin"
[Personnes]OB_Field :
"locations" : [ {
"kind":"home",
"city":"Paris"
} ]
Enregistrement 2 :
[Personnes]nom : "Smith"
[Personnes]OB_Field :
"locations" : [ {
"kind":"home",
"city":"Lyon"
} , {
"kind":"office",
"city":"Paris"
} ]
Vous souhaitez trouver les personnes qui ont un type d'adresse "home" dans la ville "Paris". Si vous écrivez :
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OB_Field;"locations[].city";=;"Paris";*)
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OB_Field;"locations[].kind";=;"home")
... la recherche retournera "Martin" et "Smith" car "Smith" a un élément "locations" dont le "kind" est "home" et un (autre) élément "locations" dont la "city" est "Paris".
Si vous souhaitez uniquement récupérer les enregistrements correspondant aux critères mais dans un même élément, vous devez lier les critères. Pour lier des critères de recherche :
Avec les mêmes enregistrements que précédemment, si vous écrivez :
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OB_Field;"locations[a].city";=;"Paris";*)
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OB_Field;"locations[a].kind";=;"home")
... la recherche retournera uniquement "Martin" car il a un élément "locations" dont le "kind" est "home" et dont la "city" est "Paris". La recherche ne retournera pas "Smith" car les valeurs "Paris" et "home" ne se trouvent pas dans le même élément de tableau. Reportez-vous ci-dessous pour plus d'exemples d'utilisations de cette fonctionnalité.
Note : Utiliser la syntaxe liée dans une ligne de recherche unique donnera les mêmes résultats qu'une recherche standard, hormis avec l'opérateur "#" : dans ce cas, des résultats invalides peuvent être retournés. Par conséquent, cette syntaxe spécifique n'est pas prise en charge.
Dans cet exemple, l'attribut "age" est soit une chaîne soit un entier et nous souhaitons trouver les personnes dont l'âge est situé entre 20 et 29. Les deux premières lignes interrogent l'attribut en tant qu'entier (>=20 et < 30) et les suivantes interrogent l'attribut en tant que chaîne (débute par "2" mais est différent de "2").
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OB_Info;"age";>=;20;*)
CHERCHER PAR ATTRIBUT([Personnes];&;[Personnes]OB_Info;"age";<;30;*)
CHERCHER PAR ATTRIBUT([Personnes];|;[Personnes]OB_Info;"age";=;"2@";*)
CHERCHER PAR ATTRIBUT([Personnes];&;[Personnes]OB_Info;"age";#;"2") //pas de * final pour lancer l'exécution
La commande CHERCHER PAR ATTRIBUT peut être utilisée pour rechercher des enregistrements dans lesquels certains attributs sont définis (ou non définis). Pour cela, vous devez utiliser un objet vide :
//Trouver les enregistrements où l'email est défini dans le champ objet
C_OBJET($undefined)
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]Info;"email";#;$undefined)
//Trouver les enregistrements où le zip code n'est PAS défini dans le champ objet
C_OBJET($undefined)
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]Info;"zip code";=;$undefined)
Note : Cette syntaxe spécifique n'est pas prise en charge avec les attributs de type tableau. La recherche de valeurs NULL dans les attributs de tableau donne des résultats invalides.
Vous voulez chercher un champ contenant des attributs tableaux. Avec les deux enregistrements suivants :
Enregistrement 1 :
[Personnes]nom : "martin"
[Personnes]OBFied :
"locations" : [ {
"kind":"office",
"city":"paris"
} ]
Enregistrement 2 :
[Personnes]nom : "smith"
[Personnes]OBFied :
"locations" : [ {
"kind":"home",
"city":"lyon"
} , {
"kind":"office",
"city":"paris"
} ]
... CHERCHER PAR ATTRIBUT trouvera les personnes ayant une localisation à "paris" par cette recherche :
//on indique l'attribut tableau avec la syntaxe "[]"
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OB_Field;"locations[].city";=;"paris")
//trouve "martin" et "smith"
Note : Si vous avez défini plusieurs critères sur le même attribut tableau, les critères correspondants ne s'appliqueront pas nécessairement au même élément de tableau. Dans l'exemple ci-dessous, la recherche retournera "smith" car l'attribut a un élément "locations" dont le "kind" est "home" et un élément "locations" dont le "city" est "paris", même s'il ne s'agit pas du même élément :
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OB_Field;"locations[].kind";=;"home";*)
CHERCHER PAR ATTRIBUT([Personnes];&;[Personnes]OB_Field;"locations[].city";=;"paris")
//trouve "smith"
Cet exemple illustre l'utilisation de la propriété virtuelle "length". Votre base de données comporte un champ objet [Customer]full_Data avec les données suivantes :
Vous souhaitez obtenir les enregistrements des clients qui ont deux enfants ou plus. Vous pouvez écrire :
CHERCHER PAR ATTRIBUT([Customer];[Customer]full_Data;"Children.length";>=;2)
Ces exemples illustrent les différentes combinaisons de liaisons de critères disponibles avec les tableaux. Soit une base contenant les enregistrements suivants :
Enregistrement 1 :
[Personnes]Nom : "Sam"
[Personnes]OBField :
"Enfants": [ {
"Nom": "Harry",
"Age": "15",
"Jouets": [ {
"Nom": "Voiture",
"Coul": "Bleu"
}, {
"Nom": "Teddy Bear",
"Coul": "Marron"
} ]
}, {
"Nom": "Betty",
"Age": "9",
"Jouets": [ {
"Nom": "Voiture",
"Coul": "Vert"
}, {
"Nom": "Puzzle",
"Coul": "Bleu"
} ]
} ]
Enregistrement 2 :
[Personnes]Nom : "Louis"
[Personnes]OBField :
"Enfants": [ {
"Nom": "Harry",
"Age": "15",
"Jouets": [ {
"Nom": "Pistolet à eau",
"Coul": "Bleu"
} ]
}, {
"Nom": "Betty",
"Age": "3",
"Jouets": [ {
"Nom": "Voiture",
"Coul": "Bleu"
}, {
"Nom": "Puzzle",
"Coul": "Vert"
} ]
} ]
Enregistrement 3 :
[Personnes]Nom : "Victor"
[Personnes]OBField :
"Enfants": [ {
"Nom": "Harry",
"Age": "9",
"Jouets": [ {
"Nom": "Poupée",
"Coul": "Rose"
}, {
"Nom": "Puzzle",
"Coul": "Bleu"
} ]
}, {
"Nom": "Betty",
"Age": "15",
"Jouets": [ {
"Nom": "Pistolet à eau",
"Coul": "Bleu"
} ]
} ]
Recherche des personnes qui ont un enfant de 15 ans nommé "Betty" :
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OBField;"Enfants[a].Nom";=;"Betty";*)
CHERCHER PAR ATTRIBUT([Personnes];&;[Personnes]OBField;"Enfants[a].Age";=;"15")
//retourne "Victor"
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OBField;"Enfants[].Nom";=;"Betty";*)
CHERCHER PAR ATTRIBUT([Personnes];&;[Personnes]OBField;"Enfants[].Age";=;"15")
//retourne "Sam", "Louis" et "Victor"
Recherche des personnes qui ont un enfant de 15 ans nommé "Betty" et un enfant de 9 ans nommé "Harry" :
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OBField;"Enfants[a].Nom";=;"Betty";*)
CHERCHER PAR ATTRIBUT([Personnes];&;[Personnes]OBField;"Enfants[a].Age";=;"15";*)
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OBField;"Enfants[b].Nom";=;"Harry";*)
CHERCHER PAR ATTRIBUT([Personnes];&;[Personnes]OBField;"Enfants[b].Age";=;"9")
//retourne "Victor"
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OBField;"Enfants[].Nom";=;"Betty";*)
CHERCHER PAR ATTRIBUT([Personnes];&;[Personnes]OBField;"Enfants[].Age";=;"15";*)
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OBField;"Enfants[].Nom";=;"Harry";*)
CHERCHER PAR ATTRIBUT([Personnes];&;[Personnes]OBField;"Enfants[].Age";=;"9")
//retourne "Sam" et "Victor"
Recherche des personnes qui ont un enfant de 15 ans nommé "Harry" qui a une voiture bleue en jouet (recherche dans un tableau de tableaux):
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OBField;"Enfants[a].Nom";=;"Harry";*)
CHERCHER PAR ATTRIBUT([Personnes];&;[Personnes]OBField;"Enfants[a].Age";=;"15";*)
CHERCHER PAR ATTRIBUT([Personnes];&;[Personnes]OBField;"Enfants[a].Jouets[b].Nom";=;"Voiture";*)
CHERCHER PAR ATTRIBUT([Personnes];&;[Personnes]OBField;"Enfants[a].Jouets[b].Coul";=;"Bleu")
//retourne "Sam"
CHERCHER PAR ATTRIBUT([Personnes];[Personnes]OBField;"Enfants[].Nom";=;"Harry";*)
CHERCHER PAR ATTRIBUT([Personnes];&;[Personnes]OBField;"Enfants[].Age";=;"15";*)
CHERCHER PAR ATTRIBUT([Personnes];&;[Personnes]OBField;"Enfants[].Jouets[].Nom";=;"Voiture";*)
CHERCHER PAR ATTRIBUT([Personnes];&;[Personnes]OBField;"Enfants[].Jouets[].Coul";=;"Bleu")
//retourne "Sam" et "Louis"
Si la recherche est correctement effectuée, la variable système OK prend la valeur 1.
La variable OK prend la valeur 0 si :
CHERCHER PAR ATTRIBUT DANS SELECTION
Download HDI database
Structure des objets de langage 4D
Produit : 4D
Thème : Recherches et tris
Numéro :
1331
Nom intl. : QUERY BY ATTRIBUTE
Créé : 4D v15
Modifié : 4D v16 R2
4D - Langage ( 4D v20)
4D - Langage ( 4D v20.1)
4D - Langage ( 4D v20.2)
4D - Langage ( 4D v20.3)
4D - Langage ( 4D v20.4)
4D - Langage ( 4D v20.5)
4D - Langage ( 4D v20.6)