Office: Problem mit Formular/Unterformular - Primärschlüssel

Helfe beim Thema Problem mit Formular/Unterformular - Primärschlüssel in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Hallo Leute. Ich habe beizeiten eine Personalverwaltung erstellt, die auch sehr gut funktioniert. Nun wollte ich noch eine Löschfunktion für bereits... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von ellinho, 16. September 2009.

  1. ellinho Erfahrener User

    Problem mit Formular/Unterformular - Primärschlüssel


    Hallo Leute.

    Ich habe beizeiten eine Personalverwaltung erstellt, die auch sehr gut funktioniert. Nun wollte ich noch eine Löschfunktion für bereits erfasste Abwesenheitszeiten integrieren, falls jemand mal seinen Urlaub storniert oder während des Urlaubs krank wird und die Urlaubstage als Krankheitstage behandelt werden müssen.

    Ich möchte das mit einem Formular mit Unterformular lösen.
    Im Formular habe ich ein Kombinationsfeld, das die Namen der Mitarbeiter enthält (aus meiner Tabelle "Mitarbeiter") und noch 3 verknüpfte Textfelder, in denen bei Auswahl aus dem Kombifeld Nachname, Vorname und Personalnummer angezeigt werden.
    Im Unterformular werden bei Auswahl aus dem Kombifeld die bereits erfassten Abwesenheitszeiten angezeigt. So weit so gut. Funktioniert auch.

    Sobald ich aber in eine Zeile im Unterformular klicke, bekomme ich die Meldung wie in Screenshot2 zu sehen. Ich weiß wohl, dass es sich bei der Personalnummer in der Tabelle Mitarbeiter um einen Primärschlüssel handelt. In der Tabelle "Abwesenheit" stehen aber nun einmal mehrere Datensätze pro Personalnummer. Irgendwie hängt das aber wohl zusammen. Wenn ich die Datensatzherkunft für das Kombifeld ändere (z.B. in Tabelle "Abwesenheit") stehen die Mitarbeiter teilweise doppelt und dreifach drin, weil es halt schon mehrere Datensätze ihrer Abwesenheit gibt. Was kann ich tun, um das Kombifeld mit seiner Funktionalität so zu belassen und gleichzeitig die Möglichkeit zu bekommen, einzelne Datensätze zu löschen ?

    Habe zur Verdeutlichung mal 2 Screenshots angehängt.

    Danke schon mal.

    Gruß
    Karsten
     
  2. miriki Erfahrener User
    Ich denke, diese Aussage könnte ein Hinweis sein. Ohne weitere Details läßt sich das aber nicht genau sagen. Aber ich schätze mal, daß das Tabellen-Design etwas krumm ist.

    Das Problem tritt eigentlich fast immer auf, wo man "lebende" Daten und "interne" Daten vermischt. In Deinem Fall: Der Primär-Schlüssel sollte eigentlich ein "internes" Feld sein, das nach außen hin zum User i.a. überhaupt nicht sichtbar ist. Das "lebende" Feld "Personal-Nummer" wiederum sollte nicht für interne Zwecke wie Beziehungen benutzt werden.

    Ein grober Aufbau von 2 in Beziehung stehenden Tabellen wäre:

    Tabelle 1: tbl_Mitarbeiter
    MitarbeiterId: Autowert (Zufall) - primär
    MitarbeiterNummer: Text - eindeutig
    MitarbeiterName: Text
    [...]

    Tabelle 2: tbl_Abwesenheiten
    AbwesenheitId: Autowert (Zufall) - primär
    MitarbeiterRef: Long
    AbwesenheitVon: Datum
    [...]

    Und dann wird die Beziehung von (1)MitarbeiterId auf (n)MitarbeiterRef gebildet. Diese Felder werden aber unter normalen Umständen nirgends auf einem Formular für den Anwender sichtbar auftauchen, sondern werden nur für die interne Verwaltung der Beziehung verwendet.

    Der "Autowert" mit Untertyp "Zufall" war eine der besten Ideen von Microsoft, kam leider nur viel zu spät. Generationen von Anwendern haben bis dahin nämlich schon den Autowert als "praktischen Zähler" benutzt und für "lebende" Zwecke mitbenutzt - und sind entsprechend oft damit auf die Nase gefallen... ;-) Die Benutzung des Zufalls-Wertes für den Primärschlüssel führt einen eigentlich gar nicht mehr in Versuchung, diesen Wert für nicht-interne Zwecke zu benutzen.

    Gruß, Michael
     
  3. ellinho Erfahrener User
    @Michael

    Danke für Deine prompte Einschätzung. Ich denke auch, dass es an meiner fälschlichen Verwendung der Personalnummer als Primärschlüssel in der tblMitarbeiter liegt. Aber was mache ich denn nun ? Wenn ich das Feld ID in der tblMitarbeiter mit AutoWert anlege und als Primärschlüssel einsetze, überschreibt mir Access in der Löschmaske der Abwesenheitszeiten permanent die Personalnummern oder löscht ganze Datensätze aus der tblMitarbeiter, statt einen Datensatz aus der tblAbwesenheit zu löschen.
    Oder anders gefragt : Kann ich die Löschfunktion auf einem anderen Wege realisieren ? Der User soll sich, wie gesagt, über ein Kombifeld den betreffenden Mitarbeiter auswählen können und daraufhin die Abwesenheitszeiten angezeigt bekommen, die er dann editieren bzw. löschen kann. Beigefügt noch der Aufbau der Tabellen.

    Gruß, Karsten
     
  4. miriki Erfahrener User

    Problem mit Formular/Unterformular - Primärschlüssel

    Das hört sich nach Nebeneffekten von

    a) Realisierung des Drop-Down zur Auswahl des Mitarbeiters --> wird nur das Feld "MitarbeiterId" durch das gebundene Drop-Down aktualisiert, oder wird (aufwendig, z.B. per VBA) der Datensatz passend zur ausgewählten MitarbeiterId des (ungebundenen) Drop-Down gesucht und als aktiver Datensatz angezeigt? Wenn Ersteres, dann ist die Änderung der MitarbeiterRef im Unterformular ganz logisch --> Aktualisierungsweitergabe der 1:n Beziehung

    b) Realisierung der 1:n Beziehung, Untertyp 1, 2 oder 3 --> werden Datensätze des "Master" (Mitarbeiter) überhaupt angezeigt, wenn es keine Datensätze in "Detail" (Abwesenheiten) gibt? Vielleicht sind die gar nicht gelöscht, sondern werden einfach nur nicht angezeigt?

    Hmmm... Gute Frage... Also wenn Du auf AutoZufall-Primärschlüssel umstellen möchtest, dann in mehreren, vorsichtigen ;-) Schritten...

    Ich würde neue Tabellen erstellen, die gleich die passende Struktur haben, insbesondere eben das zufällige Erst-Auto. ;-) Dann kannst Du darüber die Beziehungen aufbauen. Und zu guter Letzt kannst Du dann über Anfüge-Abfragen die Daten aus den bisherigen in die neuen Tabellen übernehmen.

    Je nachdem, wieviele Daten bereits in der "Abwesenheiten"-Tabelle sind, ist es eine blöde, stupide Fleißarbeit, die Daten daraus zu übernehmen. Denn da muß ja die jeweilige MitarbeiterId aus der "Mitarbeiter"-Tabelle herausgesucht werden, die dann mit in die neue "Abwesenheiten"-Tabelle als MitarbeiterRef eingetragen wird.

    Was vielleicht etwas aufwändiger sein dürfte: Das Anpassen der bisherigen Formulare... Es könnte sein, daß ein Neuaufbau der Formulare schneller geht, als in Fisselarbeit die bestehenden umzubauen und dabei vielleicht noch irgendeine Kleinigkeit zu übersehen. Ich denke aber, die "normalen" Formulare sind schnell angepaßt. Ein Neuaufbau ist vielleicht nur bei dem Haupt-/Unter-Formular sinnvoll.

    Gruß, Michael
     
  5. ellinho Erfahrener User
    @Michael

    Hört sich ganz schön kompliziert an. Bin allerdings Neuling und will mir die Datenbank, in der schon Echtzeitdaten drin sind, nicht verwüsten.

    Von daher habe ich in der tblMitarbeiter die Personalnummer als Primärschlüssel gelassen. (Denke, das ist auch wichtig, da es auch keine doppelten Personalnummern geben soll und alle Berechnungen anhand der Personalnummer stattfinden).

    Desweiteren habe ich das Formular mit dem UFO, aus dem die Datensätze gelöscht bzw. in dem sie editiert werden sollen, neu erstellt.

    Im Prinzip würde es auch funktionieren, wenn ich mich durch die Datensätze durchklicke. Sobald ich jedoch ein Kombifeld zur Auswahl des Mitarbeiters einfüge (finde ich für den Benutzer schöner und praktischer),
    werden mir Werte in der tblAbwesenheit überschrieben, die nicht geändert werden dürfen : z.B. wird einer ID eine andere Personalnummer zugeordnet. Das soll natürlich nicht sein.
    Der User soll hier nur die Möglichkeit bekommen, über ein Kombifeld den Mitarbeiter auszuwählen und im Unterformular einzelne Datensätze der Abwesenheitszeiten ändern bzw. löschen können.
    Im Kombifeld sollte aber jeder Name nur einmal auftauchen, auch wenn mehrere Datensätze in der tblAbwesenheit für den Mitarbeiter hinterlegt sind.
    Eigentlich ist das doch eine gar nicht so komplizierte Anforderung, oder ?

    Na ja. Ich hoffe auf eine Blitzidee von Euch. Vielleicht kommt sie mir ja auch selbst im Laufe des Tages.

    Danke.

    Gruß, Karsten
     
  6. miriki Erfahrener User
    Das hört sich für mich so an, als wenn Du ca. folgendes gemacht hast:

    Du hast ein Formular mit den einzelnen Datenfeldern, die auf der Tabelle "Mitarbeiter" basieren.

    Dann hast Du ein Unterformular mit den Datenfeldern aus "Abwesenheiten" darin eingebettet.

    Und weil es bequemer sein soll, hast Du ein Dropdown in das Haupt-Formular eingefügt, das auf der Tabelle "Mitarbeiter" basiert und z.B. ID und Name anzeigt bzw. auswählen läßt.

    Tja... Damit hast Du noch lange nicht die Möglichkeit geschaffen, einen Datensatz auszuwählen! Du hast nur eine andere Möglichkeit geschaffen, die z.B. Personalnummer (oder auf welches Datenfeld auch immer das Dropdown "gebunden" ist) des aktuellen Datensatzes zu ändern! Und durch die Aktualisierungs-Weitergabe der Tabellen-Beziehung ändert sich auch die Personalnummer im Unterformular.

    Eine Navigation per Dropdown benötigt da schon "etwas mehr"... ;-) Aber vielleicht möchtest Du mal bei Karl Donaubauer in die Access-FAQ, insbesondere den Punkt 4.4, schauen.

    Gruß, Michael
     
  7. ellinho Erfahrener User
    @ Michael

    Das Dropdown-Element bezieht sich nun nicht mehr auf die tblMitarbeiter. Das habe ich geändert und seitdem auch keine Last mehr mit dem Primärschlüssel.
    Es hat als Datensatzherkunft eine Abfrage aus der tblAbwesenheit, die so filtert, dass kein Mitarbeiter DOPPELT in der Auswahlliste steht, da ja in der tblAbwesenheit zu jeder Personalnummer mehrere Einträge möglich sind.

    Das Unterformular hat als Datensatzherkunft eine ähnliche Abfrage aus der tblAbwesenheit, in der die Detailangaben stehen (also für jeden Mitarbeiter auch mehrere Datensätze).

    Nun will ich quasi die Auswahl im Kombifeld im Hauptformular mit den Detailangaben im Unterformular über die Personalnummer verknüpfen, die ja zum einen mit im Kombifeld steht, zum anderen ein Teil der Detailanzeige im Unterformular ist.

    Habe in die FAQ von Donkarl geschaut. Hilft mir nur nicht weiter, da ich ja zum einen über ein Kombifeld suche und zum anderen nicht nur einen Datensatz suche, sondern mehrere, die gleichzeitig angezeigt werden sollen.

    Ich gebs nicht auf und probiere weiter.

    Danke trotzdem.

    Gruß, Karsten


    OK. Habe gerade noch mal was Neues probiert.
    Nun wähle ich aus dem Kombifeld den Mitarbeiter aus und die Werte werden im UFO angezeigt und ich kann sie auch ändern bzw. löschen.
    Schliesse ich das Formular und schaue in die tblAbwesenheit, wurde der Personalnummer, von der ich einen Abwesenheits-Datensatz gelöscht habe, ein Abwesenheitsdatensatz eines anderen Mitarbeiters zugeordnet.
    Ich werde noch wahnsinnig. Das schlimme ist, ich weiß überhaupt nicht, warum das passiert. Irgendwo in den Eigenschaften eines Steuerelements ein winziger Eintrag, der noch geändert werden muss ???
    Ansonsten funktioniert es so, wie ich mir das vorgestellt habe.

    Gruß
    Karsten
     
  8. miriki Erfahrener User

    Problem mit Formular/Unterformular - Primärschlüssel

    Ähm, nein, kleines Verständnisproblem:

    Du suchst nicht mehrere Datensätze! Du suchst nur genau einen, nämlich den des Mitarbeiters. Der soll dann im Hauptformular angezeigt werden. Die Kombination mit dem Ufo sorgt dann schon dafür, daß dort die "mehreren" Datensätze passend zum Mitarbeiter angezeigt werden.

    Und ob Du die Suche über ein Eingabefeld, ein Listenfeld oder ein Dropdown machst, ist eigentlich ziemlich egal. Das sind nur fallweise kleinere Anpassungen. Nur Buschtrommeln und Morsecode würden etwas aufwendiger sein. ;-)

    Gruß, Michael
     
  9. ellinho Erfahrener User
    @Michael

    Habe gerade im Beitrag über Deinem letzten Beitrag geschrieben...

    Ich werde mir die FAQ von Donkarl noch einmal in Ruhe ansehen..

    Danke.

    Gruß
    Karsten
     
  10. ellinho Erfahrener User
    @Michael

    Ok. Habe gerade noch einmal in Ruhe die FAQ durchgelesen und mal ein Textfeld in das Hauptformular eingefügt (wie beschrieben) und es funktioniert. Das einzige, was ich noch habe : Ich markiere zwar z.B. den mittleren von 3 Datensätzen und betätige meine Schaltfläche "Datensatz löschen" - Access löscht aber grundsätzlich immer den ersten Datensatz in der Liste. Was muss ich da noch tun, damit nur markierte Datensätze gelöscht werden. Zweite Frage : Ist es ne große Sache, aus dem Suchtextfeld ein Kombifeld zu machen ?

    Gruß
    Karsten
     
  11. miriki Erfahrener User
    Dazu müßte man erstmal genau wissen, wie der "Löschen"-Button definiert ist. Zuerst einmal:

    "Löschen" würde den Datensatz löschen, der im aktuellen Formular angezeigt wird, wobei "aktuell" sich auf das Formular bezieht, auf dem sich der Button befindet. Das ist wichtig!

    Denn wenn sich der Button auf dem Haupt-Formular befindet, wird nicht ein Datensatz der Abwesenheiten gelöscht, sondern einer der Mitarbeiter! Die Lösch-Weitergabe würde dann nebenbei auch noch dafür sorgen, daß die Abwesenheiten dieses (ehemaligen...) Mitarbeiters gleich mit in die Tonne gehen.

    Also muß das Löschen innerhalb des Unterformulars geschehen... Du benutzt, soweit ich das gesehen habe, im Unterformular die "Datenblatt"-Ansicht. Die ist für reine Listen-Darstellung sicher ok, aber ich mag sie für Bearbeitungs-Zwecke nicht mehr. Stell das doch bitte mal probehalber auf "Endlos-Formular" um. Selbst in dem Modus kann man die Eingabefelder so anordnen und formatieren, daß es dem "Datenblatt" sehr ähnlich wird. Setzt jetzt mal mit dem Assistenten einen Löschen-Button in den Detail-Bereich und probier es dann aus.

    Du wirst sehen, daß Du in jeder Zeile des Unterformulars dann einen Löschen-Buttons hast. Wenn Du den "Datensatzmarkierer" nicht ausgeschaltet hast, dann achte mal auf den, wenn du einen Datensatz (nicht den 1. in der Liste) löscht. Der wird wahrscheinlich auf dem 1. Datensatz stehen und direkt beim Klicken auf den Löschen-Button auf die Zeile wechseln, in der der gedrückte Button steht. Dann sollte auch der korrekte Datensatz gelöscht werden.

    Normal nicht... Die Technik ist ja immer die gleiche:
    - Aus dem Pool der gesamten Daten (einer Spalte) wird ein Wert ausgewählt, durch Eingabe in ein Feld oder Anklicken in einem entsprechenden Steuerelement (Dropdown, Listbox, ...)
    - Nach diesem Wert wird dann in den Datensätzen gesucht und das Lesezeichen auf den "Treffer" gesetzt, womit der Datensatz zum aktuellen, angezeigten Datensatz wird.
    - durch die Relationen zwischen den Tabellen werden die Daten in den Unterformularen automatisch mit auf den aktuellsten Stand gebracht.

    Die Frage ist also letztendlich nur, welches Feld man zur Suche benutzen möchte und wie man es eingibt bzw. auswählt. Die Wahl der Stunde würde auf den ersten Blick vielleicht auf den Primärschlüssel fallen. Mit der Umstellung auf einen Zufallswert, der nur noch intern genutzt werden soll, gestaltet sich das aber mittelschwer kompliziert. Es bleibt alternativ nur ein nach außen hin sichtbares Feld, daß eindeutig ist. Ok, hier wäre also z.B. die Mitarbeiternummer dann in der Ziehung.

    In ein normales Editierfeld kannst Du ja jeden beliebigen Wert eingeben, ob er als Treffer auftaucht oder nicht. Für die Suche wird dann "me!edit1.value" benutzt.

    Ein Dropdown soll aber mit Werten gefüllt werden, die in der Datenbank vorhanden sind. Auch dann wird "me!combobox1.value" zur Suche benutzt. Nur das Füllen des Dropdown... Kleiner Exkurs in SQL:

    Mit der so ziemlich einfachsten Form
    SELECT * FROM tbl_tabelle;
    werden alle Datensätze (komplett, also alle Spalten) einer Tabelle ausgewählt. Benötigt man nur eine Spalte, verfeinert sich das auf
    SELECT fld_feld FROM tbl_tabelle;.
    Ist das ausgewählte Feld eindeutig, dann war's das schon. Können dort Werte mehrfach auftreten, dann wirft man die Dubletten raus mit
    SELECT DISTINCT fld_feld FROM tbl_tabelle;

    Damit hätten wir die Datenquelle Deines Dropdown: "SELECT fld_mitarbeiternummer FROM tbl_mitarbeiter;". Wenn Du das Dropdown über den Assistenten einsetzt, erzeugt der prinzipiell die gleiche Datenquelle, nur in der ausführlicheren (und unübersichlicheren) Form mit jeder Menge [ und ] und Tabellennamen vor jedem Feld usw.

    Und jetzt hast Du ein Eingabefeld, daß Auto-Vervollständigen kennt und Auswahl per Liste ermöglicht, sich aber ansonsten wie ein normales Eingabefeld behandeln läßt.

    Gruß, Michael
     
