PDA

Vollständige Version anzeigen : im Recordset speziellen Datensatz finden


Lamerman
24.03.2006, 16:25
Hallo!

Habe bestimmt ne leichte Sache hier:

SO funktioniert das natürlich nicht:

Dim testerfassung As New ADODB.Recordset
testerfassung.Open "tbl_zeitpunkt", CurrentProject.Connection, adOpenDynamic, adLockOptimistic

With testerfassung
.Find "ID_zeitpunkt=" & Me.kbf_auswahl_teilnehmer
.MoveLast

Me.Zeitpunkt = Zeitpunkt

End With


in meiner "tbl_zeitpunkt" habe ich 2 Datensätze des selben Teilnehmers.

Wir lasse ich den Datensatzzeiger nun auf den letzen Datensatz springen im Recordset?

THX!!!


AD: Aus Thread #1 zu diesem Problem.

Nouba
24.03.2006, 17:28
Dim testerfassung As New ADODB.Recordset

testerfassung.Open "tbl_zeitpunkt", CurrentProject.Connection, adOpenDynamic, adLockOptimistic

With testerfassung
.Find "ID_zeitpunkt=" & Me!kbf_auswahl_teilnehmer, , adSearchBackward
If Not .EOF Then
Me!Zeitpunkt = !Zeitpunkt
End If
.Close
End With


AD: Aus Thread #1 zu diesem Problem.

Lamerman
27.03.2006, 15:06
Hallo!


Ich suche mit einem Kombifeld Teilnehmer aus.
Die gebundene Spalte ist dafür die ID_teilnehmer, eine Zahl.

In einer Tabelle habe ich dazu eine Testnummer, die immer durchnummeriert werde, sobald ich einen neuen Zeitpunkt anlege.


So siehts momentan aus. Testnummer 1 ist immer gegeben. 2 geht auch noch.
Aber dann soll er den letzten Datensatz des Teilnehmers fokussieren und dann die Testnummer +1 nehmen:

Dim i As Byte
Dim bla As Byte

Dim Zeitpunkt As New ADODB.Recordset
Zeitpunkt.Open "tbl_zeitpunkt", CurrentProject.Connection, adOpenDynamic, adLockOptimistic

With Zeitpunkt
If Not .EOF Or .BOF Then
.Find "ID_teilnehmer=" & Me.kbf_auswahl_teilnehmer

bla = !testnummer
.AddNew

If bla = 1 Then
!testnummer = bla + 1
End If
If !testnummer = i + 1 Then
!testnummer = i + 3
End If
!ID_teilnehmer = Me.t_id
!testleitung1 = Me.kbf_testleitung1
!testleitung2 = Me.kbf_testleitung2
!testdatum1 = Me.test_datum
!testdatum2 = Me.test_datum_bis
!test_alter = Me.test_alter
End If
End With

Zeitpunkt.Update
Zeitpunkt.Close


Was mache ich falsch oder wie ist die richtige Syntax?

Danke und Gruß!!

Lamerman
27.03.2006, 17:07
Einmal Visualisiert:

Ich möchte das der Datensatzzeiger auf den letzten Datensatz eines Teilnehmers springt.
Bei ID Teilnehmer 4 wäre das 35
Bei Teilnehmer 8, 45.

Weiß keiner wie ich den Datensatz selektieren kann?

milko
27.03.2006, 17:20
Wenn man gruppiert nach ID Teilnehmer das Maximum des Datumseintrags sucht, kann man mit diesen Kenner die gesuchte ID ermitteln.
Eine Abfrage mit Maximum und eine zweite, welche auf der ersten aufbaut und die ID ermittelt.
Schon kannst du mit gegebener Teilnehmer-ID den Recordset der zweiten Abfrage auf der Suche durchlaufen und hast den gewünschten Wert

Lamerman
28.03.2006, 12:40
Hi, das klappt leider noch so ganz....
"Sie haben einen Wert eingegeben, der für dieses Feld nicht zulässig ist."

Behandle aber ähnliches Problem in anderem Thread.
Dennoch Danke!


AD: Aus Thread #1 zu diesem Problem.

Lamerman
28.03.2006, 12:42
Hmm, kannst du das konkretisieren?
Brauche ich also 2 Abfragen? WIe steuere ich die denn im Recordset an.

Mit Abfragen habe ich es nicht so...

Anne Berg
28.03.2006, 14:05
Falsch ist sicherlich schon mal dieses:If Not .EOF Or .BOF ThenWas willst du damit abfragen? EndOfFile = False OR BeginOfFile = True ?!

Die Methoden eines Recordsets sollten dir da eigentlich weiterhelfen, wie da wären:
Datensatzgruppe.{FindFirst | FindLast | FindNext | FindPrevious} Kriterien

(aber das bietet dir leider nur der DAO.Recordset!)



... aber das wurde hier (http://www.ms-office-forum.net/forum/showpost.php?p=842718&postcount=2) ja schon längst geklärt! (shame on you :p)

Lamerman
28.03.2006, 14:12
Die Methoden eines Recordsets sollten dir da eigentlich weiterhelfen, wie da wären:
Datensatzgruppe.{FindFirst | FindLast | FindNext | FindPrevious} Kriterien


Die kannte ich ja noch gar nicht...! Das gibbet auch?
Ich kenne nur MoveLast etc...damit springt der Datensatzzeiger aber nur noch oben oder unten.

Das .EOF .BOF kann ja eigentlich weg, wenn ich nach was speziellem suche.

Lamerman
28.03.2006, 14:16
Hmpf...aber das ,adSearchBackward klappte alles nicht! menno...

Anne Berg
28.03.2006, 14:19
Nein, wenn du ein leeres Recordset hast, und das besagen die beiden Schalter (direkt nach dem Öffnen), so macht es auch keinen Sinn, darin etwas zu suchen. (Zumal du keine Fehlerbehandlung vorgesehen hast und den Erfolg des Find-Befehls nicht auswertest! :p)

Zu den "unbekannten" Methoden habe ich oben bereits einen Kommentar nachgeschoben...

Lamerman
28.03.2006, 14:26
Also die Recordsets sind defintiv immer gefüllt mit Teilnehmern und Testdaten.

Wie werte ich denn sowas aus?

Ja, habe ich schon gesehen. Wie wird den ein DAO aufgebaut?
Nach dem selben Schema wie ADO?

Anne Berg
28.03.2006, 14:35
Jein, das geht etwas einfacher:

Dim rs as DAO.RecordSet ' Verweis auf DAO erforderlich !
Set rs = Currentdb.OpenRecordset("Tabelle / Abfrage / SQL-Code", dbOpenDynaset)
rs.FindLast "Feldx = 'Y'"
If Not rs.NoMatch Then ' dann gibt es Daten :)

Lamerman
28.03.2006, 14:46
Erstmal Danke! Ich werde es gleich testen, da ich noch mit
Optimierungen zu gange bin in meiner DB!

OT:
Hast du die DB noch?
Hast du meine ICQ bekommen?

Anne Berg
28.03.2006, 15:25
Ja, beides. :) (muss mich aber gleich wieder ausklinken, sorry)

... aber die DB dürfte nicht mehr aktuell sein, oder?

Lamerman
30.03.2006, 07:23
Guten morgen!

Damit hatte ich Schwierigkeiten:
rs.FindLast "Feldx = 'Y'"

Gibt es vielleicht jmd der mir mehr zu den Unterschieden von ADO und DAO erklären kann?

Ich habe es so versucht ist aber ungültig.
Kenne mich damit gar nicht aus.

Dim rs as DAO.RecordSet ' Verweis auf DAO erforderlich !
Set rs = Currentdb.OpenRecordset("tbl_zeitpunkt", dbOpenDynaset)

With rs
.FindLast "Feldx = 'me.meinfeld'"
If Not .NoMatch Then ' dann gibt es Daten
End If
.close

End With

Wie mache ich es denn richtig?

Lamerman
30.03.2006, 08:06
Dim rs As DAO.Recordset ' Verweis auf DAO erforderlich !
Set rs = CurrentDb.OpenRecordset("tbl_zeitpunkt", dbOpenDynaset)

