Une requête VBA Access 2007 affiche des données dans l'analyseur de requêtes mais pas dans un jeu d'enregistrements codé VBA

StackOverflow https://stackoverflow.com/questions/253913

Question

J'ai une fonction que j'ai écrite qui était initialement supposée prendre un champ chaîne et remplir une feuille de calcul Excel avec les valeurs. Ces valeurs revenaient continuellement nulles. J'ai commencé à en suivre le jeu d'enregistrements et j'ai constaté que, même si la requête était valide et qu'elle fonctionnait correctement via l'analyseur de requête Access, le jeu d'enregistrements était vide ou comportait des champs manquants.

Pour tester le problème, j'ai créé un sous-dossier dans lequel j'ai créé une requête, ouvert un jeu d'enregistrements, puis parcouru les valeurs (en les affichant dans une boîte à messages). La partie la plus déroutante du problème semble tourner autour du "WHERE". clause de la requête. Si je ne mets pas un "WHERE" clause sur la requête, le jeu d’enregistrements contient toujours les données et les valeurs de " description " sont normaux.

Si je mets quoi que ce soit dans la clause WHERE, le jeu d'enregistrements est totalement vide ( rs.EOF = true ) ou le champ Description est totalement vide. les champs ont des valeurs. Je tiens à souligner à nouveau que si je débogue.imprime la requête, je peux la copier / coller dans l’analyseur de requête et obtenir une valeur valide et renvoyée que j’attends.

J'apprécierais certainement de l'aide avec ceci Merci!

Private Sub NewTest()

'  Dimension Variables
'----------------------------------------------------------
Dim rsNewTest As ADODB.Recordset
Dim sqlNewTest As String
Dim Counter As Integer

'  Set variables
'----------------------------------------------------------
Set rsNewTest = New ADODB.Recordset

sqlNewTest = "SELECT dbo_partmtl.partnum as [Job/Sub], dbo_partmtl.revisionnum as Rev, " & _
                "dbo_part.partdescription as Description, dbo_partmtl.qtyper as [Qty Per] " & _
            "FROM dbo_partmtl " & _
            "LEFT JOIN dbo_part ON dbo_partmtl.partnum = dbo_part.partnum " & _
            "WHERE dbo_partmtl.mtlpartnum=" & Chr(34) & "3C16470" & Chr(34)

'  Open recordset
rsNewTest.Open sqlNewTest, CurrentProject.Connection, adOpenDynamic, adLockOptimistic

    Do Until rsNewTest.EOF

        For Counter = 0 To rsNewTest.Fields.Count - 1
            MsgBox rsNewTest.Fields(Counter).Name
        Next

        MsgBox rsNewTest.Fields("Description")

        rsNewTest.MoveNext

    Loop

'  close the recordset

rsNewTest.Close
Set rsNewTest = Nothing

End Sub

EDIT: Quelqu'un a demandé que je poste le DEBUG.PRINT de la requête. La voici:

SELECT dbo_partmtl.partnum as [Job/Sub], dbo_partmtl.revisionnum as Rev, dbo_part.partdescription as [Description], dbo_partmtl.qtyper as [Qty Per] FROM dbo_partmtl LEFT JOIN dbo_part ON dbo_partmtl.partnum = dbo_part.partnum WHERE dbo_partmtl.mtlpartnum='3C16470'

J'ai essayé les guillemets simples et doubles en utilisant des caractères ASCII et implicitement.

Par exemple:

"WHERE dbo_partmtl.mtlpartnum='3C16470'"

J'ai même essayé votre suggestion avec chr (39):

"WHERE dbo_partmtl.mtlpartnum=" & Chr(39) & "3C16470" & Chr(39)

Les deux renvoient une valeur nulle pour la description. Toutefois, si je débogue.imprime la requête et la colle dans l'analyseur de requête Access, elle s'affiche correctement. Encore une fois (en note de bas de page), si je fais une déclaration LIKE dans la clause WHERE, cela me donnera un jeu d'enregistrements complètement vide. Quelque chose est vraiment méchant ici.

Voici une friandise intéressante. Les tables sont liées à un SQL Server . Si je copie les tables (données et structure) localement, le code ADO ci-dessus a parfaitement fonctionné. Si j'utilise DAO, cela fonctionne bien. J'ai essayé ce code sur Windows XP , Access 2003 et diverses versions de ADO (2.5, 2.6, 2.8) . ADO ne fonctionnera pas si les tables sont liées.

Un problème dans ADO est à l'origine du problème.

Absolument je le fais. N'oubliez pas que la requête DEBUG.PRINT que vous voyez fonctionne parfaitement dans l'analyseur de requêtes. Il retourne ce qui suit:

Job/Sub     Rev         Description                     Qty Per
36511C01     A          MAIN ELECTRICAL ENCLOSURE       1
36515C0V     A          VISION SYSTEM                   1
36529C01     A          MAIN ELECTRICAL ENCLOSURE       1

