Bonjour,
J'ai placé dans une procédure un bloc de code pour une suppression de données se trouvant dans plusieurs tables :
Ce bloc est encadré au début et à la fin par 2 balises SQLTransaction(sqlDébut) et SQLTransaction(sqlFin).
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 SI NumConnexion = 0 ALORS SQLInfoGene() Erreur("Erreur d'ouverture de la connexion : " + SQL.MesErreur) SINON Sablier(Vrai) // Mise en transaction de la connexion SQLTransaction(sqlDébut) SI SQLExec("DELETE FROM `test`.`e_adresse_ligne_adl` " + ... "WHERE `ADL_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ... "Delete_LigneAdresse") = Vrai ET SQLExec("DELETE FROM `test`.`e_adresse_adr` " + ... "WHERE `ADR_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ... "Delete_Adresse") = Vrai ET SQLExec("DELETE FROM `test`.`ej_travaille_tra` " + ... "WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ... "Delete_Travaille") = Vrai ET SQLExec("DELETE FROM `test`.`ej_contact_ctc` " + ... "WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ... "Delete_Contact") = Vrai ET SQLExec("DELETE FROM `test`.`ej_joint_jdr` " + ... "WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " " + ... "AND `TNU_Id` = 4;" , ... "Delete_MobileDomicile") = Vrai ET SQLExec("DELETE FROM `test`.`e_concierge_cge` " + ... "WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ... "Delete_Personne_Concierge") = Vrai ET SQLExec("DELETE FROM `test`.`e_personne_physique_ppq` " + ... " WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ... "Delete_Personne_Physique") = Vrai ALORS // Termine la transaction SQLTransaction(sqlFin) Info("L'enregistrement a été supprimé") SINON SQLInfoGene("Delete_Personne") //Erreur("Erreur d'exécution de la requête : " + SQL.MesErreur) // Annulation de la transaction SQLTransaction(sqlAnnule) // le contenu du fichier UnFichier n'a pas changé. FIN Sablier(Faux)
En cliquant sur l'enregistrement à supprimer j'ai le message suivant :
La fenêtre se referme avec l'application.Erreur à la ligne 123 du traitement Procédure locale Procedure_PersonneSuppression_Bis.
Vous avez appelé la fonction SQLInfoGene.
La requête <Delete_Personne> n'existe pas.
----- Informations techniques -----
Projet : PCSecurite4
Appel WL :
Traitement de 'Procédure locale Procedure_PersonneSuppression_Bis' (FEN_COUTEAU_SUISSE.PROCEDURE.Procedure_PersonneSuppression_Bis), ligne 123, thread 0
Fonction 'SQLInfoGene', syntaxe 1
Que s'est-il passé ?
La requête <Delete_Personne> n'existe pas.
Code erreur : 70018
Niveau : erreur fatale (EL_FATAL)
Code erreur WD55 : 18
Dump de l'erreur du module 'wd200hf.dll' (20.0.115.2).
Identifiant des informations détaillées (.err) : 72002
Informations de débogage :
IEWDHF=70.2
Module=<WDHF>
Version=<20.0.115.2>
Fonction (7,176)
Informations supplémentaires :
EIT_LOGICALTABLENAME : <Delete_Personne>
EIT_PILEWL :
Procédure locale Procedure_PersonneSuppression_Bis (FEN_COUTEAU_SUISSE.PROCEDURE.Procedure_PersonneSuppression_Bis), ligne 123
Clic sur Ast_Supprimer (FEN_COUTEAU_SUISSE.Ast_Supprimer), ligne 3
Procédure locale Procedure_AgentSuperAdministrateur (Fen_Login.PROCEDURE.Procedure_AgentSuperAdministrateur), ligne 21
Clic sur BTN_OK (Fen_Login.BTN_OK), ligne 36
Initialisation de PCSecurite4 (), ligne 1661
EIT_DATEHEURE : 03/03/2016 10:35:29
Or, l'identifiant PGE_Id est utilisé comme clé étrangère dans une table fille et l'intégrité de la base empêche la suppression de l'enregistrement dans la table e_concierge_cge, ce qui est normal.
MySQL fait bien son travail.
Cependant, les données sont supprimées dans les tables en amont de la table e_concierge_cge malgré le bloc de transaction SQLTransaction(sqlDébut) et SQLTransaction(sqlFin),
ce qui ne devrait normalement pas se produire. Est ce qu'il manque du code pour gérer l'exception? Est ce que la fonction SQLTransaction marche?
Cordialement.
Pierre
Partager