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 :

Access 2003 ODBC Call Failed error


Sujet :

VBA Access

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut Access 2003 ODBC Call Failed error
    Bonjour,
    Premièrement, voici mes outils : j'ai un application Access 2003 qui utilise une BD SQL (je sais, c'est étrange). J'utilise Microsoft SQL Server Management Studio Express.
    J'essaie présentement d'exécuter une requête à partir de mon application pour insérer quelques lignes de 2 tables dans une autre. Ma requête fonctionne bien quand je l'exécute directement dans SQL Server Management ou quand je crée une nouvelle requête et que je l'exécute en mode SQL dans Access, mais étrangement elle ne fonctionna pas à partir de mon application... Je reçois un erreur du genre "ODBC Call failed" pour une raison inconnue que je ne peux découvrir car ma requête fonctionne bien quand je l'exécute à partir d'SQL Server Management ou le créateur de requête de Access...

    Voici mon code VBA :
    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
    49
    50
    51
    52
    53
    54
     
    Private Sub cmdReport_Click()
    On Error GoTo Erreur
    ErrRoll = False
     
    '** sauvegarde l'enregistrement !!
    DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
    Dim Db As Database
    Dim Ws As Workspace
    Dim Rs As Recordset
    Dim Rs1 As Recordset
    Dim Rs2 As Recordset
    Set Ws = DBEngine.Workspaces(0)
    Set Db = CurrentDb
    Dim HasDuplicate As Boolean
    HasDuplicate = False
    '** Recherche les doublons dans Tag #
    Set Rs = Db.OpenRecordset("SELECT DISTINCTROW First(TbTrxInHstDtl.NoTrx) AS NoTrxChamps, First(TbTrxInHstDtl.TagNo) AS UnitéNumberChamps, Count(TbTrxInHstDtl.NoTrx) AS NombreDeDbls FROM TbTrxInHstDtl " _
        & "GROUP BY TbTrxInHstDtl.NoTrx, TbTrxInHstDtl.tagNo " _
        & "HAVING (((Count(TbTrxInHstDtl.NoTrx))>1) AND ((TbTrxInHstDtl.NoTrx)=" & Me![NoTrx] & ") AND ((Count(TbTrxInHstDtl.TagNo))>1));", 8)
    If Not Rs.BOF Then
        MsgStop ("Le même numéro de Tag est inscrit en double !" & Chr$(13) & "Corrigez.")
        [RqTrxInDtl].SetFocus
        Exit Sub
    End If
    '*** check si en inventaire on a meme Tag No pour meme BOL(in)
    Set Rs = Db.OpenRecordset("SELECT TbInventaire.TagNumber, TbTrxInHstHdr.NoTrx FROM (TbInventaire INNER JOIN TbTrxInHstDtl ON TbInventaire.TagNumber = TbTrxInHstDtl.TagNo) INNER JOIN TbTrxInHstHdr ON (TbTrxInHstHdr.NoTrx = TbTrxInHstDtl.NoTrx) AND (TbInventaire.ClientProduitNo = TbTrxInHstHdr.ClientProduitNo) AND (TbInventaire.CliSource = TbTrxInHstHdr.ClientSource) AND (TbInventaire.BolIn = TbTrxInHstHdr.ClientBOLNo) " _
        & "WHERE (((TbTrxInHstHdr.NoTrx)=" & Me![NoTrx] & "));", 8)
    If Not Rs.BOF Then
        If vbNo = MsgConfirmA("Le numéro d'entreposage(U.E.) " & Rs![TagNumber] & " est inscrit" _
            & Chr$(13) & "en inventaire pour le même client" _
            & Chr(13) & " et le même numéro d'expédition du client(Exp.#-Client) !" _
            & Chr(13) & "Voulez-vous reporter quand même ?") Then
            [RqTrxInDtl].SetFocus
            Exit Sub
        End If
    End If
     
    If vbNo = MsgConfirmQ("Reporter cette transaction maintenant ?") Then
        Exit Sub
    End If
    DoCmd.Hourglass True
    Ws.BeginTrans
    ErrRoll = True
     
    '** insère Dtl
    Db.Execute ("INSERT INTO TbTrxInHstDtl ( NoTrx, TagNo, FormatExp, UnitéDeMesure, Localisation, [Note], Qté, QtéExtension, LigneNo, QtéUnit ) " _
        & "SELECT TbTrxInHstDtl.NoTrx, TbTrxInHstDtl.TagNo, TbTrxInHstDtl.FormatExp, TbProduits.UnitéDeMesure, TbTrxInHstDtl.Localisation, TbTrxInHstDtl.Note, TbTrxInHstDtl.Qté, TbTrxInHstDtl.QtéExtension, TbTrxInHstDtl.LigneNo, TbTrxInHstDtl.QtéUnit FROM (TbTrxInHstHdr INNER JOIN TbTrxInHstDtl ON TbTrxInHstHdr.NoTrx = TbTrxInHstDtl.NoTrx) INNER JOIN TbProduits ON (TbTrxInHstHdr.ClientSource = TbProduits.CliId) AND (TbTrxInHstHdr.ClientProduitNo = TbProduits.CliProduitNo) " _
        & "WHERE (((TbTrxInHstDtl.NoTrx)=" & Me![NoTrx] & "));"), dbFailOnError
    '*** Envoie en inventaire
    Db.Execute ("INSERT INTO TbInventaire (DateIn, CliSource, ClientProduitNo, CliLotNo, NbreUnits, QtéStock, TotalStock, FormatExp, TagNumber, Localisation, TrxLigneNo, RemorqueIn, BOlIn, TrxNumber, LaNote) " _
        & "SELECT DateTrx, ClientSource, ClientProduitNo, ClientLotNo, QtéUnit, Qté, QtéExtension, FormatExp, TagNo, Localisation, LigneNo, RemorqueNo, ClientBOLNo, TbTrxInHstHdr.NoTrx, Note " _
        & "FROM TbTrxInHstHdr INNER JOIN TbTrxInHstDtl ON TbTrxInHstDtl.NoTrx = TbTrxInHstHdr.NoTrx " _
        & "WHERE TbTrxInHstHdr.NoTrx = " & Me![NoTrx]), dbFailOnError
    Mon code bogue au dernier Db.Execute.

    Est-ce que quelqu'un est en mesure de m'aider?

  2. #2
    Membre chevronné Avatar de Tonioyo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 343
    Par défaut
    Bonsoir,

    La connection vers SQL Server n'est pas établie.
    en executant l'instruction suivante

    L'objet Db (de type database) va pointer vers la base Access et non pas vers une base SQL Server.

    Pour faire un lien vers une base extérieur il faut utiliser un objet connection qui va faire la connection entre l'application access et la base de donnée SQL Server. Dans la chaine de connection il est possible d'utiliser un driver ODBC.

    Un bon article de départ sur la msdn : http://msdn.microsoft.com/fr-fr/library/bb469898.aspx

    Cordialement,

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut
    Bonjour Tonioyo,

    La connexion avec la base de données SQL est active puisque le "INSERT INTO TbTrxInHstDtl" qui est fait avant le "INSERT INTO TbInventaire" fonctionne parfaitement sur la base de données SQL. Ce n'est pas moi qui ai fait le lien entre l'application et la base de données SQL, mais il fonctionne.

  4. #4
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonsoir,

    je pencherai pour une erreur de syntaxe ou un problème de compatibilité de type entre champ source et champ destination.

    Je note que dans la deuxième requête les champs ne sont pas préfixés du nom de la table source.
    Se pourrait-il que le nom d'un champ existe dans plus d'une table ?

    A+

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut
    J'ai vérifié et revérifié des dizaines de fois la syntaxe et le problème n'est pas là, car quand je l'exécute directement via SQL Management ou le créateur de requête d'Access, cette requête fonctionne. Pourquoi ne marche-t-elle pas à partir de mon application?

  6. #6
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 134
    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 134
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Et si tu posais un On Error Goto... tu aurais un bel élément de réponse.
    Du moins un N° d'erreur que nous pourrions interpréter...

    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

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut
    J'avais déjà un On Error GoTo ... si tu regardes ma deuxième ligne de code... je n'ai juste pas affiché le reste de ma fonction puisqu'elle est très longue mais il y avait un "call msgbod(err.description)" quand une erreur se produisait...

    Mais bon, je n'ai plus de problème, il semble que ma requête fonctionne à partir de mon application maintenant sans que j'aie une idée de ce que j'ai pu changer pour que ça marche...

    Mon dieu que je hais Access...

    Edit : Et en passant, le # d'erreur pour ODBC call failed est toujours 3146 je crois

  8. #8
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 134
    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 134
    Billets dans le blog
    5
    Par défaut
    J'avais vu mais une fois posté, humm ; Mais tu n'avais pas précisé ce que tu rencontrais comme erreur et que ta procédure allait justement dans le trappeur d'erreurs...

    Si cela marche dès lors, je soupçonne que ton SELECT avait un de ses champs à NULL et qu'une contrainte empêchait l'insertion. Je te suggère alors d'user de la fonction Nz() pour certaines valeurs susceptibles d'être à NULL.

    Oui en ODBC, le 3146 est toujours le numéro que tu auras.
    Il t'appartient alors de monter ton propre gestionnaire d'erreurs si tu reste en DAO/ODBC.

    Sinon, envisage de passer en ADP avec ADO si tu veux pouvoir intercepter et interpréter les erreurs.

    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

  9. #9
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,

    Généralement un échec ODBC génére plusieurs messages d'erreur.
    Ils sont accessibles en parcourant la collection DBEngine.Errors.

    Voir l'exemple de l'aide en ligne (DAO), pour la méthode Execute de l'objet Database.

    Exemple rapide:
    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
    Sub testDaoErr_odbc()
    Dim db As DAO.Database, daoErr As DAO.Error
    Dim strSql As String
     
    Set db = CurrentDb
    strSql = "INSERT INTO pdts (No_Prod, Nom) VALUES(1, 'toto')"
    On Error GoTo ErrH
    db.Execute strSql, dbFailOnError
     
    Sortie:
    Set db = Nothing
    Exit Sub
     
    ErrH:
    Debug.Print strSql
    For Each daoErr In DBEngine.Errors
        Debug.Print daoErr.Number & " : " & daoErr.Description
    Next
    Resume Sortie
    End Sub
    A+

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut
    Merci LedZeppII pour ton truc, il m'aidera surement à régler les prochains bogues que je vais rencontrer!

    et Agyronet, ce n'est pas ma requete qui a une erreur, car peu importe les valeurs que je mettais ça ne marchait pas et maintenant peu importe les valeurs que je met elle fonctionne...
    Et je n'arrive pas à aller en pas à pas avec le débogueur d'Access 2003; je met un point d'arrêt et jamais mon code ne s'arrête... j'ai lu à plusieurs places qu'il fallait appuyer sur F5 ou F8 et j'ai essayé à plusieurs place mais ça ne fonctionne jamais. Et quand j'appuie sur la flèche verte (symbole de "play") et bien ça m'envoie dans un créateur de macro...

  11. #11
    Membre Expert
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    946
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 946
    Par défaut
    Bonjour

    C'est étonnant cette histoire de débuggage qui ne fonctionne pas...

    Une piste : essayer de mettre "stop" (dans le code.

    Si l'appui sur les flèches demande d'exécuter une macro c'est que le code est déjà fini.

    F8 permet du pas à pas, c'est à dire ligne à ligne.

    Pierre

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 3
    Par défaut
    J'ai eu le meme problème.
    Pour faire court, je recherchai plusieurs éléments dans une table, mais dans le cas ou les éléments n'existaient pas, alors ca plantait avec le meme message d'erreur.
    Il a suffit d'ajouter un petit Nz("champ des éléments recherché") pour que l'erreur ne reviennent plus!
    Bon courage

Discussions similaires

  1. [AC-2007] "ODBC --call failed" au deuxième passage
    Par yonnel dans le forum Access
    Réponses: 4
    Dernier message: 10/06/2011, 11h15
  2. [AC-2010] Insert Into erreur "ODBC --Call Failed" avec un champ sql server Identify
    Par jayjazz dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 17/05/2011, 13h17
  3. Access 2003 -> SQL Serveur 2005 Sans ODBC
    Par Destiny dans le forum Access
    Réponses: 2
    Dernier message: 21/02/2007, 15h28
  4. Réponses: 1
    Dernier message: 20/06/2006, 19h42
  5. Réponses: 1
    Dernier message: 11/12/2005, 21h21

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