Access - Komplexe Abfragen mittels Formular aus mehreren Tabellen
Als Access Neuling habe ich trotz Suche in mehreren Foren und langes rumprobieren noch keine eigene Lösung für folgendes Problem erarbeiten können. Daher würde ich mich über jedweden Hinweis, der mir bei der Lösung hilft, freuen.
Folgendes zur Projektbeschreibung:
Ausgangslage:
Eine Exeltabelle, in der in der jeweilgen Spalte bestimmte Werte eingegeben werden
Spalte A - das Datum zu den entsprechenden Werten
Spalte B - eine Identifikationsnummer der Maschine
Spalte C - eine Identifikationsnummer der Person
Spalte D - die produzierte Stückzahl
Es kann vorkommen, dass pro Datum eine Maschine mehrfach benutzt wird
Es kann vorkommen, dass pro Datum eine Person mehrfach genannt wird
Ziel soll sein:
Eine Abfrage, die es ermöglicht Wochenweise folgende Werte zu filtern und anzuzeigen:
- Bei ausgewählter Identifikationsnummer der Person und der entsprechenden Kalenderwoche soll die gesamte (also summiert) von der Person produzierte Stückzahl ausgegeben werden
- Bei ausgewähltem Maschinenbereich und der Kalenderwoche soll die gesamte (ebenfalls summiert) produzierte Stückzahl des entsprechenden Manschinenbereiches ausgegeben werden
Folgendes habe ich bisher erarbeitet:
- eine Tabelle (in Access) die jedem Datum die entsprechende Kalenderwoche zuordnet
- eine Tabelle (in Access) die der jeweilgen Kalenderwoche wieder einen entsprechenden Datumsbereich zurück gibt (als Textfeld)
- eine Tabelle (in Access), die die Identifikationsnummer der Person mit Namen und Vornamen in Verbindung bringt
- eine Tabelle (in Access), die die Identifikationsnummer der Maschine einem jeweiligen Maschinenbereich zuweist.
Folgende Beziehungen der Tabellen habe ich hergestellt:
- Tabelle Kalenderwoche in Datumsbereich (Primärschlüssel = Kalenderwoche) ist verbunden mit der Tabelle Datum in Kalenderwoche (Primärschlüssel = Datum) verknüpft ist hierbei jeweils die Kalenderwochenspalte)
- Tabelle Datum in Kalenderwoche mit verknüpfter Ursprungsexceltabelle (Spalte Datum)
- Tabelle Identifikationsnummer der Person (Primärschlüssel = Identnr.) mit Ursprungsexceltabelle (Spalte Identnr. der Person)
- Tabelle Identnr. der Maschine (Primärschlüssel = Identnr. der Maschine) mit Ursprungsexceltabelle (Spalte Identnr der Maschine)
Soweit zur Theorie.
Was ich bisher geschafft hab war, dass ich eine Kalenderwoche eingeben konnte und mir der entsprechende Datumsbereich in einem weiteren Formularfeld zurückgegeben worden ist.
Aber das war eher ein Zufallstreffer - der Hintergrund (also warum das plötzlich so funktioniert) erschloss sich mir leider nicht.
Wie muss ich das Formular gestalten um oben beschriebenes Abbildern zu können?
Ergänzungen:
Verwendet wird zur Erstellung Access 2010 es soll aber auch unter Access 2007 bearbeitbar bleiben.
Zu den Beziehungen:
Die Tabelle "Schichtbuch" ist die importierte Tabelle, die regelmäßig aktualisiert wird.
Relevant sind dabei nur die verknüpften Spalten.
Die Berechnung soll aus der Spalte "Stückzahl Kopie" erfolgen.
So stelle ich mir am Ende das Formular vor:
Im Feld Kalenderwoche soll eine Zahl eingegeben werden können (Meinetwegen auch als Rollbalkenmenü)
Dann soll angekreuzt werden, ob anch Mitarbeiter oder Bereich gefiltert werden soll (muss aber nicht unebdingt sein, wenn es nicht erforderlich ist)
Unter Mitarbeiter oder Bereich soll jeweils mit einem Rollbalkenmenü aus der Tabellenauswahl ausgewählt werden können (Also Personalliste und Bereiche)
Und im Feld Stückzahl soll dann das Ergebnis aufleuchten.
Folgendes zur Projektbeschreibung:
Ausgangslage:
Eine Exeltabelle, in der in der jeweilgen Spalte bestimmte Werte eingegeben werden
Spalte A - das Datum zu den entsprechenden Werten
Spalte B - eine Identifikationsnummer der Maschine
Spalte C - eine Identifikationsnummer der Person
Spalte D - die produzierte Stückzahl
Es kann vorkommen, dass pro Datum eine Maschine mehrfach benutzt wird
Es kann vorkommen, dass pro Datum eine Person mehrfach genannt wird
Ziel soll sein:
Eine Abfrage, die es ermöglicht Wochenweise folgende Werte zu filtern und anzuzeigen:
- Bei ausgewählter Identifikationsnummer der Person und der entsprechenden Kalenderwoche soll die gesamte (also summiert) von der Person produzierte Stückzahl ausgegeben werden
- Bei ausgewähltem Maschinenbereich und der Kalenderwoche soll die gesamte (ebenfalls summiert) produzierte Stückzahl des entsprechenden Manschinenbereiches ausgegeben werden
Folgendes habe ich bisher erarbeitet:
- eine Tabelle (in Access) die jedem Datum die entsprechende Kalenderwoche zuordnet
- eine Tabelle (in Access) die der jeweilgen Kalenderwoche wieder einen entsprechenden Datumsbereich zurück gibt (als Textfeld)
- eine Tabelle (in Access), die die Identifikationsnummer der Person mit Namen und Vornamen in Verbindung bringt
- eine Tabelle (in Access), die die Identifikationsnummer der Maschine einem jeweiligen Maschinenbereich zuweist.
Folgende Beziehungen der Tabellen habe ich hergestellt:
- Tabelle Kalenderwoche in Datumsbereich (Primärschlüssel = Kalenderwoche) ist verbunden mit der Tabelle Datum in Kalenderwoche (Primärschlüssel = Datum) verknüpft ist hierbei jeweils die Kalenderwochenspalte)
- Tabelle Datum in Kalenderwoche mit verknüpfter Ursprungsexceltabelle (Spalte Datum)
- Tabelle Identifikationsnummer der Person (Primärschlüssel = Identnr.) mit Ursprungsexceltabelle (Spalte Identnr. der Person)
- Tabelle Identnr. der Maschine (Primärschlüssel = Identnr. der Maschine) mit Ursprungsexceltabelle (Spalte Identnr der Maschine)
Soweit zur Theorie.
Was ich bisher geschafft hab war, dass ich eine Kalenderwoche eingeben konnte und mir der entsprechende Datumsbereich in einem weiteren Formularfeld zurückgegeben worden ist.
Aber das war eher ein Zufallstreffer - der Hintergrund (also warum das plötzlich so funktioniert) erschloss sich mir leider nicht.
Wie muss ich das Formular gestalten um oben beschriebenes Abbildern zu können?
Ergänzungen:
Verwendet wird zur Erstellung Access 2010 es soll aber auch unter Access 2007 bearbeitbar bleiben.
Zu den Beziehungen:
Die Tabelle "Schichtbuch" ist die importierte Tabelle, die regelmäßig aktualisiert wird.
Relevant sind dabei nur die verknüpften Spalten.
Die Berechnung soll aus der Spalte "Stückzahl Kopie" erfolgen.
So stelle ich mir am Ende das Formular vor:
Im Feld Kalenderwoche soll eine Zahl eingegeben werden können (Meinetwegen auch als Rollbalkenmenü)
Dann soll angekreuzt werden, ob anch Mitarbeiter oder Bereich gefiltert werden soll (muss aber nicht unebdingt sein, wenn es nicht erforderlich ist)
Unter Mitarbeiter oder Bereich soll jeweils mit einem Rollbalkenmenü aus der Tabellenauswahl ausgewählt werden können (Also Personalliste und Bereiche)
Und im Feld Stückzahl soll dann das Ergebnis aufleuchten.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 179062
Url: https://administrator.de/contentid/179062
Ausgedruckt am: 16.11.2024 um 19:11 Uhr
8 Kommentare
Neuester Kommentar
Moin Moin,
die Tabellen Kalenderwoche und KW kannst du dir sparen, die sind überflüssig. Aus dem Datum bekommst du alle diese Informationen auch ohne Tabellen heraus. In der Tabelle "Bereiche" ist der Typ des Feldes Maschine hoffentlich eine Zahl?
Eigentlich hätte ich dir einen Bericht vorgeschlagen, um die Daten auszuwerten. Da du aber nur einzelne Werte benötigst, geht das mit der Funktion Dsum.
Es fehlt ein Button der die Berechnung ausführt. Alternativ kannst du bei Verlassen eines Feldes die Berechnung auch ausführen lassen.
DSUM hat den Syntax: DSUM("Felddassummiertwerdensoll","Tabellenname","Kriterien")
Also [Stückzahl Kopie] soll summiert werden, aus der Tabelle "Schichtbuch" und deine Kriterien kennst du ja.
Für Mitarbeiter und Bereich solltest du ein Pulldownfeld nutzen, dass die ID und nicht den Namen zurück gibt.
D.h. die Datenquelle für das Pulldownfeld ist z.B. Mitarbeiter.
Die erste Spalte ist gebunden (die Personalnummer) und hat eine Breite von 0 (damit sie unsichtbar ist)
Die zweite Spalte (Anzahl Spalten = 2) nutzt du dann für den Mitarbeiternamen, der dann angezeigt und ausgewählt werden kann, mit einer Breite von 3-5 cm.
Generell solltest du reservierte Begriffe wie NAME oder DATUM nicht als Feldbezeichnungen verwenden!!
Feldnamen mit Leerstellen können auch Probleme bereiten, also einen Unterstrich verwenden, das macht vieles einfacher.
Viel Spaß beim Basteln.
Grüße aus Rostock
Wolfgang
(Netwolf)
Tipp: Access ohne VBA ist wie Autofahren ohne Räder
die Tabellen Kalenderwoche und KW kannst du dir sparen, die sind überflüssig. Aus dem Datum bekommst du alle diese Informationen auch ohne Tabellen heraus. In der Tabelle "Bereiche" ist der Typ des Feldes Maschine hoffentlich eine Zahl?
Eigentlich hätte ich dir einen Bericht vorgeschlagen, um die Daten auszuwerten. Da du aber nur einzelne Werte benötigst, geht das mit der Funktion Dsum.
Es fehlt ein Button der die Berechnung ausführt. Alternativ kannst du bei Verlassen eines Feldes die Berechnung auch ausführen lassen.
DSUM hat den Syntax: DSUM("Felddassummiertwerdensoll","Tabellenname","Kriterien")
Also [Stückzahl Kopie] soll summiert werden, aus der Tabelle "Schichtbuch" und deine Kriterien kennst du ja.
Private Sub Wenn_Button_geklickt_wird (oder beim Verlassen eines jeden Feldes)
Dim Kriterien as String
'######### Kriterien zusammenbauen #########
Kriterien = ""
if Me.Kalenderwochenfeld > 0 then
Kriterien = Kriterien & "Format([Datum fortlaufend], "ww", vbMonday) = " & Me.Kalenderwochenfeld
end if
if len(Me.Mitarbeiterfeld) > 0 then
Kriterien = Kriterien & iif(len(Kriterien)>0," and ","") & "Personalnummer fortlaufend = " & Me.Mitarbeiterfeld
endif
'usw. für alle deine Kriterien
Me.Summenfeld = DSUM("Stückzahl Kopie","Schichtbuch",Kriterien)
end Sub
Für Mitarbeiter und Bereich solltest du ein Pulldownfeld nutzen, dass die ID und nicht den Namen zurück gibt.
D.h. die Datenquelle für das Pulldownfeld ist z.B. Mitarbeiter.
Die erste Spalte ist gebunden (die Personalnummer) und hat eine Breite von 0 (damit sie unsichtbar ist)
Die zweite Spalte (Anzahl Spalten = 2) nutzt du dann für den Mitarbeiternamen, der dann angezeigt und ausgewählt werden kann, mit einer Breite von 3-5 cm.
Generell solltest du reservierte Begriffe wie NAME oder DATUM nicht als Feldbezeichnungen verwenden!!
Feldnamen mit Leerstellen können auch Probleme bereiten, also einen Unterstrich verwenden, das macht vieles einfacher.
Viel Spaß beim Basteln.
Grüße aus Rostock
Wolfgang
(Netwolf)
Tipp: Access ohne VBA ist wie Autofahren ohne Räder
hey,
imo würde ich die Tabellen nicht so stehen lassen.
tbl Kalenderwoche löschen und mit tbl Maschinen und Mitarbeiter 1:n beziehungen mit referenzieller Integrität bilden.
ArbeitsplatzNr im Schichtbuch = Primärschlüssel mit dublikate
PersonalNr im Schichtbuch = Primärschlüssel mit dublikate
netter link zu dem Thema
http://support.microsoft.com/kb/510037/de
mfg
imo würde ich die Tabellen nicht so stehen lassen.
tbl Kalenderwoche löschen und mit tbl Maschinen und Mitarbeiter 1:n beziehungen mit referenzieller Integrität bilden.
ArbeitsplatzNr im Schichtbuch = Primärschlüssel mit dublikate
PersonalNr im Schichtbuch = Primärschlüssel mit dublikate
netter link zu dem Thema
http://support.microsoft.com/kb/510037/de
mfg
Stimmt, wer lesen kann .... ich hatte nur dein Feld "Stückzahl" auf deinem Formular gesehen und war so von falschen Voraussetzungen ausgegangen.
Also noch mal von vorne:
- lösche die Tabellen KW und Kalenderwoche (weil überflüssig)
- erstelle eine Abfrage (Datenbasis = Schichtbuch)
- Die Kriterien für das jeweilige Feld werden in der Zeile [Kriterien] eingetragen (bedenke: nebeneinander = AND // untereinander = OR Verknüpfung)
Die Werte für die Kriterien holst du aus dem Formular. Beispiel:
Spalte: Bereich
Kriterium: = Formulare.Formularname.Bereich
Grüße aus Rostock
Wolfgang
(Netwolf)
Also noch mal von vorne:
- lösche die Tabellen KW und Kalenderwoche (weil überflüssig)
- erstelle eine Abfrage (Datenbasis = Schichtbuch)
- Die Kriterien für das jeweilige Feld werden in der Zeile [Kriterien] eingetragen (bedenke: nebeneinander = AND // untereinander = OR Verknüpfung)
Die Werte für die Kriterien holst du aus dem Formular. Beispiel:
Spalte: Bereich
Kriterium: = Formulare.Formularname.Bereich
Grüße aus Rostock
Wolfgang
(Netwolf)