Partager via

access sql server : erreur 3157

Anonyme
2021-03-21T15:14:00+00:00

Bonjour,

Je me bats depuis quelques jours sur le problème suivant :

J'ai migré une base de donnée Access sur SQL server 2012, avec Access en application front end et la base de donnée SQL sur serveur en  back end. Dans l'ensemble, tout a bien fonctionné à l'exception du problème suivant

J'ai une table de suivi de consommation comprenant environ 8700 entrées. Il y a une clé primaire, aucune contrainte ni clé secondaire.

La consultation/saisie se fait via un formulaire access liée à la table en ODBC. Or ce formulaire bloque sur les mise à jour d'information de la table.

J'ai fait les investigations suivantes, à partir de l'application en front end Access :

  • accès direct à la table sql depuis Access  : les données peuvent être éditée et modifiée sans problème.
  • modification via requête Update SQL dans l'interface Access : fonctionne sans problème.

UPDATE MaTable SET Energie = 110 WHEREIDMaTable = 8366

Microsoft 365 et Office | Access | Pour la maison | Windows

Question verrouillée. Cette question a été migrée à partir de la Communauté Support Microsoft. Vous pouvez voter pour indiquer si elle est utile, mais vous ne pouvez pas ajouter de commentaires ou de réponses ni suivre la question.

0 commentaires Aucun commentaire