Thema:

Problem mit Formular/Unterformular - Primärschlüssel

Die Seite wird geladen...
  1. Problem mit Formular/Unterformular - Primärschlüssel - Similar Threads - Problem Formular Unterformular

  2. Problem beim Schliessen eines Formulares

    in Microsoft Access Hilfe
    Problem beim Schliessen eines Formulares: Guten Morgen zusammen, ich habe ein Formular [Formular1] mit einem eingebetteten Formular [frm_Stammdaten_2] mit Unterformular [ufo_Aenderungen]. Ich möchte, wenn ich den Button "Formular...
  3. Bericht mit Datumsfilter über Formular erstellen PROBLEM

    in Microsoft Access Hilfe
    Bericht mit Datumsfilter über Formular erstellen PROBLEM: Hallo Leute, ich habe eine Datenbank aus welcher ich gerne bestimmte Datensetze aus einem bestimmten Zeitraum in ein Bericht frucken möchte. dafür habe ich zwei Textefelder auf dem Formular...
  4. Problem mit Autovervollständigen im Formular

    in Microsoft Access Hilfe
    Problem mit Autovervollständigen im Formular: Hallo, wäre für Hilfe dankbar. Ich habe eine Datenbank folgender Struktur: -Tabelle"Sprecher" mit Namen von Synchronsprechern -Tabelle "Schauspieler" mit Namen von Schauspielern -Tabelle "Film"...
  5. Projektmanagement - Problem mit den Formularen

    in Microsoft Access Hilfe
    Projektmanagement - Problem mit den Formularen: Hallo zusammen, ich arbeite gerade für ein Unternehmen und wurde damit beauftragt, eine Projektmanagement-Datenbank mit access 2003 zu erstellen. Grundsätzlich sollte die Datenbank...
  6. Word Formular - Problem mit Textfeldern

    in Microsoft Word Hilfe
    Word Formular - Problem mit Textfeldern: Guten Tag Ich hab mich schon ziemlich lange mit Dr. Google unterhalten und leider keine schlüssige Antwort erhalten. Ich erlaube mir deshalb, mich an dieses Forum zu wenden. Problem: Ich...
  7. Excel Formular Problem

    in Microsoft Excel Hilfe
    Excel Formular Problem: Hallo! Ich habe gerade ein Excel-Problem... Ich muss ein Wertpapieranalyseprogramm machen und habe da Formulare erstellt, wo man unten dann auf verkaufen und Abbrechen klicken kann. Klickt...
  8. Problem bei Abfragen mit Formularen Deutsch Englischversion

    in Microsoft Access Hilfe
    Problem bei Abfragen mit Formularen Deutsch Englischversion: Hallo ich habe folgendes Problem. Also ich habe eine Englische Version 2003 Office auf meinem Computer. Dort habe ich eine Datenbank mit Access erstellt und sie funktioniert problemlos auf...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden