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.