2010-01-12 7 views
2

У меня есть код VBA и он возвращает 'несоответствие типа данных в выражении критериев' во время выполнения. Кажется, я не могу понять, почему это дает мне эту ошибку.MS Access - несоответствие типа данных

Может кто-нибудь мне помочь?

VBA:

Public Function GezaagdeOmzet(ByVal TotaalPrijs As Double, ByVal AantalArtiklesPerOrder As Double, ByVal TotaalArtiklesPerOrder As Double, ByVal AantalArtiklesVerwijderedUitZaaglijst As Double) As Double 

    Dim result As Double 

    On Error GoTo ErrHandler 

    If IsNumeric(TotaalPrijs) = False Then 
     MsgBox ("TotaalPrijs not a number") 
     MsgBox (TotaalPrijs) 
    End If 

    If IsNumeric(AantalArtiklesPerOrder) = False Then 
     MsgBox ("AantalArtiklesPerOrder not a number") 
     MsgBox (AantalArtiklesPerOrder) 
    End If 

    If IsNumeric(TotaalArtiklesPerOrder) = False Then 
     MsgBox ("TotaalArtiklesPerOrder not a number") 
     MsgBox (TotaalArtiklesPerOrder) 
    End If 

    If IsNumeric(AantalArtiklesVerwijderedUitZaaglijst) = False Then 
     MsgBox ("AantalArtiklesVerwijderedUitZaaglijst not a number") 
     MsgBox (AantalArtiklesVerwijderedUitZaaglijst) 
    End If 

    If Not TotaalPrijs = 0 Then 
     If AantalArtiklesPerOrder > 0 Then 
      result = TotaalPrijs/(AantalArtiklesPerOrder * TotaalArtiklesPerOrder) * AantalArtiklesVerwijderedUitZaaglijst 
      On Error GoTo ErrHandler 
     Else 
      MsgBox ("AantalArtiklesPerOrder is null, Cannot do calculation") 
     End If 
    Else 
     MsgBox ("TotaalPrijs is null, cannot do division") 
    End If 

Exit Function 
ErrHandler: 
    MsgBox ("TotaalPrijs: " & TotaalPrijs & " TotaalArtiklesPerOrder: " & TotaalArtiklesPerOrder & " AantalArtiklesPerOrder: " & AantalArtiklesPerOrder & " AantalArtiklesVerwijderedUitZaaglijst: " & AantalArtiklesVerwijderedUitZaaglijst) 
End Function 

SQL запросов в MS Access

GezaagdeOmzet: Sum(GezaagdeOmzet([TotaalPrijs],[tbl_ArtikelsPerOrder]![Aantal],[Totaal],[tbl_ArtikelVerwijderdUitZaaglijst]![Aantal])) 

Есть в любом случае, чтобы поймать ошибку я получаю с помощью VBA?

Cstr или CDec или CDbl не обрабатывают эту ошибку.

ответ

3

выше функция немного странно, так как haarrrgh говорит.

Он должен больше походить на код ниже. Вам не нужно проверять, что каждый из аргументов (TotaalPrijs, ByVal AantalArtiklesPerOrder и т. Д.) Является числом, потому что вы передаете их как Double. Если вы передадите что-либо, кроме числа, например буквы или Null, вы получите сообщение об ошибке. Если это не то, что вы хотите, подумайте о передаче аргументов As Variant, вы можете проверить, что они являются числами. Однако, поскольку вы используете это в запросе, я предлагаю вам не использовать окна сообщений, если аргумент равен нулю, сделать его равным нулю, если это то, что он должен быть.

Отметим также GezaagdeOmzet =, а не результат =

EDIT снова Комментарии

