Hallo,
ich lerne mich gerade ein in Access und habe es durch Recherche schon geschafft ein Listenfeld an eine Tabelle zu binden. Dies geschieht über Spalte ID.
Ich kann auch die Textfelder füllen über die Auswahl am Listenfeld, welche auch mit der Tabelle verknüpft sind.
Aber immer wenn ich Daten bei den Textfeldern ändere, wird immer der erste Datensatz überschrieben.
Ich möchte natürlich, dass der ausgewählte Datensatz überschrieben wird.
Was muss ich dafür tun?
Hiermit fülle ich die Textfelder anhand der Auswahl im Listenfeld:
Private Sub Liste01_AfterUpdate()
Me.txt_MaschinenNr = Me!Liste01.Column(1)
Me.txt_Hersteller = Me!Liste01.Column(2)
Me.txt_Typ = Me!Liste01.Column(3)
Me.txt_Schneckendurchmesser = Me!Liste01.Column(4)
End Sub
Mir werden die richtigen Daten angezeigt, aber ich ändere wie gesagt immer nur den ersten Datensatz und nicht den gewählten.
Kann mir bitte jemand erklären, wie ich den ausgewählten Datensatz ändere?
Danke.
Hallo,
der gezeigte Code positioniert ja nicht auf den gewünschten Datensatz.
Wobei mir das Vorhaben eher überflüssig erscheint. Im Regelfall wird in abhängigen Tabellen nur die ID der Listenfeldtabelle geschrieben, sonst keine weiteren Felder.
Kannst Du mal ein Bild des Beziehungsfensters zeigen?
Wobei ich hoffe, dass Du inzwischen Beziehungen angelegt hast. Beziehungen sind unerlässlich.
Ohne Beziehungen > keine funktionierende Datenbank.
Zitatich lerne mich gerade ein in Access
Du solltest aufpassen, dass Du von vorn herein nichts falsches lernst.
Hi,
ich fange jetzt quasi von Vorne an und wollte mit der Erstellung einer einfachen Tabelle/Liste anfangen.
Das Beziehungsfenster ist leer, ich dachte wenn ich das hier mache ist das eine Beziehung, aber ich habe mich dann wohl getäuscht:
1.PNG
Edit: Hier noch ein Bild vom Formular (möchte keine unbeabsichtigten Eingaben, daher muss ich es wohl über Buttons regeln. Das funktioniert scheinbar bereits. Manche sind noch nicht belegt:
2.PNG
Ich lasse jetzt mal alles andere außen vor. Ich habe nur die Tabelle mit den Maschinendaten und dieses Formular.
Das Listenfeld hat folgende Datensatzherkunft (da dachte ich, das wäre mit Verbindung gemeint, aber es steht dort ungebunden):
SELECT tbl_Maschinen.ID, tbl_Maschinen.MaschinenNr, tbl_Maschinen.Hersteller, tbl_Maschinen.Typ, tbl_Maschinen.Schneckendurchmesser, tbl_Maschinen.Aktiv FROM tbl_Maschinen ORDER BY tbl_Maschinen.[MaschinenNr];
Ich habe nicht die Möglichkeit über Verbindungen eine Tabelle und ein Formular auszuwählen.
Hallo,
ein Listenfeld ist hier fehl am Platz. Verwende ein Endlosformular.
Außerdem ist für den typ, den Hersteller und den Schneckendurchmesser jeweils eine Tabelle erforderlich. Jede Tabelle benötigt einen Primärschlüssel. Die Beziehungen erfolgen dann über Fremdschlüssselfelder.
Du solltest Dich dringend mit den Grundlagen beschäftigen.
Siehe Links in #8 Deines anderen Themas.
Ok, danke.
Das ist eine ganze Menge Arbeit das alles über einzelne Tabellen zu machen. Wo soll da der Überblick bleiben, bei 1000 Tabellen, die ich später hätte?
Ich habe ja auch Abfragen aus der Datenbank, die gehören dann schon zusammen, muss ich die auch in einzelne Tabellen absplitten?
Ich verstehe die Links nicht, da diese nicht schlüssig erklärt sind und Google hilft im Gegensatz zu VBA, leider nicht weiter.
Dennoch werde ich die Tabellen jetzt einzeln anlegen, verstehe dann aber nicht, wie ich die Daten wieder zusammenführen soll.
Was ich dennoch nicht verstehe: Wieso wird nicht der Datensatz geändert, den ich im Listenfeld auswähle, sondern immer nur der erste?
Hallo,
wie kommst Du hier auf 1000 Tabellen ?
Du musst nur die Daten in TAbellen auslagern die sich wiederholen. Es ist doch sicher besser, den Hersteller aus einem Kombifeld auszuwählen als diesen jedes mal zu schreiben.
Zitat... muss ich die auch in einzelne Tabellen absplitten?
Nein. Abfrage beruhen ausschließlich auf den vorhanden Tabellen.
ZitatIch verstehe die Links nicht, da diese nicht schlüssig erklärt sind
Besonders das Tutorial ist sehr schlüssig erklärt und gerades für Anfänger sehr hilfreich.
Zitatverstehe dann aber nicht, wie ich die Daten wieder zusammenführen soll.
Die Daten werden über die Beziehungen mit Hilfe von Abfragen wieder zusammenhängend dargestellt.
ZitatWieso wird nicht der Datensatz geändert, den ich im Listenfeld auswähle, sondern immer nur der erste?
Das kann ich Dir nicht sagen, da ich nicht erkennen kann wie Du das machst. Auch ist mir das Listenfeld zum Ändern nicht kalr.
Zeigt das Listenfeld nicht die Vorhanden Maschinen an ?
Lade die DB (mit anonymen Daten) mal hier hoch. Als Zipfile. Vorher Reparieren/Komprimiern (Access Dienstprogramm/Tools).
Sorry, ich versuche es ja...
So habe ich nun die Tabellen gesplittet angelegt und über eine Abfrage die entsprechenden Verknüpfungen erzeugt. Habe ich das so richtig verstanden?
1.PNG
2.PNG
3.PNG
4.PNG
Also genau so war es gedacht: Das Listenfeld soll eine Übersicht der vorhandenen Maschinen geben.
Wenn ich einmal weiß wie ich so ein vermeintlich einfaches Formular funktional bekomme, dann ist das schon was.
Über das Formular lese ich die Daten in die Textfelder ein. und darüber möchte ich entweder den Datensatz ändern oder einen neuen Datensatz anlegen (wenn neue Maschinen kommen z.B.).
Gleichzeitig soll aber auch nicht versehentlich ein Datensatz geändert werden, weshalb ich Buttons verwenden möchte. Man sieht ja nicht, wenn ein Datensatz überschrieben wird, das passiert ja immer.
Ich versuche erstmal das Formular wieder anzupassen, damit ich die Datenbank hochladen kann...
Hallo,
nein, das ist falsch. Als Schlüsselfelder müssen die ID's genutzt werden, dazu sind diese da.
In die untergeordneten Tabellen muss dann ein extra Feld als Fremdschlüssel.
Du hast auch keine Tabelle für die Daten des Herstellers.
Das ist in dem Tutorial sehr ausführlich beschrieben. Ich kann nur immer wieder darauf verweisen, denn Du hast es immer noch nicht verstanden.
Im Anhang ein Bild von Beziehungen aus dem Tutorial, siehst Du den Unterschied ?
Da brauchst Du auch nichts anzupassen. Lade die DB einfach mal hier hoch.
Um zu verhindern, dass ein DS versehentlich geändert wird, wird das Formular gesperrt und nur bei Bedarf entsperrt.
Du hast recht. Ich verstehe das nicht, das Tutorial.
Jedenfalls nur bedingt. Was ich gezeigt habe war keine Beziehung, sondern ich habe es als Abfrage generiert. Die fehlende Tabelle hatte ich inzwischen gemerkt.
Also Abfrage raus und Beziehungen erstellen. Da ich inzwischen alles über den Haufen geworfen habe, schicke ich die Datenbank, wenn ich soweit ich es verstehe umgesetzt habe.
Danke für die Geduld.
Hallo,
ich habe nun die Beziehungen glaube ich hinbekommen.
Dann habe ich eine Abfrage erstellt und diese mit dem Formular verbunden.
Das Listenfeld habe ich nun wieder drin, da ich es ganz gut fände, wenn man darüber bereits eine Schnellauswahl machen könnte.
Allerdings ändern sich jetzt nicht mehr die Textfelder anhand der Auswahl.
Datenbank anbei (es geht nur um frm_Maschinenpark und qry_Maschinenpark bzw. die damit verknüpften Tabellen).
Hallo,
Du musst mit dem Listenfeld den Datensatz des Listenfeldes im Formular suchen und anzeigen.
Das macht man mit FindFirst über das Formaularrecordset. Die Suche erfolgt über IDMaschine nicht über die MaschNr. Das ist auch der Sinn einer ID.
Die Spalten des Listenfeldes sind entsprechend einzustellen. 5 Spalten (nicht 4) und in der 1.Spalte die IDMaschine. Diese wird mit Spaltenbreite 0cm ausgeblendet. Die ID muss man nicht kennen, das läuft im Hintergrund.
Mit FindFirst wird das Formular auf den in der Liste angezeigten Datensatz positioniert. Wenn Du unten mit dem Pfeil durch die Datensätze blätterst folgt die Liste automatisch dem angezeigten Datensatz. Das wird im Ereignis "Beim Anzeigen" realisiert. Übrigens, solche Dinge wie Column(x) braucht man in einer Datenbank eher nicht.
Geänderte DB anbei.
Weitere Anmerkungen (ohne Anspruch auf Vollständigkeit):
- Der Speichern Button ist so ziemlich sinnfrei, denn ein Datensatzwechel oder Schließen des Formulars/Datenbank speichert den Datensatz trotz Deiner Überprüfung. Die Validierung der Daten legt man in das Formularereignis "Vor Aktualisierung" und bricht bei unvollständigen Datensätzen das Aktualisieren mit Cancel=True einfach ab. Der Speichern Button ist dann überflüssig.
- Du verwendest an unsinnigen Stellen Fließkommazahlen (Double)
- Entferne die Sonderzeichen (-) und Leerzeichen in den Feldnamen
In der Tabelle "tbl_Liste" gibt es noch jede Menge Kandidaten für extra Tabellen. Z.B.
- Kunde
- MeldungAn
- ErstelltDurch
- ausgeführt durch
- Prozessverantwortlich
- Entscheider
- ZuletztBearbeitet
In die Liste gehört auch die IDMaschine und nicht die Maschinennr.
Alle Namen können ggf. in einer Tabelle zusammengefasst werden.
Ohne Tabellen läufst Du Gefahr, dass Du Wildwuchs bekommst. Z.B. der eine schreibt beim Kunden Schmitt und der andere Schmidt und schon hast Du 2 Namen für den gleichen Kunden. Wenn man Namen per Kombi wählen kann, sind Flüchtigkeitsfehler und Tippfehler so gut wie ausgeschlossen.
Guten Morgen,
erstmal danke für die ausführliche Erklärung.
Ich hatte gestern noch gemerkt, dass einige Fehler drin sind, da war es schon zu spät und ich hatte auch keine Zeit mehr.
Die Anzeige für die Maschinen-ID welche Du eingebunden hast, ist zur Visualisierung wie ich es verstehe und brauche ich nicht für die Funktion, oder?
Edit: Sieht doch so aus... Ich kann da aber keine Zahl eingeben und das Feld ist nicht gesperrt. Hat das mit der Funktion zu tun?
1.PNG
Diese Columns Geschichte hatte ich gegoogelt, war aber auch nicht so wie erhofft.
Ich möchte bewusst sicherstellen, dass Änderungen in der Datenbank nur aktiv vorgenommen werden können.
Sonst bekommt man das nicht mit und man hat schon was eingetragen. Deshalb dachte ich an den Speichern-Button. Sehe dass es kompliziert ist, aber mir fällt keine andere Lösung ein.
Auch beim Schließen des Formulars bzw. der Datenbank, sollen Änderungen, die nicht aktiv gespeichert wurden, zurückgenommen werden, bevor geschlossen wird.
Ob sich das umsetzen lässt?
Die tbl_Liste sollte eigentlich raus... Vergessen.
PS:
Die Verknüpfung vom Listenfeld zu IDMaschine, muss diese per VBA realisiert werden? Also geht das nicht als Steuerelement oder so? Frage nur um es zu verstehen.
Private Sub Form_Current()
Me.Liste01 = Me.IDMaschine
End Sub
Hallo,
Zitat von: undefinedDie Anzeige für die Maschinen-ID welche Du eingebunden hast, ist zur Visualisierung wie ich es verstehe und brauche ich nicht für die Funktion, oder?
Nein, das Feld dient nicht der Visualisierung, das wird in der Funktion zwingend benötigt. Schaue Dir die Funktion an, da wird darauf verwiesen (=Me.IDMaschine) Im Formular kannst Du das auf unsichtbar stellen, darf aber nicht gelöscht werden.
Zitat von: undefinedDie Verknüpfung vom Listenfeld zu IDMaschine, muss diese per VBA realisiert werden?
Das geht nur per VBA.
Im Anhang noch eine mögliche Lösung für das bewusste Speichern eines neuen/geänderten Datensatzes. Auch eine Datenvalidierung ist da eingebaut. Es ist nicht möglich die DB zu verlassen ohne den button "Beenden".
Hi, danke.
Ich habe bereits eine Lösung eingebaut und auf den Button verzichtet.
Nach meinen ersten Tests lief das auch.
Ich habe nun ein Problem mit den Textfeldern.
Ich denke, diese müssen durch Kombinationsfelder ersetzt werden, wenn ich z. B. eine neue Maschine anlegen möchte, dann kann ich das auswählen was bereits vorhanden ist und müsste nur Text schreiben, wenn es eine komplette Neuanlage ist.
Dennoch würde es mir helfen, wie ich das hinbekomme, dass nur Werte im ausgewählten Datensatz geändert werden. Wenn ich jetzt den Maschinentyp ändere, dann macht er das ja für alle Einträge mit gleichem Inhalt.
Demnach habe ich also vermutlich einen Denkfehler bei den Beziehungen.
Beispiel: Maschine 1 ist ein neuer Typ, dann ändert sich aber auch Maschine 10.
Ist es dann nicht so, dass ich IDMNR als Bezug nehmen müsste?
Das bekomme ich jetzt nämlich nicht mehr hin.
Edit:
Zwar konnte ich auf die ID für Maschinennummer ändern.
Nur kann ich nicht einen einzelnen Datensatz ändern, ich ändere weiterhin alle Maschinentypen, wenn sie gleich sind.
Dokument ausgetauscht.
Hallo,
wieso musst Du da Daten ändern in der Maschinentabelle ?
Ich dachte, die Maschinentabelle ist die Stammdatentabelle der Maschine, die nie geändert wird, es kommt höchstens eine neue Maschine dazu. Ein Maschine hat einen Typ, der ändert sich doch niemals. Der Typ Deines Autos ändert sich ja auch nicht, so lange Du dieses Auto benutzt.
Ich glaube auch, es war ein Fehler die Tabelle tbl_Liste zu löschen. Wo willst Du die dort enthalten Infos speichern ?
Zitat von: undefinedIst es dann nicht so, dass ich IDMNR als Bezug nehmen müsste?
Nein, auf keinen Fall. Bezüge erfolgen über die Schlüsselfelder, dazu sind die schließlich da.
Ich glaube, Du hast da noch einige Denkfehler in dem ganzen Aufbau.
Du musst mal die Gesamtzusammenhänge erklären (in einfachem Prosa).
Nachtrag:
Ich habe mir vorhin noch Deine neue Version angesehen. Du hast das Listenfeld und die Funktion geändert. Das hast Du völlig falsch gemacht. Das Listenfeld, die Abfrage und die Funktion müssen bleiben so wie ich diese gemacht habe. Du hast in der Abfrage die Verknüpfungen nicht analog zu den Beziehungen, auch das ist falsch. Die Verknüpfungen der Abfrage müssen den Beziehungen entsprechen. Du kannst das doch nicht einfach so machen wie Du das geade denkst. Das muss doch stimmig und konsistent sein. So wie Du das jetzt gemacht hast, ist das unsinnig (sorry), kein Wunder dass das nicht richtig funktioniert.
Guten Morgen,
das habe ich gemerkt. Also die tbl_Liste hatte mit den Maschinen nichts zu tun. Zunächst.
Das war die Liste für die Fehlermeldungen, aber ich habe ja von Vorne angefangen.
Ich habe durch meine Fehler glaube ich schon etwas mehr verstanden und mir ist klar geworden, dass ich die Beziehungen völlig falsch aufgebaut habe.
• IDMNR = Maschinennummer: Die gibt es nur einmal und muss die Basis sein
• tbl_Maschinen gehört eindeutig zu tbl_Maschinentyp, tbl_MHersteller und tbl_Schnecke
Wenn ich also bei einer Maschinennummer den Eintrag änder, weil dort eine neue bzw. andere Maschine zugeordnet wird, darf sich keine Änderung an den anderen Maschinen ergeben
Ich versuche es noch einmal neu, damit ich es besser verstehe.
Edit: So sollte es sein:
Siehe Anhang.
Hallo,
Versuch's mal damit.
- DM korrigiert
- Abfrage für Liste an verschobenen FK angepasst
- Textfelder für die FK in Kombis geändert
- Kompilierfehler beseitigt und Prozedur lesbar formatiert
- Prozedur der Liste zum Navigieren "eingedampft"
gruss ekkehard