IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

[DAO] Pourquoi mes Recordset ne sont pas inclus dans mes transactions ?


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut [DAO] Pourquoi mes Recordset ne sont pas inclus dans mes transactions ?
    bonjour,

    je deviens fou... J'aimerais gérer mes RecordSet à l'intérieur de transaction.

    J'ai donc préparé une classe DataContext pour travailler dans un Workspace donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    Option Compare Database
    Option Explicit
     
    Private Enum RecordsetLevel
        Parent
        Child
    End Enum
     
    Private ws As DAO.Workspace
    Private db As DAO.Database
     
    Private Sub Class_Initialize()
     
        Set ws = DBEngine.CreateWorkspace("ws", "Admin", vbNullString)
        Set db = ws.OpenDatabase(CurrentDb.Name)
        ws.BeginTrans
    End Sub
     
    Public Function OpenChildRecordset(dataSourceName As String, foreignKey As Long) As Recordset
     
        Set OpenChildRecordset = OpenRecordset(dataSourceName, foreignKey, Child)
    End Function
     
    Public Function OpenParentRecordset(dataSourceName As String, primaryKey As Long) As Recordset
     
        Set OpenParentRecordset = OpenRecordset(dataSourceName, primaryKey, Parent)
    End Function
     
    Public Sub RollBack()
     
        ws.RollBack
        ws.BeginTrans
    End Sub
     
    Public Sub Commit()
     
        ws.CommitTrans
        ws.BeginTrans
    End Sub
     
    Private Function OpenRecordset(dataSourceName As String, key As Long, level As RecordsetLevel) As Recordset
     
        Dim qdf As DAO.QueryDef
     
        Set qdf = db.QueryDefs(dataSourceName)
        qdf.Parameters(IIf(level = Child, "FK", "PK")) = key
        Set OpenRecordset = qdf.OpenRecordset(dbOpenDynaset)
    End Function
    J'utilise cette classe comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    'code d'un formulaire qui appel un autre formulaire :
     
    Private dc As New DataContext
    Private contactEditor As Form
     
    Private Sub OuvreForm
        Set contactEditor.Recordset = dc.OpenParentRecordset("RequêteSourceParamétrée", Me.Liste0)
        Set contactEditor.DataContext = dc
        contactEditor.Modal = True
        contactEditor.Visible = True
    End Sub
    Voici le code du form appelé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Private dc As DataContext
     
     
    Public Property Set DataContext(ByRef context As DataContext)
        Set dc = context
    End Property
     
     
    Private Sub Commande44_Click()
        '
        'Valide les modifications en cours.
        '
        dc.Commit
        Me.Dirty = False
        btcAnnuler.SetFocus
        Commande44.Enabled = False
    End Sub
     
    Private Sub Commande9_Click()
        '
        'Valide les modifications en cours et ferme le form.
        'Ici le code de fermeture du form suppose que le form soit l'objet actif
        '
        dc.Commit
        DoCmd.Close
    End Sub
     
    Private Sub btcAnnuler_Click()
        '
        'Ici le code de fermeture du form suppose que le form soit l'objet actif
        '
        DoCmd.Close
    End Sub
    Voilà, je deviens fou parce que j'ai bien fait attention de créer une transaction quand j'initialise ma classe DataContext, ensuite je travaille toujours avec la même instance de DataContext, mon recordset est créé par DataContext, donc devrait être soumis à la transaction.

    Or, que je commit ou non, les données sont toujours enregistrées...

  2. #2
    Membre Expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Par défaut
    Salut,

    Je ne suis pas sur mais... je ne pense pas que tu puisses utiliser dans ce cas un formulaire dépendant d'une source... peux-tu faire un form indépendant (et donc gérer par code la databinding...)?

  3. #3
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Si si, il est possible d'utiliser des forms dépendants en définissant soi-même son Recordset.

    La limite d'Access réside apparemment dans le fait qu'un Recordset ouvert après le début d'une transaction n'est pas soumis à celle-ci. Ce que je trouve TROP NUL.

    Il faut créer la transaction après avoir ouvert le Recordset. Ce qui enlève de belles possibilités...

  4. #4
    Membre Expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Par défaut
    Surprenant...


    Pourquoi dans ce cas ne pas ajouter une méthode BeginTrans à ta classe...?

  5. #5
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Tu as raison. A première vue cela ne me plaisait pas, d'une part, parce que le nombre de transactions est limité (5 d'après la doc, 6 ou 7 d'après mes tests), d'autre part, parce que ça complique un peu le code, tout simplement.

    Mais je n'ai pas le choix, et si je m'en sors avec des transactions imbriquées, ben ce sera déjà pas mal.

  6. #6
    Membre Expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Par défaut
    Je viens d'essayer en ajoutant une méthode BeginTrans et supprimant le begintrans de l'init de la classe...

    puis en lançant simplement la transaction une fois l'association effectuée... ça semble marcher ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Set contactEditor.Recordset = dc.OpenParentRecordset("RequêteSourceParamétrée", lgKey)
        Set contactEditor.DataContext = dc
        dc.BeginTrans

    Sympa ta classe,... c'est quoi ton objectif au juste?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mes beans ne sont pas reconnus dans la JSP
    Par daydream123 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 27/03/2012, 11h39
  2. Réponses: 3
    Dernier message: 23/05/2009, 13h07
  3. mes _FK ne sont pas persistés dans ma base oracle
    Par mickael.guilbert dans le forum JPA
    Réponses: 4
    Dernier message: 08/02/2008, 11h01
  4. Réponses: 7
    Dernier message: 22/09/2006, 01h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo