Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Umkreissuche Access SQL

Begonnen von Adrjan, April 01, 2016, 16:40:30

⏪ vorheriges - nächstes ⏩

Adrjan

Hallo zusammen,

gibt es irgendeine Möglichkeit, dieses Statement funktionstüchtig zu bekommen?

Me!Liste.RowSource = "SELECT * , (33959 * acos( cos( radians('" & Me.Breitengrad & "') ) * cos( radians(Geo.latitude) )* cos( radians(Geo.longitude ) - radians('" & Me.Laengengrad & "') ) + sin(radians('" & Me.Breitengrad & "') ) * sin( radians(Geo.latitude) ))) AS distanz  " & _
"FROM Geo " & _
"HAVING distanz < 20 "

Ziel ist es, in meinem Listenfeld, nur die Datensätze aus der Tabelle "Geo" abzubilden, welcher innerhalb des 20km Umkreises vom Breitengrad aus "Me.Breitengrad " und dem Längengrad aus "Me.Laengengrad " liegen.

Ich bin leider nicht wirklich fit in sachen VBA und allgemein auch Access.
Bisher sind leider alle meine Lösungsansätze gescheitert.
Scheinbar kann Access nicht mit den Funktionen "acos" und "radians" umgehen.

Habt ihr eine Idee wie ich das hinbekommen kann?

Vielen lieben Dank bereits für Eure Hilfe.

Viele Grüße
Adrjan

MzKlMu

Hallo,
versuche das mal so:

Me!Liste.RowSource = "SELECT * FROM Geo WHERE  (33959 * acos( cos( radians('" & Me.Breitengrad & "') ) * cos( radians(Geo.latitude) )* cos( radians(Geo.longitude ) - radians('" & Me.Laengengrad & "') ) + sin(radians('" & Me.Breitengrad & "') ) * sin( radians(Geo.latitude) ))) < 20"

Zeilenumbrüche musst Du einfügen, war ich jetzt zu faul dazu.

Das berechnet Feld wird nicht benötigt. Wenn Du es sehen willst, musst Du das mit der gleichen Formel eintragen. Die Formel wird also für das Feld benötigt und die WHERE Klausel.
Gruß Klaus

DF6GL

Hallo,

die Radians-Funktion gibt es in Access-VBA/SQL nicht...

Möglicherweise geht dieses:


Dim strSQL as String
strSQL =SELECT * , fktDist( " & str(Me!Breitengrad) & ", latitude , longitude, " & str(Me!Laengengrad) & ") AS distanz  FROM Geo HAVING distanz < 20

Me!Liste.RowSource = strSQL



und in einem Standard-Modul

ZitatPublic Function fktDist(Breitengrad As Double, latitude As Double, longitude As Double, Laengengrad As Double)
fktDist = 33959 * acos(Cos(Atn(Breitengrad)) * Cos(Atn(latitude)) * Cos(Atn(longitude) - Atn(Laengengrad)) + Sin(Atn(Breitengrad)) * Sin(Atn(latitude)))
End Function

Adrjan

Vielen Dank für eure Antworten.
Leider scheint es noch nicht zu funktionieren.

Dim strSQL as String
strSQL = "SELECT * , fktDist( " & str(Me!Breitengrad) & ", latitude , longitude, " & str(Me!Laengengrad) & ") AS distanz  FROM Geo HAVING distanz < 20"
Me!Liste.RowSource = strSQL

Public Function fktDist(Breitengrad As Double, latitude As Double, longitude As Double, Laengengrad As Double)
fktDist = 33959 * acos(Cos(Atn(Breitengrad)) * Cos(Atn(latitude)) * Cos(Atn(longitude) - Atn(Laengengrad)) + Sin(Atn(Breitengrad)) * Sin(Atn(latitude)))
End Function

Leider erscheint nur eine leere Tabelle im Listenfeld.
Ein Fehler wird allerdings nicht angezeigt, nur finde ich nicht, woran es noch liegen kann.

Viele Grüße


MaggieMay

Hallo,

ersetze mal HAVING durch WHERE.
Freundliche Grüße
MaggieMay

Adrjan

Zitatersetze mal HAVING durch WHERE.
Leider hatte das keine Auswirkung.

MaggieMay

#6
Dann nimm den generierten SQL-Code und teste ihn im SQL-Fenster einer neuen Abfrage.

