Access VBA: ошибка во время выполнения «94»: недопустимое использование Null - PullRequest
3 голосов
/ 28 марта 2011

Я пытаюсь вычислить расстояние между двумя точками (учитывая широту / долготу этих точек в десятичном формате).

код VBA:

Const pi = 3.14159265358979

Function distance(lat1, lon1, lat2, lon2)
Dim theta, dist
theta = lon1 - lon2
dist = Sin(deg2rad(lat1)) * Sin(deg2rad(lat2)) + Cos(deg2rad(lat1)) * Cos(deg2rad(lat2)) * Cos(deg2rad(theta))
dist = acos(dist)
dist = rad2deg(dist)
distance = (dist * 60 * 1.1515) * 1.609344
End Function

Function acos(rad)
If Abs(rad) <> 1 Then
acos = pi / 2 - Atn(rad / Sqr(1 - rad * rad))
ElseIf rad = -1 Then
acos = pi
End If
End Function

Function deg2rad(deg)
deg2rad = CDbl(deg * pi / 180)
End Function

Function rad2deg(rad)
rad2deg = CDbl(rad * 180 / pi)
End Function

И я получаю ошибку Ошибка времени выполнения '94': недопустимое использование Null в этой строке "deg2rad = CDbl (deg * pi / 180)". Я пишу запрос:

SELECT DISTINCT 

([band].E_laip+([band].E_min*(1/60))+([band].E_sec*(1/3600))) AS Band_E_dec, 
([band2].E_laip+([band2].E_min*(1/60))+([band2].E_sec*(1/3600))) AS Band2_E_dec,
([band].N_laip+([band].N_min*(1/60))+([band].N_sec*(1/3600))) AS Band_N_dec, 
([band2].N_laip+([band2].N_min*(1/60))+([band2].N_sec*(1/3600))) AS Band2_N_dec,

distance([Band_N_dec],[Band_E_dec],[Band2_N_dec],[Band2_E_dec]) AS Atstumas

FROM [band] LEFT JOIN band2 ON [band].Stotis = band2.Stotis;

Может, у кого-то есть идея? Заранее спасибо.

1 Ответ

2 голосов
/ 28 марта 2011

Если вы используете LEFT JOIN, , вы разрешаете пустые значения в вашей таблице JOIN ed, когда нет подходящей строки. Я думаю, у вас есть хотя бы одна запись в вашей таблице band, в которой нет соответствующей строки в band2 в поле stotis.

Чтобы узнать, сделайте:

SELECT *
FROM band
LEFT JOIN band2
ON [band].Stotis = band2.Stotis
WHERE band2.stotis IS NULL

Если вы получили какие-либо попадания, у вас возникла проблема со ссылочными данными.

Ваше решение - либо LEFT JOIN с использованием WHERE Band2.stotis IS NOT NULL, либо просто INNER JOIN с одинаковыми критериями, которые будут возвращать только совпадающие строки в обеих таблицах.

...