PDA

Vollständige Version anzeigen : Anzahl der Datensätze begrenzen


guy2
11.10.2011, 13:02
Hallo,

ich möchte Euch mal wieder mit einem Problem behelligen.

Um Kunden anschreiben zu können, habe ich eine Tabellenerstellungsabfrage erstellt, die anhand meiner Kundentabelle und der Geodaten der einzelnen Postleitzahlen, den Abstand der Kunden zu einen Ort X (die PLZ kann eingegeben werden) erstellt.


Meine Frage:
Wie kann ich es realisieren, dass meine Abfrage nur die ersten 100 Datensätze anzeigt, die dem Ort X am nächsten sind?

Für eure Hilfe sage ich schonmal ein rechtherzliches DANKE!

guy:)

Atrus2711
11.10.2011, 13:07
Hi,

wenn du die Entfernungsberechnung schon hast und damit das Sortierkriterium, ist das ein Klacks:

SELECT TOP 100 * FROM DeineTabelle ORDER BY Entfernung ASC
für die 100 Sätze mit der kleinsten Entfernung. Für die 100 mit der größten nimmst du DESC statt ASC.

Morli
11.10.2011, 13:08
.... indem du die Abfrage aufsteigend nach der Entfernung zum Ort X sortierst und die Abfrage dann mit "Select Top 100 from ....." anfangen lässt.

Morli

ebs17
11.10.2011, 13:09
SELECT Top 100 *
FROM DeineAbfrage
ORDER BY Nähe

guy2
11.10.2011, 13:12
Soweit so gut, das hatte ich auch schon ergoogelt.

Mein Problem, wo schreibe ich das hin?
Geht das direkt in die Abfrage?:p

Atrus2711
11.10.2011, 13:17
Das ist SQL. Das kannst du direkt in die SQL-Ansicht der Abfrage schreiben. Da kommst du hin durch Ansicht/SQL (bis 2003) bzw. durch das Symbol "SQL" (ab 2007).

guy2
11.10.2011, 14:03
Hmm,
wenn mir jetzt noch einer einen Tipp gibt, wie das hier einzubinden ist :upps:
Könnte man die Anzahl der Datensätze vorher abfragen, so dass ich etwas flexibler wäre?

SELECT TA_013_Geodaten.PLZ AS [Umkreis-PLZ], Val(Round(Sqr(Abs((([TA_013_Geodaten].[Länge]-[AF_013_Betriebe_ohne_GS].[Länge])*71.5)^2)+(Abs(([TA_013_Geodaten].[Breite]-[AF_013_Betriebe_ohne_GS].[Breite])*111)^2)))) AS [Entfernung in km], AF_013_Betriebe_ohne_GS.Versicherte, AF_013_Betriebe_ohne_GS.GFTS, AF_013_Betriebe_ohne_GS.Untergruppe, AF_013_Betriebe_ohne_GS.MGNR, AF_013_Betriebe_ohne_GS.Name1, AF_013_Betriebe_ohne_GS.Name2, AF_013_Betriebe_ohne_GS.Name3, AF_013_Betriebe_ohne_GS.Strasse, AF_013_Betriebe_ohne_GS.Ort, AF_013_Betriebe_ohne_GS.PLZ
FROM TA_013_Geodaten, AF_013_Betriebe_ohne_GS INNER JOIN TA_013_Gefahrtarif ON (AF_013_Betriebe_ohne_GS.Untergruppe = TA_013_Gefahrtarif.Untergruppe) AND (AF_013_Betriebe_ohne_GS.GFTS = TA_013_Gefahrtarif.GTS)
GROUP BY TA_013_Geodaten.PLZ, Val(Round(Sqr(Abs((([TA_013_Geodaten].[Länge]-[AF_013_Betriebe_ohne_GS].[Länge])*71.5)^2)+(Abs(([TA_013_Geodaten].[Breite]-[AF_013_Betriebe_ohne_GS].[Breite])*111)^2)))), AF_013_Betriebe_ohne_GS.Versicherte, AF_013_Betriebe_ohne_GS.GFTS, AF_013_Betriebe_ohne_GS.Untergruppe, AF_013_Betriebe_ohne_GS.MGNR, AF_013_Betriebe_ohne_GS.Name1, AF_013_Betriebe_ohne_GS.Name2, AF_013_Betriebe_ohne_GS.Name3, AF_013_Betriebe_ohne_GS.Strasse, AF_013_Betriebe_ohne_GS.Ort, AF_013_Betriebe_ohne_GS.PLZ, TA_013_Gefahrtarif.Auswahl
HAVING (((TA_013_Geodaten.PLZ)=[Bitte PLZ zur Umkreisberechnung eingeben]) AND ((Val(Round(Sqr(Abs((([TA_013_Geodaten].[Länge]-[AF_013_Betriebe_ohne_GS].[Länge])*71.5)^2)+(Abs(([TA_013_Geodaten].[Breite]-[AF_013_Betriebe_ohne_GS].[Breite])*111)^2))))) Between 0 And Val([Bitte Radius im km eingeben])) AND ((AF_013_Betriebe_ohne_GS.Versicherte) Between 1 And 50) AND ((TA_013_Gefahrtarif.Auswahl)=Yes))
ORDER BY Val(Round(Sqr(Abs((([TA_013_Geodaten].[Länge]-[AF_013_Betriebe_ohne_GS].[Länge])*71.5)^2)+(Abs(([TA_013_Geodaten].[Breite]-[AF_013_Betriebe_ohne_GS].[Breite])*111)^2))));

