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

WinDev Discussion :

Windev 20 Fonction SQLTransaction


Sujet :

WinDev

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2011
    Messages : 51
    Points : 80
    Points
    80
    Par défaut Windev 20 Fonction SQLTransaction
    Bonjour,

    J'ai placé dans une procédure un bloc de code pour une suppression de données se trouvant dans plusieurs tables :

    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)
    Ce bloc est encadré au début et à la fin par 2 balises SQLTransaction(sqlDébut) et SQLTransaction(sqlFin).
    En cliquant sur l'enregistrement à supprimer j'ai le message suivant :


    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
    La fenêtre se referme avec l'application.

    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

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 151
    Points
    2 151
    Par défaut
    Bonjour,

    Ce qui se passe (à mon avis).

    En gros Windev considère votre transaction comme un jeu de requête qu'il peut annuler. Mais au moment où vous exécutez votre requête votre table est mise à jour. Ceci est dû au niveau d'isolation de la transaction (http://doc.pcsoft.fr/fr-FR/?3044335). Soit.

    Vous appelez SQLInfoGene() sur une requête qui n'existe pas. Ce qui fait planter votre soft. Soit.

    La résultante : vous ne passez jamais sur SQLTransaction(sqlAnnule) (le programme plante avant). Donc => pas d'annulation de l'exécution des requêtes de la transaction (plus exactement pas d'exécution des requêtes annulatrices).

    Enfin, je vous conseille d'utiliser les opérateurs _ET_ et _OU_ (comme _A_ aussi) qui sont optimisés.
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  3. #3
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 397
    Points
    9 397
    Par défaut
    Décompose ta série de SQLExec , tu y verras plus clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    sqlTransaction(SqlDébut)
    Ok=Vrai
    si ok alors  Ok = Sqlexec(...) 
    si ok alors  Ok = Sqlexec(...) 
    si ok alors  Ok = Sqlexec(...) 
    si ok alors  Ok = Sqlexec(...) 
    si ok alors  Ok = Sqlexec(...) 
    si ok alors 
      sqltransaction(Sqlfin)
    sinon
      sqltransaction(sqlannule)
    fin
    Quand tu utilises la syntaxe SI Cond1... ET Cond2 ...
    Cond2 est elle toujours exécutée/évaluée, même si Cond1 a renvoyé faux ?
    La doc dit oui, mais la logique voudrait Non.

    Et l'autre point qui n'est pas clair dans ton code, c'est que tu finis par SQLInfoGene("Delete_Personne") et aucune requête ne s'appelait ainsi.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  4. #4
    Membre chevronné Avatar de EDM-TAHITI
    Homme Profil pro
    Directeur Service informatique et projet développement
    Inscrit en
    Janvier 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Directeur Service informatique et projet développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 994
    Points : 1 995
    Points
    1 995
    Par défaut
    Hello,
    D'accord au plus au point avec ce qui est écrit. Mais, à la vue du code, ne pourrait-on pas penser à faire grâce aux relations d'intégrités et aux contraintes une suppression cascadée que toute bonne base de données sait faire?
    Ainsi, on optimise le code, on fait propre. Et puis c'est maintenable...
    Voilà ce que je peux vous dire à la vue de ce code... et ce que je préconise vraiment.... la vie est simple, non?
    le savoir est dans les livres, 'the magic touch F1'
    Amicalement
    Eric

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 151
    Points
    2 151
    Par défaut
    Citation Envoyé par EDM-TAHITI Voir le message
    Hello,
    D'accord au plus au point avec ce qui est écrit. Mais, à la vue du code, ne pourrait-on pas penser à faire grâce aux relations d'intégrités et aux contraintes une suppression cascadée que toute bonne base de données sait faire?
    Ainsi, on optimise le code, on fait propre. Et puis c'est maintenable...
    Voilà ce que je peux vous dire à la vue de ce code... et ce que je préconise vraiment.... la vie est simple, non?

    Tout à fait d'accord sur l'utilisation des contraintes d'intégrité pour faire un DELETE CASCADE...

    J'ajouterai également que, si on fait abstraction de la possibilité d'utiliser les contraintes d'intégrité pour gérer la suppression, a l'algo présenté manque de clarté et de factorisation (par exemple faire un tableau de chaîne contenant les requêtes que l'on parcourt).
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2011
    Messages : 51
    Points : 80
    Points
    80
    Par défaut
    En fait voilà l'intégralité de la requête et qui fonctionne correctement tant que je ne rencontre pas de problème d'intégrité.

    Dans le MCD j'ai un héritage entre les tables e_personne_generique_pge (point de départ) et e_personne_physique_ppq et e_personne_physique_ppq avec (e_personne_astreinte_pea, e_personne_emprunteur_pem, e_controleur_travaux_ctx, e_concierge_cge, e_agent_agt), soit 5 branches à partir de la personne physique.
    En effet, une personne (physique) peut avoir un ou plusieurs rôles à la fois (en suivant les règles de gestion du projet).
    Ensuite, le ON DELETE CASCADE n'est pas envisageable car cela supprimerait le site géographique auquel le concierge est rattaché. (RG : Un concierge est le gardien d'un site géographique sur lequel se situent un ou plusieurs bâtiments. Ecoles, gymnase, restaurant scolaire). En cascadant la suppression du concierge je supprime le site géographique, ce qui n'est pas possible.


    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
     
    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)
    	// Modification de la valeur de toutes les rubriques UnFichier.UneRubrique
     
    	SI SQLExec("DELETE FROM `pcsecurite4`.`e_adresse_ligne_adl` " + ...
    		"WHERE `ADL_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_LigneAdresse") = Vrai ET 
    		SQLExec("DELETE FROM `pcsecurite4`.`e_adresse_adr` " + ...
    		"WHERE `ADR_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Adresse") = Vrai ET 
    		SQLExec("DELETE FROM `pcsecurite4`.`ej_travaille_tra` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Travaille") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`ej_contact_ctc` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Contact") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + "  " + ...
    		"AND `TNU_Id` = 4;" , ...
    		"Delete_MobileDomicile") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + "  " + ...
    		"AND `TNU_Id` = 2;" , ...
    		"Delete_TelephoneDomicile") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + "  " + ...
    		"AND `TNU_Id` = 8;" , ...
    		"Delete_Fax") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " " + ...
    		"AND `TNU_Id` = 3;" , ...
    		"Delete_MobileProfessionnel") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + "  " + ...
    		"AND `TNU_Id` = 9;" , ...
    		"Delete_TelephoneBureau2") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " " + ...
    		"AND `TNU_Id` = 1;" , ...
    		"Delete_TelephoneBureau1") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " " + ...
    		"AND `TNU_Id` = 5;" , ...
    		"Delete_MobileProfessionnel2") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " " + ...
    		"AND `TNU_Id` = 6;" , ...
    		"Delete_MobileProfessionnel3") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " " + ...
    		"AND `TNU_Id` = 10;" , ...
    		"Delete_PasdeTelephone") = Vrai ET 
    		SQLExec("DELETE FROM `pcsecurite4`.`e_agent_agt` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Personne_Agent") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`e_concierge_cge` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Personne_Concierge") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`e_controleur_travaux_ctx` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Personne_ChefDeTravaux") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`e_personne_emprunteur_pem` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Personne_Emprunteur") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`ej_chargement_chg` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Chargement") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`e_personne_astreinte_pea` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Personne_Astreinte") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`e_personne_physique_ppq` " + ...
    		" WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Personne_Physique") = Vrai ET
    		SQLExec("DELETE FROM `pcsecurite4`.`e_personne_generique_pge` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Personne_Generique") = 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)
    FIN

    J'ai transformé le code de suppression initial par celui-ci :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    PROCEDURE Procedure_PersonneSuppression_Bis()
     
    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)
    	// Modification de la valeur de toutes les rubriques UnFichier.UneRubrique
     
    	Ok = Vrai
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`e_adresse_ligne_adl` " + ...
    		"WHERE `ADL_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_LigneAdresse") 
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`e_adresse_adr` " + ...
    		"WHERE `ADR_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Adresse")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`ej_travaille_tra` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Travaille")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`ej_contact_ctc` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Contact")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + "  " + ...
    		"AND `TNU_Id` = 4;" , ...
    		"Delete_MobileDomicile")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + "  " + ...
    		"AND `TNU_Id` = 2;" , ...
    		"Delete_TelephoneDomicile")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + "  " + ...
    		"AND `TNU_Id` = 8;" , ...
    		"Delete_Fax")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " " + ...
    		"AND `TNU_Id` = 3;" , ...
    		"Delete_MobileProfessionnel")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + "  " + ...
    		"AND `TNU_Id` = 9;" , ...
    		"Delete_TelephoneBureau2")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " " + ...
    		"AND `TNU_Id` = 1;" , ...
    		"Delete_TelephoneBureau1")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " " + ...
    		"AND `TNU_Id` = 5;" , ...
    		"Delete_MobileProfessionnel2")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " " + ...
    		"AND `TNU_Id` = 6;" , ...
    		"Delete_MobileProfessionnel3")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " " + ...
    		"AND `TNU_Id` = 10;" , ...
    		"Delete_PasdeTelephone")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`e_agent_agt` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Personne_Agent")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`e_concierge_cge` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Personne_Concierge")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`e_controleur_travaux_ctx` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Personne_ChefDeTravaux")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_emprunteur_pem` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Personne_Emprunteur")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`ej_chargement_chg` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Chargement")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_astreinte_pea` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Personne_Astreinte")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_physique_ppq` " + ...
    		" WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Personne_Physique")
    	SI Ok ALORS Ok = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_generique_pge` " + ...
    		"WHERE `PGE_Id` = " + Ref_Param_PER_PGE_Id + " ;" , ...
    		"Delete_Personne_Generique")
    	SI Ok ALORS
    		// Termine la transaction
    		SQLTransaction(sqlFin)
    		Info("L'enregistrement a été supprimé")
    	SINON
    		SQLInfoGene("Delete_Personne_Generique")
    		//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)
    FIN
    Mais l'erreur d'intégrité se reproduit.

    L'erreur disparaît lorsque dans la table des sites géographiques je remplace le choix du concierge par un enregistrement vide (la liste des concierges se trouve dans une liste déroulante).
    La suppression peut alors s'effectuer sans problème.
    Mais je souhaite gérer ce message d'erreur et éviter la fermeture de l'application.

    Pierre

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 151
    Points
    2 151
    Par défaut
    M'est avis que vous n'avez pas bien lu mon premier message...

    Que se passe-t-il si l'exécution d'une requête avant "Delete_Personne_Generique" ne se passe pas bien ?

    bOk = Faux, on est d'accord... donc à aucun moment vous n'exécuterez "Delete_Personne_Generique" donc votre SQLInfoGene("Delete_Personne_Generique") plantera et vous ne passera pas sur SQLTransaction(sqlAnnule).

    Sinon pour éviter que une erreur crashe l'appli, regardez du coté de la gestion des exceptions (http://doc.pcsoft.fr/?3034001).

    Enfin je pense que plutôt que d'empiler les IF vous feriez mieux de parcourir un tableau dans un boucle WHILE.
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2011
    Messages : 51
    Points : 80
    Points
    80
    Par défaut
    Je travaille avec une base de données MySQL.

    D'après la documentation PCSoft : La gestion des transactions est disponible uniquement pour les bases de données HFSQL Client/Serveur.
    Ce qui expliquerait que les fonctions SQLTransaction(sqlDébut) et SQLTransaction(sqlFin) ne marchent pas.

    Cordialement.

    Pierre

  9. #9
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 151
    Points
    2 151
    Par défaut
    Bahbahbah.... Je ne sais pas où vous avez lu ça.

    En revanche les transactions sont supportées par MySQL uniquement sur les tables InnoDB (rien à voir avec Windev mais ils ont la courtoisie de le préciser dans la doc).
    Je ne comprends pas pourquoi vous vous obstinez à ne pas lire ma première réponse.
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2011
    Messages : 51
    Points : 80
    Points
    80
    Par défaut
    Bonjour,

    Merci de vos réponses.
    J'utilise bien des tables InnoDB dans le schéma.
    Nom : Capture_typeDeTables.PNG