Public Function GezaagdeOmzet(ByVal TotaalPrijs As Variant, _ 
    ByVal AantalArtiklesPerOrder As Variant, _ 
    ByVal TotaalArtiklesPerOrder As Variant, _ 
    ByVal AantalArtiklesVerwijderedUitZaaglijst As Variant) As Double 

    On Error GoTo ErrHandler 

    If (Nz(AantalArtiklesPerOrder,0) * Nz(TotaalArtiklesPerOrder,0)) * _ 
     Nz(AantalArtiklesVerwijderedUitZaaglijst,0) = 0 Then 
     GezaagdeOmzet = 0 
    Else 
     GezaagdeOmzet = Nz(TotaalPrijs,0)/_ 
     (Nz(AantalArtiklesPerOrder,0) * Nz(TotaalArtiklesPerOrder,0)) * _ 
     Nz(AantalArtiklesVerwijderedUitZaaglijst,0) 
    End If 

Exit Function 

ErrHandler: 
    ' MsgBox ("TotaalPrijs: " & TotaalPrijs & " TotaalArtiklesPerOrder: " _ 
    & TotaalArtiklesPerOrder & " AantalArtiklesPerOrder: " & AantalArtiklesPerOrder _ 
    & " AantalArtiklesVerwijderedUitZaaglijst: " _ 
    & AantalArtiklesVerwijderedUitZaaglijst) 
End Function 
+0

Спасибо Remou, но я застрял со странным «#Error» в некоторых из полей, возвращаемых этой функцией, при запуске внутри запроса? –

+0

Вы получите сообщение об ошибке, если передаете нулевое значение вашей функции, и я думаю, что вы находитесь. – Fionnuala

+0

так как мне обойти эти нули? Есть ли способ обойти? –

0

Зачем запускать функцию, которая возвращает double, только чтобы преобразовать ее в строку и суммировать ее (даже это всего лишь одно значение)?
Я не понимаю.

Что произойдет, если вы запустите функцию напрямую, а не в запросе?
Вызывает ли ошибка ошибка?

И последнее, но не в последнюю очередь - там, кажется, две ошибки в функции, как сейчас:

1) Если TotaalArtiklesPerOrder или AantalArtiklesVerwijderedUitZaaglijst равен 0, он выдает ошибку (которая попадется, но в любом случае. ..), потому что тогда вы делите на ноль в этой строке:

result = TotaalPrijs/(AantalArtiklesPerOrder * TotaalArtiklesPerOrder) * AantalArtiklesVerwijderedUitZaaglijst 

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

2) Функция всегда будет возвращать 0, потому что вы вычисляете свой результат (в переменной «результат»), но вы его не возвращаете. Вы должны сделать это явно:

GezaagdeOmzet = result 
+0

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

+0

Хорошо, просто запустил это сам, без функции суммы, с которой он работает. Теперь, в некоторых из строк у него есть «#Error», так может ли это быть причиной того, что функция Sum дает ошибку? –

+0

Итак, вы имеете в виду, что вы запускали тот же запрос, просто без функции sum() и вашей функции GezaagteOmzet(), и прямо показывали столбцы, например [tbl_ArtikelsPerOrder]! [Aantal], а THEN некоторые поля показывали «#Error»? Если да, я полагаю, что функция работает, и в вашем запросе должно быть что-то не так. –

2

@Remou обеспечил то, что смотрит на меня, как рабочий раствор, но он на самом деле не в полной мере объяснить, почему он реализовали его по-разному.Вот некоторые из причин:

  1. Параметры для вашей первоначальной функции определяются как Двойной. Они не могут быть ни Null, ни non-numeric, поэтому все тесты для IsNumeric() в вашем исходном коде - пустая трата времени, так как они никогда не вернут FALSE.

  2. «несоответствие типа данных в выражении критериев» является очень распространенным сообщением об ошибке из запросов, которые передают Nulls в пользовательские функции, которые не могут принимать Nulls в своих параметрах. Объявление ваших параметров как вариантов - это один из подходов, но варианты могут привести к разным проблемам, и вы теряете сильную типизацию данных. Я бы рекомендовал хранить типы данных Double и передать CDbl (Nz ([TotaalPrijs], 0)) из исходного запроса.

+0

@ D W Fenton, вы можете посмотреть предыдущие сообщения от @Tony, где была проблема с использованием CDbl & Nz в запросе. Надеюсь, что вышеупомянутая функция поможет @Tony понять, как он может исправлять запрос, и что функция станет излишней. – Fionnuala