Kombifelder in Abfragen verwenden (Access)

Floyd, Mittwoch, 27.05.2020, 10:59 (vor 39 Tagen)

Hallo Zusammen,

ich habe folgendes Problem:
Ich habe in einer Form mehrere Kombifelder mit Mehrfachauswahl definiert.

Die letztlich markierten Einträge aus allen Kombifeldern sollen in eine Abfrage übertragen werden. Per SQL mit "in select" kein Problem.
Die Abfrage dauert aber zu lange, da es aus der Form mehrere Kombifelder sind, die jeweils einzelne SQL's auslösen sollen. In der Abfrage stehen also je nach Feld mehrere "in sql 's " und dazu ist der Datenbestand (6 stellig) relativ groß.

Wenn ich die Werte aus den Kombi-Feldern in mehrere manuell verdeckte Textfelder eintrage, geht alles blitzschnell, da ich direkt auf das Textfeld abfragen kann.
z.B. Wie TXT-feld 1 oder 2 oder 3 usw.
So habe ich den Plan zur Lösung zunächst dahingehend geändert.

Als Beispiel:
Die Mehrfachauswahl im Kombifeld "CMB_STAAT" soll in die Textfelder TXT_STAAT1,TXT_STAAT2, TXT_STAAT3 usw übertragen werden.
Die For-Schleife zum Durchsuchen des Kombifeldes ist mir auch klar.

Danach weiß ich aber nicht wie ich aus den Kombifeldern die Werte in die wechselnden TXT_Feldnamen reinbekomme.

Den Beginn des Feldnamens in einer Variable ablegen und dann beim nächsten Durchlauf am Ende um 1 erhöhen ?

Die Verwendung von Listfelder scheiden m.M. nach aus oder ?
Kann ich die Werte aus den Kombifeldern alternativ in Variablen schreiben und dann in der Abfrage verwenden ?

Ich hoffe, ich habe alles einigermaßen verständlich erklärt und es kann mir jemand helfen.:-(

Danke vorab
Gruß Floyd

Kombifelder in Abfragen verwenden

Martin Asal @, Mittwoch, 27.05.2020, 14:48 (vor 39 Tagen) @ Floyd

Hallo Floyd,

Ich habe in einer Form mehrere Kombifelder *mit Mehrfachauswahl* definiert.

Sorry, aber Kombifelder lassen keine Mehrfachauswahl zu. Wenn du nicht noch von Listenfeldern geschrieben hättest, hätte ich eine Verwechslung vermutet, aber so kann ich nicht nachvollziehen, was du gemacht hast.

Den Inhalt von Listenfeldern mit Mehrfachauswahl kannst du jedenfalls wie folgt auslesen:

Dim i As Long, ctl As Control
Set ctl = Forms(0).Listenfeldname
 
For i = 0 To ctl.ItemsSelected.Count - 1
    Debug.Print ctl.ItemsSelected(i)
Next

Shine on
Martin

Kombifelder in Abfragen verwenden

Floyd, Donnerstag, 28.05.2020, 07:35 (vor 38 Tagen) @ Martin Asal

Hallo Martin,

ich habe hin und her gewechselt, um das Problem zu lösen.
Daher die Bäume verwechselt ...

Es geht also um - na klar - Listfelder ! :-O Danke für den Hinweis.

OK - auslesen ist klar.
Wie bekomme ich nun das Problem gelöst, dass die ausgewählten Einträge (Mehrfachauswahl) aus den List-Feldern in die Abfrageparameter der Abfrage übernommen werden, da SQL-commands wegen der Antwortzeiten ja nicht praxistauglich sind (es gibt bis zu 4 Listfelder).
Was ist der beste Weg oder gibt es Alternativen ?
Hatte mal darüber nachgedacht, die Werte jeweils in globale Variablen zu schreiben und dann in der Abfrage zu verwenden. Da weiß ich aber auch nicht wie ...

Danke schon mal ....

Gruß Floyd

Kombifelder in Abfragen verwenden

Martin Asal @, Donnerstag, 28.05.2020, 16:40 (vor 37 Tagen) @ Floyd

Hallo Floyd,

offensichtlich kennst du dich ja mit VBA aus. Dann solltest du dieses Beispiel lesen können:

 
Sub sql()
Dim db As DAO.Database, rs As DAO.Recordset
Dim strSQL as String
 
strSQL = "SELECT * FROM Tbl WHERE Nachname LIKE '*a*'"

Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL)
 
