cs_whispers
Messages postés7Date d'inscriptionlundi 6 novembre 2000StatutMembreDernière intervention 1 mars 2007
-
27 févr. 2007 à 15:40
hervat
Messages postés3Date d'inscriptionjeudi 9 avril 2009StatutMembreDernière intervention 4 mai 2012
-
28 oct. 2010 à 16:46
Bonjour à tous,
G un soucis avec les transactions (Rollback) sur Access avec VB. Mon appli est sur Access2002 (VB) et mes données sur une base ACCESS2000.
Mon pb est le suivant: Dans ma routine de validation, je fais appel à divers fonctions qui mettent à jour différentes tables. Seulement, il arrive que certaines fonctions ne peuvent pas etre effectuée (ex: ajout des quantites dans un box plein), donc il faut que j'annule toutes les précedentes opérations. J'ai donc mis une transaction en place, mais le rollback ne fonctionne, les opérations effectuées sur les tables annexes restent. Auriez-vous une solution ?
Ci-apres mon code, un peu long c'est vrai désolé
Je vous remercie tous
Private Sub bt_OK_Click()
On Error GoTo TRT_ERROR
Dim rst_wrk As New ADODB.Recordset
Dim msg_result As String
Dim rqsql As String
Dim wrk_str As String
Dim retour As Integer
Dim DebugTrace As Integer
Dim BenneCapacite As Double
Dim WrkTrans As Workspace
Dim WrkBase As Database
'---------------------------------------------------
'Verifie quantité à sortir
'---------------------------------------------------
If Not IsNumeric(qtesortie.Value) Then
MsgBox ("Quantité incorrecte !!!!")
GoTo LEAVE_SUB
End If
If qtesortie.Value > st_qte.Value Then
MsgBox ("Quantité à sortir supérieure au disponible !!!!")
GoTo LEAVE_SUB
End If
'---------------------
'Debut de transaction
'---------------------
Set WrkTrans = DBEngine.CreateWorkspace("BlWrkSpace", "Admin", vbNullString)
Set WrkBase = WrkTrans.OpenDatabase(CurrentDb.name)
WrkTrans.BeginTrans
'--------------------------------
' Saisie article de substitution
'--------------------------------
prv_arcod = GetNewArticle()
If Len(Trim(prv_arcod)) = 0 Then
MsgBox "Susbstitution Annulée"
GoTo ROLLBACK_TRANS
Else
retour = SubstArcodCmd(Me.zl_cmd, prv_arcod, Me.zl_arcod, Me.qtesortie)
If retour <> 0 Then
GoTo ROLLBACK_TRANS
End If
End If
'---------------------------------------------------
'Verifie la benne
'---------------------------------------------------
If IsNull(Me.zl_colisbenne) Or Len(Trim(Me.zl_colisbenne)) = 0 Then
retour = MsgBox("La benne n'est pas renseignée, continuez ?", vbYesNo, "Id. Benne")
If retour = vbNo Then
GoTo ROLLBACK_TRANS
End If
retour = GetIdentifiantNumber(rqsql, "CX")
Me.zl_colisbenne = rqsql
retour = CreateColisHead(Me.zl_colisbenne, COLIS_TYP_STANDARD, Me.zl_desti, Me.zl_cmd)
Else
If LookForColisId(Me.zl_colisbenne) = False Then
retour = "La benne n'est pas enregistré dans le système, continuez ?"
retour = MsgBox(rqsql, vbYesNo, "Id. Benne")
If retour = vbNo Then
GoTo ROLLBACK_TRANS
End If
retour = CreateColisHead(Me.zl_colisbenne, COLIS_TYP_STANDARD, Me.zl_desti, Me.zl_cmd)
Else
'Verifie si capacité de la benne peut contenir quantite
BenneCapacite = ReturnColisQVP(Me.zl_colisbenne)
If BenneCapacite > 0 Then
If Int(Me.qtesortie) + ReturnColisTotalQte(Me.zl_colisbenne) > BenneCapacite Then
MsgBox "Ajout dans benne impossible, capacité max. atteinte "
GoTo ROLLBACK_TRANS
End If
End If
End If
retour = SetColisTiers(Me.zl_colisbenne, Me.zl_desti)
End If
'---------------------------------------------------
' Sortie de stock vers colis/benne du client
'---------------------------------------------------
retour = AddColisLigne(Me.zl_colisbenne, zl_arcod.Value, qtesortie.Value, Me.zl_cmd)
If retour <> 0 Then
GoTo ROLLBACK_TRANS
End If
'---------------------------------------------------
'Mise à jour du stock
'---------------------------------------------------
retour = DelQteFromStockId(zl_st_nbr.Value, qtesortie.Value, True)
'---------------------------------------------------
' Generation de mouvement de sortie de stock
'---------------------------------------------------
adrd = ReturnColisLocation(Me.zl_colisbenne)
retour = GenereMouvement(zl_arcod.Value, zl_st_nbr.Value, Me.zl_colisbenne, MV_TYP_SSTOCK, _
sortie_motif.Value, qtesortie.Value, zl_adrd.Value, adrd, 0, _
Me.zl_desti, zl_cmd.Value, "")
'---------------------------------------------------
'Mise à jour ligne de la commande
'---------------------------------------------------
If Not IsNull(Me.zl_cmd.Value) And Len(Trim(Me.zl_cmd.Value)) > 0 Then
retour = UpdateCmdLigneQte(Me.zl_cmd.Value, TYP_TIERS_CLIENT, Me.zl_arcod.Value, Me.qtesortie)
End If
' Message fin de sortie
retour = MsgBox(msg_result, vbOKOnly, "Enregistrement B.L.")
'------------------
'Fin de transaction
'------------------
WrkTrans.CommitTrans
' reset de données
retour = ClearScreen()
GoTo LEAVE_SUB
'------------------
'Rollback de transaction
'------------------
ROLLBACK_TRANS:
WrkTrans.Rollback
LEAVE_SUB:
If rst_wrk.state = adStateOpen Then
rst_wrk.Close
End If
End Sub
'--------------------------------------------------------------------
'Fonction de modification de commande client - susbstitution article
'---------------------------------------------------------------------
Public Function SubstArcodCmd(commande, prv_arcod, new_arcod, qte)
On Error GoTo TRT_ERROR
Dim rst_wrk As New ADODB.Recordset
Dim rqsql As String
Dim retour As Integer
Dim DebugTrace As Integer
retour = 0
DebugTrace = 0
'Recherche de la ligne de commande à modifier
rqsql = "Select * From tbcmdl " _
+ "Where tbcmdl.cmdl_code = '" + commande + "' " _
+ " And tbcmdl.ar_code = '" + prv_arcod + "' ;"
rst_wrk.Open rqsql, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
If rst_wrk.EOF Then
retour = -1
GoTo LEAVE_FUNC
End If
DebugTrace = DebugTrace + 1
rst_wrk!cmdl_qte = rst_wrk!cmdl_qte - qte
rst_wrk.Update
If rst_wrk.state = adStateOpen Then
rst_wrk.Close
End If
DebugTrace = DebugTrace + 1
'Ajout/Modification nouvelle ligne article dans la commande
rqsql = "Select * From tbcmdl " _
+ "Where tbcmdl.cmdl_code = '" + commande + "' " _
+ " And tbcmdl.ar_code = '" + new_arcod + "' ;"
rst_wrk.Open rqsql, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
If rst_wrk.EOF Then
DebugTrace = DebugTrace + 1
rst_wrk.AddNew
rst_wrk!cmdl_code = commande
rst_wrk!ar_code = new_arcod
rqsql = new_arcod
rst_wrk!cmdl_arprix = GetArticlePrix(rqsql)
End If
DebugTrace = DebugTrace + 1
rst_wrk!cmdl_qte = rst_wrk!cmdl_qte + qte
rst_wrk.Update
If rst_wrk.state = adStateOpen Then
rst_wrk.Close
End If
DebugTrace = DebugTrace + 1
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 27 févr. 2007 à 23:34
Salut
Je n'ai pas eu le courage de tout analyser, mais je pense que cela vient du fait que tu fais des requètes avec un autre RecordSet.
Le RollBack ne s'affectera QUE sur le RecordSet sur lequel tu as commencé la transaction.
Si les données qui ne s'effacent pas ont été insérées dans ta Sub SubstArcodCmd, c'est, à mon avis, normal qu'elles restent.
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Champion du monde de boule de cristal - 2005 Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_whispers
Messages postés7Date d'inscriptionlundi 6 novembre 2000StatutMembreDernière intervention 1 mars 2007 28 févr. 2007 à 00:20
Merci à jack pour sa réponse et effectivement, les données qui ne s'effacent pas sont celles insérées dans la Sub "SubstArcodCmd". Donc je suis un peu dans la M... Connaitriez-vous un moyen de faire un rollback sur une serie d'opérations sur plusieurs recordser ou est-ce qu'il faut je memorise qqpart toutes les opérations, et procéder aux opérations inverses in case of problème? Et encore 1 fois, merci à jack pour ses éclaircissements
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 28 févr. 2007 à 20:11
Salut
Bah deux solutions :
Soit tu fais tes insertions avec le même RecordSet
Soit tu crées aussi une Transaction sur le RecordSet avec lequel tu fais les insertions.
Dans ce dernier cas, il faudra hélas que tu externalises la déclaration du RecordSet pour qu'il existe encore après la sortie de la Sub. Il faut qu'il vive aussi longtemps que nécessaire, jusqu'au moment où tu valideras (Commit) ou annuleras (RollBack) les transactions. Il faudra faire la même action sur chacun des RecordSets concerné.
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Champion du monde de boule de cristal - 2005 et 2006 Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_whispers
Messages postés7Date d'inscriptionlundi 6 novembre 2000StatutMembreDernière intervention 1 mars 2007 1 mars 2007 à 02:31
Ok Jack, merci pour les solutions - je vais donc ajuster mon code en fonction de tout ceci., et si j'ai d'autres éléments ou infos., je tacherais de me souvenir de la phrase de Socrate.
Encore merci !
Whispers
Vous n’avez pas trouvé la réponse que vous recherchez ?