Ich habe mehrere Anfügeabfragen aus denen ich eine tab_Statistik_temp erstelle.
Wie kann ich in den Anfügeabfragen einen "flexiblen" Filter aufrufen ?
Ich möchte über ein Formular einer Variablen ( Variable heist z.B. "HS" und kann die Werte "HS1,ST1,ST2,...." bekommen (die 12 zuweisbaren Werte sind fest))einen Wert zuweisen.
Dieser Wert soll dann als Filter genutzt werden für diverse Anfügeabfragen.
Alle tabellen aus denen ich daten für die verschiedenen Anfügeabfragen hole haben ein gemeinsames Feld, auf das ich den Filter anwenden möchte.
So sollen dann bei jeder Anfügeabfragen nur die daten angefügt werden die in der Spalte3 den Wert der Variablen "HS" entsprechen.
leider habe ich keine Ahnung wie und wo ich den Filter einstelle bzw. in die Anfügeabfrage integriere.
Hallo,
meinst Du mit "Filter", einem Tabellenfeld einen bestimmten Wert beim Anfügen des DS mitzugeben?
Oder willst Du gefilterte Daten aus "anderen" Tabellen in die Temp-Tabelle schreiben?
Zeige mal den SQL-String einer solchen Anfügeabfrage.
z. B. SQL-String der Anfügeabfrage:
Insert into tab_Statistik_temp (HS) Select HS from tblAndereTabelle Where HS = Forms!frmDeinFormular!HS
INSERT INTO tab_Statistik_temp ( ID, DatumMarsch, Nachname, Vorname, Hörsaal )
SELECT tab_Marsch.ID, tab_Marsch.Datum_Marsch, tab_Grunddaten.Nachname_Schüler, tab_Grunddaten.Vorname_Schüler, tab_Grunddaten.Hörsaal
FROM tab_Grunddaten RIGHT JOIN tab_Marsch ON tab_Grunddaten.ID = tab_Marsch.ID
WHERE (((tab_Grunddaten.Hörsaal)=[Formulare]![Formular1]![gewählterHS]));
oder auch
INSERT INTO tab_Statistik_temp ( ID, Nachname, Vorname, Hörsaal, DatumKleiderschwimmen )
SELECT tab_Grunddaten.ID, tab_Grunddaten.Nachname_Schüler, tab_Grunddaten.Vorname_Schüler, tab_Grunddaten.Hörsaal, tab_Kleiderschwimmen.Datum
FROM tab_Grunddaten LEFT JOIN tab_Kleiderschwimmen ON tab_Grunddaten.ID = tab_Kleiderschwimmen.ID;
in allen Tabellen ist das Feld "Hörsaal" drin.
Über das formular möchte ich den Hörsaal auswählen (die möglichen Werte sind begrenzt)(evtl. Optionsfelder und dann einen Button zum Code auslösen ?
damit soll die Tabelle tab_Statistik_temp neu erstellt werden bzw. neu befüllt werden für spätere auswertungen/Berichtserstellungen.
Ich muss also irgendwie einer Variablen einen Wert (=Hörsaal) zuweisen und als Filterkriterium in die Abfragen bekommen....
Wenn man nicht gerade die VALUES-Variante nutzt, ist eine Anfügeabfrage eine Auswahlabfrage mit davorgesetzter INSERT-Zeile. Der Filter findet da also genau so statt wie bei Auswahlabfragen und ist hier kein spezifisches Problem. Man stelle sich also die Frage: Kann man eine (normale) Auswahlabfrage filtern?
Teil des Problems: Du verwendest hier zur Parameterübergabe einen unmittelbaren Formulartextfeld-Bezug. Manche Ausführanweisungen können diesen Bezug unmittelbar auflösen (DoCmd.OpenQuery) - weil sich vor der Übergabe an die DB-Maschine Access selber noch einschaltet - andere nicht.
Andererseits ist ein Formularbezug keine Parameterübergabe im Sinne der Abfrage, sondern ein Parameterholen von "irgendwoher" und daher schon grundsätzlich problembehaftet, weil auf dem Wege des Holens einiges schiefgehen kann.
Eine "echte" Parameterabfrage ist da anwendungssicherer, man übergibt mit dem Aufruf der Abfrage auch den fraglichen Parameter. Eine Gestaltungsform:
Sub aufruf_ExecuteParamSQL()
Dim anzDS As Long
Dim sSQL As String
sSQL = "PARAMETERS" & _
" [@parHoersaal] TEXT" & _
" ;" & _
" INSERT INTO" & _
" tab_Statistik_temp(" & _
" ID," & _
" DatumMarsch," & _
" Nachname," & _
" Vorname," & _
" Hörsaal" & _
" )" & _
" SELECT" & _
" tab_Marsch.ID," & _
" tab_Marsch.Datum_Marsch," & _
" tab_Grunddaten.Nachname_Schüler," & _
" tab_Grunddaten.Vorname_Schüler," & _
" tab_Grunddaten.Hörsaal" & _
" FROM" & _
" tab_Grunddaten" & _
" RIGHT JOIN tab_Marsch" & _
" ON tab_Grunddaten.ID = tab_Marsch.ID" & _
" WHERE" & _
" tab_Grunddaten.Hörsaal = [@parHoersaal]"
anzDS = ExecuteParamSQL(sSQL, _
Forms.Formular1.gewählterHS)
End Sub
Public Function ExecuteParamSQL(ByVal SqlText As String, _
ParamArray QueryParams() As Variant) As Long
Dim qdf As DAO.QueryDef
Set qdf = CurrentDb.CreateQueryDef("", SqlText)
Dim i As Long
For i = 0 To UBound(QueryParams)
qdf.Parameters(i) = QueryParams(i)
Next
qdf.Execute dbFailOnError
ExecuteParamSQL = qdf.RecordsAffected
qdf.Close
End Function
Wenn man sich die verwendete Abfrage selber anschaut: Ein Filter auf ein Feld, das wegen des OUTER JOIN's leer sein kann (NULL-Inhalt), kann überraschende Wirkungen haben.