Access Listfeld * auswerten / SQL String

Moderator: ModerationP

Access Listfeld * auswerten / SQL String

Beitragvon Knäckebrot » 30. Nov 2020, 11:56

Hallo Zusammen,

wäre schön, wenn mir mal einer helfen könnte..


Ich habe ein Listfeld, deren Inhalt aus 3stelligen Artikelnummern aus einer Tabelle besteht. Die Mehrfachauswahl ist aktiviert.
Die jeweilige Auswahl wird in einen SQL-String transportiert und daraus eine Abfrage generiert, die eine neue Tabelle erzeugt.

Dies kann ich manuell per Klick Klick oder ALLE per VBA - Schleife - erreichen. Funktioniert soweit ...

Nur wenn ich alle auswählen lassen, wird die SQL-Abfrage mit zig Artikelnummern gefüttert und die Performance wird schlecht.
Welches ist der günstigste Weg alle Artikel auszuwählen. Ein * kann ich nicht verwenden, weil es eben nicht in der Datenquelle / Tabelle steht.

Gibt es einen Trick ? :mrgreen:

Gruß Knäckebrot
Knäckebrot
 

Re: Access Listfeld * auswerten / SQL String

Beitragvon SGast » 30. Nov 2020, 12:18

Hallo,
Nur wenn ich alle auswählen lassen, wird die SQL-Abfrage mit zig Artikelnummern gefüttert
Frage ab, ob alle markiert sind und wenn "Ja" einen SQL-String ohne Bedingung.

Gruß Steffen
SGast
 

Re: Access Listfeld * auswerten / SQL String

Beitragvon Gast » 30. Nov 2020, 13:53

Das Listenfeld selbst schließt vielleicht irgendwelche Daten aus, die WHERE-Bedingungen des Listenfeldes mußt Du evt. mit einbeziehen.
Gast
 

Re: Access Listfeld * auswerten / SQL String

Beitragvon Gast » 30. Nov 2020, 15:02

Gibt es einen Trick ?

Klar. Weniger tun.
Das Listenfeld hat eine Datenherkunft. Ohne Auswahl und somit ohne Filterung hast Du daraus gleich alle.
Da ein Listenfeld mit Mehrfachauswahl ausschließlich per VBA ausgewertet werden kann, kannst Du damit auch auf eine Nichtauswahl reagieren, dann halt umgedreht zu 'nichts = nichts tun'. Es müsste nur dem Benutzer verständlich vermittelt werden.

wird die SQL-Abfrage mit zig Artikelnummern gefüttert und die Performance wird schlecht

Performance hängt von folgenden Dingen ab (abgesehen von Prozessor, Speicher, Netzwerk u.ä.):
- Datenmenge. Viele Daten machen viel Arbeit. Teilweise muss man das einfach akzeptieren, teilweise kann man das beeinflussen (=> rechtzeitig filtern).
- Abfragedesign. SQL-Anweisungen kann man oft recht unterschiedlich formulieren, jene Anweisung, die man vielleicht gerade "geschafft" hat, muss nicht das Wahre sein.
- Indexnutzung, also nutzbare Indizes für seine Verarbeitung haben und deren wirkliche Verwendbarkeit nicht durch mangelhaftes Abfragedesign zu unterbinden.

Gerade die letzten beiden Punkte sind Entwicklergeschick basierend auf etwas Wissen und Erfahrung. Das beginnt damit zu realisieren, dass SQL Methoden der Massendatenverarbeitung verwendet und man somit besser immer alles auf einmal erledigen lässt statt alles in Scheife einzeln abzuarbeiten => Bagger statt Sandschaufel.
Gast
 

Re: Access Listfeld * auswerten / SQL String

Beitragvon Knäckebrot » 10. Dez 2020, 15:19

Sorry - das ich erst jetzt antworte.
War mit anderen Terminen zugebombt. Vielen Dank für die Rückmeldungen.

Weniger tun hört sich gut an. Habe aber doch ein Problem oder es nicht ganz verstanden ?

Also ich werte das Listfeld ArtikelNr aus und schreibe die die aktivierten Values in einen SQL-String Z.B.
Code: Alles auswählen
ArtikelNr In ('114';'118';'121').


Die SQL-Abfrage wird jeweils dynamisch je nach Auswahl neu erzeugt.

Nun der Fall, wenn im Listfeld nichts ausgewählt wurde, also alle Artikelnummern einbezogen werden sollen.

Frage ich derzeit so ab
Code: Alles auswählen
If LST_ARTIKELNR.ItemsSelected.Count = 0 Then


Was schreibe ich in den SQL-String ?
Code: Alles auswählen
ArtikelNr In ('*')
funktioniert in allen Kombinationen nicht.

Danke vorab für die Hilfe
Knäckebrot
Knäckebrot
 

Re: Access Listfeld * auswerten / SQL String

Beitragvon Beaker s.a. » 10. Dez 2020, 17:10

@Knäckebrot
Frage ab, ob alle markiert sind und wenn "Ja" einen SQL-String ohne Bedingung.

