Neuigkeiten:

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

Mobiles Hauptmenü

Versehentlich Endlosschlaufe erstellt

Begonnen von Minotauros, Oktober 07, 2020, 15:11:31

⏪ vorheriges - nächstes ⏩

Minotauros

Guten Tag

Ich möchte durch ein Recordset "loopen" und dabei jeden Datensatz duplizieren und dann ein paar der Felder der neuen Records anpassen. Für jeden Original-Datensatz wird zudem noch ein Record in einem anderen Recordset hinzugefügt.

Dafür habe ich einen (meiner Meinung nach eleganten) Code gefunden:

sqlSource = "SELECT PositionID, Pos, Objekt_F, Menge, Einheit_F, Position_F, Liste_F " & _
                "FROM tblListe INNER JOIN (tblPosition INNER JOIN tblMenge ON tblPosition.PositionID = tblMenge.Position_F) ON tblListe.ListeID = tblPosition.Liste_F " & _
                "WHERE tblListe.Dokument_F= " & Me.cboLieferscheine & ";"
        Set rstSource = dbsCurrentDB.OpenRecordset(sqlSource, dbOpenDynaset)
        Set rstNew = rstSource.Clone
        Set rstPreis = dbsCurrentDB.OpenRecordset("tblPreis", dbOpenDynaset, dbAppendOnly)
        With rstSource
            Do Until .EOF           'Durch Quelle iterieren
                With rstNew
                    .AddNew
                    For Each fld In rstSource.Fields        'Alle bestehenden Felder kopieren
                        Select Case fld.Name
                            Case "PositionID"
                            Case "Position_F"
                                !Position_F = !PositionID
                            Case "Liste_F"
                                !Liste_F = Me.ListeID
                            Case Else
                                .Fields(fld.Name).Value = fld.Value
                        End Select
                    Next
                    .Update
                    .Bookmark = .LastModified
                End With
                With rstPreis       'Neue Preis-Positionen anfügen
                    .AddNew
                    !Position_F = rstNew!PositionID
                    !Einzelpreis = 0
                    ![MWST-Satz] = DLookup("[MWST]", "tblObjekt", "ObjektID = " & rstSource!Objekt_F)
                    .Update
                End With
                .MoveNext
            Loop
        End With

Das Problem: Nachdem ich eigentlich nur 2 Datensätze kopieren wollte hat sich das Programm nach 8000 kopierten Datensätzen aufgehängt.  ;D

Bei näherer Betrachtung stellte ich fest, dass es sich bei der Do Until-Schlaufe um eine Endlosschlaufe handelt und EOF nie erreicht wird.

Meine Vermutung: Wenn im geklonten rstNew-Recordset ein neuer Datensatz hinzugefügt wird, verlängert sich auch rstSource, weshalb nie das Ende erreicht wird.

Wie kann ich das am besten lösen?

Vielen Dank für alle Hinweise.
Freundliche Grüsse


TomKelly

Hallo Minotaurus

Gehe ich richtig in der Annahme, dass die PositionID ein Autofeld ist? Wenn ja, und Acces noch nichts vermurkst hat (erkennbar durch grosse negative Werte im Autofeld, passiert leider ab und zu, und dann wird die einfache Lösung nicht funktionieren) kannst Du folgenden Ansatz wählen:
Lies zuerst die letzte PositionID aus und begrenze die Source auf diesen Wert:

lngLetzterWert = DMAX("PositionID", "tblPosition")
sqlSource = "Select ... ... Me.cboLieferscheine & " AND PositionID <= " & lngLetzterWert & ";"

Gruss
TomKelly