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, Delete et BeforeDelete


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 400
    Par défaut FireBird, Delete et BeforeDelete
    Salut
    Delphi 2009 + BD FireBird 2.5

    J'ai une relation maitre / détail, définie au niveau de la BD avec mise à jour des règles "CASCADE". j'utilise un IBQ (sans prise de tête ) dans un bouton Supprimer j'ai le code suivant :
    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
    procedure TfmMain.tb_Supprimer_CourrierClick(Sender: TObject);
    var
      c_c : integer;
    begin
      Ajout_Mod := True;
      c_c := dmData.IBQ_Courrier.FieldByName('CODE_COURRIER').AsInteger;
      if MessageDlg('Etes vous sûr de vouloir supprimer l''enregistrement en cours ... ?',
        mtConfirmation, [mbYes, mbNo], 0, mbNo) = mrYes then
      begin
        try
          dmData.IBQ_Courrier.SQL.Clear;
          dmData.IBQ_Courrier.SQL.Add('Delete from tb_courrier where code_courrier =:c_courrier');
          dmData.IBQ_Courrier.ParamByName('c_courrier').Value := c_c;
          dmData.IBQ_Courrier.ExecSQL;
          dmData.IBTrans_Courrier.CommitRetaining;
        finally
          Dialogs.MessageDlg('Enregistrement supprimé avec succès.', mtInformation, [mbOk], 0, mbOk);
        end;
        Affiche_Data(dmData.IBQ_Courrier, 'tb_courrier', 'code_courrier');
      end;
    end;
    mais avant de supprimer l'enregistrement voulu je veux supprimer son détail donc je fais un appel au BeforDelete comme suit :
    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
    procedure TdmData.IBQ_CourrierBeforeDelete(DataSet: TDataSet);
    var
       c_c : integer;
    begin
      c_c := IBQ_Courrier.FieldByName('code_courrier').AsInteger;
      if IBQ_Courrier.FieldByName('Type_courrier').AsString = 'DEPART' then
      begin
        IBQ_Dest.SQL.Clear;
        IBQ_Dest.SQL.Add('Delete * from tb_destinataire where code_courrier =:code_courrier');
        IBQ_Dest.ParamByName('c_courrier').Value := c_c;
        IBQ_Dest.ExecSQL
      end
      else
      begin
        if IBQ_Courrier.FieldByName('Type_courrier').AsString = 'ARRIVE' then
      begin
        IBQ_Exp.SQL.Clear;
        IBQ_Exp.SQL.Add('Delete * from tb_expediteur where code_courrier =:code_courrier');
        IBQ_Dest.ParamByName('c_courrier').Value := c_c;
        IBQ_Exp.ExecSQL;
      end;
      end;
    end;
    Mais à ma surprise l'exécution de l'instruction Delete du code SQL ne fait pas appel au BeforeDelete !! est-ce un bug ? dois-je ajouter quelque chose ?

    NB : en définissant les règles de MAJ à CASCADE j'ai cru comprendre que la suppression des fils (détails) serait à la charge du SGBD, vrai ou faux ?

  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


    Citation Envoyé par Just-Soft Voir le message
    NB : en définissant les règles de MAJ à CASCADE j'ai cru comprendre que la suppression des fils (détails) serait à la charge du SGBD, vrai ou faux ?
    VRAI

  3. #3
    Membre chevronné Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Par défaut
    L’événement OnBeforeDelete est déclenché lorsque tu appel la méthode delete de l’objet DataSet et pas quand tu execute une requête qui peut contenir un delete ou autre.

  4. #4
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 400
    Par défaut
    Citation Envoyé par evarisnea Voir le message




    VRAI
    Salut evarisnea, merci pour la confirmation.
    dans ce cas j'ai pas besoin d'un beforedelete ! est-ce que l'appel d'un delete sur le père est suffisant pour supprimer les fils ? car dans mon cas j'obtiens une erreur.

  5. #5
    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
    quelle erreur as-tu ?

  6. #6
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 400
    Par défaut
    Re,

    je viens d'éliminer le beforedelete puisque ne servant à rien et j'ai laissé uniquement le code suivant qui est exécuté en réponse à onClick d'un bouton :
    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
    procedure TfmMain.tb_Supprimer_CourrierClick(Sender: TObject);
    var
      c_c : integer;
    begin
      Ajout_Mod := True;
      c_c := dmData.IBQ_Courrier.FieldByName('CODE_COURRIER').AsInteger;
      if MessageDlg('Etes vous sûr de vouloir supprimer l''enregistrement en cours ... ?',
        mtConfirmation, [mbYes, mbNo], 0, mbNo) = mrYes then
      begin
        try
          dmData.IBQ_Courrier.SQL.Clear;
          dmData.IBQ_Courrier.SQL.Add('Delete from tb_courrier where code_courrier =:c_courrier');
          dmData.IBQ_Courrier.ParamByName('c_courrier').Value := c_c;
          dmData.IBQ_Courrier.ExecSQL;
          dmData.IBTrans_Courrier.CommitRetaining;
        finally
          Dialogs.MessageDlg('Enregistrement supprimé avec succès.', mtInformation, [mbOk], 0, mbOk);
        end;
        Affiche_Data(dmData.IBQ_Courrier, 'tb_courrier', 'code_courrier');
      end;
    end;
    en l'exécutant j'ai l'erreur suivante :
    violation of foreign key constraint "fk_tb_arrivee_1" on table tb_arrivee
    foreign key references are present for the record.

  7. #7
    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
    quelle est la définition de la contrainte fk_tb_arrivee_1 ?

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

Discussions similaires

  1. Firebird 2.1x trigger delete
    Par Fred 57220 dans le forum Firebird
    Réponses: 2
    Dernier message: 23/02/2013, 12h40
  2. [Débutant] TClientDataSet/firebird perte de valeur apres appel de Delete()
    Par o_live dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/01/2013, 16h18
  3. executer delete avec php sur firebird
    Par omar24 dans le forum Firebird
    Réponses: 2
    Dernier message: 21/02/2011, 11h29
  4. [Débat] Choisir InterBase/Firebird ou Microsoft SQL-SERVER ?
    Par asenaici dans le forum Décisions SGBD
    Réponses: 90
    Dernier message: 19/03/2009, 20h51
  5. [Firebird] DELETE sur le résultat d'une requete d'un IBQUERY
    Par shashark dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/06/2005, 18h17

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