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

  1. #1
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    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 401
    Points : 2 304
    Points
    2 304
    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 ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  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
    Points : 4 384
    Points
    4 384
    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 confirmé Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Points : 593
    Points
    593
    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.
    <On fait la science avec des faits, comme on fait une maison avec des pierres : mais une accumulation de faits n'est pas plus une science qu'un tas de pierres n'est une maison> **Poincaré**

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    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 401
    Points : 2 304
    Points
    2 304
    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.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  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
    Points : 4 384
    Points
    4 384
    Par défaut
    quelle erreur as-tu ?

  6. #6
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    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 401
    Points : 2 304
    Points
    2 304
    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.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  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
    Points : 4 384
    Points
    4 384
    Par défaut
    quelle est la définition de la contrainte fk_tb_arrivee_1 ?

  8. #8
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    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 401
    Points : 2 304
    Points
    2 304
    Par défaut
    c'est une clé étrangère sur le champ code_courrier de la table tb_courrier
    la schéma est le suivant :
    table maitre : tb_courrier--> code_courrier clé primaire
    table détail : tb_arrivee --> code_courrier clé étrangère
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  9. #9
    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
    Points : 4 384
    Points
    4 384
    Par défaut
    la contrainte est bien du type ON DELETE CASCADE ?
    si oui, essaie de supprimer et de recréer la contrainte, il n'y a pas de raison que ca ne fonctionne pas !

  10. #10
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    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 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par evarisnea Voir le message
    la contrainte est bien du type ON DELETE CASCADE ?
    si oui, essaie de supprimer et de recréer la contrainte, il n'y a pas de raison que ca ne fonctionne pas !
    merci evarisnea j'avais ON UPDATE CACCADE mais pas ON DELETE CASCADE , vraiment merci, très chic de ta part.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  11. #11
    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
    Points : 4 384
    Points
    4 384
    Par défaut

+ 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