PS:
Sorry, aber der Ansatz von Klaus war schon ganz richtig, du kannst das berechnete Feld nicht im Kriterium verwenden.
Da muss also der komplette Ausdruck noch einmal ausgeschrieben werden.
strSQL = "SELECT * , fktDist( " & str(Me!Breitengrad) & ", latitude , longitude, " & str(Me!Laengengrad) & ") AS distanz  " & _
            "FROM Geo WHERE fktDist( " & str(Me!Breitengrad) & ", latitude , longitude, " & str(Me!Laengengrad) & ")< 20"
Freundliche Grüße
MaggieMay

Adrjan

In einer gesonderten Abfrage kann ich die Public function aber nicht ansteuern (Undefinierte Funktion).

Public Function fktDist(Breitengrad As Double, latitude As Double, longitude As Double, Laengengrad As Double)
fktDist = 33959 * acos(Cos(Atn(Breitengrad)) * Cos(Atn(latitude)) * Cos(Atn(longitude) - Atn(Laengengrad)) + Sin(Atn(Breitengrad)) * Sin(Atn(latitude)))
End Function

ZitatDa muss also der komplette Ausdruck noch einmal ausgeschrieben werden.

Wie meinst du das genau?

MaggieMay

Code siehe oben.

Befindet sich die Funktion nicht in einem allgemeinen Modul?
Freundliche Grüße
MaggieMay

Adrjan

Ah OK.
Ich habe die Funktion nun in ein eigenes (allgemeines) Modul eingetragen. Jetzt greift die Abfrage darauf zu.

Also wenn ich das HAVING durch WHERE ersetze, dann kann er den Parameter "distanz" nicht finden.
Wenn ich "HAVING" belasse, dann erhalte ich die Fehlermeldung "HAVING-Klausel (distanz<20) ohne Gruppierung oder Aggregatfunktion".



MzKlMu

Hallo,
wie soll man einen Vorschlag machen, wenn man nix sieht ?

Zeige daher bitte den vollständigen aktuell verwendeten SQL_Code.
Gruß Klaus

Adrjan

Sorry.
Ich teste gerade folgende Abfrage:

SELECT *, fktDist(33.3334,Geo.latitude,Geo.longitude,69.952) AS distanz
FROM Geo
WHERE distanz < 20;

MzKlMu

Hallo,
wie ich weiter oben schon geschrieben habe, muss in der Wherklausel die Berechnung auch verwendet werden.

SELECT *, fktDist(33.3334,Geo.latitude,Geo.longitude,69.952) AS distanz
FROM Geo
WHERE fktDist(33.3334,Geo.latitude,Geo.longitude,69.952) < 20


Brauchst Du das Feld Distanz zur Anzeige ?
Gruß Klaus

Adrjan

#13
Ja, ich möchte das Feld Distanz mit in das Listenfeld aufnehmen.
Die Abfrage funktioniert mit deinem Code zwar fehlerfrei, nur wird scheinbar kein Umkreis gefiltert, da alle Datensätze der Tabelle Geo angezeigt werden.

Bei der Public Function...

Public Function fktDist(Breitengrad As Double, latitude As Double, longitude As Double, Laengengrad As Double)
fktDist = 33959 * acos(Cos(Atn(Breitengrad)) * Cos(Atn(latitude)) * Cos(Atn(longitude) - Atn(Laengengrad)) + Sin(Atn(Breitengrad)) * Sin(Atn(latitude)))
End Function


..-musste ich noch eine weitere Funktion "ACos" hinzufügen, da Access anscheinend mit acos auch nicht umgehen kann.

Public Function ACos(x As Double) As Double
Const Pi = 3.14159265358979
'Pi = 4*Atn(1)
If x = 1 Then
  ArcCos = 0
ElseIf x = -1 Then
  ArcCos = Pi
ElseIf x < 1 And x > -1 Then
  ArcCos = Atn(-x / Sqr((-x * x) + 1)) + Pi / 2
End If
End Function


Wie gesagt, haut die Umkreissuche aber trotzdem nicht hin...

MzKlMu

Hallo,
was wird dann im Feld Distanz angezeigt, stehen da korrekte Zahlen ?

Du musst natürlich sicher sein, dass die Rechnung selbst stimmt. Zur Formel kann ich aber nichts sagen, habe ich keine Erfahrung.
Gruß Klaus