Domino 9 und frühere Versionen > ND9: Entwicklung

Loop Until Res.Isendofdata überspringt letzten Datensatz

<< < (2/2)

ralph71:
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....

jBubbleBoy:
res.getValue muss nach res.nextRow aufgerufen werden  ;)

jBubbleBoy:
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  ;)

CarstenH:

--- Zitat von: ralph71 am 06.03.20 - 13:19:04 ---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.


--- Ende Zitat ---

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

ralph71:
Danke für Eure Hinweise. Eine Änderung der Verarbeitungslogik sollte jetzt die Lösung bringen. :-)

Navigation

[0] Themen-Index

[*] Vorherige Sete

Zur normalen Ansicht wechseln