With rs
.FindLast "ID_Zeitpunkt =" & Me!kbf_auswahl_teilnehmer
If Not .NoMatch Then ' dann gibt es Daten
Me!Zeitpunkt = rs.Bookmark

End If
.Close

End With


Ȁ <- das kam raus?! Wasn das? Jemand einen Rat?

Anne Berg
30.03.2006, 08:08
.FindLast "Feldx = 'me.meinfeld'"Feldx wäre hier der Name des Feldes nach dem du suchen möchtest, es muss im Recordset (hier: in tbl_zeitpunkt) enthalten sein
In Hochkommata gibst du dann das Kriterium, den Vergleichswert an, wenn das Datenfeld vom Typ dbText ist, bei num. Feldern lässt du sie weg.
Möchtest du eine Variable verwenden oder ein Formularfeld, dann darfst du das nicht in den String schreiben sondern musst es mit dem Filterstring verketten, also:
.FindLast "deinFeldx = '" & Me!deinFormularfeld & "'"

Anne Berg
30.03.2006, 08:11
Bookmark ist sozusagen ein Eselsohr in deinem Recordset, ein Pointer auf den aktuellen Datensatz. Die Datenfelder musst du schon explizit ansprechen, so wie auch im Formular, also:

Me!Zeitpunkt = rs!Zeitpunkt (falls Zeitpunkt der Name des Tabellenfeldes ist)


PS: das hat aber jetzt alles nichts mit dem Unterschied zwischen DAO und ADO zu tun... ;)

Lamerman
30.03.2006, 08:41
Ich werde bald bekloppt:

Wenn ich nun das mache:

Dim rs As DAO.Recordset ' Verweis auf DAO erforderlich !
Set rs = CurrentDb.OpenRecordset("tbl_zeitpunkt", dbOpenDynaset)

With rs
.FindLast "ID_Zeitpunkt =" & Me!kbf_auswahl_teilnehmer
If Not .NoMatch Then ' dann gibt es Daten
Me!Zeitpunkt = rs!ID_zeitpunkt

End If
.Close

End With

Dann findet er immer den ersten Datensazt des ID_Teilnehmers mit dem ersten ID_Zeitpunkt.

Mache ich das selbe mit


Dim rs As DAO.Recordset ' Verweis auf DAO erforderlich !
Set rs = CurrentDb.OpenRecordset("tbl_zeitpunkt", dbOpenDynaset)

With rs
.FindLast "ID_Zeitpunkt =" & Me!kbf_auswahl_teilnehmer
If .NoMatch Then ' dann gibt es Daten
Me!Zeitpunkt = rs!ID_zeitpunkt

End If
.Close

End With

dann findet er den 2. Teilnehmer mit der "8" und findet auch den Zeitpunkt "37"! :mad:
Siehe #4

Anne Berg
30.03.2006, 09:13
Entschuldige bitte, aber das macht doch keinen Sinn was du da tust! .FindLast "ID_Zeitpunkt =" & Me!kbf_auswahl_teilnehmer
If Not .NoMatch Then ' dann gibt es Daten
Me!Zeitpunkt = rs!ID_zeitpunkt
Da kannst du doch gleich schreiben:Me!Zeitpunkt = Me!kbf_auswahl_teilnehmer
Und bei NoMatch (2. Fall) hast du keinen aktuellen DS und dürftest gar nichts zurückbekommen beim Zugriff auf den RS (höchstens einen Fehler).

Ich vermute, du willst nach ID_Teilnehmer suchen und die ID_Zeitpunkt dazu auslesen.

Lamerman
30.03.2006, 09:20
Ich vermute, du willst nach ID_Teilnehmer suchen und die ID_Zeitpunkt dazu auslesen.
Stimmt!

Habs endlich:

With rs
.FindLast "ID_Teilnehmer =" & Me!kbf_auswahl_teilnehmer
If Not .NoMatch Then ' dann gibt es Daten
Me!Zeitpunkt = rs!ID_zeitpunkt


So liest er mir endlich die richtige Zeile aus, wieder was dazu gelernt.
Schwere Geburt war es! :upps:
Danke dir!!!