Suche eines Datensatzes in Daten des Unterformulars

10/03/2013 - 14:13 von Achim Jäkel | Report spam
Hallo,
ich habe jetzt noch einmal eine Frage zum Suchen in Unterformularen.

Ich habe ein Formular Katalog, welches auf Basis der Tabelle Katalog besteht.
In diesem Formular existiert ein Unterformular, welches auf einer Abfrage qry_praemienliste basiert. Insgesamt habe ich 3 verknüpfte Tabellen in diesem Projekt (alle in einer Oracle-DB). Eine für den Pràmienkatalog (Katalog), eine für die Pràmien (Praemien) und eine Tabelle mit der Zuordnung von Katalog zu Pràmie (Katalog2Praemien).

Das Unterformular (praemienliste) ist über die praemienliste.Katalog.ID (name = katalogid) mit dem Hauptformular (ID) verknüpft.

Im Formular werden immer zu einem angezeigten Katalog alle über die Tabelle Katalog2Praemien zugeordneten Pràmien angezeigt.

Ich möchte nun (am liebsten im Hauptformular) ein Suchfeld(praemiensuche) für die Pràmie (PRAEMIE) einbauen, welches nach aktualisieren den ersten gefundenen Katalog im Hautpformular aufruft und im Unterformular die gefundene Pràmie focussiert.

Ich habe versucht es wie folgt zu machen:

Private Sub praemie_AfterUpdate()
Dim rst As Recordset
Dim strFind As String

With Me![praemienliste].Form
Set rst = Me!praemienliste.Form.RecordsetClone 'praemienliste.Form.RecordsetClone
strFind = "praemie = '" & Forms!Katalog.praemiensuche & "'"
rst.FindFirst strFind
If rst.NoMatch Then 'nicht gefunden
MsgBox "Pràmie '" & Me!praemiensuche & _
"' wurde nicht gefunden", , "Suche"
Else 'gefunden
Me.Recordset.FindFirst "ID = " & rst!katalogid
.Recordset.FindFirst strFind
End If
rst.Close: Set rst = Nothing
End With
End Sub

Leider bekomme ich beim Verlassen des Suchfeldes immer die Fehlermeldung:
Element in dieser Auflistung nicht gefunden.
Der Focus im Debugger steht dann auf der ersten Zeile im Else-Zweig.

Allerdings ist der eindeutige Schlüssel im Hautpformular das Feld ID, welches auch so heisst. Im Unterformular heisst dieses Feld katalogid und enthàlt die Katalog.ID aus der Abfrage - welches die Katalog.ID aus der Tabelle Katalog darstellt. Über diese beiden Felder làuft auch die Verknüpfung zwischen Haupt- und Unterformular.

Meiner Meinung nach sieht das doch gut aus?

Suche ich übrigens nach einer Pràmie, die es tatsàchlich gibt, so kommt die MSG-Box. Allerdings spring das Hauptformular danach in den nàchsten Katalog. Das ist auch irgendwie doof. Muss ich mir da die ID merken und wieder zurückspringen um das zu verhindern?

Achja...und gleich noch eine Frage hinterher. Kann ich eigentlich auch in verknüpften Oracle-Tabellen eine Deklarierung wie
Dim rst as DAO.RecordSet machen...und warum ist DAO sicherer?

Gruß und vielen Dank vorab für eure Tipps,
Achim
 

Lesen sie die antworten

#1 Karl Donaubauer
13/03/2013 - 15:16 | Warnen spam
Hallo, Achim!

Achim Jàkel wrote:
...
Private Sub praemie_AfterUpdate()
Dim rst As Recordset
Dim strFind As String

With Me![praemienliste].Form
Set rst = Me!praemienliste.Form.RecordsetClone
'praemienliste.Form.RecordsetClone
strFind = "praemie = '" & Forms!Katalog.praemiensuche & "'"
rst.FindFirst strFind
If rst.NoMatch Then 'nicht
gefunden
MsgBox "Pràmie '" & Me!praemiensuche & _
"' wurde nicht gefunden", , "Suche"
Else
'gefunden
Me.Recordset.FindFirst "ID = " & rst!katalogid
.Recordset.FindFirst strFind
End If
rst.Close: Set rst = Nothing
End With
End Sub

Leider bekomme ich beim Verlassen des Suchfeldes immer die
Fehlermeldung:
Element in dieser Auflistung nicht gefunden.
Der Focus im Debugger steht dann auf der ersten Zeile im Else-Zweig.

Allerdings ist der eindeutige Schlüssel im Hautpformular das Feld ID,
welches auch so heisst. Im Unterformular heisst dieses Feld katalogid
und enthàlt die Katalog.ID aus der Abfrage - welches die Katalog.ID
aus der Tabelle Katalog darstellt.
...



Nicht, dass irgendjemand außer dir deine Beschreibung verstünde, ;-)
aber wenn diese Fehlermeldung wegen der Zeile

Me.Recordset.FindFirst "ID = " & rst!katalogid



kommt, bedeutet sie, dass es kein Feld "katalogid" im Recordset
"rst" gibt. Access hat bei so etwas immer Recht. Also prüfe und
korrigiere den Feldnamen.

Wenn ich zumindest den Code richtig lese, dann kannst du die
nàchste Zeile, nàmlich

.Recordset.FindFirst strFind



wegschmeißen bzw. nach oben verlagern, denn ein FindFirst aufs
Recordset wechselt den DS und der Clone oben sieht überflüssig
aus. Also:

Dim rst As DAO.Recordset
Dim strFind As String

Set rst = Me!Praemienliste.Form.Recordset
strFind = "praemie = '" & Me!Praemiensuche & "'"

rst.FindFirst strFind
If rst.NoMatch Then 'nicht gefunden
MsgBox "Pràmie '" & Me!Praemiensuche & _
"' wurde nicht gefunden", , "Suche"
Else 'gefunden
Me.Recordset.FindFirst "ID = " & rst!RichtigerFeldname
End If

rst.Close: Set rst = Nothing

Servus
Karl
*********
Access-FAQ: http://www.donkarl.com
SNEK2: SQL Server und .NET-Entwickler-Konferenz 13/14.4. Nürnberg

Ähnliche fragen