Affichages : 476
Taille : 9,6 Ko
    J'ai modifié le code comme ceci :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    PROCEDURE Procedure_PersonneSuppression_Bis()
    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)
    	// Modification de la valeur de toutes les rubriques UnFichier.UneRubrique	
    	bOk = Vrai
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_adresse_ligne_adl` " + ...
    	"WHERE `ADL_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_LigneAdresse") 
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_adresse_adr` " + ...
    	"WHERE `ADR_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Adresse")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`ej_travaille_tra` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Travaille")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`ej_contact_ctc` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Contact")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + "  " + ...
    	"AND `TNU_Id` = 4 OR `TNU_Id` = 2 OR `TNU_Id` = 8 OR `TNU_Id` = 3 OR `TNU_Id` = 9 OR `TNU_Id` = 1 OR `TNU_Id` = 5 OR `TNU_Id` = 6 OR `TNU_Id` = 10;" , ...
    	"Delete_joindre")	
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_agent_agt` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Personne_Agent")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_concierge_cge` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Personne_Concierge")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_controleur_travaux_ctx` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Personne_ChefDeTravaux")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_emprunteur_pem` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Personne_Emprunteur")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`ej_chargement_chg` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Chargement")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_astreinte_pea` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Personne_Astreinte")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_physique_ppq` " + ...
    	" WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Personne_Physique")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_generique_pge` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Personne_Generique")
    	SI bOk ALORS
    		// Termine la transaction
    		SQLTransaction(sqlFin)
    		Info("L'enregistrement a été supprimé")
    	SINON
    		QUAND EXCEPTION 		
    			SQLTransaction(sqlAnnule)
    		FIN
    	FIN
    	Sablier(Faux)
    FIN
    Que faut il modifier dans ce code pour capter l'exception?
    Malgré l'exception qui doit apparaître au niveau de la suppression dans la table concierge, les données dans les tables précédentes sont supprimées.

    Cordialement.

    Pierre

  11. #11
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 151
    Points
    2 151
    Par défaut
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    PROCEDURE Procedure_PersonneSuppression_Bis()
     
    QUAND EXCEPTION
       SQLTransaction(sqlAnnule)
    FIN
     
    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)
    	// Modification de la valeur de toutes les rubriques UnFichier.UneRubrique	
    	bOk = Vrai
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_adresse_ligne_adl` " + ...
    	"WHERE `ADL_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_LigneAdresse") 
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_adresse_adr` " + ...
    	"WHERE `ADR_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Adresse")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`ej_travaille_tra` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Travaille")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`ej_contact_ctc` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Contact")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + "  " + ...
    	"AND `TNU_Id` = 4 OR `TNU_Id` = 2 OR `TNU_Id` = 8 OR `TNU_Id` = 3 OR `TNU_Id` = 9 OR `TNU_Id` = 1 OR `TNU_Id` = 5 OR `TNU_Id` = 6 OR `TNU_Id` = 10;" , ...
    	"Delete_joindre")	
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_agent_agt` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Personne_Agent")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_concierge_cge` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Personne_Concierge")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_controleur_travaux_ctx` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Personne_ChefDeTravaux")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_emprunteur_pem` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Personne_Emprunteur")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`ej_chargement_chg` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Chargement")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_astreinte_pea` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Personne_Astreinte")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_physique_ppq` " + ...
    	" WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Personne_Physique")
    	SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_generique_pge` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    	"Delete_Personne_Generique")
    	SI bOk ALORS
    		// Termine la transaction
    		SQLTransaction(sqlFin)
    		Info("L'enregistrement a été supprimé")
    	SINON 		
    		SQLTransaction(sqlAnnule)
    	FIN
    	Sablier(Faux)
    FIN
    Mais dans votre cas je ferais plutôt :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    QUAND EXCEPTION DANS
    	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)
    		// Modification de la valeur de toutes les rubriques UnFichier.UneRubrique	
    		bOk = Vrai
    		SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_adresse_ligne_adl` " + ...
    		"WHERE `ADL_Id` = " + nPGE_PersonneId + " ;" , ...
    		"Delete_LigneAdresse") 
    		SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_adresse_adr` " + ...
    		"WHERE `ADR_Id` = " + nPGE_PersonneId + " ;" , ...
    		"Delete_Adresse")
    		SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`ej_travaille_tra` " + ...
    		"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    		"Delete_Travaille")
    		SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`ej_contact_ctc` " + ...
    		"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    		"Delete_Contact")
    		SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    		"WHERE `PGE_Id` = " + nPGE_PersonneId + "  " + ...
    		"AND `TNU_Id` = 4 OR `TNU_Id` = 2 OR `TNU_Id` = 8 OR `TNU_Id` = 3 OR `TNU_Id` = 9 OR `TNU_Id` = 1 OR `TNU_Id` = 5 OR `TNU_Id` = 6 OR `TNU_Id` = 10;" , ...
    		"Delete_joindre")	
    		SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_agent_agt` " + ...
    		"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    		"Delete_Personne_Agent")
    		SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_concierge_cge` " + ...
    		"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    		"Delete_Personne_Concierge")
    		SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_controleur_travaux_ctx` " + ...
    		"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    		"Delete_Personne_ChefDeTravaux")
    		SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_emprunteur_pem` " + ...
    		"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    		"Delete_Personne_Emprunteur")
    		SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`ej_chargement_chg` " + ...
    		"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    		"Delete_Chargement")
    		SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_astreinte_pea` " + ...
    		"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    		"Delete_Personne_Astreinte")
    		SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_physique_ppq` " + ...
    		" WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    		"Delete_Personne_Physique")
    		SI bOk ALORS bOk = SQLExec("DELETE FROM `pcsecurite4`.`e_personne_generique_pge` " + ...
    		"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" , ...
    		"Delete_Personne_Generique")
    		SI bOk ALORS
    			// Termine la transaction
    			SQLTransaction(sqlFin)
    			Info("L'enregistrement a été supprimé")
    		SINON 		
    			SQLTransaction(sqlAnnule)
    		FIN
    		Sablier(Faux)
    	FIN
     
    FAIRE
    	SQLTransaction(sqlAnnule)
    FIN
    ou un truc du genre...
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    J'ai plusieurs remarques sur ce code:
    • Il manque les SqlFerme() après chaque SqlExec()
    • A quoi sert le QUAND EXCEPTION pour le SqlAnnule ? SqlExec() ne déclenche pas d'exception si la requête échoue, mais se "contente" de renvoyer faux.
    • Pourquoi ne pas mettre les requêtes dans un tableau de chaines, puis parcourir le tableau ?

    Avec un tableau de chaines, le code devient bien plus simple:
    Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ... Construction du tableau...
    SqlTransaction(sqldebut)
    bok = vrai
    Pour tout element sRequete de tabRequetes
    bOk = bOK _ET_ SqlExec(srequete,"ReqDel")
    fin
    SqlTransaction(bOk ? SqlFin sinon SqlAnnule)

    L'opérateur _ET_ permet de ne pas évaluer la deuxième expression si la première est fausse. Ainsi dès qu'une requête échoue, les autres ne sont pas lancées.

    Tatayo.

  13. #13
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 151
    Points
    2 151
    Par défaut
    Un tableau de chaine ? je lui en parle depuis le début.......
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  14. #14
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 397
    Points
    9 397
    Par défaut
    A priori, il aimerait en plus un petit SQLInfoGene() au moment du plantage.

    Ca donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SqlTransaction(sqldebut)
    Pour tout element sRequete de tabRequetes
      si  pas SqlExec(srequete,"ReqDel") alors
        Erreur( sqlInfoGene("ReqDel") )
        SqlTransaction (SqlAnnule)
        renvoyer faux
      fin
    fin
    SqlTransaction(SqlFin )
    renvoyer vrai
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    tbc92: le message d'erreur n'est pas renvoyé par SqlInfoGene, mais pas Sql.mesErreur.

    Tatayo.

  16. #16
    Membre chevronné Avatar de EDM-TAHITI
    Homme Profil pro
    Directeur Service informatique et projet développement
    Inscrit en
    Janvier 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Directeur Service informatique et projet développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 994
    Points : 1 995
    Points
    1 995
    Par défaut
    Hello,
    Citation Envoyé par michel.souris Voir le message
    Un tableau de chaine ? je lui en parle depuis le début.......
    Oui, tu as raison, je te suis sur le sujet, mais le tableau de chaine est pour récupérer ses paramètres de requête dans une fenêtre de message d'erreur.
    le savoir est dans les livres, 'the magic touch F1'
    Amicalement
    Eric

  17. #17
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2011
    Messages : 51
    Points : 80
    Points
    80
    Par défaut
    Merci à tous pour vos réponses,

    J'ai modifié le code de la manière suivante :

    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
     
    PROCEDURE Procedure_PersonneSuppression_Ter()
    ... Construction du tableau...
    // Remplit un tableau associatif avec les tailles de fichiers
    tabRequetes est un tableau associatif de chaînes
    tabRequetes["Delete_LigneAdresse"] = "DELETE FROM `pcsecurite4`.`e_adresse_ligne_adl` " + ...
    	"WHERE `ADL_Id` = " + nPGE_PersonneId + " ;"
    tabRequetes["Delete_Adresse"] = "DELETE FROM `pcsecurite4`.`e_adresse_adr` " + ...
    	"WHERE `ADR_Id` = " + nPGE_PersonneId + " ;"
    tabRequetes["Delete_Travaille"] = "DELETE FROM `pcsecurite4`.`ej_travaille_tra` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;"
    tabRequetes["Delete_Contact"] = "DELETE FROM `pcsecurite4`.`ej_contact_ctc` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;"
    tabRequetes["Delete_joindre"] = "DELETE FROM `pcsecurite4`.`ej_joint_jdr` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + "  " + ...
    	"AND `TNU_Id` = 4 OR `TNU_Id` = 2 OR `TNU_Id` = 8 OR `TNU_Id` = 3 OR `TNU_Id` = 9 OR `TNU_Id` = 1 OR `TNU_Id` = 5 OR `TNU_Id` = 6 OR `TNU_Id` = 10;"
    tabRequetes["Delete_Personne_Agent"] = "DELETE FROM `pcsecurite4`.`e_agent_agt` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;"
    tabRequetes["Delete_Personne_Concierge"] = "DELETE FROM `pcsecurite4`.`e_concierge_cge` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;"
    tabRequetes["Delete_Personne_ChefDeTravaux"] = "DELETE FROM `pcsecurite4`.`e_controleur_travaux_ctx` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;"
    tabRequetes["Delete_Personne_Emprunteur"] = "DELETE FROM `pcsecurite4`.`e_personne_emprunteur_pem` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;"
    tabRequetes["Delete_Chargement"] = "DELETE FROM `pcsecurite4`.`ej_chargement_chg` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;"
    tabRequetes["Delete_Personne_Astreinte"] = "DELETE FROM `pcsecurite4`.`e_personne_astreinte_pea` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;" 
    tabRequetes["Delete_Personne_Physique"] = "DELETE FROM `pcsecurite4`.`e_personne_physique_ppq` " + ...
    	" WHERE `PGE_Id` = " + nPGE_PersonneId + " ;"
    tabRequetes["Delete_Personne_Generique"] = "DELETE FROM `pcsecurite4`.`e_personne_generique_pge` " + ...
    	"WHERE `PGE_Id` = " + nPGE_PersonneId + " ;"
     
    SQLTransaction(sqlDébut)
    bOk = Vrai
    sRequete est une chaîne
    POUR TOUT ELEMENT sRequete DE tabRequetes
    	bOk = bOk _ET_ SQLExec(sRequete,"ReqDel")
    FIN
    SQLTransaction(bOk ? sqlFin SINON sqlAnnule)
    cela fonctionne, mais en revanche je ne peux pas récupérer de message d'erreur avec info ou avertissement.

  18. #18
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 151
    Points
    2 151
    Par défaut
    Pour optimiser le parcours et afficher l'éventuel message d'erreur vous pouvez procéder de la façon suivante :

    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
     
    //Alimentation du tableau tel que vous l'avez faite mais en indicé (pas associatif)
    ...
    //
     
    i est un entier = 0
    bOK est un booléen = true
     
    SQLTransaction(sqlDebut)
     
    WHILE bOK _AND_ i<tabRequete..Occurrence
       i++
       bOk = SQLExec(tabRequete[i],"ReqDel")
    END
     
    IF NOT bOK THEN
       SQLInfoGene("ReqDel")
       Info(SQL.MesErreur)
       SQLTransaction(sqlAnnule)
    ELSE
        SQLTransaction(sqlFin)
    END
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  19. #19
    Membre chevronné Avatar de EDM-TAHITI
    Homme Profil pro
    Directeur Service informatique et projet développement
    Inscrit en
    Janvier 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Directeur Service informatique et projet développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 994
    Points : 1 995
    Points
    1 995
    Par défaut
    Hello,
    Citation Envoyé par michel.souris Voir le message
    Pour optimiser le parcours et afficher l'éventuel message d'erreur vous pouvez procéder de la façon suivante :

    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
     
    //Alimentation du tableau tel que vous l'avez faite mais en indicé (pas associatif)
    ...
    //
     
    i est un entier = 0
    bOK est un booléen = true
     
    SQLTransaction(sqlDebut)
     
    WHILE bOK _AND_ i<tabRequete..Occurrence
       i++
       bOk = SQLExec(tabRequete[i],"ReqDel")
    END
     
    IF NOT bOK THEN
       SQLInfoGene("ReqDel")
       Info(SQL.MesErreur)
       SQLTransaction(sqlAnnule)
    ELSE
        SQLTransaction(sqlFin)
    END
    Ca fait plaisir à voir ce code, si, si....
    Bravo Michel!
    le savoir est dans les livres, 'the magic touch F1'
    Amicalement
    Eric

  20. #20
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2011
    Messages : 51
    Points : 80
    Points
    80
    Par défaut
    En utilisant un tableau associatif Est-ce que ce que code vous conviendrait?

    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
     
    SQLTransaction(sqlDébut)
    bOk = Vrai
    sRequete est une chaîne
     
    POUR TOUT ELEMENT sRequete DE tabRequetes	
    	bOk = bOk _ET_ SQLExec(sRequete,"ReqDel") 
    		IF NOT bOk ALORS
    		SQLTransaction(sqlAnnule)
    		SQLTransaction(sqlFin)
    		SQLInfoGene("ReqDel")
    		Info("Erreur SQL : " + SQL.MesErreur)
    		SORTIR
    		FIN
    FIN
    SQLTransaction(bOk ? sqlFin SINON sqlAnnule)
     
    SQLTransaction(sqlFin )
    Pierre

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [SQL] La Fonction SQLTransaction
    Par THOMAS Patrice dans le forum WinDev
    Réponses: 2
    Dernier message: 13/07/2010, 12h33
  2. [windev] fonction frep en FTP
    Par kwakly dans le forum WinDev
    Réponses: 2
    Dernier message: 04/06/2007, 16h17
  3. [WD11] Fonction mktime en WinDev
    Par Emmanuel Lecoester dans le forum WinDev
    Réponses: 8
    Dernier message: 25/01/2007, 17h42
  4. Réponses: 19
    Dernier message: 18/10/2006, 11h47

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