PDA

Vollständige Version anzeigen : Verknüpfung Hfo und Ufo


Pusteblume
03.05.2011, 13:45
Hallo zusammen,

ich bräuchte einen Denkanstoß. Habe in einem Formular ein Hauptformular sowie ein Unterformular. Sowohl im Haupt- als auch im Unterformular existiert ein Feld namens PNr. (Personalnummer). Hfo und Ufo sind über diese Personalnummer verknüpft. Mein Ziel ist es nun, dass das Ufo bei jeder Personalnummer die gleichen Daten anzeigt, nur eben mit der entsprechenden Personalnummer. Ein weiteres Ziel ist es, dass wenn ein neuer Mitarbeiter angelegt wird, die ganzen bisher vorhandenen Kompetenzen vererbt werden.
Versteht man was gemeint ist? Zur Verdeutlichung hänge ich eine kleine Beispiel-DB an.

LG Pusteblume

Atrus2711
03.05.2011, 14:02
Hi,

versteh ich recht: du hast Personen, deren Fähigkeiten verwaltet werden sollen. Beim Anlegen einer Person soll ein für alle Personen einheitliches "Set" von Fähigkeiten im Ufo angeboten werden, dessen Daten man dann für die Person ausfüllen kann? Ich bin nicth vom Fach, was deine Daten angeht, aber könnte das z.B. sowas sein wie "Körpergröße, Gewicht, Haarfarbe", was dann für jede Person "abgefragt " wird?

Trifft das die Lage?

Pusteblume
03.05.2011, 14:04
Genau das trifft es! Weiß nicht so recht, wie man so etwas aufbaut!?

Atrus2711
03.05.2011, 14:27
Hi,

du brauchst insgesamt 3 Tabellen:

Personen (Tabelle der Köpfe)
Skills (welche Fähigkeiten gibt es überhaupt)
Personenskills. Diese Tabelle nimmt auf, wer was kann.


Beziehungen:

Personen 1:n Personenskills
Skills 1:n Personenskills


Wenn es nun einen "Standardset" von Skills gibt, könntest du diese Skills z.B. mit einem J/N-Feld in der Skillstabelle verwalten. Die Skills mit einem J sind dann die Pflichtskills, die anderen sind "optional".

Beim Anlegen eines neuen Kopfes kann die Person dann die momentanen Pflichtskills abrufen; etwa AfterInsert des Hauptforms:
Currentdb.execute "INSERT INTO PersonenSkills (F_Person_ID, F_Skill_ID) " _
& "SELECT " & Me!txtPersonID, " & Skill_ID " _
& "FROM Skills " _
& "WHERE Standardskill = True", dbFailOnError 'oder gleich: WHERE Standardskill
Me!DeinUfo.Requery


Die fett markierten Namen musst du an deine Verhältnisse anpassen.

Pusteblume
03.05.2011, 14:58
Ah, das ist gut! Bei mir wären aber alles Pflichtskills. Frage: versteh das noch nicht so ganz mit der Tabelle Personenskills.
•Personen (Tabelle der Köpfe) wäre ja bei mir die Tabelle Namen
•Skills (welche Fähigkeiten gibt es überhaupt) wäre die Tabelle Kompetenzen
Mir ist gerade noch ein bisschen schleierhaft wie ich die Tabelle Personenskills aufbauen soll. Ist die am Anfang quasi leer? Oder kann man da eine Tabelle aufbauen, in denen man die Skillstabelle einfach wieder und wieder für jede Personalnummer kopiert?

Atrus2711
03.05.2011, 15:06
Skills (welche Fähigkeiten gibt es überhaupt) wäre die Tabelle Kompetenzen
Nein. Deine Tabelle Kompetenzen entspricht eher den Personenskills, weil bei dir die Skills einer Person da drinstehen. "Meine" Skilltabelle benennt nur, welche Skills es überhaupt (personenübergreifend!) zu verwalten gibt.

Mir ist gerade noch ein bisschen schleierhaft wie ich die Tabelle Personenskills aufbauen soll. Ist die am Anfang quasi leer?
Ja. Sie füllt sich, sobald die erste Fähigkeit der ersten person erfasst wird. Wenn du 5 Leute hast und 3 Skills, und "jeder kann alles", dann hast du da 15 Zeilen drin.

Oder kann man da eine Tabelle aufbauen, in denen man die Skillstabelle einfach wieder und wieder für jede Personalnummer kopiert?
"Kopiert" im Sinne von die Skillnummern für jede Person wiederholen? Ja. Das macht mein angedeuteter Code.

