PB à toute heure et à tout moment. (à parcourir avec modération)

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 22-06-2010 10:15:38

abdelta  
Bienfaitrice du site
Award: bf
Lieu: La Daguenière
Date d'inscription: 21-03-2007
Messages: 393
Pépites: 14,703
Banque: 9,223,372,036,854,776,000

[RESOLU] Update intempestif

Bonjour,

J'ai une datawindow sur laquelle je fais un contrôle des données avant d'enregistrer :

Code: pb

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)


La sirène noire
http://www.nerdtests.com/images/badge/bf1f6c78865210a9.gif

Hors ligne

 

#2 22-06-2010 11:08:29

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] Update intempestif

Bonjour,

Pour moi tu utilises tout simplement un autre objet transaction pour ta datawindow que SQLCA.

Code: pb

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

 

#3 22-06-2010 11:13:24

abdelta  
Bienfaitrice du site
Award: bf
Lieu: La Daguenière
Date d'inscription: 21-03-2007
Messages: 393
Pépites: 14,703
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] Update intempestif

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.


La sirène noire
http://www.nerdtests.com/images/badge/bf1f6c78865210a9.gif

Hors ligne

 

#4 22-06-2010 11:29:22

Aloneg  
Membre Geek
Date d'inscription: 14-02-2007
Messages: 30
Pépites: 1,182
Banque: 37,934,892,619

Re: [RESOLU] Update intempestif

abdelta a écrit:

Comment m'en sortir ?

J'aurais tendance à coder quelque chose comme ça :

Code: PB

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

 

#5 22-06-2010 11:34:28

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [RESOLU] Update intempestif

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

 

#6 22-06-2010 12:23:32

abdelta  
Bienfaitrice du site
Award: bf
Lieu: La Daguenière
Date d'inscription: 21-03-2007
Messages: 393
Pépites: 14,703
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] Update intempestif

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" ?


La sirène noire
http://www.nerdtests.com/images/badge/bf1f6c78865210a9.gif

Hors ligne

 

#7 22-06-2010 13:18:41

shahin  
Modérateur
Award: bf
Lieu: val de marne
Date d'inscription: 26-09-2006
Messages: 938
Pépites: 8,675,050,269
Banque: 16,218,225,127,617

Re: [RESOLU] Update intempestif

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


never let people work on more than one thing at once.

Hors ligne

 

#8 22-06-2010 13:30:18

abdelta  
Bienfaitrice du site
Award: bf
Lieu: La Daguenière
Date d'inscription: 21-03-2007
Messages: 393
Pépites: 14,703
Banque: 9,223,372,036,854,776,000

Re: [RESOLU] Update intempestif

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****)


La sirène noire
http://www.nerdtests.com/images/badge/bf1f6c78865210a9.gif

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22