ADF : contournement des problèmes de fonctionnement de la propriété enabled des boutons de transaction

Dans le cadre de mises à jour de données en base, vous utilisez sûrement la propriété enabled des boutons de transaction Commit ou Rollback qui permet de gérer aisément leur disponibilité à l’utilisateur (enabled = true si détection d’une transaction en cours, false sinon).

  <af:commandButton actionListener="#{viewScope.backing_util.onValid}"
                       text="Valider"
                       disabled="#{!bindings.Commit.enabled}"
                       id="validCb" partialTriggers="soc1 it1" />

Dans le cas de pages de mise à jour de données un peu complexes, il peut arriver que cette propriété ne fonctionne pas correctement.

Pour garder l’aspect fonctionnel de enabled qui ne donne la main que quand il y a besoin de valider ou invalider la sauvegarde de données modifiées, voici une fonction codée dans un managedBean qui permet de conserver le même fonctionnement et qui arrive à gérer ces cas complexes.

 /**
   * Predicat permettant de savoir si la transaction en cours contient des donnees non
   * sauvees.
   */
  private boolean transactionDirty;
  /**
   * Predicat permettant de savoir si la transaction en cours au niveau de l'AM selectionne
   * contient des donnees non sauvees.
   * Permet de pallier a la methode Commit.enabled et Rollback.enabled si ne fonctionne pas
   * @return true s'il existe des valeurs non sauvees, false sinon
   */
  public boolean isTransactionDirty() {
    // L'iterator doit faire partie de l'AM dont on veut connaitre le statut de la
    // transaction en cours
    DCIteratorBinding ib = ADFUtils.findIterator("iterator_name");
    ApplicationModule am = ib.getViewObject().getApplicationModule();
    transactionDirty = am.getTransaction().isDirty();
    return transactionDirty;
  }

Elle utilise le prédicat isDirty() de la classe oracle.jbo.server.DBTransactionImpl.
Ensuite, il ne reste plus qu’à lier la propriété disabled du bouton de transaction au prédicat transationDirty créé en remplacement du enabled.

  <af:commandButton actionListener="#{viewScope.backing_util.onValid}"
                       text="Valider"
                     disabled="#{!viewScope.backing_util.transactionDirty"
                       id="validCb" partialTriggers="soc1 it1" />