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




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







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 ?

Hors ligne




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











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?
Hors ligne




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











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?
Hors ligne




J'ai utilisé la méthode du resetupdate() qui fonctionne dans d'autres applications.
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











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?
Hors ligne




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



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







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

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

Hors ligne




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




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