La query VBA di Access 2007 mostra i dati nell'analizzatore di query ma non nel recordset codificato VBA

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

Domanda

Ho una funzione che ho scritto che inizialmente doveva prendere un campo stringa e popolare un foglio di calcolo Excel con i valori. Quei valori venivano continuamente nulli. Ho iniziato a rintracciarlo nel recordset e ho scoperto che nonostante la query fosse valida e funzionasse correttamente tramite l'analizzatore di query di Access, il recordset era vuoto o mancava dei campi.

Per testare il problema, ho creato un sub in cui ho creato una query, aperto un recordset e quindi sfogliato i valori (inviandoli a una finestra di messaggio). La parte più imbarazzante del problema sembra ruotare attorno a "DOVE" clausola della query. Se non inserisco un " DOVE " clausola sulla query, il recordset ha sempre dati e valori per " DESCRIPTION " sono normali.

Se inserisco qualcosa per la clausola WHERE, il recordset ritorna o completamente vuoto ( rs.EOF = true ) o il campo Descrizione è totalmente vuoto dove l'altro i campi hanno valori. Voglio sottolineare ancora una volta che se debug.print la query, posso copiarla / incollarla nell'analizzatore di query e ottenere valori validi e restituiti che mi aspetto.

Apprezzerei sicuramente un po 'di aiuto in questo. Grazie!

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

MODIFICA: Qualcuno mi ha richiesto di pubblicare DEBUG.PRINT della query. Eccolo:

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'

Ho provato virgolette doppie e singole usando i caratteri ASCII e implicitamente.

Ad esempio:

"WHERE dbo_partmtl.mtlpartnum='3C16470'"

Ho persino provato il tuo suggerimento con chr (39):

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

Entrambi restituiscono un valore null per la descrizione. Tuttavia, se debug.print la query e la incollo nell'analizzatore di query di Access, viene visualizzato correttamente. Ancora una volta (come nota a margine), se faccio un'istruzione LIKE nella clausola WHERE, mi darà un recordset completamente vuoto. Qualcosa è davvero traballante qui.


Ecco un bocconcino interessante. Le tabelle sono collegate a un SQL Server . Se copio le tabelle (dati e struttura) localmente, il codice ADO sopra funzionava perfettamente. Se uso DAO funziona benissimo. Ho provato questo codice su Windows XP , Access 2003 e varie versioni di ADO (2.5, 2.6, 2.8) . ADO non funzionerà se le tabelle sono collegate.

C'è qualche difetto in ADO che causa il problema.


Assolutamente sì. Ricorda che la query DEBUG.PRINT che vedi viene eseguita perfettamente nell'analizzatore di query. Restituisce il seguente:

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

Tuttavia, la stessa query restituisce valori vuoti per Description (tutto il resto è lo stesso) quando viene eseguito il recordset (errori messagebox a causa del valore " Null ")


Ho provato a rinominare la " descrizione " campo in "testdep", ma è ancora vuoto. L'unico modo per visualizzare i dati è rimuovere la sezione WHERE della query. Sto iniziando a credere che questo sia un problema con ADO. Forse lo riscriverò con DAO e vedrò quali risultati ottengo.

EDIT: ho anche provato a compattare e riparare un paio di volte. Nessun dado.

È stato utile?

Soluzione

Quando si utilizza ADO LIKE le ricerche devono utilizzare% invece di *. So che * funziona in Access ma per qualche stupida ragione ADO non funzionerà se non usi% invece.

Ho avuto lo stesso problema e mi sono imbattuto in questo forum mentre cercavo di risolverlo. Sostituendo * 's con%' s ha funzionato per me.

Altri suggerimenti

Descrizione è una parola riservata. Metti alcune parentesi [] attorno ad essa nell'istruzione SELECT

Modifica

Prova a assegnare un nome alla colonna oltre a Descrizione

Inoltre, sei sicuro di utilizzare gli stessi valori nella clausola where - perché è un join sinistro, quindi il campo Descrizione sarà vuoto se non vi sono record corrispondenti in dbo_part

MODIFICA DI NUOVO

Se stai ottenendo risultati divertenti - prova un database compatto / di riparazione - Potrebbe essere danneggiato

Bene, quello che temevo è il caso. Funziona FINE con DAO ma non ADO.

Ecco il codice di lavoro:

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

Non uso DAO da nessuna parte in questo database e preferirei non iniziare. Dove andiamo da qui?

So che è passato del tempo dall'avvio di questo thread, ma nel caso ti stia chiedendo, ho scoperto alcuni curiosi su Access 2003 e il bug potrebbe essere stato riportato al 2007 (come posso vedere).

Ho avuto un problema simile con una clausola WHERE perché avevo bisogno di record da un campo data che contenesse anche il tempo, quindi l'intero contenuto del campo sarebbe simile a # 6/14/2011 11:50:25 AM # (# è stato aggiunto ai fini della formattazione).

Stesso problema di cui sopra, la query funziona bene con " WHERE ((tblTransactions.TransactionDate) Come '" & amp; QueryDate & amp; " *'); " nella vista di progettazione della query, ma non funzionerà nel codice VBA utilizzando ADO.

Così ho fatto ricorso all'utilizzo di " WHERE ((tblTransactions.TransactionDate) Come '" & amp; QueryDate & amp; " %%: %%: %%% M'); " nel codice VBA, con ADO e funziona perfettamente. Visualizza il record che stavo cercando, il trucco è non usare " * " nella clausola Like; o almeno quello era il problema nel mio caso.

Metto le parentesi attorno alla parola "Descrizione" nell'istruzione SELECT, ma il suo comportamento rimane. Funziona bene finché non inserisco nulla nella clausola WHERE. Ho scoperto che se inserivo qualcosa nella clausola where, la descrizione è vuota (nonostante sia visualizzata nell'analizzatore di query). Se uso un'istruzione LIKE nella clausola WHERE, l'intero recordset è vuoto ma funziona ancora correttamente nell'analizzatore di query.

Alla fine penso che sia un problema con l'esecuzione di ADO 2.8 su Vista 64

Personalmente ho sempre usato DAO nei progetti Access.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top