Autor Thema: Loop Until Res.Isendofdata überspringt letzten Datensatz  (Gelesen 3168 mal)

Offline ralph71

  • Junior Mitglied
  • **
  • Beiträge: 76
Hallo zusammen,

über den unten (abgekürzten) Code hole ich mir aus einer SQL-Datenbank Datensätze (res) und durchlaufe diese über eine Do-Loop.

Dim res As New ODBCResultSet
....
Res.FirstRow
Do
        'Mach irgendwas
   Res.NextRow
Loop Until Res.Isendofdata

Wenn ich das laufen lasse, dann führt mir der Loop den Code "Mach irgendwas" nur einmal aus, obwohl im ODBCResultSet 2 Datensätze sind (sehe ich im Debugger auch unter Currentrow = 2)

Ablauf:
hole den ersten Satz aus res (Currentrow =1) --> ""Mach irgendwas" --> gehe zum nächsten Satz (Currentrow = 2) --> Loop Until Res.Isendofdata --> Ende!!
Die Bedingung Isendofdata killt den letzten Satz. res ist doch noch nicht auf endofdata (steht ja auf Satz 2)????
Wo ist mein Denkfehler bzw wie erreiche ich, dass er den letzten Satz auch bearbeitet?
Danke!

Grüße
Ralph


Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Loop Until Res.Isendofdata überspringt letzten Datensatz
« Antwort #1 am: 06.03.20 - 12:19:51 »
versuch es mal damit:
Code
res.Execute
Do
	res.NextRow
	'-- mach was
Loop Until res.IsEndOfData
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline ralph71

  • Junior Mitglied
  • **
  • Beiträge: 76
Re: Loop Until Res.Isendofdata überspringt letzten Datensatz
« Antwort #2 am: 06.03.20 - 12:23:43 »
"Res.Execute" hab ich natürlich drin.

Was mir völlig unverständlich ist_

Do
        'Mach irgendwas
   Res.NextRow
Loop

... führt zu keinem Fehler. Endlos-Loop. Versteh ich nicht. Kann das am ODBC-Treiber liegen?

Offline ralph71

  • Junior Mitglied
  • **
  • Beiträge: 76
Re: Loop Until Res.Isendofdata überspringt letzten Datensatz
« Antwort #3 am: 06.03.20 - 12:34:49 »
Treffer!
Ein

Res.Execute
Do
      Res.NextRow
Loop Until Res.Isendofdata

Saved my day!

Offline ralph71

  • Junior Mitglied
  • **
  • Beiträge: 76
Re: Loop Until Res.Isendofdata überspringt letzten Datensatz
« Antwort #4 am: 06.03.20 - 13:19:04 »
Sorry, zu früh gefreut.

Geht so nicht...

Res.Execute
Do
     'mach was
     Res.NextRow
     'mach was
Loop Until Res.Isendofdata

Ablauf:
nimmt den ersten Satz --> macht was --> NextRow (macht er nicht!! weil der Currentrow =1 bleibt) --> mach was --> Loop --> mach was --> NextRow (macht er!! Currentrow =2) --> mach was --> ENDE
Dh er killt wieder den letzten Satz

Ich checks ned... Macht keinen Sinn.

Offline ralph71

  • Junior Mitglied
  • **
  • Beiträge: 76
Re: Loop Until Res.Isendofdata überspringt letzten Datensatz
« Antwort #5 am: 06.03.20 - 13:37:56 »
so, habe jetzt den Code auf ein Beispiel reduziert:

Sub Initialize

Dim con As New ODBCConnection
Dim qry As New ODBCQuery
Dim res As New ODBCResultSet
Dim ProfilMitgliedsnummer As String
Dim NextProfilMitgliedsnummer As String
Dim ProfilMail As String

   If Con.ConnectTo("webprofil")Then
      Set Qry.Connection = Con
      Qry.SQL = "Select nr,email,optin from users WHERE deleted_at Is Null and nr = 12345678"

      Set Res.Query = Qry
      Res.Execute    
   End if


   Do
      ProfilMitgliedsnummer = Res.Getvalue("nr",ProfilMitgliedsnummer)
      ProfilMail = Res.Getvalue("email",ProfilMail)
      
      Res.NextRow
      
      NextProfilMitgliedsnummer = Res.Getvalue("nr",NextProfilMitgliedsnummer)
      
      If NextProfilMitgliedsnummer = ProfilMitgliedsnummer then
         'machwas
      End if
      
         
   Loop Until Res.Isendofdata   
   
End Sub

Verhalten: nach dem Res.NextRow und Loop holt mir ProfilMail = Res.Getvalue("email",ProfilMail) nicht den nächsten Satz....

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Loop Until Res.Isendofdata überspringt letzten Datensatz
« Antwort #6 am: 06.03.20 - 13:42:05 »
res.getValue muss nach res.nextRow aufgerufen werden  ;)
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Loop Until Res.Isendofdata überspringt letzten Datensatz
« Antwort #7 am: 06.03.20 - 13:48:19 »
Dein Problem ist das neben dem Auslesen der Tabelle auch eine Verarbeitung der Daten durchgeführt wird, dabei kommst Du durcheinander - mein Tipp mach eins nach dem anderen, also zuerst nur Daten lesen, dann Daten auswerten / verarbeiten  ;)
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline CarstenH

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 671
  • Geschlecht: Männlich
Re: Loop Until Res.Isendofdata überspringt letzten Datensatz
« Antwort #8 am: 06.03.20 - 14:54:30 »
Res.Execute
Do
     'mach was
     Res.NextRow
     'mach was
Loop Until Res.Isendofdata

Ablauf:
nimmt den ersten Satz --> macht was --> NextRow (macht er nicht!! weil der Currentrow =1 bleibt) --> mach was --> Loop --> mach was --> NextRow (macht er!! Currentrow =2) --> mach was --> ENDE
Dh er killt wieder den letzten Satz

Ich checks ned... Macht keinen Sinn.


Das Verhalten ist ganz einfach erklärt: Der erste (!) Aufruf von NextRow positioniert immer auf Row 1, da es ja noch keine vorherige Position gab und diese quasi undefiniert ist. Du kannst zwar schon auf Daten zugreifen weil DU weißt dass der Zeiger auf dem ersten Datensatz stehen müsste aber der interne Zeiger, mit dem NextRow arbeitet, steht auf Null.

Damit sieht es so aus als würde der erste Datensatz doppelt angesprungen werden aber das wird er nicht da erst nach dem NextRow überhaupt ein definierter Zustand vorliegt!
Ein anderes Vorgehen, also mit FirstRow etc. wird ausschließlich dann benötigt, wenn der erste Datensatz eine andere Behandlung als der Rest bekommen muss.

Daher gilt, was dir jBubbleBoy im ersten Post geschrieben hat:
result.Execute
Do
  result.NextRow
  code for processing one row
Loop Until result.IsEndOfData

Ich würde unabhängig davon Code zur Fehlerbehandlung empfehlen und Zwischenmeldungen (z.B. Counter) einbauen.

HTH
Carsten

Offline ralph71

  • Junior Mitglied
  • **
  • Beiträge: 76
Re: Loop Until Res.Isendofdata überspringt letzten Datensatz
« Antwort #9 am: 10.03.20 - 13:07:19 »
Danke für Eure Hinweise. Eine Änderung der Verarbeitungslogik sollte jetzt die Lösung bringen. :-)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz