2014-01-20 3 views
1

У меня есть форма, в которой я указываю номер моей части и часть rev. Я пытаюсь написать VBA, поэтому, если я нажму кнопку в форме, он будет искать запрос, который содержит всю историю всех частей, для номера детали, а также для совпадения деталей. Как только он найдет соответствующий номер детали и часть rev, он автоматически заполняет некоторую информацию в форме для меня.Использование Dlookup с несколькими критериями в форме

Прямо сейчас у меня есть данные, возвращающие данные для соответствующего номера детали, но он дает первые данные, независимо от части rev, т. Е. Возвращает значения, соответствующие другому номеру детали, но другому rev.

Sub FindPartNumber_Click() 
DoCmd.OpenQuery "SavedQuotesQuery" 'runs query to find any matching part numbers 

'confirms if part previously exists 
If IsNull(DLookup("PartNumber", "SavedQuotesQuery", "'[PartNumber]=" & Me.PartNumber _ 
& " AND [PartRev]=" & Me.PartRev & "'")) Then 
MsgBox "Part does not previously exist. Please manually enter its characteristics", _ 
vbOK 'and alerts user 
DoCmd.Close 'close query 
Exit Sub 
End If 

[PartName] = DLookup("PartName", "SavedQuotesQuery", "PartNumber='" & Me.PartNumber _ 
& "'") 
[Length] = DLookup("Length", "SavedQuotesQuery", "PartNumber='" & Me.PartNumber & _ 
" And PartRev = " & Me.PartRev & "'") 

DoCmd.Close 'close query 
End Sub 

Я просто борюсь с синтаксисом двух критериев соответствия или здесь что-то еще происходит?

ответ

3

Здесь очень много проблем. Прежде всего, DoCmd.OpenQuery и DoCmd.Close не делают то, что вы ожидаете. Прочитайте файл справки, чтобы узнать, как их следует использовать, но для наших целей достаточно просто сказать, что они вам не нужны.

Проблема, с которой вы сталкиваетесь, заключается в том, что вы предоставляете половину своих критериев в вызове DLN. Поэтому вместо того, чтобы возвращать PartName с соответствующими PartNumber и PartRev, вы сообщаете Access, чтобы вернуть PartName первой записи, найденной с соответствующим PartNumber. Какой из них он возвращает, на самом деле не определен, если существует более одного совпадения.

Попробуйте следующие вместо:

Sub FindPartNumber_Click()  
Dim MyPartName As Variant, Criteria As String 

    Criteria = "PartNumber=""" & Me.PartNumber & """ AND " & _ 
       "PartRev= """ & Me.PartRev & """" 

    'confirms if part previously exists 
    MyPartName = DLookup("PartName", "SavedQuotesQuery", Criteria) 
    If IsNull(MyPartName) Then 
     MsgBox "Part does not previously exist. Please manually enter its characteristics", vbOK 'and alerts user 
    Else 
     [PartName] = MyPartName 
     [Length] = DLookup("Length", "SavedQuotesQuery", Criteria) 
    End If 
End Sub 
+0

Это идеальное исправление. Большое вам спасибо, но у меня есть один следующий вопрос: если бы было два экземпляра совпадающего номера детали и rev, но они имели разную длину, к которой можно было бы вернуться? – user3216418

+0

Невозможно узнать, поскольку вы не можете указать порядок сортировки с помощью 'DLookup'. Если это вызывает беспокойство, один из подходов заключается в замене DLookup Аллена Брауна: [Extended DLookup()] (http://allenbrowne.com/ser-42.html). Его функция позволяет указать пользовательский порядок сортировки, чтобы справиться с ситуацией, которую вы описываете. – mwolfe02

Смежные вопросы