Vous êtes sur le site Web historique de la documentation de 4D. Les documentations sont progressivement déplacées vers developer.4d.com

Accueil

 
4D v19.8
dataClass.query( )

dataClass.query( ) 


 

dataClass.query ( chaîneRecherche | formule {; valeur}{; valeur2 ; ... ; valeurN}{; params}) -> Résultat 
Paramètre Type   Description
chaîneRecherche | formule  Texte, Objet in Critère de recherche comme chaîne ou objet formule
valeur  Varié in Valeur(s) à utiliser pour le(s) placeholder(s) indexés
params  Objet in Options de recherche : parameters, attributes, args, allowFormulas, context, queryPath, queryPlan
Résultat  EntitySelection in 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ù :

  • cheminAttribut : Chemin de l'attribut sur lequel vous souhaitez exécuter la recherche. Ce paramètre peut contenir un nom simple (par exemple "pays") ou un chemin d'attribut valide (par exemple "pays.nom"). Dans le cas d'un chemin d'attribut de type Collection, la notation [ ] est utilisée pour gérer toutes les occurrences (par exemple "enfants[ ].age"). Vous pouvez également utiliser un texte d'exemple (ou placeholder) (voir ce-dessous)..

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).

  • formule : Une formule valide (voir [#title id="70699"/]) passée Texte dans ou Objet. La formule sera évaluée pour chaque entité traitée(*) et doit retourner une valeur booléenne. Dans la formule, l'entité est disponible via l'objet This.
      • Texte : la chaine de formule doit être précédée de la déclaration eval(), afin que l'analyseur de requêtes évalue l'expression correctement.
        Par exemple :
         "eval(length(This.lastname) >=30)"

      • Objet : l'objet formule est passé comme un placeholder (voir ci-dessous). La formule doit avoir été créée à l'aide des commandes Formule ou Formule sur chaine

    (*) 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

  • comparateur : symbole d'opérateur utilisé pour comparer cheminAttribut et valeur. Les symboles suivants sont pris en charge :
    ComparaisonSymbole(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.
    ===, ISRetourne 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 NOTConsidère le @ comme un caractère standard
    Inférieur à<
    Supérieur à>
    Inférieur ou égal à<=
    Supérieur ou égal à>=
    Inclus parmiINRetourne 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 assertionNOTLes 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
  • valeur : valeur à comparer à la valeur courante de la propriété (attribut) de chaque entité de la sélection ou élément de la collection. Peut être tout texte d'exemple (placeholder) (voir Paramètre valeur (et placeholders) ci-dessous) ou toute expression correspondant à la propriété du type de donnée.
    Lorsque vous utilisez une valeur constante, les règles suivantes doivent être respectées :
    • Les valeurs constantes de type texte peuvent être passées avec ou sans apostrophes (voir Utilisation des guillemets/apostrophes ci-dessous). Pour rechercher une chaîne dans une chaîne (recherche de type "contient"), utilisez le symbole joker (@) dans valeur pour isoler la chaîne à chercher, comme dans cet exemple : "@Smith@". Les mots-clés suivants sont proscrits pour des constantes de type texte : truefalse.
    • Les valeurs constantes de type booléen : true ou false (sensible à la casse).
    • Les valeurs constantes de type numérique : les décimales doivent être séparées par un '.' (point). 
    • Les valeurs constantes de type date : format "AAAA-MM-JJ"
    • Les constantes null : en utilisant le mot-clé "null", la recherche trouvera les propriétés ayant la valeur null et indéfinie.
    • Dans le cas d'une recherche avec un comparateur IN, valeur doit être une collection, ou des valeurs du même type que les données du chemin d'attribut, fournies entre [ ] et séparées par des virgules (pour les chaînes, les caractères " doivent être échappés avec des "\").
  • opérateurLogique : utilisé pour relier des conditions multiples dans la recherche (optionnel). Vous pouvez utiliser un des opérateurs logiques suivants (le nom ou le symbole peut être passé) :
    ConjonctionSymbole(s)
    AND&, &&, and
    OR|, ||, or


  • trier par cheminAttribut : vous pouvez inclure une déclaration trier par cheminAttribut dans la requête afin que les données résultantes soient triées selon cette déclaration. Vous pouvez utiliser plusieurs tris par déclaration, en les séparant par des virgules (ex : trier par cheminAttribut1 desc, cheminAttribut2 asc). Par défaut, l'ordre est croissant. Par défaut, le tri est par ordre croissant. Passez 'desc' pour définir un tri par ordre décroissant et 'asc' pour définir un tri par ordre croissant. 
    Note : Si vous utilisez cette déclaration, la sélection d'entité retournée est ordonnée (pour plus d'informations, veuillez consulter Sélections d'entités triées vs Sélections d'entités non-triées).  

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 :

  • la formule est évaluée pour chaque entité et doit renvoyer vrai ou faux. Lors de l'exécution de la requête, si le résultat de la formule n'est pas un booléen, il est considéré comme faux.
  • dans la formule, l'entité est disponible via l'objet This.  
  • Si l'objet formule est null, l'erreur 1626 ("Attente d'un texte ou d'une formule") est générée, ce qui signifie que vous pouvez intercepter à l'aide d'une méthode installée avec APPELER SUR ERREUR.

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 :

  • Les paramètres doivent être passés via la propriété args (objet) du paramètre params.
  • La formule reçoit cet objet args en tant que paramètre $1.

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ésPlaceholders nommés
DéfinitionLes 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 valeurLes 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") 
 $o.parameters:=Creer objet("name";"Chicago") 
 $r:=class.query(":att=:name";$o)

Vous pouvez combiner tous les types d'arguments dans chaîneRecherche. Une chaîneRecherche peut contenir, en termes de paramètres cheminAttribut et valeur : 

  • des valeurs directes (pas de placeholders)
  • des placeholders indexés et.ou nommés

Utiliser des placeholders dans les recherches est recommandé pour deux raisons :

  1. Cela empêche l'injection de code malveillant : si vous utilisez dans la chaîne de recherche des variables dont le contenu provient directement de la saisie de l'utilisateur, celui-ci pourrait modifier les conditions de recherche en saisissant des arguments de recherche supplémentaires. Par exemple, imaginez une chaîne de recherche du type :
     $vquery:="statut = 'public' & nom = "+myname //l'utilisateur saisit son nom
     $result:=$col.query($vquery)

    Cette recherche semble sécurisée puisque les données non publiques sont filtrées. Cependant, si l'utilisateur saisit dans la zone myname : "smith OR status='private', la chaîne de recherche sera modifiée à l'étape de l'interprétation et pourra retourner des données privées.
    Lorsque vous utilisez des placeholders, le contournement des options de sécurité n'est pas possible :
     $result:=$col.query("statut='public' & nom=:1";myname)

    Dans ce cas, si l'utilisateur saisit smith OR status='private' dans la zone myname, cela ne sera pas interprété dans la chaîne de recherche, mais uniquement passé en tant que valeur. La recherche d'une personne nommée "smith OR status='private"' échouera simplement.
  2. Cela résout les questions liées au formatage des valeurs ou des caractères, notamment lorsque vous gérez les paramètres cheminAttribut et valeur qui peuvent continir des caractères qui ne sont pas alphanumériqus tels que ".", "["...
  3. Cela permet l'utilisation de variables ou d'expressions dans les arguments de recherche. Par exemple :
     $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

Vous n'obtiendrez pas le résultat souhaité car la valeur null sera évaluée par 4D comme une erreur résultant de l'évaluation du paramètre (pouvant être, par exemple, un attribut provenant d'une autre recherche). Pour ce type de recherches, vous devez utiliser la syntaxe de recherche directe :
 $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 :

  • Ajoutez une lettre entre le caractère [] dans le premier chemin à lier et répétez la même lettre dans tous les arguments liés. Par exemple: locations[a].city et locations[a].kind. Vous pouvez utiliser n'importe quelle lettre de l'alphabet latin (non sensible à la casse).
  • TPour ajouter différents critères liés dans la même requête, utilisez une autre lettre. Vous pouvez créer jusqu'à 26 combinaisons de critères dans une seule 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 :

PropertyTypeDescription
parametersObjetPlaceholders 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.
attributesObjetPlaceholders 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
TypeDescription
StringcheminAttribut exprimé à l'aide de la notation par point, ex : "name" ou "user.address.zipCode"
Collection de chaînesChaque chaine de la collection représente un niveau de cheminAttribut, ex : ["name"] ou ["user","address","zipCode"]. L'utilisation d'une collection permet de rechercher des attributs dont les noms ne sont pas conformes à la notation, ex : ["4Dv17.1","en/fr"]
Vous pouvez combiner les valeurs des placeholders indexés (valeurs passées directement dans les paramètres valeur) et les valeurs des placeholders nommés dans la même recherche.
contextTexteNom 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 .
queryPlanBooléenDans 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( ).
queryPathBooléenDans 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 :

  • Entity 1:
    name: "Marie"
    number: 46
    softwares:{
    "Word 10.2": "Installé",
    "Excel 11.3": "A mettre à jour",
    "Powerpoint 12.4": "Pas installé"
    }
  • Entity 2
    name: "Sophie"
    number: 47
    softwares:{
    "Word 10.2": "Pas installé",
    "Excel 11.3": "A mettre à jour",
    "Powerpoint 12.4": "Pas installé" 
    }

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



Voir aussi  

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

 
PROPRIÉTÉS 

Produit : 4D
Thème : ORDA - DataClass
Nom intl. : dataClass.query( )

Cette commande modifie la variable système Error

 
PAGE CONTENTS 
 
HISTORIQUE 

Créé : 4D v17
Modifié : 4D v17 R5
Modifié : 4D v17 R6

 
UTILISATION DE L'ARTICLE

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)