2009-09
Datum: 03.09.2009
Ort: Vereinsheim SG Stuttgart-West
Thema: Access udn Ferienzeit
Teilnehmer: Ingmar Stauß, Dirk Eberhard, Sylvia Häusler, Susanne Röhrich, Thomas Röhrich, Roman Schütz, Dagmar Lutz
Bericht: Dagmar Lutz
Dieses Mal in nicht allzu grosser Runde, trotzdem wurde heftig gearbeitet. Ich hatte ein Problem mitgebracht bei dem ich nicht so recht weiterkam.
Für eine Literaturstellenverwaltungsdatenbank (schönes Wortkonstrukt :-)) sollte eine Suche nach Schlagwörtern mit UND-Verknüpfung realisiert werden. Mein Ansatz war eine Kreuztabellenabfrage, die längs und quer durchsucht werden muss. Es wurden von verschiedener Seite Bedenken geäussert, dass bei sehr vielen Schlagwörtern access an seine Grenzen stossen könnte. Es wurde eine gestufte Filterung vorschlagen und eine Lösung mit Abfragen über SQL-Strings aufzubauen und dann auszuwerten.
Als ich nach einer Zigarettenpause zurück kam, fand ich Dirk und Ingmar über mein Laptop gebeugt und heftig auf der Tastatur klappern.
Zwei Stunden später hatten sie eine Lösung gebastelt und hier ein Eindruck davon:
Ganz herzlichen Dank an Dirk und Ingmar 🙂
a = Me!list_schlag.ItemsSelected.Count
i = 0
If Me!list_schlag.ItemsSelected.Count = 0 Then
MsgBox „Es wurde keine Auswahl getroffen“
Else
For Each vIGr In Me![list_schlag].ItemsSelected
i = i + 1
If i > 1 Then
strSQLjoin = strSQLjoin & “ LEFT JOIN t_schlag_dok AS A_“ & i & “ ON A_“ & i – 1 & „.dok_id=A_“ & i & „.dok_id“ & „)“
End If
strSQLwhere = strSQLwhere & „A_“ & i & „.schlag_id=“ & Format$(Me![list_schlag].ItemData(vIGr)) & “ AND “
Next vIGr
strSQLwhere = Left(strSQLwhere, Len(strSQLwhere) – 5)
strSQLjoin = strSQLjoin
strSQL = „SELECT DISTINCT A_1.dok_id FROM “ & String(a – 1, „(„) & „t_schlag_dok AS A_1 “ & strSQLjoin & “ WHERE “ & strSQLwhere
End If
vSql = „“
vSql = „SELECT t_dok_stamm.id_dok, t_dok_stamm.titel, t_dok_stamm.datumm, t_dok_stamm.pfad, t_dok_stamm.bemerkungen, t_autor.autor, t_quelle.quelle, t_dokart.dokart „
vSql = vSql & „FROM (t_dokart RIGHT JOIN (t_autor RIGHT JOIN (t_quelle RIGHT JOIN t_dok_stamm ON t_quelle.id_quelle = t_dok_stamm.quelle_id) ON t_autor.id_autor = t_dok_stamm.autor_id) ON t_dokart.id_dokart = t_dok_stamm.dokart_id) INNER JOIN (“ & strSQL & „) AS Abfrage1 ON t_dok_stamm.id_dok = Abfrage1.dok_id“
Set rs = CurrentDb.OpenRecordset(vSql, dbOpenSnapshot)
If Not rs.EOF Then
Me!f_u_schlag_and.Visible = True
Me!f_u_schlag_and.Form.RecordSource = vSql
Else
MsgBox „Es ist kein Datensatz vorhanden.“
End If
rs.Close
Set rs = Nothing