Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Schleife While/Wend

Begonnen von PeterW, Februar 08, 2023, 06:42:13

⏪ vorheriges - nächstes ⏩

PeterW

Ich habe folgendes geschrieben:

Private Sub btmStart1_Click()
Dim tmp As Variant
Dim rs As Database
Set DB = CurrentDb()
Set rs = DB.OpenRecordset("tblMitglieder")
While Not rs.EOF
tmp = Split([NaName], " ")
  MsgBox tmp(0) & ",   " & tmp(1)
rs.MoveNext
Wend
End Sub

Leider funktioniert MoveNext nicht, es wird immer wieder der Datensatz 1 angezeigt.
Ist da ein Denkfehler?
Viele Grüße aus Berlin
Peter

Josef P.

Hallo!

Wo verwendet du die Daten aus dem Recordset?

Gruß
Josef

PeterW

ich will innerhalb der Schleife die Daten verarbeiten, z.B. temp(1) in ein neues Tabellenfeld einsetzen
Viele Grüße aus Berlin
Peter

andyfau

Hallo,

ist das Recordset richtig sortiert? und setze in der Zeile vor While ein rs.MoveFirst, damit Du einen definierten Zustand des Recordsets hast.
Beste Grüße
Andreas

MzKlMu

Hallo,
Zitatz.B. temp(1) in ein neues Tabellenfeld einsetzen
Warum nimmst Du da nicht einfach eine Aktualisierungsabfrage ?
Gruß Klaus

ebs17

tmp = Split([NaName], " ")Woher nimmst Du die Überzeugung, dass NaName aus dem Recordset verwendet würde? Es dürfte eher dem Formular entnommen sein, auf dem der Button liegt, und dort ändert sich nichts.

MoveNext und die Schleife funktionieren selbstverständlich, aber da von ihnen keine Aktionen mit eigenen Datensätzen abverlangt werden, sieht man nach außen nur die immer gleiche Meldung, was nun nicht sehr hilfreich sein wird.
Mit freundlichem Glück Auf!

Eberhard

PeterW

Die Aktion ist meiner Meinung nach die Anzeige in der Msgbox, hier müsste doch bei jedem Schleifenschritt der nächste Datensatz angezeigt werden.
Viele Grüße aus Berlin
Peter

Josef P.

Hallo!

Finde den Unterschied:

Private Sub btmStart1_Click()
   Dim tmp As Variant
   Dim rs As Database
   Set DB = CurrentDb()
   Set rs = DB.OpenRecordset("tblMitglieder")
   While Not rs.EOF
      tmp = Split([NaName], " ")
      MsgBox tmp(0) & ",   " & tmp(1)
      rs.MoveNext
   Wend
End Sub
vs.
Private Sub btmStart1_Click()
   Dim tmp As Variant
   Dim rs As Database
   Set DB = CurrentDb()
   Set rs = DB.OpenRecordset("tblMitglieder")
   While Not rs.EOF
      tmp = Split(Me!NaName, " ")
      MsgBox tmp(0) & ",   " & tmp(1)
      rs.MoveNext
   Wend
End Sub
vs.
Private Sub btmStart1_Click()
   Dim tmp As Variant
   Dim rs As Database
   Set DB = CurrentDb()
   Set rs = DB.OpenRecordset("tblMitglieder")
   While Not rs.EOF
      tmp = Split(rs!NaName, " ")
      MsgBox tmp(0) & ",   " & tmp(1)
      rs.MoveNext
   Wend
End Sub

Bitte jetzt nicht nur den passenden Code verwenden, sondern auch darüber nachdenken, was in der 1. Variante (dein bisher verwendeter Code) genutzt wird.

Es fehlt übrigens ein rs.Close am Ende.

Gruß
Josef

PeterW

In dem von mir genutzten Code werden in der Msgbox die in dem Tabellenfeld NaName vorhandenen Daten "Nachname Vorname" getrennt korrek angezeigt. Jetzt sollte mit Movenext der nächste Datensatz zum aktuellen Datensatz gemacht werden aber das funktioniert nicht. In der Msgbox wird weiter hin der Inhalt des ersten Datensatzes angezeigt.
Deine Variante mit rs.NaName funktioniert, aber ich verstehe noch nicht warum. 
Viele Grüße aus Berlin
Peter

Josef P.

Variante 1 und 2 sind identisch. Bei 2 sieht man nur etwas besser, woher der Wert kommt.
tmp = Split([NaName], " ")[NaName] ist die Formulareigenschaft vom Datenfeld NaName der Formulardatenquelle.
Wenn du im Formular einen anderen Datensatz wählst, wird etwas anderes angezeigt.

PeterW

Danke, mein Problem ist gelöst aber es hinterläßt bei mir Reste von Ratlosigkeit
Viele Grüße aus Berlin
Peter

Josef P.

Vielleicht bringt dieses Beispiel den Achso-Effekt:

Private Sub btmStart1_Click()
   Dim tmp As Variant
   dim i as long
   for i = 1 to 5
      tmp = Split([NaName], " ")
      MsgBox tmp(0) & ",   " & tmp(1)
   next
End Sub
Warum kann jetzt [NaName] verwendet werden, obwohl das Recordset gar nicht mehr da ist?

Gruß
Josef

PeterW

Solche Knobelaufgaben sind manchmal sicherlich hilfreich, bei mir aber funktioniert das nicht.
Viele Grüße aus Berlin
Peter

Josef P.

Du musst nicht knobeln, ich schrieb die Antwort bereits in #9. ;)
tmp = Split([NaName], " ")Das ist nichts anderes als
tmp = Split(Me.[NaName], " ").. und Me ist nicht das Recordset sondern in diesem Fall das Formular, in dem der Code läuft.

Wenn diese Info immer noch nicht hilft, kann ich leider nicht mehr weiter helfen. Mehr Varianten fallen mir nicht mehr ein, wie ich das erklären kann.

Gruß
Josef

trebuh

Hallo Peter.

Ich denke, es ist so wie Eckehard schon vermutet hat.
Der Button liegt doch bestimmt in einem Formular.
Und da ist nach dem laden der erste Datensatz aktiv. Sehr wahrscheinlich der, der Dir in der MsgBox
angezeigt wird.

Theoretisch musstest Du programieren, dass nach der MsgBox ein Datensatz weiter gesprungen werden soll.

ich denke, mit dem Code von Josef:
Private Sub btmStart1_Click()
   Dim tmp As Variant
   Dim rs As Database
   Set DB = CurrentDb()
   Set rs = DB.OpenRecordset("tblMitglieder")
   While Not rs.EOF
      tmp = Split(rs!NaName, " ")
      MsgBox tmp(0) & ",   " & tmp(1)
      rs.MoveNext
   Wend
End Sub

welcher ja (scheinbar) funktioniert, wird ja direkt auf die Tabelle zugegriffen.

Gruß