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 ?