Cependant, la même requête renvoie des valeurs vides pour Description (tout le reste est identique) lorsqu'elle est exécutée dans le jeu d'enregistrements (erreurs de boîte de message dues à la valeur "Null").

J'ai essayé de renommer la "description". champ à "testdep", mais il est toujours vide. La seule façon d'afficher les données consiste à supprimer la section WHERE de la requête. Je commence à croire que c'est un problème avec ADO. Peut-être que je vais le réécrire avec DAO et voir les résultats que je reçois.

EDIT: J'ai aussi essayé de compacter et de réparer plusieurs fois. Pas de dés.

Était-ce utile?

La solution

Lorsque vous utilisez ADO LIKE, les recherches doivent utiliser% au lieu de *. Je sais que * fonctionne dans Access, mais pour une raison stupide, ADO ne fonctionnera que si vous utilisez% à la place.

J'ai eu le même problème et j'ai accédé à ce forum en essayant de le réparer. Remplacer des * par des% a fonctionné pour moi.

Autres conseils

La description est un mot réservé - mettez-y des crochets [] dans l'instruction SELECT

EDIT

Essayez de nommer la colonne avec quelque chose en plus de Description

De plus, êtes-vous sûr d'utiliser les mêmes valeurs dans la clause where? Comme il s'agit d'une jointure à gauche, le champ Description sera vide s'il n'y a pas d'enregistrement correspondant dans dbo_part

MODIFIER DE NOUVEAU

Si vous obtenez des résultats amusants, essayez une base de données Compact / Repair - Elle est peut-être corrompue

Eh bien, ce que je craignais, c’est le cas. Cela fonctionne bien avec DAO mais pas ADO.

Voici le code de travail:

Private Sub AltTest()

'  Dimension Variables
'----------------------------------------------------------
Dim rsNewTest As DAO.Recordset
Dim dbl As DAO.Database

Dim sqlNewTest As String
Dim Counter As Integer

'  Set variables
'----------------------------------------------------------

sqlNewTest = "SELECT dbo_partmtl.partnum as [Job/Sub], dbo_partmtl.revisionnum as Rev, " & _
                "dbo_part.partdescription as [TestDep], dbo_partmtl.qtyper as [Qty Per] " & _
            "FROM dbo_partmtl " & _
            "LEFT JOIN dbo_part ON dbo_partmtl.partnum = dbo_part.partnum " & _
            "WHERE dbo_partmtl.mtlpartnum=" & Chr(39) & "3C16470" & Chr(39)


Debug.Print "sqlNewTest: " & sqlNewTest
Set dbl = CurrentDb()
Set rsNewTest = dbl.OpenRecordset(sqlNewTest, dbOpenDynaset)


' rsnewtest.OpenRecordset

    Do Until rsNewTest.EOF

        For Counter = 0 To rsNewTest.Fields.Count - 1
            MsgBox rsNewTest.Fields(Counter).Name
        Next

        MsgBox rsNewTest.Fields("TestDep")

        rsNewTest.MoveNext

    Loop

'  close the recordset

dbl.Close
Set rsNewTest = Nothing

End Sub

Je n’utilise DAO nulle part dans cette base de données et préfère ne pas commencer. Où allons-nous d'ici?

Je sais qu'un certain temps s'est écoulé depuis que ce fil a commencé, mais juste au cas où vous vous le demanderiez, j'ai découvert des curieux au sujet d'Access 2003 et le bogue a peut-être été reporté à 2007 (comme je peux le voir).

J'ai eu un problème similaire avec une clause WHERE parce que j'avais besoin d'enregistrements dans un champ de date qui contenait également du temps. Le contenu du champ entier ressemblerait donc à # 6/14/2011 11:50:25 # (# est ajouté à des fins de formatage).

Même problème que ci-dessus, la requête fonctionne très bien avec l'option "WHERE ((tblTransactions.TransactionDate) Like", comme '" & amp; QueryDate & amp; " *'); " en mode création de requête, mais cela ne fonctionnera pas dans le code VBA utilisant ADO.

J'ai donc eu recours à "WHERE ((tblTransactions.TransactionDate) Like", comme "& amp; QueryDate" &%; %%: %%: %%% M '); "" dans le code VBA, avec ADO et cela fonctionne très bien. Affiche l'enregistrement que je cherchais, l'astuce consiste à ne pas utiliser " * " dans la clause Like; ou du moins c'était le problème dans mon cas.

J'ai mis des parenthèses autour du mot "Description". dans l'instruction SELECT, mais son comportement reste. Cela fonctionne bien tant que je ne mets rien dans la clause WHERE. J'ai trouvé que si je mettais quelque chose dans la clause where, la description est vide (bien qu'elle apparaisse dans l'analyseur de requêtes). Si j'utilise une instruction LIKE dans la clause WHERE, le jeu d'enregistrements entier est vide, mais il fonctionne toujours correctement dans l'analyseur de requêtes.

En définitive, je pense que l’exécution d’ADO 2.8 sous Vista 64 pose un problème

Personnellement, j'ai toujours utilisé DAO dans les projets Access.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top