Supportnet / Forum / Datenbanken
unterformular-beziehungen??
Frage
ich habe folgende haupttabelle:
sto-nr --->händisch eingegebener code; Primärschl.
adresse
name
....
....
....
.....
zu dieser sto-nr möchte ich ein kommentar einfügen, allerdings soll es für eine sto-nr mehrere kommentare (für jede woche) geben.
ich denke es ist eine n:m beziehung, aber ich weiß nicht wie ich sie auflösen soll. arbeite mit access 2000
wie mach ich das? hab es schon probiert zum auflösen, funktioniert aber leider nicht. kann mir jemand die tabellen aufschreiben?
dank, cheers
geli
Antwort 1 von disco
moin
wenn du wissen möchtest, was du in access machen musst kann ich dir das leider auch nicht sagen.
aber deine sto-nr tabelle muss so aussehen:
sto:
{
autoId (primär, autoincrement),
sto-nr (fremdschlüssel von haupttabelle),
kommentar,
}
in der tabelle sto darf ein und die selbe sto-nr beliebig oft vorkommen, wenn sie schon in der haupttabelle vorkommt (fremdschlüssel).
in der haupttabelle darf jede sro-nr mnur einmal vorkommen (primärschlüssel). deswegen solltest du sie lieber nicht "händisch" eingeben lassen, sondern einfach als autoincrement.
g,
disco
wenn du wissen möchtest, was du in access machen musst kann ich dir das leider auch nicht sagen.
aber deine sto-nr tabelle muss so aussehen:
sto:
{
autoId (primär, autoincrement),
sto-nr (fremdschlüssel von haupttabelle),
kommentar,
}
in der tabelle sto darf ein und die selbe sto-nr beliebig oft vorkommen, wenn sie schon in der haupttabelle vorkommt (fremdschlüssel).
in der haupttabelle darf jede sro-nr mnur einmal vorkommen (primärschlüssel). deswegen solltest du sie lieber nicht "händisch" eingeben lassen, sondern einfach als autoincrement.
g,
disco
Antwort 2 von geli_m
nein, die sto-nr ist wie eine sozialversicherungsnr, sie darf so und so nur einmal vorkommen.
ich weiß jetzt nur nicht, wie ich mein problem umsetzen soll.
denn es gibt mehrere kommentare, die zu einer Sto-nr gehören.
ich weiß jetzt nur nicht, wie ich mein problem umsetzen soll.
denn es gibt mehrere kommentare, die zu einer Sto-nr gehören.
Antwort 3 von RalfH
Hallo,
Eine Tabelle anlegen mit
Kommentar-ID(Primärschl.)
sto-nr
Kommentar
Datum
Damit wäre eine 1zuN Beziehung gegeben. Also viele Kommentare zu einer sto-nr.
Damit kannste dann auch Abfragen erstellen über sto-nr oder Datum.
Gruß Ralf
Eine Tabelle anlegen mit
Kommentar-ID(Primärschl.)
sto-nr
Kommentar
Datum
Damit wäre eine 1zuN Beziehung gegeben. Also viele Kommentare zu einer sto-nr.
Damit kannste dann auch Abfragen erstellen über sto-nr oder Datum.
Gruß Ralf
Antwort 4 von Teddy7
1) verwende nie Sonderzeichen oder Leerzeichen in Feld- oder Tabellennamen -> also nicht sto-nr sondern sto_nr
2) die zweite Tabelle muß natürlich die sto_nr enthalten und eine Position (und natürlich ein Feld für den Text)
gepflegt wird sowas in Hauptformular/Unterformular - wobei das Unterformular als Datenquelle die zweite Tabelle hat, als Endlosformular definiert wird und über die sto_nr mit dem Hauptformular verknüpft wird.
Bei Erfassung eines neuen Kommentars muß die sto_nr aus dem Hauptformular in ein (ggf. unsichtbares) Feld im Unterformular kopiert werden und die Position gesetzt werden (evtl mit "dmax für diese sto_nr" + 1)
Für Auswertungen erstellt man eine Abfrage über die erste Tabelle und verknüpft die zweite Tabelle über die sto_nr rein. Dadurch erhält man für jeden Kommentar einen Datensatz - die sto_nr also mehrmals. Deshalb gruppiert man in Berichten über die sto_nr und bekommt so als "Überschrift" die sto_daten und im Detailbereich die Kommentare,
Gruß
Teddy
2) die zweite Tabelle muß natürlich die sto_nr enthalten und eine Position (und natürlich ein Feld für den Text)
gepflegt wird sowas in Hauptformular/Unterformular - wobei das Unterformular als Datenquelle die zweite Tabelle hat, als Endlosformular definiert wird und über die sto_nr mit dem Hauptformular verknüpft wird.
Bei Erfassung eines neuen Kommentars muß die sto_nr aus dem Hauptformular in ein (ggf. unsichtbares) Feld im Unterformular kopiert werden und die Position gesetzt werden (evtl mit "dmax für diese sto_nr" + 1)
Für Auswertungen erstellt man eine Abfrage über die erste Tabelle und verknüpft die zweite Tabelle über die sto_nr rein. Dadurch erhält man für jeden Kommentar einen Datensatz - die sto_nr also mehrmals. Deshalb gruppiert man in Berichten über die sto_nr und bekommt so als "Überschrift" die sto_daten und im Detailbereich die Kommentare,
Gruß
Teddy
Antwort 5 von disco
Zitat:
nein, die sto-nr ist wie eine sozialversicherungsnr
nein, die sto-nr ist wie eine sozialversicherungsnr
aha. und du glaubst, dass die SV-nummern irgendwo per hand zum erstmaligen erstellen eingegeben werden?
denke, dass die wohl eher generiert werden...
Antwort 6 von geli_m
@ teddy7:
1. danke für die infos bezügl. sonderzeichen.
2. was verstehst du unter position?
soll ich die sto_nr auch in der nebentabell reinschreiben und mit dieser ein 1:1 beziehung zur haupttabelle machen?
Bei Erfassung eines neuen Kommentars muß die sto_nr aus dem Hauptformular in ein (ggf. unsichtbares) Feld im Unterformular kopiert werden und die Position gesetzt werden (evtl mit "dmax für diese sto_nr" + 1)
zu diesem teil: kann ich das nicht irgendwie automatisieren? was ist das mit dmax...?
cheers
geli
1. danke für die infos bezügl. sonderzeichen.
2. was verstehst du unter position?
soll ich die sto_nr auch in der nebentabell reinschreiben und mit dieser ein 1:1 beziehung zur haupttabelle machen?
Bei Erfassung eines neuen Kommentars muß die sto_nr aus dem Hauptformular in ein (ggf. unsichtbares) Feld im Unterformular kopiert werden und die Position gesetzt werden (evtl mit "dmax für diese sto_nr" + 1)
zu diesem teil: kann ich das nicht irgendwie automatisieren? was ist das mit dmax...?
cheers
geli
Antwort 7 von Teddy7
Hi geli !
Die zweite Tabelle sollte m.E. so aussehen:
sto_nr
pos
Kommentar
Die Position ist ein numerisches Feld.
Die Kombination aus sto_nr und pos gibt einen eindeutigen Schlüssel.
Pos kann ein Autowert-Feld sein. Dann hat man aber das unschöne Ergebnis, daß eine sto_nr als ersten Eintrag die Position 4711 haben kann.
Will man mit Position 1 für jede sto_nr anfangen, dann kann man (natürlich maschinell) z.B. beim getfocus-Ereignis des Kommentars zum einen die sto_nr aus dem Hauptformular kopieren als auch die nächste freie Positionsnr FÜR DIESE sto_nr bestimmen. Das würde man mit der dmax-Funktion tun.
Das würde etwa so aussehen:
pos = 1
on error resume next
pos = dmax("pos","DeinTabellenname","sto_nr = " & sto_nr) + 1
on error goto 0
d.h. in das Feld pos wird erst mal 1 gebracht
dann wird gesagt wenn ein Fehler auftritt soll mit der nächsten Programmzeile weitergemacht werden
dann wird die größte Position gelesen von allen Sätzen (in der 2. Tabelle), die diese sto_nr enthalten und diese Position +1 wird dann nach pos gebracht.
Tritt also dabei ein Fehler auf - z.B. weil noch keine Daten für diese sto_nr vorhanden sind - dann macht er einfach mit der nächsten Anweisung weiter - es bleibt also 1 in pos stehen
der letzte Befehl setzt dann die Fehlerbehandlung wieder auf das Standard-Verfahren
/////
Weil der Schlüssel der 2. Tabelle aus sto_nr UND pos besteht kann es keine 1:1 Beziehung zur 1. Tabelle geben. Deshalb soll das Unterformular ja auch als Endlosformular definiert werden.
Gruß
Teddy
Die zweite Tabelle sollte m.E. so aussehen:
sto_nr
pos
Kommentar
Die Position ist ein numerisches Feld.
Die Kombination aus sto_nr und pos gibt einen eindeutigen Schlüssel.
Pos kann ein Autowert-Feld sein. Dann hat man aber das unschöne Ergebnis, daß eine sto_nr als ersten Eintrag die Position 4711 haben kann.
Will man mit Position 1 für jede sto_nr anfangen, dann kann man (natürlich maschinell) z.B. beim getfocus-Ereignis des Kommentars zum einen die sto_nr aus dem Hauptformular kopieren als auch die nächste freie Positionsnr FÜR DIESE sto_nr bestimmen. Das würde man mit der dmax-Funktion tun.
Das würde etwa so aussehen:
pos = 1
on error resume next
pos = dmax("pos","DeinTabellenname","sto_nr = " & sto_nr) + 1
on error goto 0
d.h. in das Feld pos wird erst mal 1 gebracht
dann wird gesagt wenn ein Fehler auftritt soll mit der nächsten Programmzeile weitergemacht werden
dann wird die größte Position gelesen von allen Sätzen (in der 2. Tabelle), die diese sto_nr enthalten und diese Position +1 wird dann nach pos gebracht.
Tritt also dabei ein Fehler auf - z.B. weil noch keine Daten für diese sto_nr vorhanden sind - dann macht er einfach mit der nächsten Anweisung weiter - es bleibt also 1 in pos stehen
der letzte Befehl setzt dann die Fehlerbehandlung wieder auf das Standard-Verfahren
/////
Weil der Schlüssel der 2. Tabelle aus sto_nr UND pos besteht kann es keine 1:1 Beziehung zur 1. Tabelle geben. Deshalb soll das Unterformular ja auch als Endlosformular definiert werden.
Gruß
Teddy
Antwort 8 von geli_m
hi teddy!!
danke erstmal für die hilfe!!
ich hab da noch eine frage, wo gebe ich diese funktion ein?muss ich die beziehung mit der sto_nr machen (beide sto_nr?)
cheers
geli
danke erstmal für die hilfe!!
ich hab da noch eine frage, wo gebe ich diese funktion ein?muss ich die beziehung mit der sto_nr machen (beide sto_nr?)
cheers
geli
Antwort 9 von Teddy7
Versuchs mal mit lesen:
"..............
z.B. beim getfocus-Ereignis des Kommentars zum einen die sto_nr aus dem Hauptformular kopieren als auch die nächste freie Positionsnr FÜR DIESE sto_nr bestimmen. Das würde man mit der dmax-Funktion tun. "
Und was willst Du jetzt mit der Beziehung ?
Vielleicht das was ich in Antwort 4 bereits gesagt habe:
"wobei das Unterformular als Datenquelle die zweite Tabelle hat, als Endlosformular definiert wird und über die sto_nr mit dem Hauptformular verknüpft wird. "
"..............
z.B. beim getfocus-Ereignis des Kommentars zum einen die sto_nr aus dem Hauptformular kopieren als auch die nächste freie Positionsnr FÜR DIESE sto_nr bestimmen. Das würde man mit der dmax-Funktion tun. "
Und was willst Du jetzt mit der Beziehung ?
Vielleicht das was ich in Antwort 4 bereits gesagt habe:
"wobei das Unterformular als Datenquelle die zweite Tabelle hat, als Endlosformular definiert wird und über die sto_nr mit dem Hauptformular verknüpft wird. "
Antwort 10 von geli_m
also...ich bins nochmal...
hab jetzt dies tabelle angelegt, wie du es gesagt hast. dann hab ich im formular in der entwurfsansicht auf die eigenschaften vom Kommentar(Memo) geklickt, dort hab ich bei "Bei Fokuserhalt" im Code-Generator folgendes eingeben:
Wo du DeinTabellenname geschrieben hast, hab ich status hingeschrieben, denn da muss ich eh die haupttabelle hinschreiben oder?
stimmt das so??
weil es geht immer noch nicht. es zeigt mir diese meldung an:
"Der Datensatz kann nicht hinzugefügt oder geändert werden da ein Datensatz in der Tabelle Kommentar mit diesem Datensatz in beziehung stehen muss"
cheers
geli
hab jetzt dies tabelle angelegt, wie du es gesagt hast. dann hab ich im formular in der entwurfsansicht auf die eigenschaften vom Kommentar(Memo) geklickt, dort hab ich bei "Bei Fokuserhalt" im Code-Generator folgendes eingeben:
Private Sub Kommentar_GotFocus()
Pos = 1
On Error Resume Next
Pos = DMax("Pos", "status", "STO_Nr = " & STO_Nr) + 1
On Error GoTo 0
End SubWo du DeinTabellenname geschrieben hast, hab ich status hingeschrieben, denn da muss ich eh die haupttabelle hinschreiben oder?
stimmt das so??
weil es geht immer noch nicht. es zeigt mir diese meldung an:
"Der Datensatz kann nicht hinzugefügt oder geändert werden da ein Datensatz in der Tabelle Kommentar mit diesem Datensatz in beziehung stehen muss"
cheers
geli
Antwort 11 von geli_m
oder wenn ich zuerst im Unterformular Kommentar die sto_nr eingeben, und dann erst im Hauptformular, dann glaubt man es passt, aber wenn ich noch ein Kommentar mit der selben sto_nr hinzufügen möchte, kommt folgende fehlermeldung:
"Die von Ihnen vorgenommenen Änderungen an der Tabelle konnten nicht vorgenommen werden da der Index, Primärschlüssel oder die Beziehung mehrfach vorkommende Werte enhalten würde. Ändern Sie die Daten in den Feldern, die gleiche Daten enhalten, entfernen Sie den Index, oder definieren Sie den Index neu, damit doppelte Einträge möglich sind und versuchen Sie es erneut."
im Feld Pos ändert sich aber auch nicht die Nr. es bleibt immer 1.
cheers
geli
"Die von Ihnen vorgenommenen Änderungen an der Tabelle konnten nicht vorgenommen werden da der Index, Primärschlüssel oder die Beziehung mehrfach vorkommende Werte enhalten würde. Ändern Sie die Daten in den Feldern, die gleiche Daten enhalten, entfernen Sie den Index, oder definieren Sie den Index neu, damit doppelte Einträge möglich sind und versuchen Sie es erneut."
im Feld Pos ändert sich aber auch nicht die Nr. es bleibt immer 1.
cheers
geli
Antwort 12 von Teddy7
Wenn status die Haupttabelle ist, dann ist das falsch.
Die Position steht doch unter 2. Tabelle, oder ?
Also mußt Du die auch lesen.
Zum Zeitpunkt des lesens muß die sto_nr vorhanden sein !
Die Position steht doch unter 2. Tabelle, oder ?
Also mußt Du die auch lesen.
Zum Zeitpunkt des lesens muß die sto_nr vorhanden sein !
Antwort 13 von geli_m
oke, jetzt hab ich das ausgewechselt:
Private Sub Kommentar_GotFocus()
aber wie soll die STO_Nr schon vorhanden sein, wenn ich sie im status formular erst eingebe und später dann auch das kommentar dort im unterformular.
cheers
geli
Private Sub Kommentar_GotFocus()
Pos = 1
On Error Resume Next
Pos = DMax("Pos", "Kommentar", "STO_Nr = " & STO_Nr) + 1
On Error GoTo 0
End Subaber wie soll die STO_Nr schon vorhanden sein, wenn ich sie im status formular erst eingebe und später dann auch das kommentar dort im unterformular.
cheers
geli
Antwort 14 von Teddy7
Weil man erst die sto_nr eingeben muß und dann erst ins Unterformular gelassen wird - das mußt Du entsprechend programmieren.
Und natürlich, daß VOR der Suche nach der Position die sto_nr vom Hauptformular in den neuen Satz im Unterformular übernommen wird.
Und natürlich, daß VOR der Suche nach der Position die sto_nr vom Hauptformular in den neuen Satz im Unterformular übernommen wird.
Antwort 15 von geli_m
kannst du mir das vorprogrammieren? weil ich kann das nicht.
cheers
geli
cheers
geli
Antwort 16 von Teddy7
Kann ich schon, aber nicht umsonst !
Das erfordert mehr Zeit als ich bereit bin umsonst zu leisten.
Wenn Du das haben willst kannst Du mich über pager ansprechen.
Das erfordert mehr Zeit als ich bereit bin umsonst zu leisten.
Wenn Du das haben willst kannst Du mich über pager ansprechen.
Antwort 17 von geli_m
und gibt es keine einfachere möglichkeit??es muss doch so etwas leicht zum lösen sein. indem ich für einen datensatz mehrere inhalte habe!!na ich werd mich heut am abend hinsetzen und das nocheinmal durchspielen. aber trotzdem danke für deine hilfe.
cheers
geli
cheers
geli
Antwort 18 von Gudrun11
Hallo,
es ist doch eigentlich schon alles gesagt in Antwort 3 und Antwort 4, Du mußt es nun einfach mal tun, notfalls in einem Access Buch nachlesen über 1:n Beziehungen und dann Schritt für Schritt ausführen was da steht.
Gudrun
es ist doch eigentlich schon alles gesagt in Antwort 3 und Antwort 4, Du mußt es nun einfach mal tun, notfalls in einem Access Buch nachlesen über 1:n Beziehungen und dann Schritt für Schritt ausführen was da steht.
Gudrun
Antwort 19 von geli_m
@ ralfh:
vielen vielen dank, es funktioniert!lang hab i dafür braucht...
@teddy:
danke für den tipp mit der dmax-funktion hab ich auch gleich mit eingebaut.
@gudrun:
danke für den hinweis, daran hab i gar nimma gedacht.
cheers
geli
vielen vielen dank, es funktioniert!lang hab i dafür braucht...
@teddy:
danke für den tipp mit der dmax-funktion hab ich auch gleich mit eingebaut.
@gudrun:
danke für den hinweis, daran hab i gar nimma gedacht.
cheers
geli
Antwort 20 von RalfH
Hallo geli,
Ich würde das so machen wie ich Dir bereits in Antwort 3 beschrieben habe.
Die Tabelle nennen wir tbl_Kommentare.
Eine Abfrage erstellen in der Du deine Hauptabelle mit der neuen Tabelle in eine 1 zu N Beziehung setzt über sto-nr. Die gewünschten Felder in die Abfrage stellen und bei dem Feld sto-nr gibst Du bei Kriterien folgendes ein : Wie[Bitte gewünschte sto-nr eingeben:]
Die Abfrage nennen wir qry_Kommentare
Das ganze in einem Endlosformular verpacken
Das Formular nennen wir frm_Kommentare
In Deinem Hauptformular kannst Du jetzt einen Button erstellen und nennst Ihn z.B. "Kommentare bearbeiten"
Das Ereignis nennen wir Sinngemäß BeiKlick
Jetzt ein Makro entwerfen welches das Endlosformular frm_Kommentare öffnet.
Das ganze speichern und ausprobieren.
Ich sitze leider an einem Access losen Rechner und kann das ganze nicht ausprobieren, müsste aber so gehen.
Das ganze könnte man nartürlich viel eleganter hinbekommen, aber das zu beschreiben fehlt mir die Lust bei dem Hammer Wetter!
Gruß Ralf
Ich würde das so machen wie ich Dir bereits in Antwort 3 beschrieben habe.
Zitat:
Eine Tabelle anlegen mit :
Kommentar-ID(Primärschl.)
sto-nr
Kommentar
Datum
Damit wäre eine 1zuN Beziehung gegeben. Also viele Kommentare zu einer sto-nr.
Damit kannste dann auch Abfragen erstellen über sto-nr oder Datum.
Eine Tabelle anlegen mit :
Kommentar-ID(Primärschl.)
sto-nr
Kommentar
Datum
Damit wäre eine 1zuN Beziehung gegeben. Also viele Kommentare zu einer sto-nr.
Damit kannste dann auch Abfragen erstellen über sto-nr oder Datum.
Die Tabelle nennen wir tbl_Kommentare.
Eine Abfrage erstellen in der Du deine Hauptabelle mit der neuen Tabelle in eine 1 zu N Beziehung setzt über sto-nr. Die gewünschten Felder in die Abfrage stellen und bei dem Feld sto-nr gibst Du bei Kriterien folgendes ein : Wie[Bitte gewünschte sto-nr eingeben:]
Die Abfrage nennen wir qry_Kommentare
Das ganze in einem Endlosformular verpacken
Das Formular nennen wir frm_Kommentare
In Deinem Hauptformular kannst Du jetzt einen Button erstellen und nennst Ihn z.B. "Kommentare bearbeiten"
Das Ereignis nennen wir Sinngemäß BeiKlick
Jetzt ein Makro entwerfen welches das Endlosformular frm_Kommentare öffnet.
Das ganze speichern und ausprobieren.
Ich sitze leider an einem Access losen Rechner und kann das ganze nicht ausprobieren, müsste aber so gehen.
Das ganze könnte man nartürlich viel eleganter hinbekommen, aber das zu beschreiben fehlt mir die Lust bei dem Hammer Wetter!
Gruß Ralf

