4D v17.4dataClass.query( ) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v17.4
dataClass.query( )
|
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 |
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')"
Vous devez utiliser un ou plusieurs paramètre(s) valeur lorsque la recherche est construite à l'aide de placeholders. Les placeholders sont des marqueurs que vous insérez dans les chaînes de recherche et qui sont remplacés par une autre valeur au moment où la chaîne est évaluée. Vous pouvez utiliser jusqu'à 128 paramètres valeur.
Note : Les valeurs des placeholders peuvent également être passées sous forme de collection dans la propriété parameters du paramètre optionnel params (recherches avec entitySelection et dataClass uniquement). Pour plus d'informations, veuillez vous référer au paragraphe Paramètre params ci-dessous.
Dans chaîneRecherche, insérez :paramIndex pour chaque placeholder (ce qui signifie "utilise le paramètre paramIndex de la recherche comme valeur à comparer") puis passez la ou les valeur(s) requise(s) dans le ou les paramètre(s) valeur. Par exemple, pour rechercher les employés qui habitent Chicago et qui gagnent moins de $10 000, vous pouvez écrire :
"employee.city = :1 & employee.salary < :2"; "Chicago";10000
La valeur est évaluée une fois au début de la recherche ; elle n'est pas évaluée pour chaque élément.
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
Note : Ce paramètre est pris en charge uniquement par les méthodes entitySelection.query( ) et dataClass.query( ).
Dans le paramètre params, vous pouvez passer un objet contenant des options supplémentaires. Vous pouvez utiliser les propriétés suivantes :
Propriété | Type | Description |
parameters | Collection | Valeurs à comparer lorsque vous utilisez des placeholders dans la chaîneRecherche (autre moyen de passer des valeurs aux placeholders). Si des valeurs ont également été passées directement via les paramètres valeur, celles de parameters sont ajoutées à la séquence de placeholders. |
queryPlan | Booléen | Dans la sélection d'entités résultante, retourne ou non la description détaillée de la recherche juste avant son exécution, i.e. le plan de la recherche. La valeur de propriété retournée est un objet qui inclut le plan de chaque requête et sous-requête (dans le cas d'une recherche complexe). Cette option est utile durant la phase de mise au point d'une application. Elle est généralement utilisée conjointement à queryPath. Valeur par défaut si omis : faux |
queryPath | Booléen | Dans la sélection d'entités résultante, retourne ou non la description détaillée de la recherche telle qu'elle a réellement été exécutée. La valeur de propriété retournée est un objet qui inclut le chemin réel utilisé pour la recherche (généralement identique à celui du queryPlan, mais peut différer si le moteur a effectué une optimisation de la recherche), ainsi que la durée de traitement et le nombre d'entités trouvées. Cette option est utile durant la phase de mise au point d'une application. Valeur par défaut si omis : faux |
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}]}]}]}]}
Voici divers exemples de recherches valides.
Recherche standard avec placeholders :
$entitySelection:=dataClass.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@")
Recherche standard sans placeholders :
$entitySelection :=dataClass.query("firstName = 'S@'")
Recherche avec une dataClass liée :
$entitySelection:=dataClass.query("lastName = :1 and manager.lastName = :2";"M@";"S@")
Recherche avec objets queryPlan et queryPath :
$entitySelection:=dataClass.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@";Creer objet("queryPlan";Vrai;"queryPath";Vrai))
//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 placeholders et des valeurs passées dans une collection :
$params:=Creer objet
$params.parameters:=Creer collection("D@";"R@";"S@";"K@")
$entitySelection:=dataClass.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";$params)
Recherche avec instruction NOT :
$entitySelection:=dataClass.query("not(firstName=Kim)")
Recherche avec un chemin d'attribut de type Collection :
$entitySelection:=dataClass.query("additionalInfo.hobbies[].name = horsebackriding")
Recherche avec un chemin d'attribut de type Objet :
$entitySelection:=ds.Employee.query("extra.eyeColor = :1";"blue")
Recherche avec instruction IN :
$entitySelection:=dataClass.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"))
Recherches avec une date :
$entitySelection:=dataClass.query("birthDate > :1";"1970-01-01")
$entitySelection:=dataClass.query("birthDate <= :1";Date du jour-10950)
collection.query( )
dataClass.all( )
dataClass.newSelection( )
entitySelection.query( )
entitySelection.queryPath
entitySelection.queryPlan
Produit : 4D
Thème : ORDA - DataClass
Nom intl. : dataClass.query( )
4D - Langage ( 4D v17)
4D - Langage ( 4D v17.1)
4D - Langage ( 4D v17.2)
4D - Langage ( 4D v17.3)
4D - Langage ( 4D v17.4)