[Access 2003]
Hallo!
bin Neu hier, habe folgendes Problem:
Ich habe zwei tabellen, verknüpft mit referentieller Integrität, aktualisierungsweitergabe:
Tabelle1.[Nr] ∞ - 1 Tabelle2.[Nr,Primärschl]
Nun will ich aus einem Formular heraus die beiden Tabellen ausfüllen. Dabei sollen alle datensätze aus Tabelle 1 angezeigt werden, aus Tabelle 2 jeweils nur ein zugehöriger Datensatz oder die möglichkeit, einen Datensatz einzugeben, der mit dem aktuell angezeigten Datensatz aus Tabelle 1 über das Feld Nr verknüpft wird.
Kann mir jemand hierzu paar Tips geben?
Hallo,
"will ich aus einem Formular heraus die beiden Tabellen ausfüllen"
Würde ich sein lassen.
"Dabei sollen alle datensätze aus Tabelle 1 angezeigt werden, aus Tabelle 2 jeweils nur ein zugehöriger Datensatz "
Erstelle ein Formular auf Basis von Tabelle1. Für das Fremdschlüsselfeld ("Nr") benutzt Du ein Kombifeld ("Nr") , das sein (Listen-)Daten aus Tabelle2 bezieht:
Datensatzherkunft: Select Nr, FeldX, FeldY from Tabelle2
Spaltenanzahl: 3
Spaltenbreiten: 0cm;4cm;4cm
Steuerelementinhalt: NR (Feld aus Tabelle1)
Im Formular platzierst Du an geeigneter Stelle weitere Textfelder, in denen jeweils die folgenden Ausdrücke im Steuerelementinhalt zu stehen kommen:
=Nr.Column(1)
=Nr.Column(2)
und die dann den zugehörenden Wert aus je der zweiten und dritten Spalte aus der Kombiliste anzeigen.
Um einen neuen DS in Tabelle2 einzugeben, könnte das Ereignis "Bei nicht in Liste" des Kombis benutzt werden, um über dessen Ereignisprozedur ein Eingabeform aufzurufen und dort einen neuen DS einzugeben.
Hallo Alex,
Aufgrund Franz' Anzwort bin ich nicht sicher, ob ich Dich richtig verstanden habe.
Danach
ZitatTabelle1.[Nr] ∞ - 1 Tabelle2.[Nr,Primärschl]
wäre mein Ansatz ein Hauptformular auf Basis von Tabelle 2 mit einem UFo auf Basis von Tabelle1, verknüpft über die Nr (PK in Tabelle 2, FK in Tabelle 1). Da siehst Du im HFo einen Datensatz, und im UFo alle zugehörigen.
Zitatdie möglichkeit, einen Datensatz einzugeben, der mit dem aktuell angezeigten Datensatz aus Tabelle 1 über das Feld Nr verknüpft wird.
Das wird damit allerdings nicht funktionieren, da es keine Datensätze in Tabelle 1 gibt, die nicht mit einem DS aus Tabelle 2 verbunden sind; - jedenfalls nicht bei einer 1:n-Beziehung zwischen T2(1) und T1(n).
Vielleicht schreibst Du mal etwas deutlicher was Du vor hast, damit wir sehen können in welche Richtung es gehen soll.
gruss ekkehard
Hallo!
Den Tipp mit dem Kombifeld habe ich ausprobiert, funktioniert.
Zitat von: DF6GL am November 28, 2011, 14:40:16
Würde ich sein lassen.
Hier werd ich wohl nun ansetzen.
Bei dieser Datenbank hängen alle Datensätze an der Tabelle 1. D. h. es wird noch mehr Tabellen geben. Ziel ist, an ein Datensatz aus Tabelle 1 ducrch das Filtern von Daten der Untertabellen zu kommen, oder nach einer bestimmten Datenkonstallation zu suchen.
Den Hauptformular will ich nun in Form eines Endlosformulares ausgeben. Dieser soll dem Benutzer einen Überblick über die vorhandenen Datensätze der Tabelle 1 mit den zugehörigen Informationen gewähren. Hierzu einige Filter in Form von Komboboxen erstellen. Von hier aus soll die möglichkeit bestehen, Daten in die Tabelle 1 einzupflegen. Dranhängende Datensätze aus anderen Tabellen würde ich dann über ein Unterfolmular, der per ein commandbutton aufgerufen wird, ändern bzw einpflegen.
-Kann man dies mit einer Aktualisierungsabfrage erreichen?
Den button habe ich schon eingefügt und die Formulare über die Nummer verknüpft. Also zeigt er den richtigen Datensatz an. Die Navigationsschaltflächen (unterfolmular) habe ich ausgeblendet, da nur ein Datensatz aus Tabelle 2 an einen Datensatz der Tabelle 1 dranhängt. Jedoch wenn man im Unterformular 'Enter' mehrmals drückt, gelangt man zu der eingabe eines neuen Datensatzes.
- Das würde ich noch unterbinden wollen.
Wenn ein Datensatz aus Tabelle 1 auftaucht, oder erstellt wird, wo noch kein DS aus Tabelle 2 zugeordnet ist, wird ein Syntaxfehler angezeigt, da ja keine Nr. zum zuordnen des Datensatzes vorhanden ist. - Kann man hierzu eine Anweisung zum erstellen eines neuen DS in der Tab2 geben?
Hallo,
spontan denke ich mal, Du beschreitest einen mühsamen und steinigen Weg, der zu einem Abgrund führt..
Mach mal einen Screenshot vom Beziehungsfenster , auf dem alle Tabellen (vollständig) mit ihren Beziehungen zu sehen sind und lad den hier hoch.
Beschreib zusätzlich die grundlegende Aufgabe der DB, bzw. was genau sie eigentlich leisten soll.
An der Formularaufbau-Beschreibung sind die Datenverhältnisse (auf die kommt es in erster Linie an! ) zu undurchsichtig.
Es kommt mir auch schon zuviel auf einmal vor... :)
Die Datenbank und Teile davon an sich kann ich in keiner Form veröfentlichen. Ich könnte ein ähnliches Gerüst zuhause nachbauen und davon ein screenshot machen, erst aber eventuell abends.
Zu der Zielsetzung:
Tabelle 1 beschreibt ein z.B. Projekt, der aus verschiedenen Einzelteilen besteht, die in anderen Tabellen erfasst sind. Projekte und Einzelteile haben eine eindeutige Nummer.
Die Einzelteile aus Tab2 können mehreren Projekten aus Tabelle 1 zugeordnet werden.
Nun ist eine Benutzerschnittstelle nötig (Formular), wo der Benutzer sich den gesamten Projekt anschauen kann.
Wenn einem Projekt noch kein Einzelteil zugeordnet ist, soll Möglichkeit bestehen, durch eingabe der Nummer ein Einzelteil aus Tab2 zuzuordnen oder im Idealfall direkt ein neues Einzelteil in Tab2 anzulegen, verknüpft mit dem aktuell angezeigten DS (Projekt) aus Tabelle 1.
Hallo,
mit einem Hauptformular und darin einem über die Schlüsselfelder verknüpften Unterformular lassen sich alle Deine Wünsche problemlos realisieren.
Zitatoder im Idealfall direkt ein neues Einzelteil in Tab2 anzulegen, verknüpft mit dem aktuell angezeigten DS (Projekt) aus Tabelle 1.
Auch das würde dann ganz automatisch funktionieren. Du brauchst weder Aktualisierungsabfragen, noch VBA Code, das kann Access serienmäßig.
Hallo,
wenn ich
Zitat
"Tabelle 1 beschreibt ein z.B. Projekt, der aus verschiedenen Einzelteilen besteht, die in anderen Tabellen erfasst sind. Projekte und Einzelteile haben eine eindeutige Nummer.
Die Einzelteile aus Tab2 können mehreren Projekten aus Tabelle 1 zugeordnet werden."
lese, dann fehlt hier eine Tabelle, die die Zuordnung der "Einzelteile" zu den Projekten ermöglicht. Der Formularaufbau geschieht dann (wie Klaus beschrieben hat) über ein Hauptformular "frmProjekte" (mit Datenherkunft zur Tabelle1) und einem darin eingebauten UFO-Steuerelement, das ein Endlosform ("frmProjektEinzelteile") mit Datenherkunft zur Tabelle "tblProjektEinzelteile" anzeigt. (Verknüpfung über die entspr. Schlüsselfelder ).
Im Endlosform besteht ein gebundenes Kombi mit Datensatzherkunft zu Tabelle2, das die Auswahl eines Einzelteiles ermöglicht und dessen ID in "tblProjektEinzelteile" abspeichert, sprich dem akt. Projekt zuordnet.
Hallo,
Ja, Franz hat recht. Das habe ich im Eifer des Gefechts übersehen. Das ist eine n:m Beziehuing zwischen den Projekten und den Teilen.
Oder wie sonst hast Du Dir das vorgestellt:
ZitatDie Einzelteile aus Tab2 können mehreren Projekten aus Tabelle 1 zugeordnet werden.
Mit den Einzelteilen ist es so, dass einem Projekt nur ein Einzelteil aus Tabelle2 zugeordnet wird. Dieses Einzelteil kann jedoch auch in andere Projekte einfließen. Also tblProjekte n <-> 1 tblEinzelteil.
Gedacht war es so, dass die eindeutige Nummer vom Einzelteil (PS) in ein entsprechendes Feld des DS im tblProjekte eingetragen wird.
Hallo,
dann mach es halt so, wenn es immer(!) nur ein(!) Einzelteil für ein(!) Projekt gibt. Ob das gleiche Einzelteil auch für andere Projekte benutzt werden kann/soll/darf, spielt hier keine Rolle.
Noch eine Überlegung zum Lösungsansatz:
Hab nun alle relevanten Informationen in einem Formular zum Anzeigen bzw. ändern eingepflegt.
Es wird Verknüpfungsfeld aus tblProjekt angezeigt, so dass bei eingabe einer Nr. ein Datensatz aus Tabelle 2 zugeordnet wird. Soweit ist es auch so gewollt und ist auch das Ziel.
Folgendes fehlt noch zur Vollständigkeit:
Nun versuche ich gerade einen code für das Textfeld hinzubekommen: Wenn für die eingegebe Nr kein Datensatz in der tblEinzelteile existiert, soll ein Formular zum einpflegen eines neun Einzelteils geöffnet werden. Praktischerweise könnte man noch die eben eingegebene Nr in das entsprechende Feld des geöffneten Formulars übergeben.
Wie wäre der code hierfür?
Zurzeit habe ich einen cmd zum Öffnen eines erfassungsformulars für tblEinzelteile, anschließend muss der Benutzer ja nochmal den neuen Datensatz durch eingabe der NR einem Projekt zuordnen...
Hallo,
habe doch anfänglich geschrieben, dass dafür das "Bei nicht in Liste"-Ereignis des Kombis herangezogen werden kann.
Private Sub Kombi1_NotInList(NewData As String, Response As Integer)
DoCmd.OpenForm "frmFormular1", , , , acFormAdd, acDialog, NewData
Response = acDataErrAdded
End Sub
Über den Openargs-Parameter wird der im Kombi eingegebene Wert an das zu öffnende Form übergeben und dort weiterverarbeitet:
Sub Form_Load()
If not isNull(Me.Openargs) Then Me!Nr=Me.Openargs
End Sub
Habe das Kombifeld mit Steuerelementinhalt Nr. aus tabProjekt hinzugefügt, Datenherkunft wie Beschrieben aus tabEinzelteile.
Dazu den 1. codeblock eingepflegt. Nun wenn ich eine in der tabEinzelteile nicht vorhandene Nr eingebe, gibt es den Fehler, dass die Nr nicht eingegeben werden kann, da ein Datensatz aus tabEinzelteile hierzu in beziehung stehen muss.
An dieser stelle soll ja aber ein neues DS in die tabEinzelteile eingegeben werden.
Halo,
wird die Prozedur überhaupt ausgeführt?
"Dazu den 1. codeblock eingepflegt"
was heißt das? Nur Kopieren des Codes in das Formualrmodul genügt nicht, es muss (von Dir) zunächst ein(e) Ereignisprozedur(gerüst) erstellt werden, indem bei der Eigenschaft "Bei nicht in Liste" auf die rechts stehenden 3 Punkte geklickt und weiterhin "Code" gewählt wird, damit in der Eigenschaftenzeile der Name [Ereignisprozedur] erscheint und im VBA-Editor das passende Prozedurgerüst generiert
Sub xxxxxxx_ NotInList (NewData As String, Response As Integer)
End Sub
erzeugt wird.
Zwischen diese Zeilen kann dann der Rest des Code kopiert und bei den Namen angepasst werden
Das habe ich ja alles umgesetzt.
hab nun zuhause das Gerüst nachgebaut. Hab hier Access 2007, hoffe es wird nicht viel unterschied machen.
versuche erstmal nur das andere Formular zu öffnen
Dazu screenshot im anhang
[Anhang gelöscht durch Administrator]
und dazu die datenbank selbst, 2003 kompatibel gespeichert
[Anhang gelöscht durch Administrator]
Hallo,
beide Formulare waren korrumpiert. Das kann aber von der Konvertierung von A2007 nach A2003 herrühren.
Definitive Fehler waren:
--- Bei Docmd.openform muss der Formularname in Gänsefüße eingeschlossen werden.
--- beim Form frmEinzelteil hat die Ereignisprozedur gefehlt.
[Anhang gelöscht durch Administrator]
Die Fehler habe ich auch in meiner 2007er version behoben.
Sowohl in der angehängten als auch in der Korrigierten Datenbank gab es Fehler beim Aufrufen der Formulare.
Screenshot im anhang.
DF6GL, hat die Datenbank bei dir funktioniert?
[Anhang gelöscht durch Administrator]
Hallo,
ja, dieser Fehelr trat auch bei mir auf. Erstell eine neue leere A2007-DB und importiere dort alles aus der alten...
Also das ist zum verzweifeln...
Schon wenn man zum Ereignis nicht in der liste eine Ereignisprozedur ohne code hinzufügt, kommt der o.g. Fehler... :-\
Kann jemand vielleicht eine funktionierende Datenbank mit diesen Funktionen dranhängen?
Habe nun rausgefunden, dass der Fehler aus meinem letzten Beitrag nur dann kommt, wenn bei Kombi die Eigenschaft "Nur Listeneinträge" auf "Ja" gesetzt ist.
Wenn es auf "Nein" gesetzt wird, kommt der Fehler, dass ein DS in der tblEinzelteile vorhanden sein muss, kein Formular wird aufgemacht.
Hallo,
wenn "Nur Listeneinträge" auf nein steht, tritt auch nicht das Ereignis "Bei nicht in Liste" auf und somit wird die Ereignisprozedur nicht angestossen.
Die Fehlermeldung selber kommt von den "kaputten" Formularen. Hast Du den Import in eine neue DB durchgeführt?
Das Importieren in eine neue DB hat nicht geholfen.
Aber ich freue mich zu verkünden, dass ich den Fehler endlich entdeckt habe. ;D
Unter den allgemeinen Deköarationen zum Formular muss der Eintrag option compare database stehen, dann funktioniert es!
Also geht es nun an etwas feintuning, vielleicht melde ich mich ja noch mit 'nem neunen Thema
Vielen Dank an alle beteiligten!!!