Neuigkeiten:

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

Mobiles Hauptmenü

SQL Abfrage - SELECT TOP aber um einen bestimmten Datensatz herum

Begonnen von Jakomo, Mai 30, 2023, 18:53:15

⏪ vorheriges - nächstes ⏩

Jakomo

Ich will die Ausgaben etwas beschleunigen, und nicht alle Datensätze mit einer Abfrage ansprechen, zumal die Datensätze auch recht umfangreich sind, Nebentabellen haben und meist dazu auch externe Bilder dargestellt werden etc.

Bei anderen Tabellen, die zumeist nach Datum absteigend gebraucht werden geht das mit SELECT TOP auch gut. (Auch das Nachladen bspw. letzte 14,  letzter Monat etc.)

Aber für eine andere Kategorie von Daten werden meist Such-Treffer mit Schlagwort herum aufgerufen (Aufruf Form mit ID oder Findfirst, etc.).
Jetzt möchte ich das Hauptformular so gestalten, das ich bspw. nur 10 Datensätze davor und 10 DS danach abfrage um die Ladezeit schön schnell zu halten.

Bspw. Aufruf via ID 1000 zeigt DS ID=990 bis ID=1010 und der DS 1000 wird angezeigt, Blättern bis 990 bzw. 1010 sollte ermöglicht werden.

Ist bestimmt einfacher als ich denke, weil SQL ja sehr mächtig ist, aber ich stehe auf'm Schlauch
Wer weiß wie das geht?

MzKlMu

Hallo,
wie machst Du jetzt den Aufruf des Datensatzes mit dem Schlagwort ?
Gruß Klaus

ebs17

SELECT TOP aber um einen bestimmten Datensatz herumTOP ist nur in eine Richtung verwendbar. Du könntest aber zwei Richtungen per UNION zusammenfassen.
Mit freundlichem Glück Auf!

Eberhard

Jakomo

Ich habe Suchformulare. Wie bspw. bei google-suche: Die Schlagworte (Hier Titel) werden dort über Textfeld eingegeben und alle passenden Treffer (die sich sortieren lassen) werden als Titel-Liste angezeigt. Diese Liste enthält zu jedem Titelfeld u.a. auch die eindeutige Datensatz-ID (hier: R_ID). Dann erfolgt die Auswahl über Klick. Je nach Userwunsch (bspw. Shift für popupfenster etc) erfolgt dann (zu einem Infopopup) der Hauptformular-Aufruf. Beispiel:


Private Sub R_Name_Click()

    DoCmd.OpenForm "[Das Detailfenster]"
    Forms![Das Detailfenster].Recordset.FindFirst "R_ID=" & Me!R_ID

End Sub
 
 
Wenn ich um den Wunscheintrag (R_ID +10 sowie R_ID -10) auslesen könnte wäre das ideal, man sollte aber bedenken, das die ID nicht zwingend lückenlos sind.
Wenn ich das per SQL im Detailfenster mache, rufe ich vermutlich besser über openArgs auf und werte dann aus. Bspw:

  DoCmd.OpenForm "[Das Detailfenster]", acNormal, , , , , R_ID

Zitat von: MzKlMu am Mai 30, 2023, 19:18:35Hallo,
wie machst Du jetzt den Aufruf des Datensatzes mit dem Schlagwort ?

MzKlMu

Hallo,
Du musst das Formular filtern.
Etwa so (ungetestet):
Me.Filter = "R_ID Between " & Me.R_ID - 10 & " And " & Me.R_ID + 10
Me.FilterOn = True
Gruß Klaus

ebs17

Zitatum einen bestimmten Datensatz herum
Da wird als Erstes eine verwendbare Reihenfolge unterstellt und erwartet. Diese gibt es aber in Abfragen nicht (Leichte Ausnahme ist die TOP-X-Gestaltung).

Eine fixierte Reihenfolge hat man in einem Recordset. In einem solchen könnte man sich per Move bewegen und darüber die Grenzwerte für eine Filterung ermitteln.
Mit freundlichem Glück Auf!

Eberhard

MzKlMu

Hallo,
mein Vorschlag bezieht sich auf das von ihm dargestellte Beispiel.
ZitatBspw. Aufruf via ID 1000 zeigt DS ID=990 bis ID=1010 und der DS 1000 wird angezeigt, Blättern bis 990 bzw. 1010 sollte ermöglicht werden.
Gruß Klaus

Beaker s.a.

Hallo Klaus,
Warum extra Filtern? Das kann man doch direkt als WhereCondition übergeben.
Allerdings kannst du dabei so oder so nicht sicher stellen, dass 21 DS
angezeigt werden, -
Zitatman sollte aber bedenken, das die ID nicht zwingend lückenlos sind.
Eberhards Vorschlag dürfte wohl am sichersten sein.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Jakomo

Danke Euch.

Wie ich sehe, ist einfachste menschliche Logik, ich meine das was wirklich naheliegend ist (+10/-10 DS) doch nicht so einfach in SQL zu übertragen.

Ich hab mich über den Filtervorschlag gewundert und auch direkt an WHERE gedacht.
Falls nicht jemanden noch eine "komplexe" SQL-Logik einfällt, die eine fixe Anzahl Datensätze "drumherum" handeln kann, werde ich mit WHERE arbeiten.
Dann sind es ggf. mal 18, 19 oder 21 (10+10+aktueller DS), aber so wäre es einfach pragmatisch.
Danke fürs Mitdenken Jungs!

MzKlMu

Hallo,
den Filterausdruck meines Vorschlags in #4 kannst Du direkt als Whereklausel verwenden.
Gruß Klaus

markusxy

Zitat von: Jakomo am Mai 31, 2023, 18:35:45einfachste menschliche Logik

Ehrlich gesagt kann ich deine Logik nicht nachvollziehen und ich weiß auch nicht inwiefern du mit Hintergründen vertraut bist was Effizienz bei File-Servern wie Access angeht - oder wird da im Hintergrund etwa ein Datenbank-Server eingesetzt?

Also du brauchst einen Datensatz und liest aber stattdessen 20 ein - welche Logik steckt da dahinter?
Wie ermittelst du diesen einen Datensatz?