Pas de problème (pb), que du PowerBuilder (PB) ^^

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 21-03-2008 10:34:04

jcc  
Membre completement Geek
Lieu: Mouscron
Date d'inscription: 08-01-2008
Messages: 142
Pépites: 13,733
Banque: 409,387,083,524

[RESOLU] besoin d'aide sur une transaction

Le décor: les tables "demande", "solde", "ventilation" sous SqlAnyWhere

Lorsqu'une personne fait une demande de congé, une numéro de demande est octroyé.
Le nombre d"heures doit subir une ventilation via 3 compteurs de solde.
Ces ventilations (MAx 3 par demande) sont sauvée dans la table "ventilation"
Et pour terminer les soldes de la table "solde" sont recalculés en fonction de cette ventilation.

Pour l'instant, lorsque je clique sur le bouton de validation de la demande de congé, celle-ci est sauvée dans la table "DEMANDE"
La table "Ventilation" est liée à la table "demande" de ce fait la demande doit exister pour créer les ventilations.
De ce fait, je commit la demande avant de lancer la ventilation.
Pendant la ventilation, il y a création de max 3 enregistrements dans la table "ventilation". Je boucle avec commit à chaque fois.
Une fois terminée, je fais la maj des soldes dans la table "solde"

Ce que je voudrais c'est que le tout ne fasse qu'une transaction pour qu'en cas de problème, les soldes restent inchangés, la ventilation ne se fasse pas et par conséquent la demande soit refusée.

Quelqu'un aurait une idée pour faire quelque chose de propre?

Dernière modification par jcc (25-03-2008 11:05:20)

Hors ligne

 

#2 21-03-2008 10:45:24

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: [RESOLU] besoin d'aide sur une transaction

euh... arrêtez moi si je dis une énorme bêtise mais tu n'as pas besoin de commiter "demande" pour insérer dans "ventilation" justement si tu utilise une seule transaction pour les 2 opérations, ensuite quand tout est fini tu commite ou pas.

à moins que ça marche autrement dans SqlAnyWhere ?


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

#3 21-03-2008 10:55:45

jcc  
Membre completement Geek
Lieu: Mouscron
Date d'inscription: 08-01-2008
Messages: 142
Pépites: 13,733
Banque: 409,387,083,524

Re: [RESOLU] besoin d'aide sur une transaction

<<Demande>> 0,n ---------- (1,1)  <<Ventilation>>

Pour qu'une ventilation soit créer il faut que la demande existe

Donc si la demande n'est pas commitée, la création de la ventilation donne une erreur.

A mon avis, si la ventilation plante je dois deleter la demande.

Autre chose, comme je boucle pour sauver mes Max 3 ventilations, suis-je obligé de commiter à chaque fois.
Y-a-t'il un moyen de charger mes MAx 3 ventilations et de faire le commit à la fin en dehors de la boucle? Si oui, comment faire?
Je fais cela via un datastore

Dernière modification par jcc (21-03-2008 10:56:34)

Hors ligne

 

#4 21-03-2008 11:02:50

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2493
Pépites: 106
Banque: 9,223,372,036,854,775,808

Re: [RESOLU] besoin d'aide sur une transaction

Ton insertion dans ces différentes tables est effectuée au sein d'une ou plusieurs procédures?
Ou tout est effectué depuis différentes datastores générant elles-mêmes les insert /updates?


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#5 21-03-2008 11:08:51

jcc  
Membre completement Geek
Lieu: Mouscron
Date d'inscription: 08-01-2008
Messages: 142
Pépites: 13,733
Banque: 409,387,083,524

Re: [RESOLU] besoin d'aide sur une transaction

La mise à jour de la table demande se fait via l'évènement clicked du bouton validation. MaJ de la DW demande.

Le clicked event du bouton fait appel à une fonction qui utilise un datastore pour la ventilation et un datastore pour la table solde

Hors ligne

 

#6 21-03-2008 11:27:11

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2493
Pépites: 106
Banque: 9,223,372,036,854,775,808

Re: [RESOLU] besoin d'aide sur une transaction

Au niveau du SQLCA, l'autocommit est activé ou non?
Les COMMIT dont tu parles sont codés où? Dans le script de mise à jour de tes datastores?
Ce sont des datastores mises à jour par procédures stockées ou non?
Où sont codés les débuts et fin de transactions?


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#7 21-03-2008 11:49:13

jcc  
Membre completement Geek
Lieu: Mouscron
Date d'inscription: 08-01-2008
Messages: 142
Pépites: 13,733
Banque: 409,387,083,524

Re: [RESOLU] besoin d'aide sur une transaction

J'ai utilisé la méthode du resetupdate() qui fonctionne dans d'autres applications.

Code: pb

