von marcel_at_work » Mi, 12.05.2010 20:59
Hallllllllööööööchen DPunch,
dessen bin ich mir doch ABSOLUT bewußt!!! Und das DU MIR schon so ausgiebig geholfen hast, finde ich äußerst bewundernswert!
Ich sitze die letzte Zeit echt Tag und Nacht am Rechner, um selbst zu den Lösungen zu kommen. Ich bin aber am Verzweifeln, weil anscheinend auch niemand anders eine Lösung zu diesem Service hat.
Wie du schon schriebst, habe ich sogar auch schon die englische Referenz dazu durchgearbeitet (und soweit ich es verstanden habe, auch angewendet). Der Erfolg blieb mir aber trotzallem verwährt.
Der Service RowSet von XResultSet... unterstützt bis auf die Navigation anscheinend andere Methoden wie z.B. auch refreshRow, etc. Leider habe ich aber beim Implementieren versagt. Egal, was ich auch versuchte.
Die Gute Nachricht (ja, die gibt es

): Ich habe indessen mein komplettes Programm auf RowSet/XResult... bzw. allg. SQL-Abfragen umgestellt, und es ENDLICH geschafft, die Basis deiner Entfernungs-Berechnung einzubinden. (ich mußte dazu jedoch ziemlich viele Website zu diesem Thema überfliegen und gar, über verschiedene Wikis, Mathematische Funktionsgleichungen der Oberstufe studieren, bis ich irgendwelche Zusammenhänge verstand

)
Schau doch mal...
(Edit: "Initialisierung der DB-Verbindung" findet an andere Stelle im Programmablauf statt)
Code: Alles auswählen
OPTION EXPLICIT
Sub geoCoords()
Dim nGeoLatStart, nGeoLonStart, nGeoLatTarget, nGeoLonTarget as Double
Dim nLatitudeStart, nLongitudeStart, nLatitudeTarget, nLongitudeTarget as Double
Dim nDistance, nMaxDistance
Dim sEntry, sListSpace
Dim startTime, endTime, countTime, nHits
startTime = GetSystemTicks 'Abrufen der Systemzeit für den Funktions-Counter
nHits = 0
nMaxDistance = 6000
oResultGeo.Command = "SELECT Unternehmen, Zusatz, Anschrift, PLZ, Ort, Land, Bundesland, Latitude, Longitude, Geschlecht, Titel, Vorname, Nachname, Position, Tel1, Tel2, Tel3, Fax, eMail, Web, Tags, Anmerkungen, Erstellungsdatum, Änderungsdatum FROM geopersonality.adresses"
oResultGeo.Execute
oResultGeo.next()
nGeoLatStart = 50.11222 'Frankfurt
nGeoLonStart = 08.68194
'nGeoLatTarget = 52.52222 'Berlin
'nGeoLonTarget = 13.29750
nLatitudeStart = nGeoLatStart / 180 * Pi
nLongitudeStart = nGeoLonStart / 180 * Pi
Do While oResultGeo.Next
If oResultGeo.getDouble(8) <> 0 Then 'Wenn Feld "PLZ" nicht leer,...
'... Abrufen der Koordinaten aus dem ResultSet
nGeoLatTarget = oResultGeo.getDouble(8)
nGeoLonTarget = oResultGeo.getDouble(9)
'Vorbereitung der Koordinaten für die Arkuskosinus-Funktion
nLatitudeTarget = nGeoLatTarget / 180 * Pi
nLongitudeTarget = nGeoLonTarget / 180 * Pi
nDistance = ArcCos(Sin(nLatitudeStart) * Sin(nLatitudeTarget) + Cos(nLatitudeStart) * Cos(nLatitudeTarget) * Cos(nLongitudeTarget - nLongitudeStart)) * 6378.137
If nDistance <= nMaxDistance Then
nDistance = Left(nDistance, Instr(nDistance,",") + 1) 'Die Entfernungsangabe (nDistance) bis auf eine Stelle nach dem Komma abschneiden
'Vervollständigung von "nDistance" mit Leerzeichen, um in der Listbox eine gleichförmige Ansicht in Spalten zu gewährleisten
If Len(nDistance) = 3 Then
sListSpace = " "
ElseIf Len(nDistance) = 4 Then
sListSpace = " "
ElseIf Len(nDistance) = 5 Then
sListSpace = " "
End If
sEntry = "[→" & sListSpace & nDistance & " Km] " & oResultGeo.getString(4) & " " & oResultGeo.getString(5)
If oResultGeo.getString(19) <> "" Then sEntry = sEntry & " → " & oResultGeo.getString(19)
'Übertragung in das Listbox-Element
listGeoResults.additem(sEntry, 0)
nHits = nHits + 1 'Aktualisierung der Ergebnis-Anzeige
End If
End If
Loop
'listGeoResults.removeitems(0,1) 'Einen Eintrag ab Eintrag 1(0) löschen oder...
'EmptyListBox(listGeoResults)
endTime = GetSystemTicks 'Erneutes Abrufen der Systemzeit für den Funktions-Counter
countTime = (endTime - startTime)/1000 'Differenz zwischen den Counter-Zeiten berechnen
'If Instr(countTime,"-") > 0 Then
' countTime = replaceString(countTime,"",",")
' countTime = replaceString(countTime,"","E")
'End If
textGeoInfo.text = nHits & " Ergebnisse (" & countTime & " Sekunden)"
End Sub
'Experimentelle Arkussinus-Funktion für OpenOffice.org-Basic
Function ArcSin(x)
Dim nNumer, nDenom, nFrac, nResult, nNewTerm
nNumer = 1
nDenom = 2
nFrac = 1
nResult = x
For i = 1 To 100
nFrac = nFrac * nNumer / nDenom
nNumer = nDenom + 1
nDenom = nNumer + 1
nNewTerm = nFrac * ((x^nNumer)/nNumer)
nResult = nResult + nNewTerm
If nNewTerm < 1.0E-60 Then
Exit For
EndIf
Next i
ArcSin = nResult
End Function
'Experimentelle Arkuskosinus-Funktion für OpenOffice.org-Basic
Function ArcCos(x)
ArcCos = ArcSin(Sqr(1 - x^2))
End Function
Das einzige, wozu ich eben immer noch keinen Zugriff habe, ist das "Schreiben IN die DB". *heul*
DU benutzt ja selbst gelegentlich den RowSet-Service... könntest du mir denn eventuell mal ein einfaches Script von dir posten, wo man die "Abfragen und Updates" der DB sieht? Wie speicherst DU denn dann mit diesem Service in die DB?
ODER hat vielleicht jemand ANDERS ein Bsp.-Script zur Veranschaulichung?
>Heute ist "ökomenischer Kirchentag" und die Hoffnung ist deshalb gerade wieder sehr präsent, dass ein Wunder geschieht und sich mir vielleicht doch noch der ein oder andere offenbahrt!!!
GlG, Marci
Hallllllllööööööchen DPunch, :D
dessen bin ich mir doch ABSOLUT bewußt!!! Und das DU MIR schon so ausgiebig geholfen hast, finde ich äußerst bewundernswert! :)
Ich sitze die letzte Zeit echt Tag und Nacht am Rechner, um selbst zu den Lösungen zu kommen. Ich bin aber am Verzweifeln, weil anscheinend auch niemand anders eine Lösung zu diesem Service hat.
Wie du schon schriebst, habe ich sogar auch schon die englische Referenz dazu durchgearbeitet (und soweit ich es verstanden habe, auch angewendet). Der Erfolg blieb mir aber trotzallem verwährt.
Der Service RowSet von XResultSet... unterstützt bis auf die Navigation anscheinend andere Methoden wie z.B. auch refreshRow, etc. Leider habe ich aber beim Implementieren versagt. Egal, was ich auch versuchte.
Die Gute Nachricht (ja, die gibt es :lol: ): Ich habe indessen mein komplettes Programm auf RowSet/XResult... bzw. allg. SQL-Abfragen umgestellt, und es ENDLICH geschafft, die Basis deiner Entfernungs-Berechnung einzubinden. (ich mußte dazu jedoch ziemlich viele Website zu diesem Thema überfliegen und gar, über verschiedene Wikis, Mathematische Funktionsgleichungen der Oberstufe studieren, bis ich irgendwelche Zusammenhänge verstand :lol: :D )
Schau doch mal...
(Edit: "Initialisierung der DB-Verbindung" findet an andere Stelle im Programmablauf statt)
[code]
OPTION EXPLICIT
Sub geoCoords()
Dim nGeoLatStart, nGeoLonStart, nGeoLatTarget, nGeoLonTarget as Double
Dim nLatitudeStart, nLongitudeStart, nLatitudeTarget, nLongitudeTarget as Double
Dim nDistance, nMaxDistance
Dim sEntry, sListSpace
Dim startTime, endTime, countTime, nHits
startTime = GetSystemTicks 'Abrufen der Systemzeit für den Funktions-Counter
nHits = 0
nMaxDistance = 6000
oResultGeo.Command = "SELECT Unternehmen, Zusatz, Anschrift, PLZ, Ort, Land, Bundesland, Latitude, Longitude, Geschlecht, Titel, Vorname, Nachname, Position, Tel1, Tel2, Tel3, Fax, eMail, Web, Tags, Anmerkungen, Erstellungsdatum, Änderungsdatum FROM geopersonality.adresses"
oResultGeo.Execute
oResultGeo.next()
nGeoLatStart = 50.11222 'Frankfurt
nGeoLonStart = 08.68194
'nGeoLatTarget = 52.52222 'Berlin
'nGeoLonTarget = 13.29750
nLatitudeStart = nGeoLatStart / 180 * Pi
nLongitudeStart = nGeoLonStart / 180 * Pi
Do While oResultGeo.Next
If oResultGeo.getDouble(8) <> 0 Then 'Wenn Feld "PLZ" nicht leer,...
'... Abrufen der Koordinaten aus dem ResultSet
nGeoLatTarget = oResultGeo.getDouble(8)
nGeoLonTarget = oResultGeo.getDouble(9)
'Vorbereitung der Koordinaten für die Arkuskosinus-Funktion
nLatitudeTarget = nGeoLatTarget / 180 * Pi
nLongitudeTarget = nGeoLonTarget / 180 * Pi
nDistance = ArcCos(Sin(nLatitudeStart) * Sin(nLatitudeTarget) + Cos(nLatitudeStart) * Cos(nLatitudeTarget) * Cos(nLongitudeTarget - nLongitudeStart)) * 6378.137
If nDistance <= nMaxDistance Then
nDistance = Left(nDistance, Instr(nDistance,",") + 1) 'Die Entfernungsangabe (nDistance) bis auf eine Stelle nach dem Komma abschneiden
'Vervollständigung von "nDistance" mit Leerzeichen, um in der Listbox eine gleichförmige Ansicht in Spalten zu gewährleisten
If Len(nDistance) = 3 Then
sListSpace = " "
ElseIf Len(nDistance) = 4 Then
sListSpace = " "
ElseIf Len(nDistance) = 5 Then
sListSpace = " "
End If
sEntry = "[→" & sListSpace & nDistance & " Km] " & oResultGeo.getString(4) & " " & oResultGeo.getString(5)
If oResultGeo.getString(19) <> "" Then sEntry = sEntry & " → " & oResultGeo.getString(19)
'Übertragung in das Listbox-Element
listGeoResults.additem(sEntry, 0)
nHits = nHits + 1 'Aktualisierung der Ergebnis-Anzeige
End If
End If
Loop
'listGeoResults.removeitems(0,1) 'Einen Eintrag ab Eintrag 1(0) löschen oder...
'EmptyListBox(listGeoResults)
endTime = GetSystemTicks 'Erneutes Abrufen der Systemzeit für den Funktions-Counter
countTime = (endTime - startTime)/1000 'Differenz zwischen den Counter-Zeiten berechnen
'If Instr(countTime,"-") > 0 Then
' countTime = replaceString(countTime,"",",")
' countTime = replaceString(countTime,"","E")
'End If
textGeoInfo.text = nHits & " Ergebnisse (" & countTime & " Sekunden)"
End Sub
'Experimentelle Arkussinus-Funktion für OpenOffice.org-Basic
Function ArcSin(x)
Dim nNumer, nDenom, nFrac, nResult, nNewTerm
nNumer = 1
nDenom = 2
nFrac = 1
nResult = x
For i = 1 To 100
nFrac = nFrac * nNumer / nDenom
nNumer = nDenom + 1
nDenom = nNumer + 1
nNewTerm = nFrac * ((x^nNumer)/nNumer)
nResult = nResult + nNewTerm
If nNewTerm < 1.0E-60 Then
Exit For
EndIf
Next i
ArcSin = nResult
End Function
'Experimentelle Arkuskosinus-Funktion für OpenOffice.org-Basic
Function ArcCos(x)
ArcCos = ArcSin(Sqr(1 - x^2))
End Function
[/code]
Das einzige, wozu ich eben immer noch keinen Zugriff habe, ist das "Schreiben IN die DB". *heul*
DU benutzt ja selbst gelegentlich den RowSet-Service... könntest du mir denn eventuell mal ein einfaches Script von dir posten, wo man die "Abfragen und Updates" der DB sieht? Wie speicherst DU denn dann mit diesem Service in die DB?
ODER hat vielleicht jemand ANDERS ein Bsp.-Script zur Veranschaulichung?
>Heute ist "ökomenischer Kirchentag" und die Hoffnung ist deshalb gerade wieder sehr präsent, dass ein Wunder geschieht und sich mir vielleicht doch noch der ein oder andere offenbahrt!!! :shock: :lol:
GlG, Marci