rs.MoveFirst
Debug.Print rs("Nachname")
 
Set rs = Nothing
Set db = Nothing
 
End Sub

Da du ja weißt, wie man die Listboxen ausliest, kannst du dir somit selbst einen SQL-String zusammenbauen und ausführen.

Martin

Kombifelder in Abfragen verwenden

Floyd, Donnerstag, 28.05.2020, 19:53 (vor 37 Tagen) @ Martin Asal

Hallo Martin.

danke, dass du dir bei dem Wetter die Zeit nimmt, zu antworten.

Lies doch mal bitte mein 1.tes Postimng. SQL's führen nicht zum Ziel, da mehrere aus den Listboxen in der Abfrage platziert, einfach zu langsam sind. So kombiniert dauert es einfach zu lange(annähernd 100.000 DS)

Schreibe ich die Werte direkt in textfelder und lese die aus, geht es trotz des großen Datenbestandes blitzschnell. Textfelder sind aber wegen der Multiparmeter, die möglich sein müssen, nicht dienlich.

Daher kam die Idee, Listboxen (da Multiauswahl möglich) zu verwenden und die Werte in die Abfrage zu beamen. Entweder direkt oder per x - Variablen
Da hapert es eben bei mir mit der Umsetzung :-(


So verständlich ?

Schönen Abend noch
Gruß Floyd

Kombifelder in Abfragen verwenden

Martin Asal @, Freitag, 29.05.2020, 11:13 (vor 37 Tagen) @ Floyd

Hallo Floyd,

je mehr du schreibst, desto unklarer wird mir, wie du es eigentlich umgesetzt hast, Daten aus einem Formular in eine Abfrage zu bekommen. Da gibt es ja mehrere Möglichkeiten, und die Entscheidung kann von der Performance abhängen, oder auch davon, wie man die Abfrage weiterverarbeiten will.

Mir will allerings partout nicht einleuchten, warum die Entscheidung für Listboxen vs Textfelder die Performance beeinflussen soll. Außerdem ist eine Abfrage immer eine SQL-Abfrage. Es kommt nur darauf an, wie das SQL zustandekommt, und manchmal sind Abfragen so aufgebaut, dass Access eine "schlecht definierte Abfrage" nicht optimieren kann.

Martin

Kombifelder in Abfragen verwenden

Floyd, Donnerstag, 04.06.2020, 09:27 (vor 31 Tagen) @ Martin Asal

Hallo Martin,

ich habe nochmal mehrere Tage probiert. Leider habe ich keine neuen Wege gefunden.

Nochmal zum Szenario:
Ich habe mehrere List-Felder in einer UF, in die der User (ggf. Mehrfach) auswahlen trifft.
Zb. LISTFELDER Kunde, DS-ART, Geschlecht, Staat

Z.B. habe ich die Mehrfach Auswahl aus dem Listfeld - Staat - per SQL in eine Hilfstabelle extrahiert.

in Kurzform so:

sSQL = "SELECT STAAT, STAAT_TXL " _
                    & "FROM STAAT_MASTER " _
                    & "WHERE STAAT in ("
             For Each vItem In .LST_STAAT.ItemsSelected


            strSQL = "UPDATE TBL_TEMP_PARAMETER " & _
            "SET TBL_TEMP_PARAMETER.TEMP_STAAT =" & [AUSWAHL]
             
             'Debug.Print strSQL
             DoCmd.RunSQL strSQL
            
            
             sSQL = sSQL & "'" & .LST_STAAT.ItemData(vItem) & "', "
             Next vItem


Gleiches gilt für die anderen Listfelder. Also alle Werte in Temp-Tabellen zwischengespeichert.
Ich frage darauf in der zentralen nachfolgenden Abfrage so ab:


In (select TMP_STAAT from [TAB_TMP_STAAT])


Kombiniert mit den anderen Werten habe ich also mehrere In Selects (in dem Fall 4 ) plus feste nicht variable Werte aus der UF (Kritierium wie Forms blabla ..) in einer Abfrage, die eine neue temporäre Auswahl-Tabelle erzeugen soll.

Nach meiner Erkenntnis ist das nicht so performant, wie direkt die Werte aus der Form / Listfeld mit ODER in die Abfrage zu positionieren. Dsa war meine Ausgangsfrage.

Ggf. liegt es an den mehrfach verschachteten IN Select - Befehlen in einer Abfrage.
Aber da bin ich überfragt und meine Kenntnisse reichen da nicht mehr.

Ggf. hast du noch einen anderen Weg /idee ?

Danke für die Zeit , die du dir nimmst

Gruß Floxd

Kombifelder in Abfragen verwenden

Martin Asal @, Donnerstag, 04.06.2020, 11:26 (vor 31 Tagen) @ Floyd

Hallo Floyd,

weißt du, dass ein In-Statement nicht zwingend eine Unterabfrage enthalten muss? Es geht z.B. auch so:

SELECT * FROM Personen WHERE Nachname IN ("Müller", "Meier", "Mayer");

Des weiteren ist dein Ansatz deswegen langsam, weil du mit temporären Tabellen arbeitest. Ich würde das ca wie folgt lösen:

sSQL = "SELECT STAAT, STAAT_TXL " _
    & "FROM STAAT_MASTER " _
    & "WHERE STAAT in ("
 
For Each vItem In .LST_STAAT.ItemsSelected
    sSQL = sSQL & """" & vItem & """, "
Next
 
sSQL = sSQL & ");"

Martin

Kombifelder in Abfragen verwenden

Floyd, Donnerstag, 04.06.2020, 16:34 (vor 30 Tagen) @ Martin Asal

hallo Martin,
nein mit dem In-Statement - das war mir nicht bekannt.
Das Benutzen der Hilfstabellen - habe ich schon gedacht, dass dies ggf die Ursache für die schlechte Performance ist, kannte aber keinen anderen Weg.

Ich werde beide Ansätze weiter verfolgen.

Dein Lösungsvorschlag, den ich am besten finde (wirklich sehr nett) , kann ich nachvollziehen.
War ja schon auf dem halben Weg, aber weis nicht, wie ich die diversen Selects aus den 4 Listfeldern in eine Abfrage vermurkse, also verkette.
Ich müsste dann mehrere SQL-Selects /Item Select - also auch auf die Felder Kunde, DS-Art usw. machen
Alles in einer Abfrage ? Oder ggf. durch die SQL-Seclects den Datenbestand immer weiter reduzieren ? Letzters wäre der schlechtete Weg.


Sorry- das ist für mich und meinem Wissensstand wirklich schwer zu verstehen ...:-(

Gruß Floyd

Kombifelder in Abfragen verwenden

Martin Asal @, Freitag, 05.06.2020, 07:53 (vor 30 Tagen) @ Floyd

War ja schon auf dem halben Weg, aber weis nicht, wie ich die diversen Selects aus den 4 Listfeldern in eine Abfrage vermurkse, also verkette.

Du musst einfach nur mehrere dieser Schleifen hintereinander verwenden. Dazwischen immer ein "AND".

RSS-Feed dieser Diskussion
powered by my little forum