Pusteblume
04.05.2011, 10:48
Hallo Martin,

also hab das jetzt (so glaube ich) aufgebaut wie du es beschrieben hast. Aber irgendwie vererbt sich das Ganze noch nicht richtig. Ich glaube meine Verknüpfungen stimmen nicht!?

LG Pusteblume

Atrus2711
04.05.2011, 10:59
Ich glaube meine Verknüpfungen stimmen nicht!?
In der Tat.

Die Tabellen sollten etwa so aussehen:

Personen (Felder: ID Autowert, Vorname Text, Nachname Text)
Skills (Felder: ID Autowert, Bezeichnung Text)
Personenskills (Felder: ID Autowert, F_Person_ID Zahl (Long Integer), F_Skill_ID Zahl (Long Integer), Level (Long Integer))


Unterstrichen sind die Primärschlüssel. Die Beziehungen sollten sein:

Personen.ID --1:n-- Personenskill.F_Person_ID
Skills.ID --1:n-- Personenskills.F_Skill_ID


Das Feld Level in den Personenskills ist für eine Einstufung der Kenntnisse gedacht, z.B. 1 = Grundkenntnisse bis 10 = Spitzenkönner. Wenn du das nicht brauchst, lass es weg.

Pusteblume
04.05.2011, 12:35
Könnest du mir nochmal weiterhelfen? Irgendwie ist das immer noch nicht richtig.

Personen ist bei mir Namen;
Skills_Basis ist Personenskills
und Skills ist eben Skills.

Was ist falsch daran?

Atrus2711
04.05.2011, 12:43
Die Tabellen Skills und SkillsBasis sind gleich. Das kann wohl nicht stimmen.

Die Skills selbst (= die überhaupt in Rede stehenden Fähigkeiten) dürfen keinerlei Personenbezug haben. Denn diesen Personenbezug regelt die Skillsbasis!

Die Verknüpfung HF zu UF sieht ok aus: ID der Köpfe zu Personalnr der Personenfähigkeiten. Sprechende Feldnamen könnten da aber noch besseren Überblick gewähren.

Feldnamen wie Detail1, -2 und -3 sind übrigens immer ein Holzwegindikator.

Pusteblume
04.05.2011, 13:05
Was mache ich falsch?

Entschuldige, aber ich glaub manchmal ich bin einfach zu doof für Access. Danke, dass du mir hilfst!

Atrus2711
04.05.2011, 13:15
Was mache ich falsch?
Falsche Frage. Richtige Frage: Was erwartest du, und was passiert tatsächlich?

Was mir auffällt:

Ohne Not hast du die Verknüpfung von HF und UF geändert. Jetzt synchrosniert das UF anhand der Skillnr. Das war vorher richtig!
Deine Tabelle SKills ist leer. Damit wird jede Skillnummer abgelehnt als nichtexistent.
Die Skillnummer im UF wäre als Kombifeld komfortabler auszuwählen.
Noch immer sind die Tabellen Skills und SkillsBasis nahezu identisch. Liest du meine Antworten?

Pusteblume
04.05.2011, 13:57
Falsche Frage. Richtige Frage: Was erwartest du, und was passiert tatsächlich?
-> Ziel: im Hfo scrollt man sich einen Namen raus und bekommt im Ufo alle vorhandenen Skills genannt.

•Ohne Not hast du die Verknüpfung von HF und UF geändert. Jetzt synchrosniert das UF anhand der Skillnr. Das war vorher richtig!
-> Jetzt ist es wieder richtig, oder?

•Deine Tabelle SKills ist leer. Damit wird jede Skillnummer abgelehnt als nichtexistent.
-> Was soll ich denn dort hinein schreiben?

•Die Skillnummer im UF wäre als Kombifeld komfortabler auszuwählen.

-> Wie ist das gemeint? Ich möchte im Ufo einfach eine Liste mit allen vorhandenen Skills.

•Noch immer sind die Tabellen Skills und SkillsBasis nahezu identisch. Liest du meine Antworten?
-> Ja, ich lese deine Antworten ;-) Problem ist ja nur, dass hinterher ja auch alle Daten dort stehen sollen. Habs jetzt mal so geändert wie du es geschildert hast.

Atrus2711
04.05.2011, 14:26
Hi,

Jetzt ist es wieder richtig, oder?
Ja.

