وصول 2007 VBA استعلام يظهر البيانات في محلل استعلام ولكن ليس في VBA الأكواد السجلات

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

سؤال

ولدي وظيفة لقد كتبت أن كان من المفترض في البداية أن تأخذ حقل سلسلة وملء جداول اكسل مع القيم. وجاء هذه القيم باستمرار حتى لاغية. بدأت تتبع ذلك العودة إلى سجلات وجدت أنه على الرغم من الاستعلام كونها صالحة وتعمل بشكل صحيح من خلال محلل استعلام الوصول كان سجلات فارغة أو قد الحقول في عداد المفقودين.

لاختبار المشكلة، أنا خلقت الفرعية التي خلقت استعلام، وفتح السجلات، ومن ثم ترحيلها من خلال القيم (إخراج لهم عن messageBox). الجزء الأكثر حيرة من المشكلة يبدو أن تدور حول "حيث" شرط الاستعلام. إذا كنت لا تضع "أين" شرط على الاستعلام، السجلات يحتوي على بيانات والقيم ل "الوصف" دائما طبيعية.

إذا وضعت <م> أي شيء في لجملة WHERE يأتي السجلات يعود إما فارغة تماما (rs.EOF = true) أو حقل الوصف فارغ تماما حيث توجد حقول أخرى القيم. وأود أن أؤكد مرة أخرى أنني إذا debug.print الاستعلام، ويمكن نسخ / صقه في محلل الاستعلام والحصول على القيم الصالحة وعاد أن أتوقع.

وكنت على يقين نقدر بعض المساعدة مع هذا. شكرا لك!

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

وتحرير: شخص طلب أنني نشر DEBUG.PRINT الاستعلام. ومن هنا:

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'

ولقد حاولت التنصيص واحدة باستخدام أحرف ASCII وضمنا.

وعلى سبيل المثال:

"WHERE dbo_partmtl.mtlpartnum='3C16470'"

وحاولت حتى اقتراحكم مع مركز حقوق الإنسان (39):

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

وكلا إرجاع قيمة خالية لوصف. ومع ذلك، إذا كنت debug.print الاستعلام ولصقه في محلل استعلام الوصول، فإنه يعرض على ما يرام. مرة أخرى (كملاحظة جانبية)، إذا كنت تفعل بيان LIKE في جملة WHERE، وسوف تعطي لي سجلات فارغة تماما. شيء غير متزعزع حقا هنا.


وهنا هو نبأ سار للاهتمام. وترتبط الجداول إلى SQL Server. إذا كنت نسخ الجداول (البيانات وهيكل) محليا، فوق عملت رمز ADO لا تشوبه شائبة. إذا كنت تستخدم DAO أنه يعمل بشكل جيد. لقد حاول هذا الرمز على Windows XP، Access 2003، وإصدارات مختلفة من ADO (2.5, 2.6, 2.8). سوف ADO لا تعمل إذا ترتبط الجداول.

وهناك بعض الخلل في ADO الذي يسبب المشكلة.


وبالتأكيد أن أفعل. تذكر، الاستعلام DEBUG.PRINT ترى يعمل تماما في محلل الاستعلام. تقوم بإرجاع ما يلي:

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

ولكن، إرجاع نفس الاستعلام قيم فارغة للالوصف (كل شيء آخر هو نفسه) عند تشغيله من خلال السجلات (أخطاء MESSAGEBOX بسبب قيمة "خالية").


وحاولت إعادة تسمية حقل "وصف" إلى "testdep"، لكنه ما زال فارغا. والطريقة الوحيدة لجعله عرض البيانات هي لإزالة القسم WHERE من الاستعلام. أنا بدأت أعتقد أن هذا هو مشكلة مع ADO. ربما سوف إعادة كتابة مع DAO ورؤية ما يؤدي أحصل.

وتحرير: كما أنني حاولت ضغط وإصلاح عدة مرات. لا الزهر.

هل كانت مفيدة؟

المحلول

عند استخدام عمليات البحث ADO مثل يجب استخدام٪ بدلا من *. أنا عارف أعمالك * في Access ولكن لسبب غبي وADO لا تعمل إلا إذا كنت تستخدم٪ بدلا من ذلك.

وكان لي نفس المشكلة وركض accoss هذا المنتدى بينما كان يحاول إصلاحه. استبدال * الصورة مع٪ الصورة عملت بالنسبة لي.

نصائح أخرى

والوصف هو كلمة محجوزة - وضع بعض بمعقوفين حوله في عبارة SELECT

وتحرير

وحاول تسمية العمود شيئا إلى جانب الوصف

وهي أيضا أنت متأكد من أنك تستخدم نفس القيم في جملة WHERE - لأنه هو اليسار الانضمام وبالتالي فإن حقل الوصف فارغا إذا لم يكن هناك سجل المقابلة في dbo_part

وتحرير AGAIN

إذا كنت تحصل على نتائج مضحكة - محاولة قاعدة بيانات / إصلاح الميثاق - قد تكون تالفة و

حسنا، ما كنت أخشاه هو الحال. أنه يعمل بشكل جيد مع DAO ولكن ليس ADO.

وهنا هو رمز العمل:

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

النهاية الفرعية

وأنا لا تستخدم DAO في أي مكان في قاعدة البيانات هذه ويفضل عدم البدء. أين نذهب من هنا؟

وأنا أعلم لقد مر بعض الوقت منذ بدأ هذا الموضوع، ولكن فقط في حال كنت أتساءل، وأنا قد وجدت بعض غريبة عن وصول 2003 وربما تكون قد حملت الفيروس في عام 2007 (ما أستطيع أن أرى لها).

ولقد كان يعاني من مشكلة مماثلة مع جملة WHERE لأنني بحاجة السجلات من حقل التاريخ الذي يتضمن أيضا الوقت، وبالتالي فإن محتويات الحقل بالكامل تبدو وكأنها رقم 6/14/2011 11:50:25 # (# الصورة مضافة للتنسيق الأغراض).

ونفس القضية على النحو الوارد أعلاه، الاستعلام يعمل بشكل جيد مع "WHERE ((tblTransactions.TransactionDate) مثل" وQueryDate & "* ')؛" في طريقة عرض تصميم الاستعلام، ولكن فإنه لن ينجح في رمز VBA باستخدام ADO.

ولذا لجأت إلى استخدام "WHERE ((tblTransactions.TransactionDate) مثل" وQueryDate و"٪٪: ٪٪: ٪٪٪ M ')؛" في رمز VBA، مع ADO ويعمل على ما يرام. يعرض سجل كنت أبحث عنه، هو خدعة عدم استخدام "*" في جملة LIKE. أو على الأقل ان هذه هي القضية في حالتي.

وأضع بين قوسين حول كلمة "الوصف" في عبارة SELECT، لكنه لا يزال السلوك. أنه يعمل بشكل جيد طالما أنا لا تضع أي شيء في جملة WHERE. لقد وجدت إذا وضعت شيئا في شرط حيث وصف فارغ (على الرغم تظهر في محلل استعلام). إذا كنت تستخدم بيان LIKE في جملة WHERE، السجلات بأكمله فارغ لكنه لا يزال يعمل بشكل صحيح في محلل استعلام.

وأخيرا أعتقد انها مشكلة مع تشغيل ADO 2.8 على ويندوز فيستا 64

وأنا شخصيا دائما تستخدم DAO في مشاريع Access.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top