Hallo Access-O-Maniacs,
habe ein Problem mit doppelte M:N-Beziehung
Lieferant <<->> Artikel (Lieferant hat mehrere Artikel, aber Artikel hat auch mehrere Lieferanten
Charge <<->> Artikel (Artikel hat eine Charge, aber eine Charge hat auch mehrere Artikel.
Eine M:N Beziehung mit zusätzliche Tabelle bekomme ich hin aber dann....
Ich vermute das es an der Tabellen-Beziehungen liegt, aber ich finde keine Lösung.
Die Daten in der Test-Datenbank wurden händisch eingegeben und befüllen das Formular (frm_Art_Charge_Lfrt), aber ich kann keine neuen Datensätze hinzufügen.
Gruss
Rudi
Moin Access-O-Maniacs,
ich bin ein bisschen weitergekommen, aber irgenwie ist da der wurm drin.
Ich glaube das die Beziehungen nicht stimmen.
Leider ist es schon eine weile herr mit dem access.
Vielleicht habt ihr ein Denk-Anstoss.
Ziel soll sein, dass zu jeder BA ein kombination aus Artikel und Lieferant stehen soll.
Artikel und Lieferant haben eine M:N beziehung, welche ich mittels eine zwischen Tabelle
in 2x 1:N Beziehungen aufgelöst habe.
Test DB im Anhang.
Gruss Rudi
Hallo,
Dein Beispiel entspricht ja nicht den Bildern aus Deinem 1.Beitrag.
Im Beispiel ist auch keine doppelte n:m Beziehung.
Bitte erkläre die Zusammenhänge mal genauer.
Hallo MzKlMu,
habe die N:M beziehung erst einmal reduziert auf eine N:M beziehung.
Um das ganze zu verstehen und es einfacher zu machen.
Hinzu käme (zum späteren Zeitpunkt) noch eine Tabelle (tab_Charge) welche auch an Artikel und Lieferant "gebunden" ist.
Die tab_Art_Lfrt müsste dann um die Spalte FS_Charge (=Fremdschlüssen Charge erweitert werden)
und an Diesen die tab_Charge verknüpft werden.
Kann ich gerne wie o.g. machen.
Gruss
Rudi
Hallo Rudi,
ZitatDie tab_Art_Lfrt müsste dann um die Spalte FS_Charge (=Fremdschlüssen Charge erweitert werden)
und an Diesen die tab_Charge verknüpft werden.
Genau; - und der PK dieser Tabelle gehört dann als FK in die
Bewegungstabelle.
Was ist denn tbl_BA? Und warum gibt in der n:m einen FK auf diese
Tabelle, wenn die Bezihung doch anders herum eingerichtet ist?
I.Ü. viel Spass mit deinen kryptischen Objektnamen. Da droht schon
nach zwei Wochen die Verständnislosigkeit.
gruss ekkehard
Hallo Ekkehard,
habe jetzt mal eine Beziehungsmodell "gebastelt". Siehe Anhang.
Geänderte DB habe ich auch nochmal angehängt.
Artikel, Charge und Lieferant (verbunden mit 2x M:N-Beziehung über Tabelle Lfrt_Art) sollen mit einer Beanstandung (BA) in Verbindung stehen. Artikel, Charge und Lieferant können mehrfach in verschiedenen Beanstandungen (BA) vorkommen.
Irgendwie funktioniert es mit den Verknüpfungen / Beziehungen nicht. Die DB "vergisst" immer die Werte. Wenn ich jedoch in der Tabelle BA gucke, dann sind da mehrere Datensätze, kann Diese jedoch nicht öffnen mit dem "+" wie bei den anderen Tabellen.
Bzgl. der kryptischen Objektnamen. Mit den meisten Bezeichnungen arbeite ich tagtäglich.
BA = Beanstandung
Art = Artikel
Lfrt = Lieferant
Charge = Charge (=Schmelznummer)
FS = FK = Fremdschlüssel
ID_... = PK = Primärschlüssel mit Autowert
tab = Tabelle
frm = Formular
ufrm = Unterformular
abfr = Abfrage
Hallo Rudi,
Zitatarbeite ich tagtäglich.
Aber ich/wir hier nicht.
ZitatBA = Beanstandung
Art = Artikel
Lfrt = Lieferant
O.K., Rest ist klar bzw. gängig.
Die Beziehung zwischen tab_BA und tab_Lfrt_Art ist falsch herum bzw.
müsste als n:m wohl eher so aussehen.
gruss ekkehard
Moin Ekkehard,
bin mir nicht ganz sicher ob das so richtig ist, bzw. ich mich nicht eindeutig genug ausgedrückt habe. ;D
Eine Beanstandung hat immer nur eine Kombination aus Artikel, Charge und Lieferant.
Eine Kombination aus Artikel, Charge, Lieferant kann auf mehreren Beanstandungen auftauchen.
Somit Bestünde doch eine 1:n Beziehung zwischen Beanstandung und der Kombination aus Artikel, Charge und Lieferant, oder bin ich da falsch gewickelt ?
Den Namen dieses Threads bezieht sich auf der Kombination Artikel, Charge und Lieferant.
Die dann mit der Tabelle BA verknüpft werden soll.
Ein Artikel kann mehrere Chargen haben und auch mehrere Lieferanten.
Ein Lieferant hat mehrere Artikel und mehrere Chargen
Ein Charge kann mehrere Artikel haben jedoch nur ein Lieferant.
Gruss
Rudi
Hallo Rudi,
ZitatEine Beanstandung hat immer nur eine Kombination aus Artikel, Charge und Lieferant.
Eine Kombination aus Artikel, Charge, Lieferant kann auf mehreren Beanstandungen auftauchen.
O.K., hatte ich wohl falsch verstanden. Dann schmeiss die "tab_BA_LAC"
wieder raus und mach es so.
In meinem letzten Bild sind auch Fehler; - da habe ich vergessen die
unnötigen FKs zu löschen.
gruss ekkehard
Moin Ekkehard,
müssten nicht in der Tabelle mit Artikel, Charge und Lieferant die Spalten mittels Primärschlüssel eindeutig (nur einmal vorkommend) gekennzeichnet werden. ?
Die Kombination aus Artikel, Lieferant und Lieferant gibt es jeweils nur einmal.
Habe meine Idee / Vorschlag mal bildlich angehängt.
Gruss
Rudi
Es muss natürlich heissen
Die Kombination aus Artikel, Charge und Lieferant gibt es jeweils nur einmal.
Moin die Damen und Herren,
habe noch mal ein bisschen die Tastatur betätigt und meine DB angepasst und rumprobiert, aber komme nicht mehr weiter.
1) Egal welchen Artikel ich angeben, es gibt immer nur ein Lieferant. Obwohl mehrere Lieferanten den gleichen Artikel haben mit anderen Chargen.
Ich habe 2 Varianten:
1) Hauptformular (frm_BA)mit Unterformular (ufrm_BA) verbunden über eine ID und ein FS und eine dazugehörige Abfrage (abfr_frm_BA)
2) nur ein Hauptformular (frm_BA_1 mit entsprechenden Feldern und eine dazugehörige Abfrage (abfr_frm_BA1)
Es ist bestimmt irgend etwas kleines aber ich finde es nicht.
Gruss
Rudi
Hallo Rudi,
Zitatmüssten nicht in der Tabelle mit Artikel, Charge und Lieferant die Spalten mittels Primärschlüssel eindeutig (nur einmal vorkommend) gekennzeichnet werden. ?
Eindeutig ja, aber nicht als PK. Richte den Autowert als PK ein, und
erzeuge einen
eindeutigen Mehrfelderschlüssel (siehe Anlage).
Deine DB lade ich mir gleich runter, und schau es mir (später) mal an.
gruss ekkehard
Hallo Rudi,
DB anbei zurück; - Forms Artikel und Beanstandungen angepasst, Index in der n:m gesetzt.
Achtung, ich habe einige Controls umbenannt.
gruss ekkhard
Moin Ekkehard,
das sieht sehr gut aus. Ich würde aber gerne nach Auswahl des Artikels, die weiteren Werte (Charge und Lieferant) auch per gefiltertes Kombinationsfeld auswählen wollen. Siehe DB, frm_BA_1
kombinationsfeld Artikel: ID_Art; ArtNr; Kurztext
Datensatzherkunft: tab_Art, gebundene Spalte 1 (=ID_Art)
kombinationsfeld Charge: ID_Charge; Charge; FS_Art wie cbo_Art
SELECT tab_Charge.ID_Charge, tab_Charge.Charge, tab_Art_Lfrt_Charge.FS_Art
FROM tab_Charge INNER JOIN tab_Art_Lfrt_Charge ON tab_Charge.ID_Charge = tab_Art_Lfrt_Charge.FS_Charge
WHERE (((tab_Art_Lfrt_Charge.FS_Art)=[Formulare]![frm_BA_1]![cbo_Art]))
ORDER BY tab_Charge.Charge;
kombinationsfeld Lieferant: ID_Lfrt; LfrtName; FS_Art wie cbo_Art und FS_Charge wie cbo_Charge
SELECT tab_Lfrt.ID_Lfrt, tab_Lfrt.LfrtName, tab_Art_Lfrt_Charge.FS_Art, tab_Art_Lfrt_Charge.FS_Charge
FROM tab_Lfrt INNER JOIN tab_Art_Lfrt_Charge ON tab_Lfrt.ID_Lfrt = tab_Art_Lfrt_Charge.FS_Lfrt
WHERE (((tab_Art_Lfrt_Charge.FS_Art)=[Formulare]![frm_BA_1]![cbo_Art]) AND ((tab_Art_Lfrt_Charge.FS_Charge)=[Formulare]![frm_BA_1]![cbo_Charge]))
ORDER BY tab_Lfrt.LfrtName;
Der Grund ist, dass es ca. 18000 Artikel, 36500 Chargen und 181 Lieferanten gibt. Von der Menge an Bestellungen und Lieferscheinen ganz zu schweigen. Oder bin ich da falsch gewickelt ?
Gruss
Rudi.
Hallo Rudi,
Mit deinem Form "frm_BA_1" kannst du die Tabelle "tab_Art_Lfrt_Charge"
füllen; mit den BA hat das nichts zu tun.
Prinzipiell, wenn auch nicht immer, sollte ein Form nur an eine Tabelle
gebunden sein. Deine Abfrage macht keinen Sinn, die Nachschlagetabellen
werden doch in den Kombis verwendet.
Die schrittweise Einschränkung der DS in "tab_Art_Lfrt_Charge" geht daher
nur mit ungebundenen Kombis. Diese beziehen sich alle auf diese Tabelle,
denn da müssen sie drin sein. Sonst gibt es keinen FK für die BA. An diesen
ist dann das Kombi cbo_Charge gebunden.
Habe noch mal dran rumgebastelt. Die von mir geschriebenen Prozeduren
stehen als erste im Modul (frm_BA).
gruss ekkehard
Moin Ekkehard,
gucke mir gerade Deine fleiß Arbeit an. Sieht sehr nach meinen Wünschen aus.
2 Sachen sind mir aufgefallen (bei mir Access 2010):
1) wenn das Kombinationsfeld gewechselt wird, dann ist die Eingabe aus dem vorangegangenem Kombinationsfeld nicht mehr sichtbar. Gespeichert sind die Daten. Erst beim Blättern in den Datensätzen sind die eingegebenen / gespeicherten Datensätze sichtbar.
2) wenn alle Kombinationsfelder gefüllt, dann erzeugt er bereits eine neue BA mit einer ID, ebenso bei klicken auf "neuer Datensatz". Ich kenne nur das im ID-Feld "(Neu)" steht.
Habe mir auch den Code zum frm_BA angeguckt, aber ich bin nicht so firm mit VBA und konnte dort nichts finden was o.g. "veranlasst".
Gruss
Rudi.
Hallo Rudi,
Zu 1.
Tausche die beiden Prozeduren aus
Private Sub cbo_Artikel_AfterUpdate()
Dim sSQL As String
If Me.NewRecord Then
sSQL = _
"SELECT DISTINCT ALC.FS_Lfrt, L.LfrtName " _
& "FROM tab_Lfrt AS L " _
& "INNER JOIN tab_Art_Lfrt_Charge AS ALC " _
& "ON L.ID_Lfrt = ALC.FS_Lfrt " _
& "WHERE ALC.FS_Art = " & cbo_Artikel
Me.cbo_Lieferant.RowSource = sSQL
Me.txtArtikel = Me.cbo_Artikel.Column(1) '! hier und ...
Me.txtf_kurztext = Me.cbo_Artikel.Column(2)
End If
End Sub
Private Sub cbo_Lieferant_AfterUpdate()
Dim sSQL As String
If Me.NewRecord Then
sSQL = _
"SELECT ALC.ID_Lfrt_Art, C.Charge " _
& "FROM tab_Charge AS C " _
& "INNER JOIN tab_Art_Lfrt_Charge AS ALC " _
& "ON C.ID_Charge = ALC.FS_Charge " _
& "WHERE ALC.FS_Art = " & Me.cbo_Artikel & " And ALC.FS_Lfrt = " & Me.cbo_Lieferant
Me.cbo_Charge.RowSource = sSQL
Me.txtLieferant = Me.cbo_Lieferant.Column(1) '... hier
End If
End Sub
zu 2.
Das wird durch die Zeile
Me.cbo_Charge = Null
ausgelöst, da ein Wert in ein gebundenes Feld geschrieben wird. Ändere die
Zeile wie folgt
Me.cbo_Charge.RowSource = ""
Macht auch eh mehr Sinn, - meine Unzulänglichkeit :-(
gruss ekkehard
Moin Ekkehard,
Erstmal vielen Dank für deine Hilfe. Muss es mir später zur Gemüte führen. Mein PC macht zicken :-(
Moin Ekkehard,
funzt jetzt wunderbar. Wie gewünscht. Du bist der Beste.
Jetzt muss noch eine Routine rein um auch Werte zu ergänzen. Hast Du sicherlich schon erwartet. Habe bei den Ereignissen der Kombinationsfeldern geguckt, aber den regulären Eintrag "Bei nicht in Liste bei cbo_Art und cbo_Lieferant nicht gefunden.Nur bei cbo_Charge gibt es den o.g. Eintrag in der Ereignisliste.
Ich gehe davon aus, dass der code von Dir noch ein "bisschen" ergänzt werden muss für cbo_Art und cbo_Lfrt.
Wenn nicht in Liste (Tabelle) dann öffne frm_Art und nehme den Wert des Feldes/der Felder mit.
Leider weiss ich nur wie das bei dem Ereignis "bei nicht in liste" funktioniert, aber nicht bei dem SQL -code bei Laden des frm_BA.
Gruss
Rudi
Hallo Rudi,
Das macht auf diesem Form keinen Sinn. In diesem Form werden "Bean-
standungen" erfasst und sonst nichts.
Es wird doch wohl beim Wareneingang zunächst der Artikel mit Charge und
Lieferant erfasst, und erst dann, wenn überhaupt, eine Beanstandung zu eben
dieser Charge. Wie willst du sonst den FK in die Beanstandung bekommen?
Um also die Chargen zu erfassen, brauchst ein eigenes Formular, das an die
Tabelle "tab_Art_Lfrt_Charge" gebunden ist. Da kannst du dann die drei Kombis
mit einem "NotInList"-Ereignis ausstatten.
Von diesem Form aus könntest du auch gleich das Form BA mit einem neuen
DS öffnen und den FK für Art/Lfrt/Charge übergeben, und müsstest nur noch
Bestellung und Lieferschein ergänzen.
Wobei an dieser Stelle eine Riesenlücke im Datenmodell klafft. Es gibt keine
Beziehung zwischen Bestellung und Lieferschein sowie keine zwischen Liefer-
schein und den Artikeln, - somit kein Zusammenhang zwischen Lieferschein
und Beanstandung. Du kannst also eine BA anlegen zu einer Charge, deren
Artikel gar nicht auf dem ausgewählten Lieferschein steht.
Musst du mal drüber nachdenken.
gruss ekkhard
Moin Ekkehard,
es soll über ein zusätzliches Formular laufen (frm_Art), wo Artikel, Charge und Lieferant gepflegt werden.
Wenn ein Artikel, eine Charge oder Lieferant als Kombination nicht in der tab_ALC ist, dann soll er frm_Art
öffnen und die bereits gemachten Angaben mit übertragen in frm_Art.
Das es eine Datenlücke gibt, ist mir durchaus bewusst, aber da wir kein Qualitäts-Modul für unser ERP-System haben, wollen wir uns mit meiner DB behelfen.
Die Mitarbeiter in unsere Qualitätssicherung füllen aktuell ein Word-Dokument aus, ohne jeglich Beziehungen irgend wo hin. Also die größt möglich Datenlücke die es gibt.
Ausserdem soll über meine DB auch noch die Ausschussware erfasst werden und dem Lieferanten berechnet werden.
Franz hatte mir kürzlich schon mit der Übergabe an anderes Formular geholfen mit "OpenArgs". Kann aber mein Beitrag gerade nicht finden.
Gruss
Rudi
Hallo Rudi,
Sorry, fällt mir heute nichts mehr dazu ein, - muss jetzt Feierabend machen.
Morgen bin ich ausser Haus, weiss aber nicht wie lange. Überlege mir was
wenn's passt.
gruss ekkehard
@Klaus
Falls du Lust und Zeit magst du vielleicht einspringen. Ich halte das Vorgehen
für falsch, aber wohl machbar.