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?
Hallo,
wie machst Du jetzt den Aufruf des Datensatzes mit dem Schlagwort ?
SELECT TOP aber um einen bestimmten Datensatz herum
TOP ist nur in eine Richtung verwendbar. Du könntest aber zwei Richtungen per UNION zusammenfassen.
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 ?
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
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.
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.
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
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!
Hallo,
den Filterausdruck meines Vorschlags in #4 kannst Du direkt als Whereklausel verwenden.
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?