PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV (earlier versions) → Problème fonctionnement Transactions HF C/S
Problème fonctionnement Transactions HF C/S
Started by Serge MAURY, Dec., 14 2018 11:13 AM - 1 reply
Registered member
4 messages
Posted on December, 14 2018 - 11:13 AM
Bonjour,

Je rencontre un problème récurent sur une de mes applications. Je protège un traitement assez complexe par une transaction avec le code de type suivant :

si htransactiondebut() alors
Quand exception dans
//Etape 1 : Code avec suppression d'enregistrement dans une table
//Etape 2 : Code avec création d'enregistrements dans plusieurs tables
//Etape 3 : Autres codes

htransactionfin()
faire
htransactionannule()
//Code ouvrant une fenêtre avec affichage d'une erreur
fin
fin

Lorsqu'une erreur système intervient (Erreur systeme : Access violation (GPF)), l'exception fonctionne et le code suivant Faire est bien exécuté. Notez que htransactionannule est exécuté en premier Le logiciel est cependant complètement figé sur la fenêtre affichant le code erreur. L'utilisateur est obligé de redémarrer son pc pour libérer de la mémoire.

Cependant lorsqu'il relance l'application, la transaction n'a pas eu l'effet escompté puisqu'une partie des enregistrements supprimé à l'étape 1 ont disparu.

J'ai donc un doute sur l'efficacité des transactions.
J'ai fait un peu de lecture sur la doc et sur différents forum et j'ai localisé le fichier TRSOperation.TRS contenant la liste des opérations sous transaction et le dossier avec le nom de la base de données contenant les fichiers concernés par les transactions.
La date de modification de ces fichiers n'est pas celle du jour alors que ces transactions sont déclenchées tous les jours sur mon système.

Je précise que j'ai environ 15 utilisateurs qui utilisent cette application en version 20. Que la base est une base HF C/S. (Le moteur de base à été mis à jour en Version 21).


Est ce normal ?
Existe il un paramètre quelque-part qui désactive les transactions ou modifie l'emplacement de ces fichiers ?

Merci par avance à ceux qui pourront me donner des pistes pour déterminer d'où vient mon problème.


Pour info :

Je viens d'ajouter un code trouvé sur un forum pour libérer de la mémoire en espérant que cela résoudra mon problème sur ce point mais j'aimerais être certain de pouvoir faire confiance aux transactions ce qui n'est plus le cas en ce moment.

Je vais migrer en version 23 début 2019.
Registered member
299 messages
Popularité : +16 (16 votes)
Posted on December, 17 2018 - 12:31 PM
Savoir si votre problème provient de la transaction ou de la levée de l'exception.

Je travaille autrement :
Chaque exécution SQL renvoie un booléen, VRAI si tout est OK FAUX sinon
Je définis un booléen en début de fonction
A chaque exécution je fais évoluer le booléen.
Au final si il est toujours à VRAI je fait un commit sinon un rollback.

Ce qui donne
SI LB_OK ALORS LB_OK = IAD_Execute("Start transaction")
SI Val(LT_ID[2]) = 0 ALORS
LC_SQL = InsertTDV()
SI LB_OK ALORS LB_OK = IAD_Execute(LC_SQL)
LC_SQL = InsertDetail()
SI LB_OK ALORS LB_OK = IAD_Execute(LC_SQL)
SINON
SI LB_OK ALORS LB_OK = IAD_Execute(LC_SQL)
FIN

// insertion table détail
LC_SQL = "delete from rdv_rlvdetail where RLV_ID = " + LT_ID[2]
SI LB_OK ALORS LB_OK = IAD_Execute(LC_SQL)
POUR i = 1 _A_ pop_SaisieRDV.zr_Liste..Occurrence
LC_SQL = ...
SI LB_OK ALORS LB_OK = IAD_Execute(LC_SQL)
FIN

SI LB_OK ALORS
AgendaAjouteRendezVous(ag_Planning, LO_RDV)
Info("Le rendez-vous a été enregistré")
IAD_Execute("Commit")
SINON
Info("Des erreurs ont été rencontrées.", "Le rendez-vous a été enregistré.")
IAD_Execute("RollBack")
FIN


En espérant que ça pourra vous aider