Placeholders pour les chemins d’accès aux attributs dans les requêtes ORDA

Traduit automatiquement de Deepl

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

HDI : Exemple de caractères de remplacement pour les chemins d’accès aux attributs dans les requêtes ORDA.

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 !

Avatar
- Product Owner - Marie-Sophie Landrieu-Yvert a rejoint l'équipe de 4D Product en tant que Product Owner en 2017. En tant que Product Owner, elle est en charge de rédiger les user stories puis de les traduire en spécifications fonctionnelles. Son rôle est également de s'assurer que l'implémentation de la fonctionnalité livrée répond au besoin du client.Marie-Sophie est diplômée de l'école d'ingénieur ESIGELEC et a commencé sa carrière en tant qu'ingénieur chez IBM en 1995. Elle a participé à divers projets (projets de maintenance ou de construction) et a travaillé en tant que développeur Cobol. Elle a ensuite travaillé en tant que concepteur UML et développeur Java. Dernièrement, ses principaux rôles étaient d'analyser et de rédiger des exigences fonctionnelles, de coordonner les équipes commerciales et de développement.