Dringend! Abhängige Kombinationsfelder

Hallo, ich bins mal wieder. Jetzt habe ich noch ein sehr dringendes Problem. Ich habe in Access 2000 ein Formular erstellt und will mit einem Kombinationsfeld nach Datensätzen darin suchen. Da ich aber einen zusammengesetzten Primärschlüssel habe, mit dem ich auch abfragen möchte, benötige ich ein abhängiges Kombinationsfeld.Ich habe versucht, das mit einem VBA Code zu realisieren:

Private Sub Kombinationsfeld16_AfterUpdate()
’ Den mit dem Steuerelement übereinstimmenden Datensatz suchen.
Dim rs As Object

Set rs = Me.Recordset.Clone
rs.FindFirst „[Order_number] = '“ & Me![Kombinationsfeld16] & „’“
Me.Bookmark = rs.Bookmark

Me!Position_number.RowSource = "SELECT Position_number FROM Abfrage_Zahlungen WHERE Position_number= " & Me!Position_number
Me!Position_number.Requery
End Sub

Irgendwas stimmt da nur nicht so richtig. Ich muss dazu noch sagen:

Mein Formular basiert auf einer Abfrage. Dazu gehört auch die Order number und die Position number, die den zusammen gesetzten Primärschlüssel bilden und nach denen auch im Formular gesucht werden soll. Die Abfrage sind aus mehreren Tabellen gezogen.

Die zweite Sache ist, in einem anderen Formular, das auf der gleichen Abfrage basiert, Datensätze zu ändern und neu einzufügen bzw. zu löschen.Wie könnte man das realisieren?

Ich hoffe, mir kann jemand helfen; ich brauche dringend Hilfe!

Grüße und danke vorab

Hallo Ohana

Um abhängige Kombinationsfelder erhalten zu können,
könnte man im GotFocus des Kombifeldes
entsprechenden VBA-Code schreiben

Private Sub Kombinationsfeld16_GotFocus()
Dim SQL As String
SQL = "SELECT …
Kombinationsfeld16.RowSource = SQL
End Sub

Dieser würde dann immer aufgerufen werden, wenn
das entsprechende Kombifeld aktiviert wird.

