Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Suche eines Datensatzes in Daten des Unterformulars

135 views
Skip to first unread message

Achim Jäkel

unread,
Mar 10, 2013, 9:13:45 AM3/10/13
to
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

Karl Donaubauer

unread,
Mar 13, 2013, 10:16:45 AM3/13/13
to
Hallo, Achim!

Achim Jäkel wrote:
> ...
> ...

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


Achim Jäkel

unread,
Mar 14, 2013, 8:16:33 AM3/14/13
to
Hallo Karl,

vielen Dank für deine Rückmeldung. Ich weiss wohl - ich habe versucht es so genau wie möglich zu beschreiben :)

Ich glaube aber, dass der Code so nicht funktioniert, da ich den code auf meinem Hauptformular ausführen möchte. Dann ist die Zeile:

Set rst = Me!Praemienliste.Form.Recordset

doch falsch, oder? Müsste hier dann nicht sowas stehen:

Set rst = Forms!subfrm_praemienliste!Form.Recordset

Ich habe das schon geändert - aber auch dieser Code funktioniert dann nicht. Der Debugger springt dann genau in diese Zeile und meldet, dass das subfrm_praemienliste nicht gefunden werden kann.
Mein Hauptformular heisst frm_praemienkatalog2praemie. Mein Unterformular (welches ein selbstgestaltetes Formular ist und dann eingebunden wurde) heisst subfrm_praemienliste.

Ich verstehe es nicht.

Danke & liebe Grüße,
Achim

Karl Donaubauer

unread,
Mar 14, 2013, 8:45:42 AM3/14/13
to
Hallo, Achim!

Achim Jäkel wrote:
> ...
> Ich glaube aber, dass der Code so nicht funktioniert, da ich den code
> auf meinem Hauptformular ausführen möchte. Dann ist die Zeile:
>
> Set rst = Me!Praemienliste.Form.Recordset
>
> doch falsch, oder?

Glaubst du das oder hast du es getestet?
Das Me!Praemienliste.Form hatte ich deinem Code entnommen.

> Müsste hier dann nicht sowas stehen:
>
> Set rst = Forms!subfrm_praemienliste!Form.Recordset

Naa.

> Ich habe das schon geändert - aber auch dieser Code funktioniert dann
> nicht. Der Debugger springt dann genau in diese Zeile und meldet,
> dass das subfrm_praemienliste nicht gefunden werden kann.
> Mein Hauptformular heisst frm_praemienkatalog2praemie. Mein
> Unterformular (welches ein selbstgestaltetes Formular ist und dann
> eingebunden wurde) heisst subfrm_praemienliste.
> ...

Wenn subfrm_praemienliste nur als Herkunftsobjekt eines
UFo-Steuerelementes geöffnet ist, dann befindet es sich nicht
in der Forms-Auflistung. Daher der Fehler.

Was du brauchst ist zudem nicht der Name des Herkunftsobjektes
sondern das, was in der Eigenschaft "Name" des UFo-Steuerelementes
steht, also:

Set rst = Me!NameDesUFoSteuerelementes.Form.Recordset

s.a. http://www.donkarl.com?FAQ4.2

Achim Jäkel

unread,
Mar 14, 2013, 4:36:10 PM3/14/13
to
Hallo noch einmal,
ich verstehe es so langsam wirklich nicht mehr. Es ist doch eigentlich eine echt simple Aufgabe. Was mache ich nur falsch?
Das Unterformular-Steuerobjekt im Hauptformular hat den Namen praemienliste.

In diesem Unterformular existiert ein Feld mit dem Namen katalog_id.

Falls hier jemand etwas Muße hat:
http://www.safaricar.de/files/Datenbank1.accdb

Ich wäre wirklich für jeden Hinweis dankbar.

Liebe Grüße,
Achim

Karl Donaubauer

unread,
Mar 15, 2013, 6:05:40 AM3/15/13
to
Hallo, Achim!