im Ufo alle vorhandenen Skills genannt
die vorhandenen Skills (= die Aussage: wer kann was) werden ja auch genannt. Die Frage ist, wie sie da hinein kommen (bisher: Ziffer eintippen) und wie festgehalten wird, dass jemand ein Skill nicht hat. Wenn einer ein Skill nicht hat, wäre es wohl unnütz, wenn diese Zeile im Ufo erscheinen würde. Ich kann z.B. kein Atemschutz, kein Sanskrit, kein Chinesisch, keine Erdnüsse, ... Du kannst nur Positiv formulieren: wer kann was.

Was soll ich denn dort hinein schreiben?
Wie eure Skills heißen, wirst du wohl selber am besten wissen... :rolleyes:

Ich möchte im Ufo einfach eine Liste mit allen vorhandenen Skills.
Das Kombi bietet diese Liste an, um die Skills, die einer hat, einzeln einzutragen. Wer 3 (von 14) Skills hat, hat nur 3 Zeilen im Ufo, nicht 14. Für so eine Darstellung (3 von 14) wären andere Wege besser geeignet.

Pusteblume
04.05.2011, 15:09
Alsoooo,

Wenn einer ein Skill nicht hat, wäre es wohl unnütz, wenn diese Zeile im Ufo erscheinen würde.
-> es sollten trotzdem alle vorhandenen Skill erscheinen (Hat er zum Beispiel eine Atemschutzuntersuchung,... gemacht. Wenn nicht kann man dies ja immer noch händisch nachtragen.)

Wie eure Skills heißen, wirst du wohl selber am besten wissen...
-> Aber die Skills stehen doch schon in der Tabelle Skills_Basis. Dies sind Fahrtätigkeit, Atemschutz,... muss ich die alle nochmal extra da eingeben?

Hört sich so an, als hättest du eine Beispiel-DB? :)

Atrus2711
04.05.2011, 15:25
Nein, das ist nicht sinnvoll. Die für die Person noch nicht vorhandenen Skills sind automatisch und immer die Restmenge: die, die er noch nicht hat. Das ist ein Abfrageergebnis. Wenn du die Gesamtliste der Skills um eine Zeile erweiterst und du hast 50 Leute, müsstest du sonst 50 nutzlose Sätze eingeben.

"Hat-er-nicht" ist kein Faktum.

Aber die Skills stehen doch schon in der Tabelle Skills_Basis.
Du verstehst es nicht: Jede Skills-Basis-Zeile sagt aus: wer (Person) kann was (Skill). Das Was ist immer eine der Fähigkeiten, die in der Skills-Tabelle vorhanden sind. Die Was-Werte sind also zwingend auf die Skillnummer der Skills-Tabelle begrenzt. Wenn du 3 Leute und 5 Skills hast, und jeder kann alles, hast du 3*5 = 15 Sätze. Wenn einer der 3 Leute keine der Fähigkeiten hat, dann hast du nur 2*5 = 10 Zeilen, und für den Dritten hast du eben keine Skillbasis-Zeilen.

Dein Wunsch stammt vermutlich aus der Excel-Denke ("Matrix"): Zeilen sind die Köpfe, Spalten sind die Skills, an den kreuzungspunkten stehen Kreuze (o.ä) für "kann er" und nix für "kann er nicht". Diese Matrixdarstellung enthält einige "Nicht-Infos", nämlich die leeren Felder. Die würdest du wohl auch in Excel nicht mit "nein" o.ä. füllen wollen.

Pusteblume
10.05.2011, 09:32
Hast du zufällig eine Beispiel-DB?

Toast78
10.05.2011, 10:02
Du hast anscheinend den Sinn der Skills_Basis-Tabelle noch nicht verstanden. Schmeiß mal den Autowert-Schlüssel aus der Skills_Basis-Tabelle (ein unglücklich gewählter Name!) raus.
Markiere die Zeilen PNr und SkillNr und setze nun dort den Schlüssel.
Beim Anlegen der Daten wird dir auffallen, dass du jetzt nur noch Daten

Edit: Ach ich habs mal eben schnell gemacht

Pusteblume
10.05.2011, 10:08
Irgendwie glaube ich wir verstehen uns falsch!?

In der DB, die du gerade verändert hast, hat Johnny Mauser ja andere Skills als Hans Meier und Ronny Fuchs hat gar keine. Mein Zeil ist es aber, dass bei allen einfach die gleichen Skills stehen mit der entsprechenden Personalnummer. Verstehst Du?

Toast78
10.05.2011, 10:16
Ich habe dich schon verstanden. Nur dein Ansatz ist Martins UND meiner Meinung nach der falsche.
Vor allem, wenn da so viele Detaildaten dranhängen. Vergleichen kann man vor allem die Textfelder nicht anständig miteinander. Vor allem, wenn viele Datensätze leerbleiben, ist es absoluter Humbug diese Daten aus der Stammtabelle zu kopieren. Und was ist, wenn sich die Stammdaten öfters ändern? Willst du dann jedes mal die Skills der anderen Personen wieder auffüllen? Am besten noch leer, weil sie diese Skills nicht erlernt haben?

Toast78
10.05.2011, 10:28
Ansonsten schau dir mal die Mehrfachauswahl von Josef an. Die ist im Prinzip die Visualisierung von dem, was du willst, unter Beibehaltung des gängigen Datenbank-Konzepts. http://access.joposol.com/beispiele/formulare/mehrfachauswahl.html
Thread dazu: http://ms-office-forum.de/forum/showthread.php?t=277369&highlight=mehrfachauswahl

Allerdings halte ich das Beispiel für dich schwer adaptierbar, da du zu viele Detaildaten dranhängen hast.

Atrus2711
10.05.2011, 10:30
Hi,

@Pusteblume:
vermutlich verstehen wir unter der Aussage "Person X hat Skill 1" unterschiedliche Dinge:

Du verstehst da drunter die Möglichkeit, dass Person X Skill 1 haben könnte (Möglichkeit)
Wir verstehen da drunter das Faktum, dass Person X Skill1 hat (Tatsache).


Die Skills, die bei euch überhaupt eine Rolle spielen, sind aber automatisch die Möglichkeiten. Es ist also unnütz, diese Möglichkeiten bei jeder Person einzutragen, wenn diese Person diese Möglichkeit nicht ausfüllt.

Es ist ja möglich, dass jeder alle Skills hat. Aber das ist dann nur eins der vielen denkbaren Szenarien. Manche Person hat vielleicht nicht alle Skills. Und selbst wenn ihr heute nur "vollgeskillte" Leute habt, könnte es sein, dass künftig neue Skills erwünscht sind, die einer vorhandenen Person ja nicht automatisch zuwachsen.

Deine Denke stammt vermutlich aus dem "Matrixansatz":

Person/Skill A B C
Müller X X
Meier X X
Schulze X

Du siehst da vermutlich 9 "Möglichkeiten". Wir sehen da 5 Fakten. Wir haben damit weniger Arbeit :) und wenn sich die Skills mal erweitern, brauchen wir keine zig neue ("leere") Positionen nachzuschleppen.

Dein Ansatz könnte allenfalls sinnvoll sein, wenn die Skills für jeden Mitarbeiter erfasst werden sollen und dabei in einer Kenntnisskala eingstuft werden. Im Beispiel oben hat Müller in B kein Kreuz; das könnte man durchaus als Müller/B/0 ablegen. Wenn Müller sich in B qualifiziert, wird dann sein B-Level steigen. Damit hätte man die 9 Fakten - "Level 0" ist eben ein Faktum; anders als die Aussage "hat-er-nicht".

Pusteblume
10.05.2011, 10:54
Ich versuche es jetzt nochmal aufzubauen. Habe zwei Fragen: In der Skills_Basis hast du 2 Prímärschlüssel. Einmal für die PNr und einmal für die SkillNr. Wie mache ich das?

Zweite Frage: in der Skill_Basis wird die ID auf einmal zur Personalnr. Das ist ja so nicht richtig. Johnny Mauser hat ja z.b. Personalnummer 9759 und im Ufo steht unter PNr dann auf einmal die 6. Wie kann ich das ändern, dass dort immer die Personalnummer für denjenigen Mitarbeiter, sprich 9759 für J. Mauser steht?

Atrus2711
10.05.2011, 11:07
In der Skills_Basis hast du 2 Prímärschlüssel. Einmal für die PNr und einmal für die SkillNr. Wie mache ich das?
Nicht ganz richtig. Das ist ein Primärschlüssel, der aus zwei Feldern besteht. Die Felder der Primärschlüssels kannst du in den "Zeilenköpfen" des Tabellenentwurfs mit gedrückter Strg-Taste markieren und dann das Schlüsselsymbol anklicken.

Zweite Frage:
Das synchronisierende Feld zwischen HF und Ufo kannst du einstellen. Markiere im HF das Ufo-"Rechteck", und stelle in dessen Eigenschaften die Eigenschaften Verknüpfen von und Verknüpfen nach ein; siehe Bild. In der Datenbank geht beides, weil sowohl die Personalnummer als auch die ID der Leute eindetuig ist: die ID als Primärschlüssel und die PNr durch ihren eindeutigen Index. Hier wäre zu überdenken, weclhes Feld man nimmt - in aller Regel den Primärschlüssel.