Der Inhalt im Kombinationsfeld kann auch im Current der Form per VBA angepasst werden. Dann ändert sich Dieser jedes Mal, wenn ein neuer Datensatz aufgerufen wird (wenn im SELECT … Bezug genommen wird auf Inhalte von Controls der Form (WHERE Tabelle.Feld = ‚" & Controlinhalt & "‘ ORDER BY …")

Die aktuelle Dataensatznummer kann in Form_Current
mit Me.CurrentRecord in eine Variable eingelesen werden
und wenn benötigt ausgewertet werden.

Gruß Wolfgang

Hallo, Wolfgang,
habe jetzt folgende Code unter GotFocus eingetragen:

Private Sub Kombinationsfeld18_GotFocus()
Dim SQL As String
SQL = „SELECT [Abfrage_Zahlungen].[Position_number] FROM Abfrage_Zahlungen“
Kombinationsfeld18.RowSource = SQL

End Sub

Kombinationsfeld 18 ist das abhängige Feld und die SQL - Anweisung definiert die Datensatzherkunft des abhängigen Feldes. Es klappt leider nicht. Was mache ich falsch?

Grüße,Ohana

Hallo Ohana

Wenn der angegebene SQL-String Daten zurückgibt was man im Abfragemodul testen kann, so sollte im Kombinationsfeld18 auch etwas angezeigt werden.
Auch wenn der Inhalt immer gleich sein wird, da in dem SQL-String keine WHERE-Abfrage enthalten ist.

Wenn auf dem Formular Datensatzabhängige Felder wie z.B. ID o.a. enthalten sind, so kann Dieser Inhalt zur Filterung verwendet werden. Die Datensatznummer zu verwenden ist nicht sehr sinnvoll.

Zum zweiten Problem:
Daten aktualisieren kann man mit Hilfe des SQL-Kommandos UPDATE.
Die Syntax hierzu lautet: UPDATE SET =‚Wert‘ Whereorder
Also beispielsweise:

DIM SQL As String
SQL=„UPDATE Adressen SET name=‚Meier‘ WHERE name=‚Meier‘ AND ID=1111“
DoCmd.Run SQL

Löschen wird mit DELETE durchgeführt.

Dim SQL As string
SQL=„DELETE * FROM Adressen WHERE name=‚Meier‘ AND ID=1111“
DoCmd.RunSQL SQL

Einfügen erfolgt mittels INSERT INTO

Dim SQL As String
SQL=„INSERT INTO Adressen (‚Name‘,‚Vorname‘) VALUES(‚Meier‘,‚Lutz‘)“
DoCmd.RunSQL SQL

Gruß Wolfgang

Hallo, Wolfgang,

erstmal vielen Dank für die ausführliche Antowrt. Für die Suche habe ich eine Lösung gefunden. In welche Eigenschaften würde ich die Anweisungen in VBA denn eintragen? (bin da blutiger Anfänger)

Grüße

Hallo Ohana

Ich würde Schaltflächen einfügen. entsprechend einen fürs Einfügen, einen fürs Ändern und einen fürs Löschen.
Beispiel für den Lösch-Button

Private Sub btnDelete_Click()

Dim SQL As String
Dim ID As Double
dim result As Integer
On Error Resume Next
'Inhalt aus Textfeld txtId auslesen (Autowert des 'Datenfeldes id)

ID = Val(txtId.Value)
SQL = „DELETE * FROM Tabelle WHERE id=“ & ID
result = MsgBox(„Wollen Sie worklich den Datensatz mit der ID " & id & " löschen ?“, vbYesNo + vbCritical + vbDefaultButton2, „Daten löschen“)
If result = vbYes Then
'Warnmeldung ausschalten
DoCmd.SetWarnings False
DoCmd.RunSQL SQL
'Warnmeldungen wieder einschalten
DoCmd.SetWarnings True
End If

End Sub

Wolfgang Hupka

Hallo, Wolfgang,

ja, mit solchen Buttons versuche ich gerade, das zu realisieren. Leider hab ich schon beim Button „Neuer Datensatz“ Probleme. Ich habe eine HFO mit einem UFO erstellt. Die beiden basieren auf den Tabellen Order list und CapEX list. Beide sind mit dem Primärschlüssel Order number und Position number verbunden; also ein zusammen gesetzter Primärschlüssel. Wenn ich jetzt daten eintragen will, drücke ich auf „Neuer Datensatz“ und die Felder leeren sich. Soweit so gut. Jetzt kann ich aber nur eine neue Order number und eine neue Position number vergeben; die restlichen Felder im Unterformular sind nicht änderbar. Der Cursor springt zwar in das Feld, aber ich kann nichts eingeben. Liegt das vielleicht daran, dass es sich um zwei verschiedene Tabellen handelt, sprich, die Felder werden schreibgeschützt? An den Berechtigungen für das Fromular kann es nicht liegen, die habe ich auf ja gesetzt.

Grüße,
Ohana

Hallo Ohana,

ich gehe davon aus, dass aus der Abfrage ein bestimmter Datensatz angezeigt werden soll.

Was für Daten enthält Dein Kombinationsfeld16 und wie werden sie aktuell gehalten? Du musst natürlich dafür sorgen, dass die aktuellen Order_number des Formulars im Kombinationsfeld enthalten sind.

Einfacher ist es vielleicht mit einem Textfeld Order_number_such und einem Button ‚suchen‘ einzurichten. Im Click-Ereignis des Buttons wird ein select-String zusammengebaut mit rs.FindFirst"[Order_number] = ‚" & ME!order_number_such & "‘".

Im zweiten Teil wird versucht der Position_number ein select-Ergebnis zuzuordnen mit genau dieser Position_number als Selektionskriterium. Das dürfte nicht funktionieren. Ich habe aber auch den Sinn nicht ganz verstanden.

Im zweiten Formular kann man Eingabefelder anlegen, in denen die zu ändernden Daten eingespeichert werden um sie zu korrigieren.
Es können auch neue Daten eingetragen werden, um einen neuen Datensatz anzulegen.
Mit einem Button speichern können die Daten aus den Eingabefeldern gespeichert werden.
Dabei muss mittels eines Schalters unterschieden werden, ob es eine Korrektur(update) oder Neuanlage(insert) ist.

Das Ändern, Hinzufügen oder Löschen funktioniert aber nicht über die Abfrage. Hier müssen die entsprechenden Tabellen benutzt werden. Das heisst, wenn Daten aus mehreren Tabellen geändert werden, muss für jede Tabelle die entsprechende Aktion ausgeführt werden.

Voraussetzung für alles ist, dass jeder Datensatz eindeutig über einen Schlüssel identifizierbar ist.

Gruß
JOGI

Hallo Ohana,

leider kann ich dir da nicht helfen. Du scheinst mehr zu können als ich. Ich bin selbst Anfänger.

Hallo Ohana,

entschuldigen Sie die verspätete Rückmeldung, hatte leider keine Gelegenheit zu Anworten.
Dann muss ich Ihnen auch noch mitteilen, dass ich in Sachen Access immer noch am Anfang stehe und zu der Frage leider nichts sagen kann.

Gruß Hugo

Hallo, Hugo,
ich danke Ihnen trotzdem für die Rückmeldung.

Gruß, Ohana