Achim Jäkel wrote:
> ich verstehe es so langsam wirklich nicht mehr. Es ist doch
> eigentlich eine echt simple Aufgabe. Was mache ich nur falsch?
> Das Unterformular-Steuerobjekt im Hauptformular hat den Namen
> praemienliste.
>
> In diesem Unterformular existiert ein Feld mit dem Namen katalog_id.
>
> Falls hier jemand etwas Muße hat:
> http://www.safaricar.de/files/Datenbank1.accdb
>
> Ich wäre wirklich für jeden Hinweis dankbar.
>

Nur als Hinweis, falls sich niemand deine DB ansieht:

Du solltest exakt auf die gestellten Rückfragen eingehen und
ggf. erhaltene Fehlermeldungen und -nummern nennen.

Ich habe z.B. gefragt, ob du meinen Code getestet hast.
Darauf kam keine Antwort und keine (Fehler-) Beschreibung.
Dann kann man auch nichts antworten.

Achim Jäkel

unread,
Mar 15, 2013, 12:39:25 PM3/15/13
to
Hallo Karl,

danke für den Hinweis. Verbuche das bitte unter meiner allgemeinen Verzweifelung, bei so einem einfachen Problem so kläglich zu scheitern :)

Also, ich habe deinen Code natürlich ausprobiert und noch einmal sichergestellt, dass für das Subform der Steuerelementname verwendet wird und auch der Feldname im Unterformular korrekt ist.
Der unten aufgeführte Code ist im Ereignis "nach Aktualisieren" meines Suchfeldes "praemiensuche".

Suche ich nun nach einer Prämie, die in dem geladenen Katalog (z.B. ID = 1) nicht existiert (z.B. "Praemie5") so erscheint kein Fehler mehr, sondern der Code geht in den notFound-Zweig. Die Prämie existiert allerdings in Katalog ID=2.
Ich habe auch bereits einen Haltepunkt auf die If-Zeile gesetzt. In strFind steht dann "praemie = 'Praemie5'". rst!katalogid hat den Wert = 1?

Der Code sieht damit jetzt wie folgt aus:

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

Danke & liebe Grüße,
Achim

Karl Donaubauer

unread,
Mar 15, 2013, 1:06:09 PM3/15/13
to
Hallo, Achim!

Achim Jäkel wrote:
> ...
> ...

Und was passiert jetzt oder passiert nicht, was du aber willst?

Ich habe ja grundsätzlich deine Suchlogik nicht verstanden.
Du hast eine Verknüpfung zwischen HFo und UFo, und suchst daher
natürlich immer nur in den momentan angezeigten/verknüpften DS
des UFos. Mir ist nicht klar, was das bringen soll bzw. was du davon
erwartest.

Übrigens solltest du das
rst.Close
unten im Code weglassen, denn das könnte dir das Recordset
des UFos zerstören.

Karl Donaubauer

unread,
Mar 15, 2013, 1:19:58 PM3/15/13
to
Karl Donaubauer wrote:
> Achim Jäkel wrote:
>> ...
>> 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
>> ...
> Ich habe ja grundsätzlich deine Suchlogik nicht verstanden.
> Du hast eine Verknüpfung zwischen HFo und UFo, und suchst daher
> natürlich immer nur in den momentan angezeigten/verknüpften DS
> des UFos. ...

Hmm, vielleicht willst du eigentlich die Datenherkunft des UFos
durchsuchen. Das wäre dann statt

>> Set rst = Me!Praemienliste.Form.Recordset

Set rst = Currentdb.OpenRecordset("qry_praemienliste", dbOpenDynaset)

Achim Jäkel

unread,
Mar 15, 2013, 3:48:58 PM3/15/13
to
Hallo Karl,

danke!!! Das war der entscheidende Tipp. Natürlich wollte ich in sämtlichen Datensätzen des UFos suchen. Ich dachte, dass es dazu genügt das Recordset des UFos zu öffnen.

Vielen Dank für Deine Geduld.
Achim
0 new messages