HOWTO développement Sashipa

 Supprimer en cascade avec Sashipa-Melba.

Votre utilisateur en a marre de supprimer un à un tous les enregistrements dépendants pour pouvoir supprimer une fiche. Il préfèrerait que tous les enregistrements dépendants soient supprimés en lot lors de la suppression de la fiche.

Avertissement !

Il est préférable d'utiliser la fonctionnalité de votre SGBD si elle existe. Ensuite vous pourrez utiliser cette HOWTO.

Cette opération n'est pas implémentée par le convertisseur Sashipa vers Melba. Il faut donc retoucher à la main un des fichiers Java générés, puis recompiler. Cette opération reste donc réservée aux initiés à Java.

De plus il faudra re-modifier le fichier généré à chaque fois qu'il sera modifié. Dans le cas d'une architecture client-database, cette opération sera le plus souvent trop lourde pour être intéressante. Mais elle reste envisageable avec une architecture client-servlet-database car le fichier retouché est celui de la servlet. La servlet ne doit être mise à jour que lors d'un changement dans les parties environnement ou architecture du code Sashipa.

Etape 1 : récupérer le source approprié

Voici la marche à suivre :

Il nous faut maintenant ajouter le code Java pour la suppression en cascade.

Etape 2 : Modifier le code Java

Certaines méthodes de la classe XxxAnalyser renvoient la valeur null. Parmi celles-là, une méthode doActionBeforeExecute attend en paramètre une requête de suppression (object MpDeleteQuery). Nous allons ajouter notre code dans cette méthode.

Dans notre exemple, nous souhaitons que les adresses du contact à supprimer, soient supprimées avec le contact.

  protected String doActionBeforeExecute(
        ClientSession session, MpDeleteQuery query, 
        MpBufferUpdate bufferUpdate
        ) throws FatalException { 
    String dbTable = query.getSchemaTable();
    if (dbTable.equalsIgnoreCase("CONTACT")) {
      try {
        ConstList lstPkValue = query.getPkValueList();
        for (int i=0; i < lstPkValue.size(); i++) {
          MpPkValue pkValue = (MpPkValue) lstPkValue.get(i);
          // - delete dependencies in CONTACTADRESSE
          deleteDependentRecord(
            query.getDbms(), query.getDatabase(),
            "CONTACTADRESSE",
            new String[] {"ContactRef"},
            pkValue, 
            bufferUpdate
          );
        }
        return null;            // ok, no error
      }
      catch (Throwable x) {
        return "Erreur lors de la suppression des adresses par" +
               " lot.\n\n" + x.getMessage();
      }
    }
    return null;
  }

La méthode renvoie null si elle ne voit pas d'inconvénient à ce que la suppression principale ait lieue. Autrement elle renvoit un message d'erreur ce qui stoppera le processus de suppression, puis le message sera journalisé et remonté à l'utilisateur.

Un objet MpDeleteQuery contient un ensemble de valeurs de clef primaire à supprimer. Dans notre code nous exécutons une requête de suppression de type "DELETE FROM CONTACTADRESSE WHERE ContactRef=XXX" pour chaque valeur de clef primaire, XXX étant la valeur de clef primaire. Pour info on travaille sur des tableaux pour prendre en compte les cas de clefs complexes.

Etape 3 : Compiler

La marche à suivre :

Une fois l'opération terminée, une bonne habitude est de faire un copier/coller du code de votre méthode Java, dans un commentaire à la fin de votre fichier source XML.

Et voilà ! Un peu compliqué mais bon, ça existe...

© Copyright 2003 Sashipa-Melba Team. Ce document de la technologie Sashipa-Melba est sous licence GNU FDL Vous pouvez le copier et modifier librement les copies tant que cette mention apparaît clairement.