PDA

Vollständige Version anzeigen : n:m Tabellenstruktur


Franko Mustacho
24.06.2003, 20:25
Liebes Forum,

ich habe folgendes Problem:

ich habe zwei Tabellen:

Die 1. enthält Angaben zur Person (name, vorname, etc.) und einen primary key (Autowert) als Personen ID. (insgesamt 7 Einträge)

Die 2. beinhaltet Aufträge bei denen diese Personen mitgearbeitet haben. Da innerhalb eines Auftrages aber mehrere Personen mitarbeiten können (jedoch max. 3) habe ich drei Spalten eingerichtet in denen nun jeweils die Personen ID eingetragen wird. Wenn nur zwei Personen mitgearbeitet haben bleibt die dritte Spalte leer (bzw. bekommt eine 0 zugewiesen) (wird ständig erweitert, angenommen 100 Einträge)

Mein Problem: ich möchte nun eine abfragetabelle erhalten die die jeweiligen personen enthält und die ihr zugehörigen aufträge. wie kann ich das realisieren?

Bitte bitte ich verzweifel langsam?

Viele Grüsse Frank

gentry205
24.06.2003, 22:31
Hallo Frank,

einen Tipp vorweg. Du solltest noch eine dritte Tabelle anlegen, in der du eine Person und einen Auftrag zusammen bringen kannst. Dises Konstrukt hat den Vorteil, dass beliebig viele Personen an einem Auftrag arbeiten können und ein Person an mehreren Aufträge arbeiten kann. Man sollte die Datenstruktur immer so anlegen, dass diese auch später nicht verändert werden muss, z.B. kann es sein, dass später an einem Auftrag auch mehr als drei Personen arbeiten können. Außerdem werden leere Felder vermieden. Die angehängte Grafik veranschaulicht diese Struktur.
Die Abfrage dafür sieht wie folgt aus:
SELECT Person.PersonID, Person.Nachname, Person.Vorname, Auftrag.AuftragID, Auftrag.Bezeichnung, Auftrag.Auftraggeber FROM Person, Auftrag, ArbeitetFuerAuftrag WHERE Person.PersonID=ArbeitetFuerAuftrag.PersonID AND Auftrag.AuftragID=ArbeitetFuerAuftrag.AuftragID;
Diese Abfrage gibt alle Personen mit allen zugehörigen Aufträge zurück.

Gruß
Marek

gentry205
24.06.2003, 22:32
hatte die Grafik vergessen.

Jan
24.06.2003, 22:43
1. Tabelle : tab_person, mit person_id, name, nachname etc.
2. Tabelle : tab_auftrag, mit einer ID pro Auftrag (auftrag_id), keine Felder, die Personen enthalten
3. Tabelle : tab_auftrag_person, mit zwei Feldern : auftrag_id, person_id

Verknüpfen : tab_auftrag mit tab_auftrag_person über die auftrag_id,
tab_person mit tab_auftrag_person über die person_id.
Referentielle Integrität nicht vergessen !

Beispiel : Person 1,2,3 arbeiten an Auftrag 1 :

Du trägst drei Datensätze in tab_auftrag_person ein :

auftrag_id person_id
1 1
1 2
1 3

Verhindern, dass mehr als drei Personen pro Auftrag eingetragen werden :

Wenn Du dass über VBA - Code machst : nach dem Einfügen Datensätze für die auftrag_id zählen, wenn grösser als 3, Eintrag rückgängig machen.

Lege über auftrag_id und person_id in tab_auftrag_person noch einen zusammengesetzten Schlüssel, damit eine Person nur einmal pro Auftrag vorkommen kann!

Grüße,

Jan

Szebin
24.06.2003, 22:51
Hallo Frank,

habe die Abfrage mit Deinen zwei Tabellen hinbekommen.
In der Anlage findest Du eine Beispiel-db.
Hier siehst Du in der Abfrage4 das Ergebnis.

Gruß Sabine

Szebin
24.06.2003, 23:04
Hallo Frank,

nachdem ich die db hochgeladen habe, habe ich erst bemerkt, daß ich Deine Frage etwas falsch verstanden habe. Der Vorschlag von Marek ist korrekt; aber vielleicht brauchst Du auch eine Möglichkeit anzusehen, welche Personen am jeweiligen Auftrag gearbeitet haben.

Entschuldige bitte meine Schusseligkeit, habe die Brille nicht aufgesetzt oder zu schnell gelesen.

Gruß Sabine

Franko Mustacho
25.06.2003, 01:41
Vielen Dank für die vielen Antworten,

allerdings hab ich ein weiteres Problem, was mit diesem unmittelbar zusammenhängt:

Ich möchte nun ein Formular als Eingabemaske haben, in dem die Aufträge eingegeben werden können und natürlich auch das Personal, was hierbei mitgearbeitet hat. Wahrscheinlich müsste ich das über ein Unterformular lösen? - Am liebsten hätte ich hierbei Optionsfelder, welche auf die Personaltabelle zurückgreifen und die Personen zur Auswahl anbieten (muss ja nicht einmal dynamisch sein). Das Problem hierbei allerdings ist, wie ich diese jetzt in der Hilfstabelle speichern kann (bei jedem "True" Klick in einem Optionsfeld müsste ein neuer Datensatz angelegt werden und bei jedem "False" Klick müsste dieser Datensatz wieder gelöscht werden.

Gibt es hierfür Lösungsvorschläge - ich glaube allerdings, es fehlt mir am Verständnis, wie die Formulardaten in der Tabelle gespeichert werden - ob ich beispielsweise eine Abfrage zwischenschalten muss, etc.

Grüsse und nochmals vielen Dank bis hierher

Frank

Szebin
25.06.2003, 01:55
Hallo Frank,

ich hoffe, Du hast eine dritte Tabelle angelegt.
Als Anlage das Formular für eine Neueingabe.

Gruß Sabine

Paul.Ostermeier
25.06.2003, 07:36
am einfachsten wäre vermutlich, wenn Du in Dein Auftrag-Einzelformular
ein Unterformular mit Deinen Personen als Endlosform einbettest,

die Personen Auswahl eignet sich m.E. nach eher per "Listbox"
ein weiter Datensatz im Unterformular im 1:n Auftrag-Personen Formular bedeutet somit wine weitere Person, die an den Auftrag mitwirkt ......