Les fonctionnalités d’ORDA continuent d’arriver avec 4D v17 R5 ! Dans un précédent billet de blog, nous vous avons montré comment créer des requêtes génériques avec des caractères de remplacement nommés pour les valeurs. Ce billet se concentre sur l’utilisation des caractères de remplacement pour les chemins d’accès aux attributs (noms de champs dans les tables).
Deux types de placeholders sont disponibles :
Les caractères de remplacement indexés
Examinons un exemple d’utilisation de caractères de remplacement indexés pour les chemins d’accès aux attributs. Nous voulons trouver les clients dont le nom commence par « Bravo » et dont le champ de commentaire contient « Nouveau client » :
C_OBJECT($clients)
$clients :=ds.Clients.query(":1 = 'Bravo@' et :2 = 'Nouveau client'" ; "nom" ; "commentaire")
Les caractères de remplacement sont insérés en tant que :paramIndex(par exemple, :1, :2, … avec un incrément de 1) dans la chaîne de requête. Leurs valeurs correspondantes sont fournies par la séquence de paramètres de valeur.
caractères de remplacement nommés
Vous pouvez également utiliser des placeholders nommés. Ils utilisent le même concept que les caractères de remplacement nommés pour les valeurs. Les paramètres sont insérés sous la forme :paramName et leurs valeurs sont fournies dans la chaîne de requête :
C_OBJECT($clients;$settings)
$settings :=New object
$settings .attributes:=New object("pathOfName" ; "name" ; "pathOfComment" ; "comment")
$clients :=ds.Clients.query(":pathOfName = 'Bravo@' et :pathOfComment = 'New client'" ;$settings)
Pourquoi utiliser des caractères de remplacement ?
Examinons le champ licencesInfo champ objet. Il indique le nombre de licences dans un style licenceName:number.
{"licencesInfo" :
{"4DDevPro":10, //This client has 10 4DDevPro licences
"4DServerV17_2":18,
"4DWebappserverV17_2":23}
}
Pour trouver le nombre de licences « 4DDevPro », vous pouvez écrire cette requête :
C_OBJECT($clients)
$clients :=ds.Clients.query("licencesInfo.4DDevPro >=0")
Mais regardons maintenant ce licencesInfo champ objet. Vous pouvez voir que l’utilisation de caractères de remplacement pour les chemins d’accès aux attributs peut être particulièrement utile pour interroger un objet dont les noms de propriété ne sont pas conformes à la notation par points:
{"licencesInfo" :
{"4D Dev. Pro":10, //This client has 10 4D Dev. Pro licences
"4D Server V17.2":18,
"4D Web app/server V17.2":23}
}
Dans ce cas particulier, le fait de fournir les paramètres sous la forme d’une collection de chaînes de caractères résout le problème car la requête les interprétera comme un chemin d’accès aux attributs.
C_OBJECT($clients)
$clients :=ds.Clients.query(":1 >=0" ;New collection("licensesInfo" ; "4D Dev. Pro"))
Ce n’est pas le seul avantage de l’utilisation de caractères de remplacement. Il y a également un aspect de sécurité accrue, puisque l’utilisation de placeholders empêche l’insertion de code malveillant. Il n’est pas non plus nécessaire de s’inquiéter des problèmes de formatage ou de caractères. Et la liste est longue…
Les exemples ci-dessus concernent l’interrogation d’une dataClass, mais si vous consultez la documentation, vous verrez qu’elle est également applicable aux collections. Vous découvrirez également d’autres exemples montrant pourquoi l’utilisation de caractères de remplacement est une bonne idée !