Ich habe 2 Tabellen in Access angelegt. In Tabelle1 steht ein Primärschlüssel (ID1, Auto Wert, Long Integer) und mehrere Firmen (Firma), in der zweiten Tabelle stehen zu den einzelnen Firmen für mehrere Jahre Zahlen (z.B. Firma1 2011 Umsatz, Firma1 2010 Umsatz etc). In der 2. Tabelle steht im Feld ID2 in jeder Zeile der Primärschlüssel aus Tabelle 1, der z.B. Firma1 identifiziert.
In einem Endlosformular habe ich alle Firmen aus Tabelle 1 angezeigt.
Prinzipiell könnte ich das Endlosformular auf Einzel-Formular umstellen und dann ein Unterformular für Tabelle2 erstellen, das Tabelle1.ID1 und Tabelle2.ID2 verknüpft. Dann verliere ich aber die Übersicht über alle Firmen im Endlosformular, da Access in einem Endlosformular keine Unterformulare zulässt.
Jetzt meine Idee:
In dem Endlosformular, in dem ich mir alle Firmen aus Tabelle1 anzeigen lasse, will ich ein Listenfeld erstellen. In diesem Listenfeld sollen für jede Firma aus Tabelle1 alle Daten aus Tabelle2 angezeigt werden, bei denen der Primärschlüssel (ID1) aus Tabelle1 mit dem Wert ID2 in Tabelle 2 ident ist.
Wie müsste die VBA-Ereignisprozedur aussehen die das Listenfeld mit dem Formular verknüft, und unter welchem Ereignis für das Listenfeld müsste diese Eingetragen werden?
Hallo Gregor!
Ich hätte da ein Datenbank für dich.
Zwei Tabellen Namens Fimen und Bestellungen
Zwei Gleichnamige Forms
Jede Menge VBA
Und eine Abfrage
Und eine Beziehung
Könnte dir den Ganzen VBA jetzt posten aber ich weiss nicht so recht ob dir das was hilft, kann dir aber die Datenbank schicken falls du das möchtest.
Hallo, mein vorschlag:
1.) ich würde einmal ein Endlos-Formular und ein Einzel-Formular erstellen
2.) in dem Endlos-Formular an irgend einer Stelle im
Detail-Bereich einen Schaltknopf erstellen, der zum Einzel-Formular nach dem klicken springt
Den Schaltknopf wie folgt erstellen:
Formular öffnen
das formular öffnen und bestimmte Daten suche und anzeigen
Feld vom Endlos-formular mit Feld vom Einzel-Formular
auswählen und auf fertig stellen klicken
Nachdem der Schaltknopf im Endlos-Formular erstellt wurde, brauchst du nur bei der zu suchenden firma hierauf klicken und schon siehst du alle einzelnen Daten dieser Firma
Ein Kombinationsfeld kf und ein Listenfeld lf im Formular anzulegen. Das Kombinationsfeld wird an Tabelle1 gebunden.
Für das Kombinationsfeld die Ereignisprozedur „Beim Klicken“ einrichten. In dieser Prozedur dem Listenfeld die entsprechenden Daten aus Tabelle2 zuordnen.
lf.rowsource = „select * from Tabelle2 where ID1=“ & kf.column(0)
lf.requery
In diesem Fall enthält in Tabelle1 die Spalte 1 ID1.
Zunächst einmal einen Verweis auf Microsoft.DAO setzen.
mit Access 2000
Private Sub Form_Open(Cancel As Integer)
Dim rs As DAO.Recordset
Dim SQL As String
SQL = „SELECT Tabelle1.Firma, Tabelle2.[2011], Tabelle2.[2012] FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.ID1 = Tabelle2.ID2;“
Set rs = CurrentDb.OpenRecordset(SQL)
rs.MoveFirst
Dim Liste As String
Do While Not rs.EOF
Liste = „Firma;2011;2012“
If IsNull(rs!firma) = True Then
GoTo weiter
Else
Liste = Liste & „;“ & rs!firma
End If
If IsNull(rs![2011]) = False Then
Liste = Liste & „;“ & rs![2011]
End If
If IsNull(rs![2012]) = False Then
Liste = Liste & „;“ & rs![2012]
End If
weiter:
rs.MoveNext
Loop
Liste0.RowSource = Liste
End Sub
Datenherkunftstyp der Listbox auf Werteliste setzen.
Access > 2000
Da ich mit Visual Studio arbeite und dort Accessdateien lediglich als Daten-Container benutze und deshalb lediglich ACCESS2000 habe, konnte ich folgendes nicht probieren:
Private Sub Form_Open(Cancel As Integer)
Dim rs As DAO.Recordset
Dim SQL As String
Dim Firma As string
Dim U2011 As Currency
Dim U2012 As Currency
SQL = „SELECT Firmen.Firma, Umsatz.[2011], Umsatz.[2012] FROM Firmen INNER JOIN Umsatz ON Firmen.ID1 = Umsatz.ID2;“
Set rs = CurrentDb.OpenRecordset(SQL)
rs.MoveFirst
Do While Not rs.EOF
If IsNull(rs!firma) = True Then
GoTo weiter
Else
Firma= rs!firma
End If
If IsNull(rs![2011]) = False Then
u2011= rs![2011]
End If
If IsNull(rs![2012]) = False Then
u2012= rs![2012]
End If
Liste0.AddItem Firma & „,“ & u2011 & „,“ & u2012
weiter:
rs.MoveNext
Loop
End Sub
in früheren Access Versionen wurde der Code automatisch erstellt, wenn man mit dem Assistenten ein Listenfeld angelgt hat. Heutte muss das Programmiert werden. Da kann ich nicht helfen.
Hallo Gregor
Ich schlage vor: ein leeres Hauptformular, darin zwei Unterformulare je für Tabelle1 und Tabelle2. In ein Standardmodul folgenden Code einsetzen:
Option Compare Database
Option Explicit
Global glgID
Function getID()
getID = glgID
End Function
Im Unterformular für Tabelle1 beim Klicken folgenden Code eingeben (ev. Auch bei Firmenname):
Private Sub ID_Click()
glgID = Me!ID
Forms!formular1.Refresh
End Sub
(Formular1 ist das leere Hauptformular)
In der Datensatzquelle des Unterformulars für Tabelle2 bei ID das Kriterium getID() setzen
Falls die anzuzeigende Datenmenge in Tabelle2 nicht zu gross ist, könnten diese Daten auch im Hauptformular als Listfeld gezeigt werden. Dann die Datensatzquelle des Listfeldes entsprechend anpassen.