19 réponses

  1. Anonyme
    2021-03-22T07:57:37+00:00

    Merci du retour.

    J'ai un peu avancé sur le problème. Je vais essayer d'expliquer le plus clairement possible

    J'ai, pour faire simple : 

    - une table nommée MaTable,

    - un formulaire continu frmAllrecords qui pointe sur maTable via une requête SQL directe comme source de donnée, nommée qry_frmAllRecords. Ce formulaire permet de parcourir la base et de sélectionner un enregistrement particulier

    • un formulaire frmForm, qui édite un enregistrement particulier. Ce formulaire est en général appelé depuis le formulaire frmAllRecords, en cliquant sur un enregistrement, via le code VBA  indiqué plus haut. Lorque le formulaire frmForm s'ouvre sur l'enregistrement sélectionné, le formulaire frmallRecords reste ouvert dans un onglet.

    J'ai maintenant clairement identifié le problème : lorsque j'ouvre le formulaire frmAllRecords, la requête source bloque la table dans son intégralité. Je ne peux effectuer aucune modification/ajout, soit directement sur la base ou via le formulaire d'édition frmForm.

    La base est libérée dès que je ferme frmAllRecords. Je peux alors intervenir sur la table directement, ou via le formulaire frmForm pour un enregistrement donné.

    Lorsque je lance la requête source directe qry_frmAllRecords, j'obtiens le même blocage. La table se libère lorsque je ferme la fenêtre de requête. Cette requête fait intervenir plusieurs table : (ci dessous le code complet)

    SELECT T1.IDConsoFour, T1.DateHeureSaisie, T1.DateHeureReleve, T1.DateProduction, T1.Poste, T1.Equipe, Left(tblConsoFour.Commentaire,255) AS Comm, T1.HeuresArretProd, T1.HeuresArretMaint, T1.HeuresArretEffacement, T1.IDCampagne, Count(T2.IDPointageFour) AS NbPointages, T3.CodeCampagne, T4.NomClient

    FROM (tblCampagnes AS T3 LEFT JOIN tblClients AS T4 ON T3.IDClient = T4.IDClient) INNER JOIN (tblConsoFour AS T1 LEFT JOIN tblPointageFour AS T2 ON T1.IDConsoFour = T2.IDConsoFour) ON T3.IDCampagne = T1.IDCampagne

    GROUP BY T1.IDConsoFour, T1.DateHeureSaisie, T1.DateHeureReleve, T1.DateProduction, T1.Poste, T1.Equipe, Left(tblConsoFour.Commentaire,255), T1.HeuresArretProd, T1.HeuresArretMaint, T1.HeuresArretEffacement, T1.IDCampagne, T3.CodeCampagne, T4.NomClient

    ORDER BY T1.DateHeureReleve DESC;

    A noter : lorsque je remplace la requete SQL directe dans le formulaire par une requete normale Access (insertion directe du code ci dessus dans le formulaire frmAllRecords), la table n'est pas verrouillée.

    Merci de vos éclaircissement

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  2. Anonyme
    2021-03-21T18:36:22+00:00

    Nous utilisons un service de traduction pour assister nos utilisateurs. Veuillez nous excuser pour les éventuelles erreurs grammaticales.

    Ok, deux ou trois choses. Tout d’abord, lorsque vous ouvrez le formulaire avec la commande :

    DoCmd.OpenForm « frmForm », acNormal, , , « IDTable - 8366 », acFormEdit, acWindowNormal

    vous l’ouvrent avec un filtre. Donc, il ne montrera qu’un enregistrement, sauf si vous effacer le filtre. Vous devriez être en mesure de modifier cet enregistrement, mais pas de modifier les enregistrements à moins que vous n’entiez le filtre.

    Tu n’as toujours pas expliqué ce que signifie le blocage. donc je me demande si vous croyez, puisque vous ne pouvez pas naviguer vers d’autres enregistrements, c’est ce que vous entendez par blocage. Pouvez-vous modifier le seul enregistrement affiché ?

    Aussi que le code ouvre un formulaire nommé frmForm, pas frmAllRecords. Cela peut aussi faire partie de la question.

    Malheureusement, comme je ne vois pas ce que vous voyez, je dois me fier à vos descriptions du problème. Et vous ne fournissez pas assez d’informations.

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  3. Anonyme
    2021-03-21T18:16:46+00:00

    Bonjour ScottBDiamond

    Merci de t'intéresser à mon sujet.

    Suite à tes indications, j'ai refait quelques tests et je pense avoir trouvé l'origine du problème (mais pas encore la solution)...

    Ma base de données est organisée de la manière suivante  : 

    Je dispose d'un formulaire frmAllRecords    qui me permet de visualiser l'ensemble des enregistrements de la table sous forme de liste. Il est lié à la table via une requête SQL directe (pass through) , qui elle -même contient le code "SELECT * FROM Table"

    A partir de ce formulaire, je peux visualiser un enregistrement donné via la commande VBA (à l'intérieur de mon formulaire multiple), par exemple pour l'enregistrement 8366 :

    DoCmd.OpenForm "frmForm", acNormal, , "IDTable = 8366", acFormEdit, acWindowNormal

    Ce que je viens de découvrir, c'est que le formulaire frmAllRecords, lorsqu'il est ouvert, bloque TOUS les enregistrements de la table (alors que je pensais que les requêtes SQL directes étaient en lecture seule, et ne bloquaient pas en mise à jour).

    Dès que je ferme le formulaire frmAllRecords, je peux à nouveau éditer les enregistrements et les modifier.

    La question est donc : comment paramétrer le formulaire frmAllRecords pour qu'il ne bloque pas la table entière ?

    Ce qui est curieux, c'est que j'ai d'autres tables fonctionnant sur le même principe, mais qui ne semblent pas poser de problème.

    merci pour le support

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  4. Anonyme
    2021-03-21T16:17:23+00:00

    Nous utilisons un service de traduction pour assister nos utilisateurs. Veuillez nous excuser pour les éventuelles erreurs grammaticales.

    Salut DE13AL, je suis un conseiller indépendant et va essayer d’aider.

    Vous dites; « ce formulaire bloque les mises à jour d’information de la table. » Pouvez-vous expliquer en détail ce que cela signifie. Que se passe-t-il lorsque vous essayez? Obtenez-vous un message d’erreur? Avez-vous vérifié pour vous assurer que les mises à jour autoriser sont définies sur Oui ?

    Il est clair que ce n’est pas le lien ODBC puisque puisque vous pouvez mettre à jour la table directement ou par le biais d’une requête. Donc, le problème doit être la forme. Avez-vous essayé de créer un nouveau formulaire lié à la table.

    S’il vous plaît fournir plus d’informations afin que nous puissions vous aider.

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  5. Anonyme
    2021-03-21T15:21:52+00:00

    Bonjour,

    Je me bats depuis quelques jours sur le problème suivant :

    J'ai migré une base de donnée Access sur SQL server 2012, avec Access en application front end et la base de donnée SQL sur serveur en  back end. Dans l'ensemble, tout a bien fonctionné à l'exception du problème suivant

    J'ai une table de suivi de consommation comprenant environ 8700 entrées. Il y a une clé primaire, aucune contrainte ni clé secondaire.

    La consultation/saisie se fait via un formulaire access liée à la table en ODBC. Or ce formulaire bloque sur les mise à jour d'information de la table.

    J'ai fait les investigations suivantes, à partir de l'application en front end Access :

    • accès direct à la table sql depuis Access  : les données peuvent être éditée et modifiée sans problème.
    • modification via requête Update SQL dans l'interface Access : fonctionne sans problème.

    UPDATE MaTable SET Energie = 110 WHERE IDMaTable = 8366

    le problème survient lorsque je tente de mettre à jour un enregistrement à partir d'un formulaire liée à la table : le formulaire attend 60s, puis se ferme et la mise à jour n'est pas effectuée.

    Lorsque j'essaie à nouveau une mise à jour via la requête SQL depuis Access, après un laps de temps de 60s, j'obtiens le message d'erreur suivant :

    "ODBC - Echec de mise à jour d'une table liée".

    J'ai parfois l'indication d'une erreur 3157.

    Il semble que la table se bloque suite à l'utilisation du formulaire. La fermeture et la réouverture d'Access permet de la débloquer

     

    Merci de votre aide

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire