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

Access Discussion :

[JET]Corruption de données malgrés verrouillage pessimiste [À faire]


Sujet :

Access

  1. #1
    jjd
    jjd est déconnecté
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [JET]Corruption de données malgrés verrouillage pessimiste
    Je me permet de reposter ce message dans l'espoir qu'un "ponte" d'access puisse se pencher sur mon problème.

    D'avance merci.

    Bonjour à tou(te)s,

    Je suis confronté de façon récurrente à un problème de corruption de données causée par des tentatives de modifications concurentes d'enregistrements.
    Mon contexte :
    Une consultation médicale, médecins et secrétaires utilisant la base.
    Base Access 97 composée d'un mdb contenant les tables sur un serveur et une dizaine de clients avec sur chaque poste un mdb contenant les formulaires, requêtes... et les attaches aux tables. Au maximun 4 à 5 clients sont connectés ensemble.
    L'erreur rencontrée assez fréquement (2 fois par mois environ) entraine la perte du champ corrompu. Le message est:

    The Microsoft Jet database engine stopped the process because you and another user are attempting to change the same data at the same time.

    Etant en verrouillage optimiste au départ, depuis les premières corruptions je suis passé en verrouillage pessimiste (option Enregistrement verrouillé) sur chaque poste client, mais le problème persiste.
    Avez-vous déjà été confronté à ce problème et que peut-on faire de plus ?

    D'avance merci de vos réponses,

    Jean-Jacques DONATÉ.
    Centre Hospitalier d'Argenteuil

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 170
    Points
    12 170
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Oui, j'ai déjà rencontré ce type de problème et y avais remédié pour une petite base (enfin l'affichage du message) avec une petite fonction maison que je vous donne ci-dessous:

    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
    'Function used to check if a record is already in use
    '*** - Created by JPA on 2000-04-06 (Sales trading) -***************************************************************************************************************
    Function checkIfRecordIsLocked(ByVal IDPrimaryKey As Long) As Boolean
    Dim oDB As Database
    Dim oRS As Recordset
    Dim sqlSelection As String
    Dim currentDate As Date
    Dim sConnectedUser As String
     
    On Error GoTo L_ErrLocked
     
      sqlSelection = "SELECT MaTable.ID, MaTable.DateCreation"
      sqlSelection = sqlSelection & vbCrLf & "FROM MaTable"
      sqlSelection = sqlSelection & vbCrLf & "WHERE (((MaTable.ID)=" & IDKey & "));"
      Set oDB = CurrentDb
      Set oRS = oDB.OpenRecordset(sqlSelection, dbOpenDynaset)
     
         With oRS
            currentDate = !DateCreation
            .Edit
            !DateCreation = currentDate
            .Update
            .Close
         End With
         checkIfRecordIsLocked = False
     
    L_ExitLocked:
        Set oDB = Nothing
        Set oRS = Nothing
        Exit Function
    L_ErrLocked:
        sConnectedUser = fnctGetConnectedUserName(Err.Description)
        sConnectedUser = IIf(Len(sConnectedUser) > 0, sConnectedUser, "un tiers")
        checkIfRecordIsLocked = True
        MsgBox "ATTENTION !!!" & vbCrLf & vbCrLf & "Cet enregistrement en cours d'utilisation par " & sConnectedUser & "..." & vbCrLf & vbCrLf & "Il ne peut pas être mis à jour !", 16, "Enregistrement verrouillé"
        Resume L_ExitLocked
    End Function
    Le principe était des plus simple, tenter de mettre à jour une date dans une table spécifique (celle qui concerne votre problème) avec une valeur identique à la sienne... Utilisez alors cette fonction sur un bouton "Enregistrer" du formulaire.

    Mais je vous conseille plutôt de viser le mode transactionnel beaucoup plus fiable et certainement mieux adapté à votre situation.

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  3. #3
    jjd
    jjd est déconnecté
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci de cette rapide réponse
    J'ai bien sûr pensé à passer sur SQL Server MSDE mais celà pose plusieurs problèmes matériels (acquisition d'un "vrai serveur" dédié à l'application, temps de développement, etc...) qu'il faut tout d'abord résoudre.
    Je vais donc commencer par appliquer votre méthode, plus immédiatement utilisable. Pourriez-vous me donner le code de la fonction fnctGetConnectedUserName qui vient je suppose des API Windows ?

    Encore merci,

    Jean-Jacques DONATÉ.
    Centre Hospitalier d'Argenteuil

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 170
    Points
    12 170
    Billets dans le blog
    5
    Par défaut
    Re,

    Pas besoin de MSDE pour faire du transactionnel...
    Quand je parle de mode transactionnel, je veux dire que les opérations SQL (UPDATE-INSERT-DELETE) doivent être en "mode transactionnel" à savoir pour certaines d'entre elles, un BeginTrans, un CommitTrans et un RollBack.
    Access sait très bien faire ça...
    Quant à fnctGetConnectedUserName(), ce n'est pas une API mais ni plus ni moins une autre fonction maison qui en regard du message d'erreur (Err.Description) extrait le nom du UserName (Login) va chercher les Noms et prénoms en fonction de ce login dans une table annexe.

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  5. #5
    jjd
    jjd est déconnecté
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci j'ai (enfin presque) tout compris et vais mettre en oeuvre votre solution.

    Bien cordialement,

    Jean-Jacques DONATÉ.
    Centre Hospitalier d'Argenteuil.

Discussions similaires

  1. [AC-2007] Verrouillage pessimiste dans un formulaire (ADP)
    Par dataset dans le forum IHM
    Réponses: 2
    Dernier message: 06/10/2009, 08h25
  2. Communication réseau et corruption de données
    Par elthenia dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 26/06/2008, 09h36
  3. corruption de données dans une session
    Par Bigstef dans le forum Langage
    Réponses: 2
    Dernier message: 12/06/2008, 15h41
  4. [HIBERNATE] Verrouillage pessimiste
    Par enjoy dans le forum Hibernate
    Réponses: 0
    Dernier message: 06/12/2007, 17h42
  5. Corruption des données téléchargées sur le net
    Par Matthieu Brucher dans le forum Administration
    Réponses: 5
    Dernier message: 27/09/2005, 08h58

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