Доступ к VBA: функция DLookUp, выдающая ошибку несоответствия типов - PullRequest
3 голосов
/ 22 июля 2011

Я пытаюсь запустить следующий код, но я получаю ошибку компиляции "Несоответствие типов" в DLookUp.

DLookUp возвращает значение, верно? Для меня этот код говорит: в наборе записей strSQL найдите, где столбец SKUS_ORDERED равен curSKU2. strSQL, temp, curSKU2 инициализируются как переменные строкового типа.

...
 strSQL = "SELECT * FROM ORDER_DATA WHERE [ORDER]=" & curOrder

 Dim temp As String
 temp = DLookup("SKUS_ORDERED", db.OpenRecordset(strSQL), SKUS_ORDERED = curSKU2)
...

Где несоответствие типов? Кто-нибудь может мне помочь?

EDIT:

       ...
        Set fld_orders = rst_orders.Fields("ORDER")
        curOrder = fld_orders.Value

        Dim temp As String
        temp = DLookup("SKUS_ORDERED", "ORDER_DATA", "SKUS_ORDERED = '" & curSKU2 & "' AND [ORDER] = " & curOrder)

        If temp <> Null Then MsgBox temp
       ...

Весь код довольно длинный, но вот большой фрагмент, где инициализируется curOrder, это внутри вложенного цикла, curSKU2 инициализируется раньше вне цикла. Надеюсь, это поможет.

Ответы [ 2 ]

5 голосов
/ 22 июля 2011

Несоответствие происходит потому, что вторым параметром должна быть строка, а не RecordSet.
Если какой-либо из параметров в третьем аргументе является переменной (как в вашем случае), третий аргумент также должен быть объединенной строкой:

temp = DLookup("SKUS_ORDERED", "ORDER_DATA", _
            "SKUS_ORDERED = '" & curSKU2 & "' and ORDER = " & curOrder)

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

Без дополнительного кода трудно увидеть, где вы используете Null.
Правильно ли указаны имя таблицы и столбца?
Какие типы являются вашими переменными? Они действительно имеют значения?
Можете ли вы опубликовать еще код, где мы увидим, как вы объявляете и заполняете переменные?

Символ «_» обозначает разрыв строки. Я мог бы написать целое утверждение в одну строку, но тогда вам нужно было бы прокрутить, чтобы увидеть его полностью:

temp = DLookup("SKUS_ORDERED", "ORDER_DATA", "SKUS_ORDERED = '" & curSKU2 & "' and ORDER = " & curOrder)

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

Не могли бы вы показать части, где объявлены обе переменные и где также инициализируется curSKU2? С тем, что вы опубликовали, по-прежнему не видно, заполнен ли curSKU2 и какие это типы.

Плюс, temp объявлен как строка, поэтому он никогда не может быть нулевым.
Это имеет два последствия:

  1. If temp <> Null не имеет смысла.
  2. DLookup возвращает Null, когда запись не найдена, поэтому несоответствие типов может быть в строке temp = DLookup(...).
    Попробуйте temp = Nz(DLookup(...)) вместо.
2 голосов
/ 22 июля 2011

Я предлагаю вам изменить этот раздел вашего кода ...

Dim temp As String
temp = DLookup("SKUS_ORDERED", "ORDER_DATA", "SKUS_ORDERED = '" & curSKU2 & "' AND [ORDER] = " & curOrder)

на этот ...

Dim temp As String
Dim strCriteria As String
strCriteria = "SKUS_ORDERED = '" & curSKU2 & "' AND [ORDER] = " & curOrder
Debug.Print strCriteria
Debug.Print TypeName(DLookup("SKUS_ORDERED", "ORDER_DATA", strCriteria))
temp = DLookup("SKUS_ORDERED", "ORDER_DATA", strCriteria)

Если вы получили сообщение об ошибке, переключитесь в Немедленное окно, чтобыпросмотреть вывод из операторов Debug.Print.

Первый даст вам текст условия WHERE, которое вы можете проверить в новом запросе:

SELECT SKUS_ORDERED FROM ORDER_DATA WHERE [strCriteria text here]

Функция TypeName () сообщит вам тип данных возвращаемого значенияпо DLookup ().Если TypeName сообщает Null, вы получите сообщение об ошибке при попытке назначить его для строковой переменной (temp), потому что строковое значение никогда не может быть Null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...