if l_ds_ventil.update(true,false) = 1 then
      if l_ds_solde.update(true,false) = 1 then
           l_ds_ventil.resetupdate()
           l_ds_solde.resetupdate()
           commit;
      else
           rollback;
      end if
end if


Mais je viens de découvrir que cette méthode ne fonctionne pas en webform.
Or, c'est cela que je veux faire. Alors comment faire cela en webform?

Hors ligne

 

#8 21-03-2008 12:11:01

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2493
Pépites: 106
Banque: 9,223,372,036,854,775,808

Re: [RESOLU] besoin d'aide sur une transaction

Bon, pour les webforms, je ne vais pas pouvoir t'aider. Par contre, les settransobjets sur tes datastores sont bien codés en amont je suppose?


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#9 21-03-2008 12:16:25

jcc  
Membre completement Geek
Lieu: Mouscron
Date d'inscription: 08-01-2008
Messages: 142
Pépites: 13,733
Banque: 409,387,083,524

Re: [RESOLU] besoin d'aide sur une transaction

Aucun problème à ce niveau là.

C'est uniquement le update(boolean accept, boolean resetflag) qui n'est pas accepté en webform.
Et je ne connais une méthode équivalente pour que cela fonctionne.

Hors ligne

 

#10 21-03-2008 14:05:40

FMolinas  
Membre Geek
Lieu: Lyon
Date d'inscription: 12-06-2007
Messages: 87
Pépites: 97
Banque: 6,435,474,948,567

Re: [RESOLU] besoin d'aide sur une transaction

Tu peux aussi jeter un oeil à l'option wait_for_commit de SQLAnywhere.
En gros, elle permet de ne vérifier les contraintes d'intégrité que lors d'un commit, ce qui te permettrait de passer tes mises à jour en une transaction unique.

Hors ligne

 

#11 21-03-2008 14:57:17

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: [RESOLU] besoin d'aide sur une transaction

jcc a écrit:

<<Demande>> 0,n ---------- (1,1)  <<Ventilation>>

Pour qu'une ventilation soit créer il faut que la demande existe

Donc si la demande n'est pas commitée, la création de la ventilation donne une erreur.

sauf si tu fais les 2 opérations dans la même transaction.

à ce moment là ta transaction elle connait déjà tes inserts dans "demande" même si ils sont pas commités

autrement dit tu n'as pas besoin de commiter tes inserts dans "demande" pour faire des inserts qui leurs sont liés dans "ventialtion" A CONDITION d'employer la même transaction pour les 2 inserts


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

#12 23-03-2008 12:10:13

pick ouic  
La bourse ou la vie ^^
Award: gearotter
Lieu: Massy-Verrières
Date d'inscription: 30-05-2006
Messages: 4685
Pépites: 1,025
Banque: 2,147,483,647
Site web

Re: [RESOLU] besoin d'aide sur une transaction

tu passes via des updates datawindows ?
dans ce cas, regardes l'aide en ligne...


Connaitre son ignorance est une grande part de la connaissance.
http://animegifs.free.fr/anime/mazinger/mazinger.gif

Hors ligne

 

#13 25-03-2008 09:54:20

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: [RESOLU] besoin d'aide sur une transaction

Peut-etre une bete question, mais quel est l'isolation level de l'objet de transaction que tu utilise pour tes 3 datawindow?
L'isolation est peut etre pas assez permissive pour qu au sein d'une meme transaction tu ne puisse voir tes insert non commites... Essaie de mettre la trans en RU avant de faire les insert de demande, et remet la a sa valeur precedente apres l'update de solde...

Sinon, tu fais des [dw].settransobject(sqlca) ou des [dw].settrans(sqlca)?

Et sinon, pour les web forms, ou as tu vu que l'update avec 2 arguments n'est pas supporte? C'est possible hein, mais je ne trouve pas dans la doc...

Hors ligne

 

#14 25-03-2008 11:04:38

jcc  
Membre completement Geek
Lieu: Mouscron
Date d'inscription: 08-01-2008
Messages: 142
Pépites: 13,733
Banque: 409,387,083,524

Re: [RESOLU] besoin d'aide sur une transaction

rincevent a écrit:

jcc a écrit:

<<Demande>> 0,n ---------- (1,1)  <<Ventilation>>

Pour qu'une ventilation soit créer il faut que la demande existe

Donc si la demande n'est pas commitée, la création de la ventilation donne une erreur.

sauf si tu fais les 2 opérations dans la même transaction.

à ce moment là ta transaction elle connait déjà tes inserts dans "demande" même si ils sont pas commités

autrement dit tu n'as pas besoin de commiter tes inserts dans "demande" pour faire des inserts qui leurs sont liés dans "ventialtion" A CONDITION d'employer la même transaction pour les 2 inserts

OK, merci. Ca fonctionne

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22