So Bearbeiten Sie Datensätze aus einem VBA-Formular, dass Sie möchten, um interaktiv auswählen?
Habe ich eine Reihe von ComboBox in eine MS Access 2003 DB, die sind alle gebunden, um Felder in einer einzelnen Tabelle. Allerdings werden die Daten, die Sie ermöglichen Ihnen die Auswahl nicht aus, dass die Tabelle und stattdessen kommt aus verschiedenen anderen Tabellen. Dies funktioniert gut für die Platte, die Schöpfungsgeschichte, aber jetzt will ich in der Lage sein, zu Bearbeiten und die Aufnahme nachträglich. Das problem ist, dass ich kann nicht herausfinden, wie füllen Sie die Formular-Elemente ohne das schreiben eine Reihe von benutzerdefinierten code.
Meine erste Neigung ist, um eine combo-box, die Grenzen Ihrer Möglichkeiten, um den Datensatz-IDs und dann die benutzerdefinierte Abfrage, und verwenden Sie, um die ausgewählten Werte in allen anderen Formular-Elemente. Allerdings habe ich das Gefühl, ich sollte in der Lage sein, etwas zu tun, so einfach wie DoCmd.GoToRecord , , , ID
und die form sollte wieder Auffüllen Prima. Ich bin nicht gegen das tun der Arbeit beschäftigt, aber ich bin sicher, ich bin nur etwas fehlt in meinem relativ mickrig Kenntnisse in VBA und Access.
Sind Sie versuchen, aktualisieren Sie die Elemente in jeder combo-box, weil Sie verändert, seit Sie das Formular geöffnet?
InformationsquelleAutor Tim Visher | 2009-03-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur um den mix, ich würde bieten zwei Ansätze, einen empfohlen, der andere nicht.
Ansatz 1: Wenn Sie schon gebunden, Ihre form, um die gesamten Daten Tabelle (das ist die nicht-empfohlene Vorgehensweise), können Sie mit dem Kombinationsfeld-Assistenten zu navigieren, um den angeforderten Datensatz, aber ich würde nicht empfehlen es in den letzten Versionen von Access:
ein. es nicht zulässt, dass Sie den richtigen Namen der combo-box, bevor Sie es schafft, die code.
b. der code ist einfach FALSCH.
Hier der code, den ich produzierte gerade in meiner test-Datenbank:
Das ist falsch in so vieler Hinsicht, es ist einfach nur bemerkenswert. Dies ist, was der code sollte sein:
Gibt es keine Notwendigkeit zu Klonen, der Datensatzgruppe des Formulars, wenn die RecordsetClone bereits vorhanden ist.
Es gibt keinen Grund, eine object-variable verwenden, wenn Sie können einfach direkt verwenden, um die bereits bestehenden Objekt.
Muss es einen check für ein schmutziges Datensatz vor dem verlassen des Datensatzes, weil, wenn Sie nicht zwingen, die speichern, Fehler in der save-Vorgang kann dazu führen, verlorene Daten.
Aber die bessere Methode ist diese:
Methode 2: Verwenden Sie die combo-box zu ändern, die form der zugrunde liegenden Datenherkunft.
Dem AfterUpdate-Ereignis deines Kombinationsfeldes würde wie folgt Aussehen:
Nun, das funktioniert nur die erste Zeit, als auf dem zweiten zurücksetzen der Datenherkunft, Sie am Ende mit zwei WHERE-Klauseln, die ist nicht gut. Es gibt zwei Ansätze:
ein. unter der Annahme, dass das Formular geöffnet wird, ohne eine WHERE-Klausel, die Shop-Eröffnung recordsource-Wert in einer Variablen auf Modulebene in form OnLoad-Ereignis:
Und auf der Modul-Ebene, definieren strRecordsource entsprechend:
Dann in der combo-box AfterUpdate-Ereignis, haben Sie dieses anstatt:
Nun, wenn Ihr Formular beginnt mit einer WHERE-Klausel bereits definiert ist, wird es mehr kompliziert, aber ich werde nicht in zu gehen, und lassen es als eine übung für den Leser, was der beste Ansatz sein könnte.
Oh, und +1. Nicht eine Access-guru, ich glaube nicht, ändern Sie einfach die Recordsource direkt. Viel eleganter, die ein DoCmd -, denke ich. Vielleicht ist es nur mich und die Tatsache, dass ich nicht wirklich Zugriff auf die Programmierung, sondern den Rückgriff auf DoCmd der Regel fühlt sich wie ein hack zu mir (also in der Regel gibt es einen besseren Weg gibt).
Danke für die Tippfehler-das ist jetzt behoben.
InformationsquelleAutor David-W-Fenton
Ich davon aus, dass Sie bereits festgelegt haben, die Reihe der Quellen für jedes Kombinationsfeld. So lange, wie Sie haben nicht nur die combo-box auf dieser Liste, es sollte zeigen, was Sie haben, in dieser Spalte gespeichert werden.
Allerdings, wenn Sie Ihre Combo-Box verändert seine Liste für jede Zeile können Sie etwas tun, wie diese in der Aufzeichnung der OnCurrent-Ereignis oder das Feld GotFocus-Ereignis:
InformationsquelleAutor BIBD
Nach re-Lektüre Ihrer Frage, ich denke, ich sehe, was Sie versuchen zu erreichen. Du bist auf dem richtigen Weg mit
GotoRecord
, obwohl ich wahrscheinlichOpenForm
in diesem Fall, weil es eineWhereCondition
Eigenschaft, die erlaubt Ihnen die Verwendung von SQL, um genau anzugeben, welcher Datensatz zu öffnen. Es klingt wie Sie möchten, implementieren Sie eine "jump to record" - Typ-Funktionalität in Ihrem Formular, wo der Benutzer wählt einen Datensatz-ID aus einer Liste und die form ändert sich und zeigt die ausgewählte Aufzeichnung.Eine Möglichkeit ist die Umstellung auf die neue Platte jedes mal, wenn der Benutzer wählt ein Element in der ComboBox. Man kann damit umgehen in dem Kombinationsfeld
Click
Veranstaltung.Verwende ich ein einfaches Beispiel: angenommen, Sie haben eine
Students
Tisch, und einStudentForm
für das betrachten/Bearbeiten von Datensätzen in derStudents
Tabelle. DieStudentForm
hat eine ComboBoxcboStudentID
gebunden ist, um dieStudents.ID
Spalte überRowSource
Eigenschaft. Wenn Sie eine student-ID in der ComboBox, dieStudentsForm
schaltet die Anzeige des entsprechenden student-Datensatz.In der
Click
Ereignisprozedur für das Kombinationsfeld-Steuerelement, können Sie code, der diese "jump to record" - Funktion mit so etwas wie die folgenden:Als David W. Fenton weist in den Kommentaren, können Sie kürzen Sie die folgende Zeile:
:
oder einfach nur:
da der default-Wert der ComboBox in diesem Fall wird der Wert der gebundenen Spalte in der aktuellen
ListIndex
. In diesem Fall können Sie einfach entfernen SierecordID
insgesamt und code derClick
Ereignis wie folgt:Vielen Dank, David. Ich habe bearbeitet Sie meine Antwort auf die Tatsache widerspiegeln, dass Sie gleichwertig sind, in diesem Fall.
InformationsquelleAutor Mike Spross