Leschamps d’objets, introduits avec 4D v15, permettent de stocker et d’indexer des données non structurées. Il peut s’agir d’un ensemble de données communes, comme le prénom, le nom de famille, la date de naissance. Il peut s’agir de données différentes dans chaque enregistrement, comme un magasin qui aura besoin de différents attributs pour les chaussures (taille, couleur), les ordinateurs (CPU, mémoire), les imprimantes (couleur, encre), une liste de valeurs ou toutes les combinaisons possibles.
Voici une User Story réelle d’un client 4D :
« Mon application de badges gère les droits d’accès de chaque personne à un bâtiment et pour un créneau horaire. Ces informations sont stockées dans une base de données sous la forme d’un tableau d’objets ( par exemple : {droit d’accès, bâtiment, plage horaire} ). Je veux pouvoir rechercher les personnes qui ont accès à un bâtiment pendant un créneau horaire ».
4D fournit plusieurs façons d’interroger les données, en utilisant l’index et donc extrêmement rapide.
4D v16 R2 améliorera encore cet ensemble de fonctionnalités, en permettant des requêtes encore plus complexes à l’intérieur d’une liste d’éléments dans un seul objet. Lorsque vous effectuez une recherche dans les attributs d’un tableau avec plusieurs arguments de requête joints par l’opérateur AND, vous pouvez choisir d’obtenir les enregistrements pour lesquels
- les arguments correspondants se trouvent dans au moins un élément
- les arguments correspondants se trouvent dans le même élément (nouveau).
Exemple
Prenons un exemple avec les deux enregistrements suivants :
{ "name":"martin", "locations": [ { "kind":"home", "city":"paris" } ] } , { "name":"smith", "locations": [ { "kind":"home", "city":"lyon" }, { "kind":"office", "city":"paris" } ] }
Vous voulez trouver les personnes dont le type de localisation « domicile » se trouve dans la ville de « paris ».
Les arguments correspondants sont dans au moins un élément
Si vous écrivez
QUERY BY ATTRIBUTE([People] ;[People]OB_Field ; "locations[].kind";= ; "home";*)
QUERY BY ATTRIBUTE([People] ; & ;[People]OB_Field ; "locations[].city";= ; "paris")
La requête renvoie « martin« et « smith« parce que « smith« a un élément « locations » dont le « kind« est« home« et dont la « city« est « paris« , même s’il ne s’agit pas du même élément.
Les arguments correspondants sont dans le même élément
Si vous écrivez :
QUERY BY ATTRIBUTE([People] ;[People]OB_Field ; "locations[a].kind";= ; "home";*)
QUERY BY ATTRIBUTE([People] ; & ;[People]OB_Field ; "locations[a].city";= ; "paris")
La requête renvoie « martin« car il possède un élément « locations« dont le « kind« est « home« et dont la « city« est « paris« . La requête ne renvoie pas « smith« parce que les valeurs « home« et « paris« ne sont pas dans le même élément du tableau.
Si vous souhaitez obtenir uniquement les enregistrements pour lesquels les arguments correspondants se trouvent dans le même élément, vous devez utiliser des arguments liés. Pour lier les arguments d’une requête, ajoutez une lettre entre les [ ] 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. Pour ajouter différents critères liés dans la même requête, utilisez une autre lettre. Vous pouvez télécharger la base de données d’exemple suivante pour voir plus d’exemples.
Vous pouvez également vous référer à la documentation de 4D v16 R2 pour plus de détails :