Powerbuilder pour les completement Geeks !

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