Vous êtes sur le site Web historique de la documentation de 4D. Les documentations sont progressivement déplacées vers developer.4d.com |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v19.8
dataClass.query( )
|
dataClass.query ( chaîneRecherche | formule {; valeur}{; valeur2 ; ... ; valeurN}{; params}) -> Résultat | ||||||||
Paramètre | Type | Description | ||||||
chaîneRecherche | formule | Texte, Objet |
![]() |
Critère de recherche comme chaîne ou objet formule | |||||
valeur | Varié |
![]() |
Valeur(s) à utiliser pour le(s) placeholder(s) indexés | |||||
params | Objet |
![]() |
Options de recherche : parameters, attributes, args, allowFormulas, context, queryPath, queryPlan | |||||
Résultat | EntitySelection |
![]() |
Nouvelle entity selection constituée des entités de la dataClass correspondant au(x) critère(s) de recherche indiqués dans chaîneRecherche ou formula | |||||
La méthode dataClass.query( ) recherche les entités répondant au(x) critère(s) de recherche spécifié(s) dans chaîneRecherche ou formule et (optionnellement) valeur, parmi toutes les entités de la dataclass, et retourne un nouvel objet du type EntitySelection contenant toutes les entités trouvées. Le lazy loading est appliqué.
Si aucune entité n'est trouvée, un objet EntitySelection vide est retourné.
Le paramètre chaîneRecherche doit respecter la syntaxe suivante :
cheminAttribut | formule comparateur valeur {opérateurLogique cheminAttribut | formulecomparateur valeur} {tri par cheminAttribut {desc | asc}}
où :
Note : Vous ne pouvez pas utiliser directement des attributs dont les noms contiennent des caractères spéciaux tels que ".", "[ ]", ou "=", ">", "#" etc., car ils ne seront pas correctement évalués dans la chaîne de recherche. Si vous souhaitez rechercher ces attributs, pensez à utiliser des textes d'exemple (placeholder) pour étendre une plage de caractères dans les chemins d'attribut (voir Paramètre valeur (et placeholders) ci-dessous).
"eval(length(This.lastname) >=30)"
(*) si la formule n'est pas le seul critère de recherche, le système d'optimisation des requêtes pourrait prioriser le traitement d'autres critères (ex : attributs indexés) et ainsi, la formule serait évaluée uniquement pour un sous-ensemble d'entités.
Les formules contenues dans les requêtes peuvent recevoir des paramètres via $1. Ce point est détaillé dans le paragraphe Paramètre formule ci-dessous.
Notes :
- Vous pouvez également passer directement un paramètre formule au lieu d'un paramètre chaîneRecherche (recommandé lorsque les formules sont plus complexes). Voir le paragraphe Paramètre formule ci-dessous.
- Pour des raisons de sécurité, il est possible de désactiver les appels de formules dans les méthodes membres query(). Voir la description du paramètre chaîneRecherche.
Comparaison | Symbole(s) | Commentaire |
Egal à | =, == | Retourne les données correspondantes, prend en charge le joker de recherche (@), ne tient pas compte de la casse et est non diacritique. |
===, IS | Retourne les données correspondantes, considère le @ comme un caractère standard, ne tient pas compte de la casse et est non diacritique. | |
Différent de | #, != | Prend en charge le joker de recherche (@) |
!==, IS NOT | Considère le @ comme un caractère standard | |
Inférieur à | < | |
Supérieur à | > | |
Inférieur ou égal à | <= | |
Supérieur ou égal à | >= | |
Inclus parmi | IN | Retourne les données égales à au moins une des valeurs d'une collection ou d'un ensemble de valeurs, prend en charge le joker de recherche (@) |
Condition Not appliquée à une assertion | NOT | Les parenthèse sont obligatoires lorsque NOT est utilisé devant une assertion contenant plusieurs opérateurs |
Contient mot-clé | % | Les mots-clés peuvent être définis dans les attributs de type texte ou image |
Conjonction | Symbole(s) |
AND | &, &&, and |
OR | |, ||, or |
Utilisation des guillemets/apostrophes
Lorsque vous utilisez des guillemets dans les recherches, vous devez utiliser des apostrophes ' ' à l'intérieur des requêtes et des guillemets " " pour encadrer la recherche complète, sinon une erreur est générée. Par exemple :
"personne.nom = 'smith' AND personne.prenom = 'john'"
Note : Les guillemets simples ne sont pas pris en charge dans les valeurs recherchées car ils casseraient la chaîne de recherche.
Par exemple, "comp.name = 'John's pizza' " génèrera une erreur. Si vous devez rechercher des valeurs contenant des guillemets simples, il est nécessaire d'utiliser des placeholders (voir ci-dessous).
Utilisation des parenthèses
Vous pouvez utiliser des parenthèses dans la recherche afin de prioriser les calculs. Par exemple, vous pouvez organiser une recherche de la manière suivante :
"(personne.age >= 30 OR personne.age <= 65) AND (personne.salaire <= 10000 OR personne.statut = 'Manager')"
Au lieu d'insérer une formule dans le paramètre chaîneRecherche (voir ci-dessus), vous pouvez directement passer un objet formule en tant que critère de recherche booléen. L'utilisation d'un objet formule pour les requêtes est recommandée car vous bénéficiez d'une tokénisation et car il est plus facile de rechercher/lire du code.
La formule doit avoir été créée à l'aide de la commande Formule ou Formule sur chaine. Dans ce cas :
Note : Pour des raisons de sécurité, les appels de formule dans les méthodes membres query() peuvent être interdits. Voir la description du paramètre params.
Passer des paramètres à des formules
Toute formule appelée par la méthode membre query() peut recevoir des paramètres :
Ce code montre comment les paramètres sont passés aux méthodes :
$settings:=Creer objet("args";Creer objet("exclude";"-")) //objet args pour passer des paramètres
$es:=ds.Students.query("eval(checkName($1.exclude))";$settings) //args est reçu dans $1
Des exemples supplémentaires sont fournis dans l'exemple 3.
4D Server : En mode client/serveur, les formules sont exécutées sur le serveur. Dans ce contexte, seul l'objet querySettings.args est envoyé aux formules.
4D vous permet d'utiliser des placeholders pour les arguments cheminAttribut et valeur du paramètre params. Un placeholder est un paramètre que vous insérez dans des chaines de recherche et qui est remplacé par une autre valeur au moment où la chaîne de recherche est évaluée. La valeur des placeholders est évaluée une seule fois, au début de la requête; elle n'est pas évaluée pour chaque élément.
Il existe deux types de placeholders : les placeholders indexés et les placeholders nommés.
- | Placeholders indexés | Placeholders nommés |
Définition | Les paramètres sont insérés comme : paramIndex (par exemple :1, :2...) dans chaîneRecherche et leurs valeurs sont fournies par la séquence du/des paramètre(s) valeur. Vous pouvez utiliser jusqu'à 128 paramètres valeur | Les paramètres sont insérés comme : paramName (par exemple :myparam) et leurs valeurs sont fournies dans les objets attributes et/ou parameters dans le paramètre params. |
Exemple | $r:=class.query(":1=:2";"city";"Chicago") | $o.attributes:=Creer objet("att";"city") |
Vous pouvez combiner tous les types d'arguments dans chaîneRecherche. Une chaîneRecherche peut contenir, en termes de paramètres cheminAttribut et valeur :
Utiliser des placeholders dans les recherches est recommandé pour deux raisons :
$vquery:="statut = 'public' & nom = "+myname //l'utilisateur saisit son nom
$result:=$col.query($vquery)
$result:=$col.query("statut='public' & nom=:1";myname)
$result:=$col.query("address.city = :1 & name =:2";$city;$myVar+"@")
$result2:=$col.query("company.name = :1";"John's Pizzas")
Recherche de valeurs null
Lorsque vous recherchez les valeurs null, vous ne pouvez pas utiliser la syntaxe placeholder car le moteur de recherche considère la valeur null comme une valeur de comparaison invalide. Par exemple, si vous exécutez la recherche suivante :
$vSingles:=ds.Person.query("spouse = :1";Null) // n'aboutira pas
$vSingles:=ds.Person.query("spouse = null") //syntaxe valide
Lorsque vous effectuez une recherche dans des collections au sein d'attributs objet à l'aide de plusieurs arguments de requête reliés par l'opérateur AND, vous souhaiterez éventuellement vous assurer que seules les entités contenant des éléments correspondant à tous les arguments soient retournées, et non les entités où des arguments peuvent être trouvés dans différents éléments. Pour ce faire, vous devez relier les arguments de requête aux éléments de collection, de sorte que seuls les éléments uniques contenant des arguments reliés soient identifiés.
Par exemple, avec les deux entités suivantes:
Entity 1:
ds.People.name: "martin"
ds.People.places:
{ "locations" : [ {
"kind":"home",
"city":"paris"
} ] }
Entity 2:
ds.People.name: "smith"
ds.People.places:
{ "locations" : [ {
"kind":"home",
"city":"lyon"
} , {
"kind":"office",
"city":"paris"
} ] }
Vous souhaitez trouver des personnes dont le type d'emplacement est "home" dans la ville de "paris". Si vous écrivez :
ds.People.query("places.locations[].kind= :1 and places.locations[].city= :2";"home";"paris")
... la requête retournera "martin" et "smith" car "smith" a un élément "locations" dont "kind" (le type) est "home" et un élément "locations" dont "city" (la ville) est "paris", même si ce sont des éléments différents.
Si vous souhaitez obtenir uniquement les entités dont les arguments correspondants sont dans le même élément de collection, vous devez relier des arguments. Pour lier des arguments de requête :
A l'aide des entités ci-dessus, si vous écrivez :
ds.People.query("places.locations[a].kind= :1 and places.locations[a].city= :2";"home";"paris")
... la requête ne retournera uniquement "martin" car il possède un élément "locations" dont "kind" (le type) est "home" et dont "city" (la ville) est "paris". La requête ne retournera pas "smith" car les valeurs "home" et "paris" ne sont pas contenus dans le même élément de collection.
Dans le paramètre params, vous pouvez passer un objet contenant des options supplémentaires. Vous pouvez utiliser les propriétés suivantes :
Property | Type | Description | ||||||
parameters | Objet | Placeholders nommés pour les valeurs utilisées dans in the chaîneRecherche. Les valeurs sont exprimées sous forme de paires propriété / valeur, où propriété est le nom du placeholder inséré pour une valeur, dans la chaîneRecherche (":placeholder") et où valeur correspond à la valeur à comparer. Vous pouvez combiner, dans la même recherche, les valeurs des placeholders indexés (valeurs passées directement dans les paramètres valeur) et les valeurs des placeholders nommés. | ||||||
attributes | Objet | Placeholders nommés pour les chemins d'attribut utilisés dans used in the chaîneRecherche. Les attributs sont exprimés sous forme de paires propriété / valeur, où propriété est le nom du placeholder inséré pour un chemin d'attribut dans la chaîneRecherche (":placeholder") et où valeur peut être une chaine ou une collection de chaines. Chaque valeur correspond à un chemin qui peut être désigné soit par un attribut scalaire ou relatif de la dataclass soit par une propriété d'un champ objet de la dataclass
| ||||||
context | Texte | Nom du contexte d'optimisation automatique appliqué à la sélection d'entités. Ce contexte sera utilisé par le code qui gère la sélection d'entités afin de bénéficier de l'optimisation. Cette fonctionnalité est conçue pour le traitement client/serveur ; pour plus d'informations, veuillez vous reporter à la section Optimisation client/serveur . | ||||||
queryPlan | Booléen | Dans la sélection d'entités résultante, retourne ou ne retourne la description détaillée de la recherche juste avant d'être exécutée, i.e. la recherche programmée. La propriété retournée est un objet qui inclut chaque recherche et sous-recherche programmée (dans le cas d'une recherche complexe). Cette option est utile durant la phase de développement d'une application. Elle est utilisée conjointement à queryPath. Par défaut, si elle est omise : faux. Note : Cette propriété est prise en charge uniquement par les méthodes entitySelection.query( ) et dataClass.query( ). | ||||||
queryPath | Booléen | Dans la sélection d'entités résultante, retourne ou ne retourne pas la description détaillée de la recherche telle qu'elle est effectuée. La propriété retournée est un objet qui contient le chemin utilisé pour la recherche (généralement identique à celui de queryPlan, mais il peut être différent si le moteur parvient à optimiser la recherche), l'heure du traitement et le nombre d'enregistrements trouvés. Cette option est utile durant la phase de développement d'une application. Par défaut, si elle est omise : faux. Note : Cette propriété est prise en charge uniquement par les méthodes entitySelection.query( ) et dataClass.query( ). |
A propos du queryPlan et du queryPath
Les informations enregistrées dans le queryPlan et le queryPath incluent le type de recherche (indexée ou séquentielle), chaque sous-recherche nécessaire, ainsi que les opérateurs de conjonction. Le queryPath contient également le nombre d'entités trouvées et le temps nécessaire à l'exécution de chaque critère de recherche. Il vous sera utile d'analyser ces informations lors du développement de vos applications. Généralement, les descriptions du plan et du chemin de recherche sont identiques mais elles peuvent différer car 4D peut mettre en oeuvre des optimisations dynamiques lors de l'exécution de la recherche, afin d'améliorer les performances. Par exemple, le moteur de recherche de 4D peut convertir dynamiquement une recherche indexée en recherche séquentielle s'il estime qu'elle s'exécutera plus rapidement. Ce cas particulier peut se produire lorsque le nombre d'entités parmi lesquelles la recherche est effectuée est limité.
Par exemple, si vous exécutez la recherche suivante :
$sel:=ds.Employee.query("salary < :1 and employer.name = :2 or employer.revenues > :3";50000;"Lima West Kilo";10000000;Creer objet("queryPath";Vrai;"queryPlan";Vrai))
queryPlan:
{Or:[{And:[{item:[index : Employee.salary ] < 50000},{item:Join on Table : Company : Employee.employerID = Company.ID,subquery:[{item:[index : Company.name ] = Lima West Kilo}]}]},{item:Join on Table : Company : Employee.employerID = Company.ID,subquery:[{item:[index : Company.revenues ] > 10000000}]}]}
queryPath:
{steps:[{description:OR,time:63,recordsfounds:1388132,steps:[{description:AND,time:32,recordsfounds:131,steps:[{description:[index : Employee.salary ] < 50000,time:16,recordsfounds:728260},{description:Join on Table : Company : Employee.employerID = Company.ID,time:0,recordsfounds:131,steps:[{steps:[{description:[index : Company.name ] = Lima West Kilo,time:0,recordsfounds:1}]}]}]},{description:Join on Table : Company : Employee.employerID = Company.ID,time:31,recordsfounds:1388132,steps:[{steps:[{description:[index : Company.revenues ] > 10000000,time:0,recordsfounds:933}]}]}]}]}
Cette section fournit divers exemples de recherches.
Recherche dans une chaîne :
$entitySelection:=ds.Customer.query("firstName = 'S@'")
Recherche avec une instruction NOT :
$entitySelection:=ds.Employee.query("not(firstName=Kim)")
Recherche avec des dates :
$entitySelection:=ds.Employee.query("birthDate > :1";"1970-01-01")
$entitySelection:=ds.Employee.query("birthDate <= :1";Current date-10950)
Recherche avec des placeholders indexés pour les valeurs :
$entitySelection:=ds.Customer.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@")
Recherche avec des placeholders indexés pour les valeurs sur une dataClass liée :
$entitySelection:=ds.Employee.query("lastName = :1 and manager.lastName = :2";"M@";"S@")
Recherche avec des placeholders nommés pour les valeurs :
C_OBJET($querySettings;$managedCustomers)
$querySettings:=Creer objet
$querySettings.parameters:=Creer objet("userId";1234;"extraInfo";Creer objet("name";"Smith"))
$managedCustomers:=ds.Customer.query("salesperson.userId = :userId and name = :extraInfo.name";$querySettings)
Recherche utilisant les placeholders nommés et indexés pour les valeurs :
C_OBJET($querySettings;$managedCustomers)
$querySettings:=Creer objet
$querySettings.parameters:=Creer objet("userId";1234)
$managedCustomers:=ds.Customer.query("salesperson.userId = :userId and name=:1";"Smith";$querySettings)
Recherche avec objets queryPlan et queryPath :
$entitySelection:=ds.Employee.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@";Creer objet("queryPlan";Vrai;"queryPath";Vrai))</p><p> //vous pouvez ensuite récupérer ces propriétés dans la sélection d'entités résultante :
C_OBJET($queryPlan;$queryPath)
$queryPlan:=$entitySelection.queryPlan
$queryPath:=$entitySelection.queryPath
Recherche avec un chemin d'attribut de type Collection :
$entitySelection:=ds.Employee.query("extraInfo.hobbies[].name = :1";"horsebackriding")
Recherche avec un chemin d'attribut de type Collection et des attributs reliés :
$entitySelection:=ds.Employee.query("extraInfo.hobbies[a].name = :1 and extraInfo.hobbies[a].level=:2";"horsebackriding";2)
Recherche avec un chemin d'attribut de type Collection et plusieurs attributs reliés :
$entitySelection:=ds.Employee.query("extraInfo.hobbies[a].name = :1 and extraInfo.hobbies[a].level = :2 and extraInfo.hobbies[b].name = :3 and extraInfo.hobbies[b].level = :4";"horsebackriding";2;"Tennis";5)
Recherche avec un chemin d'attribut de type Objet :
$entitySelection:=ds.Employee.query("extra.eyeColor = :1";"blue")
Recherche avec instruction IN :
$entitySelection:=ds.Employee.query("firstName in :1";Creer collection("Kim";"Dixie"))
Recherche avec instruction NOT (IN) :
$entitySelection:=ds.Employee.query("not (firstName in :1)";Creer collection("John";"Jane"))
Recherche avec des placeholders indexés pour les attributs :
C_OBJET($es)
$es:=ds.Employee.query(":1 = 1234 and :2 = 'Smith'";"salesperson.userId";"name")
//salesperson est une entité liée
Recherche avec des placeholders indexés pour les attributs et avec des placeholders nommés pour les valeurs :
C_OBJET($es;$querySettings)
$querySettings:=Creer objet
$querySettings.parameters:=Creer objet("customerName";"Smith")
$es:=ds.Customer.query(":1 = 1234 and :2 = :customerName";"salesperson.userId";"name";$querySettings)
//salesperson est une entité liée
Recherche avec des placeholders indexés pour les attributs et les valeurs :
C_OBJET($es)
$es:=ds.Clients.query(":1 = 1234 and :2 = :3";"salesperson.userId";"name";"Smith")
//salesperson est une entité liée
Cette section illustre les recherches avec des placeholders nommés pour les attributs.
Considérons une dataclass Employee avec 2 entités :
Recherche avec des placeholders nommés pour les attributs :
C_OBJET($querySettings;$es)
$querySettings:=Creer objet
$querySettings.attributes:=Creer objet("attName";"name";"attWord";Creer collection("softwares";"Word 10.2"))
$es:=ds.Employee.query(":attName = 'Marie' and :attWord = 'Installed'";$querySettings)
//$es.length=1 (Employee Marie)
Recherche avec des placeholders nommés pour les attributs et les valeurs :
C_OBJET($es;$queySettings)
C_TEXTE($name)
$querySettings:=Creer objet
//Placeholders nommés pour les valeurs
//Il est demandé à l'utilisateur de saisir un nom
$name:=CHERCHER("Veuillez saisir le nom à rechercher:")
Si(OK=1)
$querySettings.parameters:=Creer objet("givenName";$name)
//Placeholders nommés pour les chemins d'attributs
$querySettings.attributes:=Creer objet("attName";"name")
$es:=ds.Employee.query(":attName= :givenName";$querySettings)
Fin de si
These examples illustrate the various ways to use formulas with or without parameters in your queries.
The formula is given as text with eval() in the queryString parameter:
C_OBJECT($es)
$es:=ds.Students.query("eval(length(This.lastname) >=30) and nationality='French'")
The formula is given as a Formula object through a placeholder:
C_OBJECT($es;$formula)
$formula:=Formula(Length(This.lastname)>=30)
$es:=ds.Students.query(":1 and nationality='French'";$formula)
Only a Formula object is given as criteria:
C_OBJECT($es;$formula)
$formula:=Formula(Length(This.lastname)>=30)
$es:=ds.Students.query($formula)
Several formulas can be applied:
C_OBJECT($formula1;$1;$formula2;$0)
$formula1:=$1
$formula2:=Formula(Length(This.firstname)>=30)
$0:=ds.Students.query(":1 and :2 and nationality='French'";$formula1;$formula2)
A text formula in queryString receives a parameter:
C_OBJECT($es;$settings)
$settings:=New object()
$settings.args:=New object("filter";"-")
$es:=ds.Students.query("eval(checkName($1.filter)) and nationality=:1";"French";$settings)
//checkName method:
C_TEXT($1;$exclude)
$exclude:=$1
$0:=(Position($exclude;This.lastname)=0)
Using the same checkName method, a Formula object as placeholder receives a parameter:
C_OBJECT($es;$settings;$formula)
$formula:=Formula(checkName($1.filter))
$settings:=New object()
$settings.args:=New object("filter";"-")
$es:=ds.Students.query(":1 and nationality=:2";$formula;"French";$settings)
$settings.args.filter:="*" // change the parameters without updating the $formula object
$es:=ds.Students.query(":1 and nationality=:2";$formula;"French";$settings)
We want to disallow formulas, for example when the user enters their query:
C_OBJECT($es;$settings)
C_TEXT($queryString)
$queryString:=Request("Enter your query:")
if(OK=1)
$settings:=New object("allowFormulas";False)
$es:=ds.Students.query($queryString;$settings) //An error is raised if $queryString contains a formula
End if
4D Blog - Add values to your generic orda queries
4D Blog - Placeholders for attribute paths in ORDA queries
CHERCHER
collection.query( )
dataClass.all( )
dataClass.newSelection( )
DECRIRE EXECUTION RECHERCHE
entitySelection.query( )
entitySelection.queryPath
entitySelection.queryPlan
FIXER DESTINATION RECHERCHE
LIRE DESTINATION RECHERCHE
Produit : 4D
Thème : ORDA - DataClass
Nom intl. : dataClass.query( )
Créé : 4D v17
Modifié : 4D v17 R5
Modifié : 4D v17 R6
4D - Langage ( 4D v19)
4D - Langage ( 4D v19.1)
4D - Langage ( 4D v19.4)
4D - Langage ( 4D v19.5)
4D - Langage ( 4D v19.6)
4D - Langage ( 4D v19.7)
4D - Langage ( 4D v19.8)