Ich muss da leider passen.

Atrus2711
11.10.2011, 14:08
Hi,

gosh, was für ein Chaos. :upps:

Zerleg das doch mal in kleinere Einheiten (die z.B. die Berechnungen schonmal wegnehmen), und nutze Aliase, um die langen Namen nicht nutzen zu müssen:
SELECT Alias.Feld FROM Tabelle AS Alias

Und: ist das Kreuzprodukt im FROM beabsichtigt? Kreuzprodukte sind nicht verboten, aber oftmals unerwünscht.

guy2
11.10.2011, 15:47
Nochmal hmm, das sind für mich ehrlich gesagt spanische Dörfer.
Ich habe von dem nichts geschrieben, ich habe lediglich in der Entwurfsansicht gearbeitet.

ebs17
11.10.2011, 16:09
Das "TOP 100" kannst Du direkt in die SQL-Anweisung einfügen, falls die Sortierung nach Entfernungen schon passt.
ich habe lediglich in der Entwurfsansicht gearbeitet
Auch dort kann man Tabellenaliase einstellen und damit ellenlange Tabellenbezeichnungen auf einzelne Buchstaben verkürzen. Einfach Tabelle markieren und Eigenschaftsblatt öffnen (siehe Anlage).

guy2
12.10.2011, 10:23
So, die Begrenzung der Anzahl der Datensätze mit TOP funktioniert.

SELECT TOP 100 TA_013_Geodaten.PLZ AS [Umkreis-PLZ].....

Aber wie kann ich jetzt die Anzahl über eine Eingabe steuern, d.h. eine Eingabebox, in die ich Anzahl eingeben kann?

fhentzsc
12.10.2011, 10:37
wenn du die Anzahl per Eingabe steuern möchtest, musst du den SQL-String dynamisch aufbauen und dann erst verwenden.


Gruß

Frank

Atrus2711
12.10.2011, 10:51
Hi,

...was etwa so gehen könnte:

Currentdb.QueryDefs("DeineAbfrage").SQL = "SELECT TOP " & Forms!DeinForm!DeinTextfeldMitDerSatzanzahl & " TA_013_Geodaten.PLZ AS [Umkreis-PLZ] ..."

Wenn das referenzierte Formular das aktuelle ist, geht auch

Currentdb.QueryDefs("DeineAbfrage").SQL = "SELECT TOP " & Me!DeinTextfeldMitDerSatzanzahl & " TA_013_Geodaten.PLZ AS [Umkreis-PLZ] ..."

guy2
12.10.2011, 12:55
Hallo Martin,

vielleicht stelle ich mich auch einfach zu doof an, aber es gibt kein Formular zu der Abfrage.
Die Variablen werden direkt aus der Abfrage heraus abgefragt.

Viele Grüße
Guido

Atrus2711
12.10.2011, 12:58
Naja, aber die TOP X willst du doch vorgeben... das war doch dein Wunsch:
wie kann ich jetzt die Anzahl über eine Eingabe steuern ... es gibt kein Formular zu der Abfrage
hast du keins, bau dir eins.

Eine Inputbox bzw. Parameter an dieser Stelle, mit dem du ad hoc den Wert abfragen könntest, läuft jedenfalls nicht:

'geht so nicht!!!
SELECT TOP [wie viele] * FROM Tabelle