Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
J'ai une datawindow sur laquelle je fais un contrôle des données avant d'enregistrer :
If wf_controle_saisie() < 1 then Return -1 end if If dw_validation_reservation.Update() <> 1 Then inv_sql.of_rollback(SQLCA) return -1 Else inv_sql.of_commit(SQLCA) return 1 End If
Malgré mon return -1, les modifications sont enregistrées : je les retrouve lors du retrieve suivant. Encore plus bizarre, elles ne sont pas mises à jour dans la base jusqu'à ce que je ferme mon appli (il y a un autocommit à la fermeture).
Est-ce que quelqu'un a déjà eu ce genre de bizarerie ? Comment m'en sortir ? Où chercher ?
Dernière modification par abdelta (22-06-2010 13:32:14)
Hors ligne
Bonjour,
Pour moi tu utilises tout simplement un autre objet transaction pour ta datawindow que SQLCA.
dw_validation_reservation.SetTransObject(SQLCA) ?
Dans ce cas le comporte devient logique (pas de rollback) puisque par défaut il y a un autocommit sur l'événement close des fenêtres dans PB.
Hors ligne
buck a écrit:
Bonjour,
Pour moi tu utilises tout simplement un autre objet transaction pour ta datawindow que SQLCA.
Non, il n'y a qu'un seul objet transaction dans cette appli.
buck a écrit:
Dans ce cas le comporte devient logique (pas de rollback) puisque par défaut il y a un autocommit sur l'événement close des fenêtres dans PB.
Je ne ferme pas ma fenêtre entre le return -1 (celui qui suit le wf_controle_saisie) et le retrieve. Pourtant je retrouve les modifications.
Hors ligne
abdelta a écrit:
Comment m'en sortir ?
J'aurais tendance à coder quelque chose comme ça :
long ll_return If wf_controle_saisie() < 1 then ll_return = -1 else If dw_validation_reservation.Update() <> 1 Then inv_sql.of_rollback(SQLCA) ll_return = -1 Else inv_sql.of_commit(SQLCA) ll_return = 1 End If End If return ll_return
De toute façon, on m'a toujours appris que les return au milieu du code, c'est le mal
Hors ligne
Bonjour,
Il y a une autre possibilité. La propriété autocommit de ton objet transaction est valide :
Transaction.AutoCommit Boolean The automatic commit indicator.
Values are:
TRUE - Commit automatically after every database activity.
FALSE - Do not commit automatically after every database activity.
Hors ligne
Aloneg, ta solution ne change rien à mon problème. Mais comme c'est plus propre, je vais la mettre en place.
Buck, j'ai vérifié, l'autocommit de la transaction est à false, c'est donc encore une fausse piste.
Ce qui m'étonne le plus, c'est que, en interrogeant la base de données directement avec PL/SQL, les données ne sont pas mises à jour tant que l'appli est ouverte ; et pourtant le retrieve trouve les modifications. Est-ce que le retrieve est capable de ramener les données quand elles ne sont pas "commitées" ?
Hors ligne
Normal Abdelta, ça veut juste dire que tu es à l'intérieur d'une transaction.
Donc, inv_sql.of_rollback(SQLCA) ne fonctionne pas ou n'a pas été éxécuté.
Je penche pour la 2° hypothèse.
D'autre part, il y a quand même quelque chose de bizarre.
Pourquoi il retourne -1 ?
Si c'est à cause de wf_controle_saisie, le dw.update() n'est pas exécuté (rollback inutile ?)
Si c'est dw.update() qui renvoie -1, ça veut dire que c'est Oracle qui a refusé les mises à jour (là encore rollback inutile)
Conclusion : il y a eu des mises à jour AVANT le controle de saisie, et c'est lui qui est en erreurs.
Petite remarque : dw.update() : quand on n'utilise pas les transactions
Avec les transactions : dw.update(..., false), puis dw.ResetUpdate ( ) en cas de succès
PS: Autocommit ne fonctionne pas avec Oracle
Hors ligne
Alors,
En effet, j'étais dans une même transaction. Le wf_controle_saisie ramenait -1 donc ni commit ni rollback ; c'est pourquoi le retrieve ramenait les modifs. J'ai finalement mis un rollback plus loin (dans un autre événement) pour sortir de la transaction et retrouver des données cohérentes.
Le of_rollback ne sert que si le contrôle se passe bien (wf_controle_saisie = 1) et que l'update échoue.
Merci à tous, distribution de pépites (100 à chacun, parce que j'étais vraiment dans la m****)
Hors ligne