Как сделать текстовое поле доступа с числовым значением равным DLookup с текстовым полем в качестве критериев

Я действительно понятия не имею, почему это не работает, но я пытаюсь заставить работать следующее:

If Me.Text1 = DLookup("Field1", "Test1_Table", "Test1_Table.Field1= _
     & Me.Text1") Then
   MsgBox "It works"
Else
End If

Приведенный выше код является тестовым кодом для более крупного проекта, над которым я работаю, поэтому имена таблиц и полей предназначены только для тестирования. Кроме того, Field1 является числовым полем. По сути, когда я ввожу 1 в Text1, я хотел бы, чтобы функция DLookup нашла 1 в Test1_Table.Field1 и выдала мне сообщение о том, что это работает. Я могу заставить это работать со строковыми значениями, такими как:

If Me.Text1 = DLookup("Field1", "Test1_Table", "Test1_Table.Field1='" _
    & Me.Text1 & "'")Then

Точно так же это работает, когда 1 вводится в Text1:

If 1 = DLookup("Field1", "Test1_Table", "Test1_Table.Field1= _
    & Me.Text1") Then

Однако я пробовал:

If Me.Text1 = DLookup("Field1", "Test1_Table", "Test1_Table.Field1= _
    & Forms!TestSearch_Form!Text0)Then

а также

If Me.Text1 = DLookup("Field1", "Test1_Table", "Test1_Table.Field1= _
    & Forms!TestSearch_Form!Text0)Then

так далее...

Я пробовал много разных комбинаций, и кажется, что я не могу заставить их быть равными при работе с числовыми значениями. Кто-нибудь знает, что мне не хватает, или есть идеи?

Спасибо,

Дэмион


person Community    schedule 19.05.2009    source источник
comment
В первом примере кода Test1_Table.Field1= & Me.Text1) на самом деле должно читаться как Test1_Table.Field1= & Me.Text1). Однако это все еще не работает. Спасибо, ДФМ   -  person    schedule 19.05.2009
comment
Ваши цитаты в основном не в том месте. Если это опечатка, то вы также должны быть уверены, что ваши типы верны. Сравнение десятичных чисел может быть проблематичным.   -  person Fionnuala    schedule 19.05.2009
comment
@Remou: они дважды сказали числовой [так в оригинале] и один раз числовой. Как вы сомневаетесь, в синтаксисе ACE/Jet SQL NUMERIC является синонимом DECIMAL... @DFM: мы говорим здесь о значениях DECIMAL?   -  person onedaywhen    schedule 19.05.2009


Ответы (3)


Как насчет:

 If Not IsNull(DLookup("Field1", "Test1_Table", "Field1=" & Me.Text1)) Then

Это будет работать только в том случае, если поле Field1 определено как числовое поле, вам понадобятся разделители, если это поле даты и времени или текстовое поле.

РЕДАКТИРОВАТЬ:

Приведенный выше оператор либо равен значению Me.Text1, либо имеет значение null. Другой способ использовать DllookUp — сказать:

 SomeVar=DLookup("Field1", "Test1_Table", "Field1=" & Me.Text1)

SomeVar будет либо нулевым, то есть не найденным, либо вернет значение или Field1, равное Me.Text1, потому что именно это мы просили в операторе Where. Отсюда видно, что возвращать значение Field1 бессмысленно, оно либо найдено и равно text1, либо не найдено и null. Единственной причиной получения значения DlookUp является поиск какого-либо другого значения или вычисления в таблице.

После этого важно помнить, что вы ищете точное совпадение и десятичные значения могут сильно отличаться далеко вправо от запятой, куда вы вряд ли будете смотреть.

person Fionnuala    schedule 19.05.2009
comment
Спасибо за ответ. Чтобы мой поиск работал, мне нужно, чтобы DLookup был равен текстовому полю. Я не думаю, что смогу использовать приведенный выше код в этом случае. Поле1 задается как числовое поле. Что странно, так это то, что если 1 = DLookup(Field1, Test1_Table, Field1= & Me.Text1), то... работает, когда я ввожу 1 в текстовое поле, но когда я заменяю 1, после if с Me.Text1 и введите 1 в текстовое поле, поиск не распознает значение 1 в поле1. - person ; 19.05.2009
comment
Почему бы не использовать DCount() вместо DLookup()? Вам нужно знать не возвращаемое значение (вы это уже знаете), а количество записей. То есть, если вы не слишком упростили свой пример, и вы действительно возвращаете значение, отличное от того, которое вы ищете. - person David-W-Fenton; 20.05.2009

Dim sWhere as String
sWhere = "Test1_Table.Field1=" & Me.Text1
If CInt(Me.Text1)=DLookup("Field1", "Test1_Table", sWhere) Then         
     MsgBox "It works" 
Else
   'do something else
End If

Попытка сделать слишком много vba внутри DLookup может быть проблемой?

person JeffO    schedule 19.05.2009
comment
Спасибо за ваш ответ - К сожалению, это тоже не работает. Я продолжаю делать что-то еще, что говорит мне о том, что код не ищет числовое значение. Для дополнительной информации field1 имеет четыре записи: 1,2,3,4. Когда я пытаюсь протестировать код, я ввожу 1 в текстовое поле, чтобы сделать его максимально простым. Это может быть ограничением DLookup (?) - person ; 19.05.2009
comment
Мне удалось воспроизвести ошибку вашего теста, но она работала при использовании: CInt(Me.Text1) = ... - person JeffO; 19.05.2009

Если CInt(Me.Text1) = DLookup("Field1", "Test1_Table", "Test1_Table.Field1=" & Me.Text1) Тогда...

Приведенный выше код работает отлично. Благодаря Guiness я смог использовать свой исходный код и просто добавить CInt в оператор if.

Кроме того, спасибо всем за ваш вклад.

ДФМ

person Community    schedule 20.05.2009