Neuigkeiten:

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

Mobiles Hauptmenü

Logik-Problem mit Schleife

Begonnen von hanskuhn, September 08, 2011, 12:53:36

⏪ vorheriges - nächstes ⏩

hanskuhn

Moin zusammen,

ich habe das merkwürdige Problem, dass mein Code richtig funktioniert und ich weiß nicht warum :)

Ich möchte aus meiner Tabelle in einer Schleife jeden Datensatz auslesen. 4 DS sollen allerdings ausgeschlossen werden. Zunächst bestimme ich die Anzahl der Schleifen-Durchläufe (intZ). Nun das (für mich) Merkwürdige: Ich lasse die Schleife durchlaufen und er überspringt automatisch die 4 DS, die ich in der DCount-Funktion ausgeschlossen habe. Ist das irgendeine VBA-Funktionalität?

intZ = DCount("[SZID]", "[tblStromZähler]", "SZID <> 8 And SZID <> 9 And SZID <> 10 And SZID <> 18")
    Set db1 = CurrentDb
    Set rst1 = db1.OpenRecordset("tblStromZähler", dbOpenDynaset)
    rst1.MoveFirst
    For intQ = 1 To intZ

Hondo

#1
Hallo,
wenn das funktioniert ist es reiner Zufall.
Besser ist folgender Code:

Dim db As DAO.Database
Dim rs AS DAO.Recordset
Set db = Currentdb
set rs = db.openRecordset("Select * From tblStromZähler Where SZID <> 8 And SZID <> 9 And SZID <> 10 And SZID <> 18", dbopenDynaset)
Do While not rs.eof
....
Loop
rs.close
set rs = Nothing
set db = Nothing


Gruß Andreas

PS: ein Grund warum es funktionieren könnte wäre dass die auszuschließenden DS am Ende des Recordsets wären.

hanskuhn

ZitatPS: ein Grund warum es funktionieren könnte wäre dass die auszuschließenden DS am Ende des Recordsets wären.

Tja, das habe ich auch vermutet - die DS befinden sich allerdings "verstreut" im rs.  ???

Danke für deinen alternativen Code-Vorschlag.

database

Hallo,

darf dem noch eine kleine Ergänzung hinzufügen:

Dim db As DAO.Database
Dim rs AS DAO.Recordset
Set db = Currentdb
set rs = db.openRecordset("Select * From tblStromZähler Where SZID <> 8 And SZID <> 9 And SZID <> 10 And SZID <> 18", dbopenDynaset)
If rs.RecordCount > 0 Then
rs.MoveFirst
Do While not rs.eof
....
rs.MoveNext
Loop
End If
rs.close
set rs = Nothing
set db = Nothing

hanskuhn

Alles klar, ich weiß zwar immer noch nicht, warum meine Lösung funktioniert, aber sicherheitshalber werde ich mal lieber euren Code einbauen.

Ich lasse den Thread nochmal ein paar Tage offen, vlt hat ja noch jmd nen Einfall...

database

Hallo,

meine Ergänzungen bewirken, dass die Schleife überhaupt nur dann angesprungen wird, wenn Datensätze vorhanden sind,
sowie dass nach dem Ablauf einer Aktion innerhalb der Schleife zum nächsten Datensatz gesprungen wird.
Wenn das rs.MoveNext nicht enthalten ist, hast du eine Endlosschleife, die es in sich hat. ;)

Durch die Verwendung der vorgeschlagenen Variante hast du ein Recordset zur Verfügung, welches die auszuschließenden DS erst gar nicht enthält.

Zitatvlt hat ja noch jmd nen Einfall...
Weiter gehe ich mit Andi konform - dass es bei dir funktioniert kann nur ein Zufall sein - du zählst die Datensätze ohne die Ausschlüsse,
öffnest ein Recordset welches ALLE DS enthält und beginnst dieses von oben nach unten zu durchlaufen.
Die Anzahl der Sprünge entspricht dabei der Anzahl der Datensätze minus Auszuschließende.
Wenn die Ausschlüsse so wie du das beschreibst irgendwo in der Tabelle stehen können diese NICHT übersprungen werden - sie müßten dazu tatsächlich am Ende der Tabelle stehen.






Hondo

Hallo,
Do While not rs.eof bewirkt das selbe.
Ohne Datensätze wird die Schleife nicht ausgeführt.
Insofern braucht man nur das MoveNext, und dafür stehen die Punkte in meinem Code.

Andreas

hanskuhn

Danke sehr, funktioniert auch alles wunderbar.

Hatte meinen Code genauso interpretiert wie du, database. Deshalb ja meine Verwunderung, die DS sind halt nicht am Ende der Tabelle. Leider kann ich die Datenbank nicht hochladen, da die Daten zu anonymisieren dann jetzt doch ein wenig zu aufwendig wäre...

database

Hallo,

@Andi
"Ohne Datensätze wird die Schleife nicht ausgeführt"
ist zweifelsfrei richtig, ich habe aber auch ein MoveFirst eingebaut und da würde es ohne Datensätze krachen - das habe ich nicht erwähnt.