collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 58
  • Punkt Versteckte: 1
  • Punkt Mitglieder: 2
  • Punkt Benutzer Online:

* Forenstatistik

  • stats Mitglieder insgesamt: 14107
  • stats Beiträge insgesamt: 68024
  • stats Themen insgesamt: 9165
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 17
  • stats Am meisten online: 415

Autor Thema: flexibler Filter für Anfügeabfrage  (Gelesen 100 mal)

Offline Grumpy

  • Newbie
  • Beiträge: 43
flexibler Filter für Anfügeabfrage
« am: November 07, 2018, 13:56:33 »
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.
 

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 23498
Re: flexibler Filter für Anfügeabfrage
« Antwort #1 am: November 07, 2018, 14:16:31 »
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

Offline Grumpy

  • Newbie
  • Beiträge: 43
Re: flexibler Filter für Anfügeabfrage
« Antwort #2 am: November 08, 2018, 07:27:15 »
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....
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 931
Re: flexibler Filter für Anfügeabfrage
« Antwort #3 am: November 08, 2018, 09:23:34 »
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.
« Letzte Änderung: November 09, 2018, 09:40:40 von ebs17 »
Mit freundlichem Glück Auf!

Eberhard
 

 

Abfrage bzw. das Kriterium flexibler gestalten

Begonnen von ShayolBoard Tabelle/Abfrage

Antworten: 10
Aufrufe: 4165
Letzter Beitrag Dezember 04, 2015, 01:36:40
von Shayol