Domino 9 und frühere Versionen > ND9: Entwicklung
Loop Until Res.Isendofdata überspringt letzten Datensatz
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