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 :
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 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 à 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 ?
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;
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 ?
Partager