Nicht gelesen?
Den ersten Teil hast du doch schon umgesetzt.
Ereignisorientierte Programmierung:
Alles, was geschieht, geschieht.
Alles, was während seines Geschehens etwas anderes geschehen
läßt, läßt etwas anderes geschehen.
Alles, was sich selbst im Zuge seines Geschehens erneut geschehen
läßt, geschieht erneut.
Beaker s.a.
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1056
Registriert: 14. Jul 2012, 21:56
Wohnort: Bremen

Re: Access Listfeld * auswerten / SQL String

Beitragvon Bitsqueezer » 10. Dez 2020, 17:29

Hallo,

was hilft Dir das, wenn Du da eine Lösung für "alle Datensätze" hast, wenn der User dann statt alle nur 99% aller Datensätze markiert hat? Alle außer einem? Dann hast Du wieder das gleiche Problem.

Wenn Du eine performante Lösung haben willst, dann schreibst Du die selektierten Datensätze in eine Tabelle, die Du dann mit Deiner verknüpfst, indem Du die festen Werte Deiner IN-Klausel gegen eine SELECT-Abfrage auf die Selektionstabelle austauschst.
Die Performance wird danach normalerweise kaum beeinträchtigt, egal, wieviele Datensätze der User gewählt hat.

Krux ist dann noch die Listbox: Um an die selektierten Datensätze zu kommen, mußt Du wieder per Schleife alle IDs auslesen (übrigens schreibt man IDs nicht in einfache Anführungszeichen, wenn es denn wirklich IDs und kein Text ist. Ausnahme ist, wenn das Backend z.B. SQL Server ist und Du bigint als Datentyp verwendet hast).

Außerdem mußt Du dann mühsam die IDs von da erst wieder in eine Tabelle schreiben - also warum nicht den User die Tabelle direkt schreiben lassen, während er auswählt?
Dazu verwendest Du eine Selektionstabelle mit UserID im Backend und statt der ollen Listbox ein schön formatiertes Endlosformular, in dem Du das gleiche darstellst wie in der Listbox. Zusätzlich eine Checkbox für die Auswahl. Dann kannst Du noch mehr Komfort einbauen, indem Du den User per Recordselektor mehrere Datensätze auswählen läßt (= wie Shift in der Listbox) und per Button die Auswahl in den Checkboxen setzt. Ebenso kann man einen Button für "Alle Datensätze" oder "Keine" verwenden - oder Invertieren der Auswahl.

Die UserID in der Tabelle hilft, die ganze Geschichte multiuserfähig zu machen, damit sich die Leuts nicht gegenseitig ihre Auswahl überschreiben. Beim Öffnen des Formulares kannst Du einfach alle IDs aus der Selektionstabelle für diesen User löschen und dann alle existierenden der eigentlichen Tabelle einfügen. Oder intelligenter: Nur die IDs hinzufügen, die in der eigentlichen Tabelle, aber nicht in der Selektionsliste sind und umgekehrt alle IDs entfernen, die nicht mehr in der eigentlichen Tabelle sind.

Ist das Backend ein Datenbankserver, kann man das alles schön mit einer Stored Procedure erledigen, ansonsten eben mit VBA und SQL.

Da die Auswahltabelle jetzt auch im Backend liegt, ist die Performance jetzt kein Thema mehr, natürlich ordentlich auf UserID und Feld mit der TabellenID der Zieltabelle indiziert.

Jetzt spielt es auch keine Rolle mehr, wenn 99 oder 100% selektiert wurden oder nur 3.

Vergiß die Listbox, in 99% aller Fälle kann man alles mit Tabellen und Endlosformular ersetzen und dabei noch die Möglichkeit bekommen, alles schön zu formatieren und mit viel Komfort zu versehen. Die Listbox ist ein Relikt aus alter Zeit und gehört eigentlich eingemottet.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7910
Registriert: 21. Jun 2007, 12:17

Re: Access Listfeld * auswerten / SQL String

Beitragvon Gast » 10. Dez 2020, 20:21

Nun der Fall, wenn im Listfeld nichts ausgewählt wurde, also alle Artikelnummern einbezogen werden sollen.

Eine Nichtauswahl bedeutet primär nichts, nicht alle.
Also könnte man ein Steuerelement neben das Listenfeld setzen (Checkbox oder so) und damit verkünden, dass man alle meint.

Folgende Reaktion:
Code: Alles auswählen
ArtikelNr In ('114', '118', '121')

... aus der WHERE-Klausel entfernen bzw. nicht einsetzen. Alternativ diesen Ausdruck mit True ersetzen.

Nebenbei: Bei alle handelt es sich um wieviel in Zahlen?

Dazu:
Code: Alles auswählen
WHERE ArtikelNr In ('114', '118', '121')
' vs.
WHERE ArtikelNr In (SELECT ArtikelNr FROM Auswahltabelle)

Ich glaube nicht, dass die zweite Variante bezüglich Ausführungsgeschwindigkeit einen Vorteil hätte.
In jedem Fall sollte man aber sicherstellen, dass das Feld ArtikelNr indiziert ist und auch nebenbei keine Bremsen eingebaut sind.
Gast
 


Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste