Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Aus Formular heraus mehrere zusammenhängende Tabellen ausfüllen

Begonnen von _Alex, November 28, 2011, 14:28:24

⏪ vorheriges - nächstes ⏩

_Alex

[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?

DF6GL

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.

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

_Alex

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?

DF6GL

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.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

_Alex

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.

MzKlMu

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.
Gruß Klaus

DF6GL

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.


Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

MzKlMu

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.
Gruß Klaus

_Alex

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.

DF6GL

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.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

_Alex

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

DF6GL

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
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

_Alex

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.

DF6GL

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
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access