Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: derilzemer am Juli 28, 2017, 22:20:44

Titel: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: derilzemer am Juli 28, 2017, 22:20:44
Hallo,
ich habe auf einem Kombifeld in Datensatzherkunft einen Select dem folgende Query zugrunde liegt:
SELECT tblQuartette.SpielID_F, tblQuKarten.QuKartenID, tblSpiele.SpielNr, tblSpiele.Ausgabejahr, [QuartettKz] & [KartenNr] AS Karte, tblQuKarten.Kartenbezeichnung
FROM tblSpiele
INNER JOIN (tblQuartette INNER JOIN tblQuKarten ON tblQuartette.QuartettID = tblQuKarten.QuartettID_F) ON tblSpiele.SpielID = tblQuartette.SpielID_F
WHERE QuKartenID IN
   (SELECT QuKartenID_F
    FROM tblKartenMerkmale)
ORDER BY tblQuKarten.Kartenbezeichnung;

Die Select selbst sieht dann aber so aus:
SELECT qrySpielKarten.Kartenbezeichnung
FROM qrySpielKarten
GROUP BY qrySpielKarten.Kartenbezeichnung;

Ich lasse mir als nur das eine Feld Kartenbezeichnung (und das gruppiert) anzeigen. Das funktioniert alles sauber. Sowohl der select als auch der Query liefern die gleiche Anzahl an Datensätzen
Das Listenfeld als Datensatzherkunft folgenden Select:
SELECT tblQuartette.SpielID_F,
       tblQuKarten.QuKartenID,
       tblSpiele.SpielNr,
       tblSpiele.Ausgabejahr,
       [QuartettKz] & [KartenNr] AS Karte,
       tblQuKarten.Kartenbezeichnung
FROM tblSpiele
INNER JOIN (tblQuartette
            INNER JOIN tblQuKarten ON tblQuartette.QuartettID = tblQuKarten.QuartettID_F) ON tblSpiele.SpielID = tblQuartette.SpielID_F
WHERE (((tblQuKarten.QuKartenID) IN
          (SELECT QuKartenID_F
           FROM tblKartenMerkmale)))
ORDER BY tblQuKarten.Kartenbezeichnung;

