2017-01-09 39 views
0

經過幾個星期的努力,我必須給朋友打電話。我認爲我愈發離我越來越亂。我在MS Access中有兩個表格(見下面)SQL VBA - 基於計算的最小結果更新表中的字段

目標是在包含最近城市的地區的表(「tblnewbid」)的表格(「tblnewbid」)中結束一個名爲(「O_CityRegion」)的新字段。所以我需要使用每個城市的經度和緯度,這些國家的地區相匹配(簡單地減少計算時間),並計算它們之間的距離。在該區域內的城市列表中,我需要找到最小距離並將相應的SubRegion返回到「O_CityRegion」字段中。

從數學上講,我知道下面的公式適用於座標之間計算距離:

(ACOS(COS(RADIANS(90-(Latitude1))) * COS(RADIANS(90-(Latitude2))) + SIN(RADIANS(90-(Latitude1))) * SIN(RADIANS(90-(Latitude2))) * COS(RADIANS((Longitude1)-(Longitude2))))*3958 

這是剛剛工作的所有其他部分的問題。我想我以前一直很接近,但我現在只是複製我的代碼。在其中

Access表和字段:

tblnewbid 

Origin // O_State Region // Latitude // Longitude 

tblClosestCities 

CityState // Latitude // Longitude // Region // SubRegion 

下面是我的代碼,因爲它代表:

Private Sub btnInsertClosestCityRegion_Click() 
Dim strSQL As Variant 
Dim rs1 As DAO.Recordset 
Dim db As Database 
Dim FSO As New FileSystemObject 
Dim Distance As Integer 

Set db = CurrentDb 

db.Execute ALTER TABLE [tblnewbid] ADD COLUMN O_CityRegion CHAR, dbFailOnError 

Set rs1 = db.OpenRecordset(Select [Origin] FROM [tblnewbid];) 

rs1.MoveFirst 

    strSQL = "UPDATE [tblnewbid] INNER JOIN [tblClosestCities]" 
    strSQL = strSQL & ON [tblClosestCities].[Region] = tblnewbid.[O_StateRegion] 
    strSQL = strSQL & SET [tblClosestCities].[SubRegion] = [tblnewbid].[O_CityRegion] 
    strSQL = strSQL & " FROM (" 
    strSQL = strSQL & " SELECT [tblClosestCities].[SubRegion], (3958 * ACOS(COS(RADIANS(90-[tblnewbid].[Latitude])) * COS(RADIANS(90-[tblClosestCities].[Latitude])) + SIN(RADIANS(90-[tblnewbid].[Latitude])) * SIN(RADIANS(90-[tblClosestCities].[Latitude])) * COS(RADIANS([tblnewbid].[Longitude]-[tblClosestCities].[Longitude]))) AS " & Distance & ")" 
    strSQL = strSQL & " FROM tblClosestCities, " & tblnewbid & ")" 
    strSQL = strSQL & " WHERE " & Distance & " = MIN(" & Distance & ")" 

    db.Execute (strSQL), dbFailOnError 


rs1.Close 

Set rs1 = Nothing 
Set db = Nothing 

DoCmd.Hourglass False 
MsgBox "The proxity of the city within the states have been added!" 
End Sub 

回答

1

如果SQL包含聚合函數無法更新表。先用最小距離創建臨時表,然後運行更新。