ACCESS - TRANSACTION

Résolu
cs_whispers Messages postés 7 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 1 mars 2007 - 27 févr. 2007 à 15:40
hervat Messages postés 3 Date d'inscription jeudi 9 avril 2009 Statut Membre Derniè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
   
TRT_ERROR:
    MsgBox Me.name + " [bt_OK] " + Err.description + " (" + Trim(Str(Err.Number)) + ") "


    '------------------
    '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
   
    retour = 0
    GoTo LEAVE_FUNC


TRT_ERROR:
    MsgBox "SubstArcodCmd() - Erreur: " + Err.description _
         + " (DebugTrace: " + Trim(Str(DebugTrace)) + ")"
    retour = Err.Number
   
LEAVE_FUNC:
    If rst_wrk.state = adStateOpen Then
        rst_wrk.Close
    End If
   
    SubstArcodCmd = retour
End Function

5 réponses

cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
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)
3
cs_whispers Messages postés 7 Date d'inscription lundi 6 novembre 2000 Statut Membre Derniè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


Whispers   
3
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
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) 
3
cs_whispers Messages postés 7 Date d'inscription lundi 6 novembre 2000 Statut Membre Derniè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 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
hervat Messages postés 3 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 4 mai 2012
28 oct. 2010 à 16:46
je ne sais pas cmt utiliser les transactions en access-vb


Vatusidi Makani
0