Letztendlich ist es der gleiche Select wie bei dem Kombifeld. Wenn ich nun einen Wert aus dem Kombi auswähle, dann sollte  er das Listenfeld aktualisieren, aber genau das klappt nicht und ich weiß nicht warum. Wähle ich einen Wert im Kombifeld aus, dann wird das Listenfeld (zeigt alle Datensätze an) leer und aus Maus :-(.
Am Kombifeld ist als Ereignis --> Nach Aktualisierung folgendes als Codeschnipsel hinterlegt:
Private Sub cboSpielkarte_AfterUpdate()
    Me.ufKarten.Form.Filter = "False"
    Me.lstKarten.RowSource = "SELECT tblQuartette.SpielID_F, tblQuKarten.QuKartenID, tblSpiele.SpielNr, tblSpiele.Ausgabejahr, [QuartettKz] & [KartenNr] AS Karte tblQuKarten.Kartenbezeichnung " _
        & " FROM tblSpiele INNER JOIN (tblQuartette INNER JOIN tblQuKarten ON tblQuartette.QuartettID = tblQuKarten.QuartettID_F) ON tblSpiele.SpielID = tblQuartette.SpielID_F " _
        & " WHERE QuKartenID IN (SELECT QuKartenID_F FROM tblKartenMerkmale)='" & Me.cboSpielkarte & "'"
End Sub


Natürlich frage ich mich, warum das Ergebnis 0 ist. Hat jemand eine Idee?

Gruß und Danke für die Unterstützung
Andreas
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: Lachtaube am Juli 29, 2017, 10:54:33
Ohne Verwendung von Aggregaten in einer Abfrage ist eine Gruppierung suboptimal - verwende das Prädikat DISTINCT (Eigenschaft: eindeutige Datensätze in der Entwurfsansicht einer Abfrage)
Warum nimmst Du nicht zusätzlich QuKartenID als gebundene (versteckte) Spalte im Kombifeld auf? Dann wüsstest Du auch, was miteinander in der Abfrage zu vergleichen wäre.
FilterOn ist vom Datentyp Boolean und kein String.
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: derilzemer am Juli 29, 2017, 14:43:19
Hi Lachtaube,
ZitatOhne Verwendung von Aggregaten in einer Abfrage ist eine Gruppierung suboptimal - verwende das Prädikat DISTINCT (Eigenschaft: eindeutige Datensätze in der Entwurfsansicht einer Abfrage)
Warum nimmst Du nicht zusätzlich QuKartenID als gebundene (versteckte) Spalte im Kombifeld auf?
Das habe ich jetzt mal gemacht.
SELECT DISTINCT qrySpielKarten.Kartenbezeichnung, qrySpielKarten.QuKartenID
FROM qrySpielKarten
ORDER BY qrySpielKarten.Kartenbezeichnung;

Zitat
Dann wüsstest Du auch, was miteinander in der Abfrage zu vergleichen wäre.
Dein Hinweis deswegen ist ja dahingehend, dass diese wohl falsch ist was die Abfrage angeht, oder?
ZitatFilterOn ist vom Datentyp Boolean und kein String.
Damit beziehst du dich wohl auf den Codeschnipsel
ZitatMe.ufKarten.Form.Filter = "False"
. Aber ehrlich gesagt komme ich damit nicht klar, was du mir damit sagen willst.
Private Sub cboSpielkarte_AfterUpdate()
    Me.ufKarten.Form.Filter = "False"
    Me.lstKarten.RowSource = "SELECT tblQuartette.SpielID_F, tblQuKarten.QuKartenID, tblSpiele.SpielNr, tblSpiele.Ausgabejahr, [QuartettKz] & [KartenNr] AS Karte tblQuKarten.Kartenbezeichnung " _
        & " FROM tblSpiele INNER JOIN (tblQuartette INNER JOIN tblQuKarten ON tblQuartette.QuartettID = tblQuKarten.QuartettID_F) ON tblSpiele.SpielID = tblQuartette.SpielID_F " _
        & " WHERE QuKartenID IN (SELECT QuKartenID_F FROM tblKartenMerkmale) WHERE Kartenbezeichnung ='" & Me.cboSpielkarte & "'"
End Sub

Die Abfrage des Listenfeldes habe ich noch mal angepasst, was allerdings nicht zu einer Änderung beigetragen hat. Wenn ich im Kombifeld einen Datensatz auswähle, dann leert sich das LF.

Gruß Andreas
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: Lachtaube am Juli 29, 2017, 16:11:25
Gestalte die Abfrage um, so das das numerische Feld an die erste Position rückt.SELECT DISTINCT q.QuKartenID, q.Kartenbezeichnung
FROM   qrySpielKarten As q
ORDER  BY 2;


In den Eigenschjaften des Kombifelds legst Du 2 Spalten fest, setzt die gebundene Spalte auf 1 und legst Spaltenweiten 0cm;Xcm an. Damit wird die erste Spalte ausgeblendet. Wobei X durch einen vernünftigen Wert zu ersetzen ist. An der Darstellung sollte sich nichts verändert haben. Nur wird jetzt nicht mehr mit der Kartentext, sondern die QuKartenID in der Bedingung verwendzt.
   & " WHERE QuKartenID = " & Nz(Me.cboSpielkarte, 0)

Ansonsten werden Bool'sche Wertangaben ohne Hühnerfüße verwendet: False und nicht "False"
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: derilzemer am Juli 29, 2017, 17:16:14
Hallo Lachtaube,
Zitat von: Lachtaube am Juli 29, 2017, 16:11:25
Gestalte die Abfrage um, so das das numerische Feld an die erste Position rückt.SELECT DISTINCT q.QuKartenID, q.Kartenbezeichnung
FROM   qrySpielKarten As q
ORDER  BY 2;

In den Eigenschaften des Kombifelds legst Du 2 Spalten fest, setzt die gebundene Spalte auf 1 und legst Spaltenweiten 0cm;Xcm an. Damit wird die erste Spalte ausgeblendet. Wobei X durch einen vernünftigen Wert zu ersetzen ist. An der Darstellung sollte sich nichts verändert haben. Nur wird jetzt nicht mehr mit der Kartentext, sondern die QuKartenID in der Bedingung verwendet.
   & " WHERE QuKartenID = " & Nz(Me.cboSpielkarte, 0)
Ich habe es mal genauso umgestellt, jedoch habe ich nun keinen Effekt des DISTINCT mehr. Vor der Umstellung hatte ich 7 "Redundanzen" nun zeigt er die alle wieder an. Das liegt dann wohl daran, dass er in der Spalte QuKartenID natürlich keine Redundanten ID's findet, oder? Wie stellt man das nun ein, dass er den Distinct nur über die Spalte 1 macht, also nicht über beide bzw. 0?
Was ich dann immer noch nicht nachvollziehen kann ist folgendes. Am Kombifeld ist ja das Ereignis Nach Aktualisierung gebunden (sagt man das so überhaupt, gebunden?).
SELECT tblQuartette.SpielID_F,
       tblQuKarten.QuKartenID,
       tblSpiele.SpielNr,
       tblSpiele.Ausgabejahr,
       [QuartettKz] & [KartenNr] AS Karte tblQuKarten.Kartenbezeichnung
FROM tblSpiele
INNER JOIN (tblQuartette
            INNER JOIN tblQuKarten ON tblQuartette.QuartettID = tblQuKarten.QuartettID_F) ON tblSpiele.SpielID = tblQuartette.SpielID_F
WHERE QuKartenID = & Nz(Me.cboSpielkarte, 0)

Das bedeutet doch, dass er das Listenfeld aktualisieren soll, sobald ich eben eine Karte ausgewählt habe, richtig? Tut es nicht wirklich. Wenn ich eine Auswahl treffe erhalte ich zuerst das Fenster Parameterwert eingeben und es steht Falsch da, bestätige ich es bekomme ich wieder das leere Listenfeld  :(. Der Select im Listenfeld sieht wie folgt aus:
SELECT tblQuartette.SpielID_F,
       tblQuKarten.QuKartenID,
       tblSpiele.SpielNr,
       tblSpiele.Ausgabejahr,
       [QuartettKz] & [KartenNr] AS Karte,
       tblQuKarten.Kartenbezeichnung
FROM tblSpiele
INNER JOIN (tblQuartette
            INNER JOIN tblQuKarten ON tblQuartette.QuartettID = tblQuKarten.QuartettID_F) ON tblSpiele.SpielID = tblQuartette.SpielID_F
WHERE (((tblQuKarten.QuKartenID) IN
          (SELECT QuKartenID_F
           FROM tblKartenMerkmale)))
ORDER BY tblQuKarten.Kartenbezeichnung;

Zitat
Ansonsten werden Bool'sche Wertangaben ohne Hühnerfüße verwendet: False und nicht "False"
Das habe ich jetzt verstanden, hab die Hühnerfüße gekickt.

Danke und Gruß
Andreas
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: Lachtaube am Juli 29, 2017, 19:17:49
Ich habe einmal die Abfrage aus dem Anfangsbeitrag (Spalten verschoben) in einem Upload von Dir getestet und kann darin keine Doubletten (weder bei der QuKartenId noch bei der Kartenbezeichnung) erkennen. Wo steckt das Problem

Edit: Ich sehe gerade, dass ich blind bin und nehme meine Aussage zurück.
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: derilzemer am Juli 30, 2017, 09:34:45
Guten morgen,
Zitat von: Lachtaube am Juli 29, 2017, 19:17:49
Ich sehe gerade, dass ich blind bin und nehme meine Aussage zurück.
kein Problem. Aber das mal zum Anlass genommen, ich bin ein echtes Rindvieh, sorry. Ich lasse mich irgendwie zu arg vom Ergebnis einfangen. Was will ich denn eigentlich.
Das Feature heißt Spielkarten vergleichen. MAn vergleicht in der Regel etwas, was auch "annäherend identisch ist". Ergo
ist Redundanz in form vom DISTINCT einfach und schlicht weg falsch. Group by ist also korrekt.
Ich muss also die Redundanzen finden und die Einzelkarten die unique sind in den künftig 90000 ausselektieren! Deswegen müsste die Abfrage doch eigentlich so aussehen
SELECT tblQuartette.SpielID_F,
       tblQuKarten.QuKartenID,
       tblSpiele.SpielNr,
       tblSpiele.Ausgabejahr,
       tblQuKarten.Kartenbezeichnung,
       [QuartettKz] & [KartenNr] AS Karte
FROM tblSpiele
INNER JOIN (tblQuartette
            INNER JOIN tblQuKarten ON tblQuartette.QuartettID = tblQuKarten.QuartettID_F) ON tblSpiele.SpielID = tblQuartette.SpielID_F
WHERE (((tblQuKarten.QuKartenID) IN
          (SELECT QuKartenID_F
           FROM tblKartenMerkmale))
       AND ((tblQuKarten.Kartenbezeichnung) IN
              (SELECT Kartenbezeichnung
               FROM tblQuKarten
               GROUP BY Kartenbezeichnung
               HAVING Count(*) > 1)
            AND (tblQuKarten.Kartenbezeichnung)<>"-"));

und unter Datensatzherkunft für das Kombi dann so?
SELECT qrySpielKarten.Kartenbezeichnung FROM qrySpielKarten GROUP BY Kartenbezeichnung;
Hab das dann so mal aufgebaut. Die Abfrage passt, die query für das Kombi passt, aber sobald ich einen Wert auswähle, dann poppt das Fenster Parameterwert eingeben auf (bild1, dazu hänge ich jetzt mal ein Bild an). Bestätige ich das mit ok, dann ist das Listenfeld wieder leer.

Edit: Wenn ich im Parameterfenster statt ok auf Abbruch gehe, dann springt der Debugger auf folgende Zeile und markiert diese gelb.
Private Sub cboSpielkarte_AfterUpdate()
    Me.ufKarten.Form.Filter = False


Gruß Andreas
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: Xoar am Juli 30, 2017, 10:21:38
Hi, wenn nur der Filter "deaktiviert" werden soll, schreib
Me.ufKarten.Form.FilterOn = false

Den Filter deaktiviert man über die FilterOn Eigenschaft.

Grüße

Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: derilzemer am Juli 30, 2017, 11:10:47
Hi,
danke für den Hinweis. Jetzt gibt es keinen Fehler mehr, jedoch wird weiterhin in der Liste auch kein Auswahlergebnis aufgeführt, zeigt also 0 Datensätze an. Das Ding macht mich noch Kirre :(.
Gruß Andreas
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: PhilS am Juli 31, 2017, 14:53:00
Zitat von: derilzemer am Juli 30, 2017, 11:10:47...jedoch wird weiterhin in der Liste auch kein Auswahlergebnis aufgeführt, zeigt also 0 Datensätze an.
Kann es NULL-Werte in tblQuKarten.Kartenbezeichnung geben? Wenn ja, würde ich diese in dem SubSelect ausschließen. Bin gerade nicht sicher wie Access das handhabt, aber andere DB-Systeme werten einen solchen Ausdruck immer als Falsch aus, wenn ein NULL-Wert enthalten ist.
Also so:
...
(SELECT Kartenbezeichnung
               FROM tblQuKarten
               WHERE Kartenbezeichnung IS NOT NULL
               GROUP BY Kartenbezeichnung
               HAVING Count(*) > 1)
...


Außerdem ist es oft hilfreich zur Fehlersuche, ein solches SQL-Statement einfach mal die SQL-Ansicht einer neue Abfrage zu kopieren und auszuführen. Dort gibt es dann ggfls. deutliche Meldungen für Fehler, die in einer Rowsource einfach ignoriert werden.
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: derilzemer am Juli 31, 2017, 16:43:20
Zitat von: PhilS am Juli 31, 2017, 14:53:00
Zitat von: derilzemer am Juli 30, 2017, 11:10:47...jedoch wird weiterhin in der Liste auch kein Auswahlergebnis aufgeführt, zeigt also 0 Datensätze an.
Kann es NULL-Werte in tblQuKarten.Kartenbezeichnung
Nein, grundsätzlich findet er schon mit der aktuellen Abfrage auch nur Datensätze, die eben Einträge haben. Ich habe trotzdem mal den Zusatz gemacht, mit dem gleiche Ergebnis, dass das Listenfeld dann 0 anzeigt. Ich mache das auch so wie du gesagt hast, den SQL query ausführen, dann sieht man gleich ob es passt oder ob nicht.
Ich denke, ich habe da ein grundsätzliches Problem mit dem Verständnis der Funktionsabfolge. Ich habe eine Query, qrySpielkarten. Dieser sieht aktuell so aus:

SELECT tblQuartette.SpielID_F,
       tblQuKarten.QuKartenID,
       tblSpiele.SpielNr,
       tblSpiele.Ausgabejahr,
       tblQuKarten.Kartenbezeichnung,
       [QuartettKz] & [KartenNr] AS Karte
FROM tblSpiele
INNER JOIN (tblQuartette
            INNER JOIN tblQuKarten ON tblQuartette.QuartettID = tblQuKarten.QuartettID_F) ON tblSpiele.SpielID = tblQuartette.SpielID_F
WHERE (((tblQuKarten.QuKartenID) IN
          (SELECT QuKartenID_F
           FROM tblKartenMerkmale))
       AND ((tblQuKarten.Kartenbezeichnung) IN
              (SELECT Kartenbezeichnung
               FROM tblQuKarten
               GROUP BY Kartenbezeichnung
               HAVING Count(*) > 1)
            AND (tblQuKarten.Kartenbezeichnung)<>"-"));

In den Eigenschaften des Kombifeldes cboSpielkarte unter Datensatzherkunft sprech ich die query dann so an:
SELECT qrySpielKarten.Kartenbezeichnung FROM qrySpielKarten GROUP BY Kartenbezeichnung;
Dem Kombifeld habe ich entsprechend die Spalte angegeben, welche angezeigt werden soll, damit eine Auswahl gemacht werden kann, gebunden 1, Spaltenanzahl 6. Das passt.  Als weiteres habe ich dem Kombifeld eben das Ereignis Nach Aktualisierung zugeordnet
Private Sub cboSpielkarte_AfterUpdate()
    Me.ufKarten.Form.FilterOn = False
    Me.lstKarten.RowSource = "SELECT tblQuartette.SpielID_F, tblQuKarten.QuKartenID, tblSpiele.SpielNr, tblSpiele.Ausgabejahr, [QuartettKz] & [KartenNr] AS Karte tblQuKarten.Kartenbezeichnung " _
        & " FROM tblSpiele INNER JOIN (tblQuartette INNER JOIN tblQuKarten ON tblQuartette.QuartettID = tblQuKarten.QuartettID_F) ON tblSpiele.SpielID = tblQuartette.SpielID_F " _
        & " WHERE Kartenbezeichnung = " & Nz(Me.cboSpielkarte)
End Sub

Die nahezu gleiche Query wie qrySpielkKarte habe ich an das Listenfeld gebunden.
SELECT tblQuartette.SpielID_F,
       tblQuKarten.QuKartenID,
       tblSpiele.SpielNr,
       tblSpiele.Ausgabejahr,
       tblQuKarten.Kartenbezeichnung,
       [QuartettKz] & [KartenNr] AS Karte
FROM tblSpiele
INNER JOIN (tblQuartette
            INNER JOIN tblQuKarten ON tblQuartette.QuartettID = tblQuKarten.QuartettID_F) ON tblSpiele.SpielID = tblQuartette.SpielID_F
WHERE (((tblQuKarten.QuKartenID) IN
          (SELECT QuKartenID_F
           FROM tblKartenMerkmale)));

Wenn ich das Feature aufrufe, dann zeigt das Listenfeld erst mal 153 gefundene Datensätze an, also alle, ob mit oder ohne Wert! Als Ereignis für das Listenfeld ist dann nur noch angegebn, was geschehen soll, wenn man einen oder mehrere Datensätze im Listenfeld markiert.
Private Sub lstKarten_AfterUpdate()
    Dim strKarten As String
    Dim itm As Variant
    If Me.lstKarten.ItemsSelected.count > 0 Then
        ' ausgewählte Karten anzeigen
        For Each itm In lstKarten.ItemsSelected
            strKarten = strKarten & "," & Me.lstKarten.ItemData(itm)
        Next
        Me.ufKarten.Form.Filter = "QuKartenID in (" & Mid(strKarten, 2) & ")"
        Me.ufKarten.Form.FilterOn = True
    Else
        ' leeres Ufo anzeigen
        Me.ufKarten.Form.Filter = False
        Me.ufKarten.Form.FilterOn = True
    End If
End Sub

Aus meiner Sicht, passiert der fehler, wenn ich im Kombifeld eine Auswshl treffe, dann geht es in die Büsche. Also scheint das Thema RowSource falsch zu sein, die Übergabe, sprich wenn das Feld aktualisiert, da läuft was schief, aber was?
Gruß Andreas
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: DF6GL am Juli 31, 2017, 16:54:18
Hallo,

ich kann jetzt nicht den ganzen Thread von Anfang an durchlesen,  deshalb einfach die Frage:

Ist das Kombi gebunden?  (Steuerelementinhalt irgendein Tabellenfeldname)?

Zum anderen verstehe ich nicht (den Sinn) diese(r) Monster-Abfragen für ein (Auswahl-) Kombifeld, zudem da nicht mit PKs , sondern über Bezeichnungen gefiltert wird.
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: derilzemer am Juli 31, 2017, 17:17:16
Zitat von: DF6GL am Juli 31, 2017, 16:54:18
Ist das Kombi gebunden?  (Steuerelementinhalt irgendein Tabellenfeldname)?
Nein, das Kombi ist nicht gebunden, also Steuerelementinhalt ist leer.
Zitat
Zum anderen verstehe ich nicht (den Sinn) diese(r) Monster-Abfragen für ein (Auswahl-) Kombifeld, zudem da nicht mit PKs , sondern über Bezeichnungen gefiltert wird.
Monsterabfrage stimme ich dir zu, wobei sie ja funzt. Das GROUP by Bezeichnung (ich denke das meinst du) deshalb, weil ich eben nur da doppelte Werte drin habe. Genau die suche bzw. brauche ich ja. Das bekomme ich mit einem PK nicht hin oder irre ich mich?

Gruß Andreas
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: Lachtaube am Juli 31, 2017, 17:53:11
Auf jeden Fall sollte das Zusammenkleben der Abfrage mit & " WHERE Kartenbezeichnung = " & Nz(Me.cboSpielkarte) bei Zeichenketten ncht funktionieren, weil hier einfache oder doppelte Hochkommata fehlen.

PS: Verwende Debug.Print Me.lstKarten.RowSource und kopiere die Ausgabe zum Prüfen in die SQL-Ansicht einer leeren Abfrage.

PPS: dem Feld Kartenbezeichnung sollte man auch einen Index in der Tabelle spendieren, damit man bei größerem Datenbestand keine allzu langen Wartezeiten hat.
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: derilzemer am Juli 31, 2017, 19:55:56
Halo Lachtaube,
Zitat von: Lachtaube am Juli 31, 2017, 17:53:11
Auf jeden Fall sollte das Zusammenkleben der Abfrage mit & " WHERE Kartenbezeichnung = " & Nz(Me.cboSpielkarte) bei Zeichenketten nicht funktionieren, weil hier einfache oder doppelte Hochkommata fehlen.
Das stimmt, sind abhanden gekommen :(. Hab ich jetzt "nachgepflegt". Du meintest so, oder?
& " WHERE Kartenbezeichnung ='" & Nz(Me.cboSpielkarte) & "'"
Wenn ich nach der Änderung jetzt im Kombifeld einen Datensatz auswähle, dann ist zumindest kein 0 mehr im Listfeld. Es bleibt bei 153 gefundenen Datensätzen, also genau soviel, wie es von Anfang an hat.
ZitatPPS: dem Feld Kartenbezeichnung sollte man auch einen Index in der Tabelle spendieren, damit man bei größerem Datenbestand keine allzu langen Wartezeiten hat.
Ich habe das Feld in der Tabelle indiziert, also Duplikate zulassen. Das hast du wohl damit andeuten wollen.

ZitatPS: Verwende Debug.Print Me.lstKarten.RowSource und kopiere die Ausgabe zum Prüfen in die SQL-Ansicht einer leeren Abfrage.
Das bring ich nicht auf die Kette, wie ich das mache Debug.Print Me.lstKarten.RowSource. Mit leerer Abfrage meinst du ja sicher, wenn ich einen Datensatz auswähle, dass ich dann 0 zurück bekomme oder wie meinst du genau, sorry :(.

Gruß Andreas
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: Lachtaube am Juli 31, 2017, 21:34:11
Ich meine es so, wie es da steht. Was ist daran unklar?
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: derilzemer am Juli 31, 2017, 22:08:10
Hi,
Verwende Debug.Print Me.lstKarten.RowSource und kopiere die Ausgabe zum Prüfen in die SQL-Ansicht einer leeren Abfrage.
Ich habe das so eingetragen im VBA
Private Sub cboSpielkarte_AfterUpdate()
    Me.ufKarten.Form.Filter = "False"
    Debug.Print Me.lstKarten.RowSource = "SELECT tblQuartette.SpielID_F, tblQuKarten.QuKartenID, tblSpiele.SpielNr, tblSpiele.Ausgabejahr, [QuartettKz] & [KartenNr] AS Karte tblQuKarten.Kartenbezeichnung " _
        & " FROM tblSpiele INNER JOIN (tblQuartette INNER JOIN tblQuKarten ON tblQuartette.QuartettID = tblQuKarten.QuartettID_F) ON tblSpiele.SpielID = tblQuartette.SpielID_F " _
        & " WHERE Kartenbezeichnung ='" & Nz(Me.cboSpielkarte) & "'"
End Sub

Hab im Formular ein Datensatz ausgewählt und habe folgendes erhalten (bild1, so ist es eindeutig als Bild, beschreiben wäre eventuell missverständlich). Aber wo ich jetzt im lokalen Fenster suchen soll, wo fang ich an zu suchen?! Es weißt laut Bild auf einen Fehler in der letzten Zeile hin wenn ich es richtig deute (Me.cboSpielkarte?). 
Gruß Andreas


Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: Lachtaube am August 01, 2017, 00:29:30
Jetzt hast Du aber den Rückwärtsgang eingelegt. Dass "False" falsch ist, hatten wir doch schon geklärt. Und dann, zuerst die RowSource wie bisher zuweisen und danach mit Debug.Print auslesen.
Private Sub cboSpielkarte_AfterUpdate()
   If IsNull(Me.cboSpielkarte) Then Exit Sub

   Me.ufKarten.Form.Filter = False
   Me.lstKarten.RowSource = _
      "SELECT q.spielid_f," & vbCrLf & _
      "       qk.qukartenid," & vbCrLf & _
      "       s.spielnr," & vbCrLf & _
      "       s.ausgabejahr," & vbCrLf & _
      "       q.quartettkz & qk.kartennr AS karte," & vbCrLf & _
      "       qk.kartenbezeichnung" & vbCrLf & _
      "FROM   TBLSPIELE s" & vbCrLf & _
      "       INNER JOIN (TBLQUARTETTE q" & vbCrLf & _
      "                   INNER JOIN TBLQUKARTEN qk" & vbCrLf & _
      "                           ON q.quartettid = qk.quartettid_f)" & vbCrLf & _
      "               ON s.spielid = q.spielid_f" & vbCrLf & _
      "WHERE  qk.kartenbezeichnung = '" & Replace(Me.cboSpielkarte, "'", "''") & "'"
   Debug.Print Me.lstKarten.RowSource
   'im VBA-Editor das Direktfenster einblenden und generierte Abfrage in der SQL-Ansicht testen.
End Sub
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: derilzemer am August 01, 2017, 21:56:52
Hi,
Zitat von: Lachtaube am August 01, 2017, 00:29:30
Jetzt hast Du aber den Rückwärtsgang eingelegt. Dass "False" falsch ist, hatten wir doch schon geklärt.
Ich weiss, hab das aber nicht gemacht um andere zu ärgern, sondern, wenn ich im Listenfeld was markiere und dann wieder demarkiere, dann kommt wieder Parameterwert eingeben. Breche ich das ab, dann geht der Debug auf die Zeile  Me.ufKarten.Form.Filter = False Setze ich die "False", dann ist der Fehler weg und es funktioniert :-( Sprich ich kann auch einen Datensatz auch wieder demarkieren. Sprich, das ist erzwungen dass ich das wieder in "" setze. In dem ganzen Prozess kommt ja 2x vor.
Private Sub cboSpielkarte_AfterUpdate()
   If IsNull(Me.cboSpielkarte) Then Exit Sub

   Me.ufKarten.Form.Filter = False
   Me.lstKarten.RowSource = _

und in
Private Sub lstKarten_AfterUpdate()
    Dim strKarten As String
    Dim itm As Variant
    If Me.lstKarten.ItemsSelected.count > 0 Then
        ' ausgewählte Karten anzeigen
        For Each itm In lstKarten.ItemsSelected
            strKarten = strKarten & "," & Me.lstKarten.ItemData(itm)
        Next
        Me.ufKarten.Form.Filter = "QuKartenID in (" & Mid(strKarten, 2) & ")"
        Me.ufKarten.Form.FilterOn = True
    Else
        ' leeres Ufo anzeigen
        Me.ufKarten.Form.Filter = False
        Me.ufKarten.Form.FilterOn = True
    End If

Ich mach das eben nur, weil es mit den "" geht :(. Muss ich etwas in den Formulareigenschaften unter Daten --> Filter wegmachen? Da steht False, aber das steht da ja nur, weil ich nicht will, dass er schon Datensätze vorab anzeigt.
Das mit deiner Prüfroutine funktioniert.
Das Debug Ergebnis aus dem Direktbereich
SELECT q.spielid_f,
       qk.qukartenid,
       s.spielnr,
       s.ausgabejahr,
       q.quartettkz & qk.kartennr AS karte,
       qk.kartenbezeichnung
FROM   TBLSPIELE s
       INNER JOIN (TBLQUARTETTE q
                   INNER JOIN TBLQUKARTEN qk
                           ON q.quartettid = qk.quartettid_f)
               ON s.spielid = q.spielid_f
WHERE  qk.kartenbezeichnung = 'Opel Diplomat V8'

Ich habe ja gesehen, dass du den Code etwas vereinfacht (gekürzt) und "modifiziert" hast.
WHERE  qk.kartenbezeichnung = '" & Replace(Me.cboSpielkarte,
Da ist eine Änderung, replace. Bewirkt was, dass er das aktuell angezeigte Query Ergebnis des LF entfernt bzw. ersetzt mit der Auswahl?
Er übergibt jetzt den ausgewählten Datensatz auch an das Listenfeld. Ich kann Datensätze markieren und demarkieren (wenn ich False in "" setze), genauso wie es sein sollte, das ist erst mal echt super  :). Das Gänsefußthema weiss ich nicht was ich da falsch habe in den Einstellungen.
Jetzt funktioniert nur noch die Übergabe an das Ufo nicht ganz korrekt. Aktuell steht im QuKartenID Feld die Spiel-ID statt der QuKartenID und als Spiel-ID wird im UFO eine ganz andere ID angezeigt (bild1). Ergo zeigt er noch die falsche Karte an.
Das liegt dann wohl an der von euch als Mnsterabfrage bezeichneten Abfrage, oder? Die Felder im Ufo sind im Steuerelementinhalt alle korrekt zugewiesen. Die Datensatzquelle des Ufo ufKarten ist:
SELECT DLookUp("Bilderpfad","tblBildPfad") AS BilderPfad,
       tblVerlag.BilderOrdner,
       tblBilderZuSpiel.Bilddateiname,
       tblBilderZuSpiel.BildmotivID_F,
       tblQuKarten.QuKartenID,
       tblQuKarten.Kartenbezeichnung,
       [QuartettKz] & [KartenNr] AS Karte,
       tblSpiele.SpielID,
       tblSpiele.SpielNr,
       tblSpiele.Ausgabejahr,
       tblSpiele.Verzeichnisname,
       tblSpiele.SerieID_F
FROM tblVerlag
INNER JOIN ((tblSpiele
             INNER JOIN tblBilderZuSpiel ON tblSpiele.SpielID = tblBilderZuSpiel.SpielID_F)
            INNER JOIN (tblQuartette
                        INNER JOIN tblQuKarten ON tblQuartette.QuartettID = tblQuKarten.QuartettID_F) ON tblSpiele.SpielID = tblQuartette.SpielID_F) ON tblVerlag.VerlagID = tblSpiele.VerlagID_F;

Warum zeigt er im Feld QuKartenID die SpielID an??

Gruß Andreas



Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: Beaker s.a. am August 02, 2017, 09:58:57
Hallo Andreas,
Bezügl.Debug.Print:
keine Zuweisung (Variable = irgendwas) möglich
also entweder
Debug.Print Me.lstKarten.RowSource
oder
Debug.Print "SELECT ... "
Das Ergebnis dieses Befehls siehst du, wenn du im VB-Editor "Strg-G" drückst.
Aus dem aufscheinenden Direktfenster kannst du den String kopieren, in eine
leere Abfrage einfügen (SQL-Ansicht), und testen.
gruss ekkehard


P.S. Ich bastele gerade an einem kleinen Tool um diesen Vorgang zu erleichtern; -
ist aber noch nicht "rund".
Titel: Re: Kombifeld soll nach Aktualisierung Listenfeld aktualisieren, geht aber nicht
Beitrag von: derilzemer am August 02, 2017, 17:14:30
Hi Ekkehard,
Zitat von: Beaker s.a. am August 02, 2017, 09:58:57
Hallo Andreas,
Bezügl.Debug.Print:
keine Zuweisung (Variable = irgendwas) möglich
also entweder
Debug.Print Me.lstKarten.RowSource
oder
Debug.Print "SELECT ... "
Das Ergebnis dieses Befehls siehst du, wenn du im VB-Editor "Strg-G" drückst.
Aus dem aufscheinenden Direktfenster kannst du den String kopieren, in eine
leere Abfrage einfügen (SQL-Ansicht), und testen.

Ich hab ein wenig gebraucht, bis ich gesehen habe, dass ich auf der Leitung stehe :(. Aber dann hat das auch mit Hilfe von Lachtaube auch funktioniert was das anwenden des Debug.print angeht.
Zitat
P.S. Ich bastele gerade an einem kleinen Tool um diesen Vorgang zu erleichtern; - ist aber noch nicht "rund".
Das hört sich doch gut an. Solche Hilfstools sind für solche "Schwerbegreifer" wie mich Gold wert. Dann bin ich mal gespannt, ob du es dann mal final hast und man es dann nutzen kann.

Gruß Andreas