ADF : parcourir les enregistrements d'une ViewObject master-detail (IIème méthodologie avec le ViewLinkAccessor)

Lors d’un article précédent, nous avions abordé le même use case (parcours d’un ensemble d’enregistrements d’une vue maître-détail au niveau du ViewControllerProject) en utilisant la built-in method ADF SetCurrentRowWithKey, ADF : parcourir les enregistrements d’une ViewObject master-detail (Ière méthodogie avec SetCurrentRowWithKey.
Cette fois-ci, nous allons utiliser le ViewLinkAccessor (généré lors de la création du ViewLink) existant entre la vue master-detail.

Le point de départ et les méthodes utilitaires utilisées seront les mêmes.

Implémentation du parcours des enregistrements

Cette première partie de la méthode sert à parcourir les enregistrements de la vue maître.

/**
* Permet de parcourir les enregistrements d'une vue maitre-detail.
*/
public String iterateOverMasterDetailRecords() {
// Iterateur de la table maitre
DCIteratorBinding masterViewIt = ADFUtils.findIterator("masterViewIterator");
// RowSetIt de la vue maitre : on utilise un RowSetIterator secondaire pour que le
// traitement n'influence pas l'affichage de la page
RowSetIterator masterViewRowSetIt = masterViewIt.getViewObject().createRowSetIterator(null);
// On se positionne sur le slot avant la premiere ligne
masterViewRowSetIt.reset();
// Ligne en cours de la vue maitre
Row masterCurrentRow = null;
// Ligne en cours de la vue details
Row detailsCurrentRow = null;
// Parcours de la vue maitre
while (masterViewRowSetIt.hasNext()) {
masterViewRowSetIt.next();
// Recuperation de la ligne en cours de la vue maitre
masterCurrentRow = masterViewRowSetIt.getCurrentRow();
// Ici votre code pour travailler sur la vue maitre
// Par exemple, on peut recuperer un attribut de la masterView
Object masterAttribute = masterCurrentRow.getAttribute("monMasterAttribut");

Ci-dessous, le point central du fonctionnement de cette autre méthode, on récupére les enregistrements de la vue détails en passant par l’attribut ViewLinkAccessor de la ligne en cours.

// On recupere le RowSetIterator de la vue details par l'intermediaire du ViewLinkAccessor
RowSetIterator detailsViewRowSetIt = (RowSetIterator)masterCurrentRow.
getAttribute("ViewLinkAccessorName");
detailsViewRowSetIt.reset();
De la même façon que pour la vue maître, on peut alors parcourir les enregistrements
de la vue détails pour la ligne maître en cours.
// Parcours de la vue details
while (detailsViewRowSetIt.hasNext()) {
detailsViewRowSetIt.next();
// Recuperation de la ligne en cours de la vue details
detailsCurrentRow = detailsViewRowSetIt.getCurrentRow();
// Ici votre code pour travailler sur la vue details
// Par exemple, on peut recuperer un attribut de la detailsView
Object detailsAttribute = detailsCurrentRow.getAttribute("monDetailsAttribut");
}
}
}

Conclusion

Les 2 méthodologies sont très proches l’une de l’autre et ne doivent pas avoir de grandes différences au niveau des performances.
Ma préférence irait plutôt à l’utilisation de la 2ème méthodologie du fait d’une plus grande simplicité d’utilisation (simple manipulation d’un attribut d’un ViewObject).
En tout état de cause, il est toujours bon de connaître plusieurs méthodologies; l’une ou l’autre pouvant mieux répondre à certains use cases rencontrés.