Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Je ne comprends pas bien le fonctionnement de ce point.
Voici mon problème :
J'ai une datawindow pour laquelle je peux updater un champ (un checkbox)
Dans le bouton fermer de la fenêtre contenant cette dw, je code dw_1.update()
Si je laisse le code en l'état, tant que je n'ai pas quitté l'application je ne peux pas faire de select * from toto (la tble qui a été updatée), on dirait qu'il y a une transaction ouverte.
Pour que je puisse consulter la table en question, il faut que j'encadre mon update d'un SQLCA.autocommit = true, puis false à la fin du update.
Quelqu'un pourrait-il m'expliquer le fonctionnement de cela.
Si je nespécifie pas ce autocommit, ma base est bloquée ?
Hors ligne
il y a une explication sur l'autocommit et le commit :
http://pbadonf.fr/forum/viewtopic.php?id=128
c'est normale que tu n'aies pas la main apres un update. car on attend apres, un commit ou un rollback.
ca , ce sont des notions de SQL !
Hors ligne
Bonjour,
Une autre solution, plutôt que changer tes paramètres de connexion de ton SQLCA, est de scripter le commit après ton dw_1.update() avec un "commit using sqlca;", celà libèrera les enregistrements bloqués par ta transaction.
Hors ligne
oups, sorry pick ouic, j'avais pas vu ta réponse
Hors ligne
Bonjour,
Comme cette question reste toujours ouverte, je suppose que Deedoo2000 n'a pas encore trouvé l'info recherchée, je tente d'une autre approche, j'espère que cela pourrait aider.
L'attribut autocommit de l'objet transaction permet de dire à PB d'ajouter systématiquement ou non un "commit" après chaque "ordre" envoyé vers SGBD. Le commit valide la transaction passée.
Vue les problèmes cités, je suppose que Deedoo2000 travaille avec Sybase (comme moi). Car Sybase bloque aussi la table en mode lecture.
Pour faire court, il faut toujours positionner l'autocommit à true, repasser à false juste avant de faire dw.update() pour pouvoir faire un rollback.
Quand autocommit est à true, PB ajoute systématiquement un commit après chaque dw.retrieve() par exemple, ce qui permet de ne pas bloquer les tables.
Passer obligatoirement autocommit à false avant de faire dw.update car sinon on ne peut pas faire rollback en cas d'erreur.
sqlca.autocommit=false dw.update() if sqlca.sqlcode <> 0 then ... rollback; else ... commit; end if sqlca.autocommit = true
A+
Hors ligne
tres bien repondu.
je clos le topic.
et je te rajoute 50 pepites.
Hors ligne