Supportnet Computer
Planet of Tech

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

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.

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

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

Antwort 5 von disco

Zitat:
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

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

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

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. "

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:

Private Sub Kommentar_GotFocus()

Pos = 1
On Error Resume Next
Pos = DMax("Pos", "status", "STO_Nr = " & STO_Nr) + 1
On Error GoTo 0

End Sub


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

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

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 !

Antwort 13 von geli_m

oke, jetzt hab ich das ausgewechselt:


Private Sub Kommentar_GotFocus()

Pos = 1
On Error Resume Next
Pos = DMax("Pos", "Kommentar", "STO_Nr = " & STO_Nr) + 1
On Error GoTo 0

End Sub


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

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.

Antwort 15 von geli_m

kannst du mir das vorprogrammieren? weil ich kann das nicht.
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.

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

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

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

Antwort 20 von RalfH

Hallo geli,

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.


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