IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

[FireBird] Valider/Annuler insertions multiples


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Par défaut [FireBird] Valider/Annuler insertions multiples
    Hello,

    Je suis en train de travailler sur un logiciel de gestion d'adhérents. Le cahier des charges m'impose d'implémenter toute une partie "comptabilité" également. Cela signifie que, sur la partie adhésions, pour chaque adhésion enregistrée, je dois insérer dans la base de données les écritures correspondantes dans une table que j'ai appelé "écritures" (base FireBird) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ECRITURES
    id (int)
    exercice (int) 
    journal (varchar)
    date (date)
    compte (varchar)
    piece (varchar)
    libelle (varchar)
    montant (double)
    pointage (varchar)
    J'ai pour cela créé une fonction "ecrire" sous Delphi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function ecrire(journal : string; dateEcriture : TDate; compte,piece,libelle : string; montant : double) : boolean;
    begin
      With data_main.BD_ecritures do
      begin
        Open; Insert;
        FieldByName('EXERCICE').AsInteger:=1;
        FieldByName('JOURNAL').AsString:='VE';
        FieldByName('DATE').AsDateTime:=dateEcriture;
        FieldByName('COMPTE').AsString:=compte;
        FieldByName('PIECE').AsString:=piece;
        FieldByName('LIBELLE').AsString:=libelle;
        FieldByName('MONTANT').AsCurrency:=montant;
        Post; Close;
      end;
      Result:=true;
    end;
    Seulement voilà : comment gérer les erreurs dans ce genre de cas ?

    Je veux dire, prenons une écriture d'adhésion :

    1. Enregistrement de la dette de l'adhérent
    2. Enregistrement du produit (adhésion)
    3. Enregistrement du produit (dons éventuels)


    La fonction "ecrire" sera donc appelée 3 fois. Mais que faire si une des 3 insertions se déroule mal ? Peut être utiliser les "transactions" mais je trouve ce système incompatible avec ma fonction "ecrire" et je ne vois pas comment le mettre en oeuvre...

    Avez-vous des idées ? Des avis ? Merci

  2. #2
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Par défaut

    je vois bien une transaction gérer cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    StartTransaction;
    try
      //Enregistrement de la dette de l'adhérent
      //Enregistrement du produit (adhésion)
      //Enregistrement du produit (dons éventuels)
     
      // valider la transaction
      CommitTransaction;
    catch
      RollbackTransaction;
      //message d'erreur
    end;

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 593
    Billets dans le blog
    65
    Par défaut
    Avec BDE il faut utiliser la propriété CacheUpdates de TTable
    puis ApplyUpdates

    Code aide delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    procedure ApplyButtonClick(Sender: TObject);
     
    begin
    with CustomerQuery do
    begin
    Database1.StartTransaction;
    try
    ApplyUpdates; {essayer d'écrire les mises à jour dans la base};
    Database1.Commit; {en cas de réussite, valider les modifications};
    except
    Database1.Rollback; {en cas d'échec, annuler les modifications};
    raise; {déclencher l'exception pour empêcher l'appel de CommitUpdates!}
    end;
    CommitUpdates; {en cas de réussite, effacer le cache}
    end;
    end;

  4. #4
    Membre confirmé Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Par défaut
    Merci à vous 2 pour vos précieuses réponses.

    En fait, ici je sais à l'avance que pour cette opération j'aurai 3 écritures. Mais à coté de ça, l'utilisateur pourra aussi enregistrer ses opérations courantes et là je ne sais pas combien d'écritures il y aura : 2 dans la plus part des cas (un tiers et une charge/un produit), mais il peut aussi y en avoir plusieurs. Du coup, je vais devoir appeler "ecrire" plusieurs fois dans une boucle, et de ce fait je ne peux pas inclure la vérification de la transaction dans la fonction "ecrire" car elle n'aurait que peu d'utilité.

    Mais en lisant vos propositions, j'ai eu une idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure demarrerEcriture
    	//Ouverture de la table
    	//Démarrage de la transaction
     
    procedure ecrire : boolean
    	//Insertion de l'écriture
     
    procedure appliquerEcriture : boolean
    	//Application des mises à jour de la table
    	//Si ok => validation des modif => renvoi true
    	//Si non => annulation des mises à jour => renvoi false
    	//suppression du cache
    du coup il ne me restera plus qu'à faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    demarrerEcriture;
    tantQue ligneDansMonTableauDeSaisie faire
      ecrire;
    fin
    appliquerEcriture;
    Je pense pouvoir m'en sortir comme ça !

    Merci encore !

  5. #5
    Membre confirmé Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Par défaut
    Je complète ma précédente réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function Tdata_main.demarrerEcritures : boolean;
    begin
      data_main.BD_ecritures.Open;
      data_main.BD_ecritures.Transaction.CommitRetaining; //Lance la transaction
      Result:=true;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function Tdata_main.ecrire(journal : string;
                               dateEcriture : TDate;
                               compte,piece,libelle : string;
                               montant : double) : boolean;
    begin
      try
        With data_main.BD_ecritures do
        begin
          Insert;
          FieldByName('EXERCICE').AsInteger:=Param.exercice;
          FieldByName('JOURNAL').AsString:=journal;
          FieldByName('DATE').AsDateTime:=dateEcriture;
          FieldByName('COMPTE').AsString:=compte;
          FieldByName('PIECE').AsString:=piece;
          FieldByName('LIBELLE').AsString:=libelle;
          FieldByName('MONTANT').AsCurrency:=montant;
          Post;
        end;
        Result:=true;
      except
        Result:=false;
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function Tdata_main.appliquerEcritures : boolean;
    begin
      try
         data_main.BD_ecritures.ApplyUpdates; //Appliquer les modifs
         data_main.BD_ecritures.Transaction.CommitRetaining; //Valide les modifs
         Result:=true;
      except
         data_main.BD_ecritures.Transaction.RollbackRetaining; //Annule les modifs
         Result:=false;
         raise;
      end;
      data_main.BD_ecritures.CancelUpdates; //Vide le cache
      data_main.BD_ecritures.Close;
    end;
    Sachant qu'il faut mettre la propriété "CachedUpdates" de la table en question à "true".

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 593
    Billets dans le blog
    65
    Par défaut
    Il aurait été bon d'indiquer de quels types de composants il s'agit ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/05/2007, 13h16
  2. procédure stockée insert multiple
    Par gigi34 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/09/2005, 10h37
  3. Insertion multiple à base de sous requête SELECT
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/04/2005, 16h34
  4. INSERT multiples avec : rs.AddNew et .Update
    Par M.Zip dans le forum ASP
    Réponses: 4
    Dernier message: 03/12/2004, 15h53
  5. pb d'insertions multiples
    Par devalender dans le forum SQL
    Réponses: 2
    Dernier message: 14/07/2004, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo