SQL-Insert in Leseschleife

Hallo ACCESS-Experten,

mein Problem in Access 2003 (wahrscheinlich nicht versionsabhängig):

Ich arbeite eine SQL-Leseschleife ab und muss zu jedem einzelnen Satz ggf. mehrere Sätze in eine andere Tabelle schreiben. Probematisch ist, dass das SQL des INSERT die Abarbeitung der Leseschleife stört. Es wird immer nur der erste Satz verarbeitet. Ausschnitt aus dem Programm (ich habe das vereinfacht - im Original gibt es deutlich mehr Funktionen, die allerdings nichts mit meinem Problem zu tun haben):

Private Sub PrepareNames()

Dim SQL As String
Dim db As Database
Dim RS As Recordset

' Ausschalten des Bestätigungsdialoges
Application.SetOption "confirm action queries", 0

Set db = CurrentDb

Set RS = db.OpenRecordset("Bestand")
On Error GoTo 0
RS.MoveFirst
While Not RS.EOF
 BuildNames RS!ID, \_
 RS!NameVN, \_
 RS!VornameVN, \_
 RS!NameVP, \_
 RS!VornameVP
Wend
RS.Close
End Sub

Private Sub BuildNames(ID As Long, \_
 NameVN As String, \_
 VornameVN As String, \_
 NameVP As String, \_
 VornameVP As String)
Dim SQL As String
Dim db As Database
Set db = CurrentDb

' Aufbau des Namens-Index

If Len(NameVN) \> 0 Then
 SQL = "INSERT INTO SuchName " & \_
 "(Satznummer, Suchbegriff, Rolle) VALUES(" & \_
 Str(ID) & ", """ & LTrim(RTrim(NameVN)) & """, """ & \_
 "VN"")"
 DoCmd.RunSQL (SQL)
End If

If Len(VornameVN) \> 0 Then
 SQL = "INSERT INTO SuchVorname " & \_
 "(Satznummer, Suchbegriff, Rolle) VALUES(" & \_
 Str(ID) & ", """ & LTrim(RTrim(VornameVN)) & """, """ & \_
 "VN"")"
 DoCmd.RunSQL (SQL)
End If

If Len(NameVP) \> 0 Then
 SQL = "INSERT INTO SuchName " & \_
 "(Satznummer, Suchbegriff, Rolle) VALUES(" & \_
 Str(ID) & ", """ & LTrim(RTrim(NameVP)) & """, """ & \_
 "VP"")"
 DoCmd.RunSQL (SQL)
End If

If Len(VornameVP) \> 0 Then
 SQL = "INSERT INTO SuchVorname " & \_
 "(Satznummer, Suchbegriff, Rolle) VALUES(" & \_
 Str(ID) & ", """ & LTrim(RTrim(VornameVP)) & """, """ & \_
 "VP"")"
 DoCmd.RunSQL (SQL)
End If

End Sub

Wie bekomme ich es hin, in einer SQL-Leseschleife einen bzw. mehrere SQL-Inserts auszuführen, ohne dass die Leseschleife zurückgesetzt wird?

Vielen Dank im Voraus
ThoK

Hallo,

vermutlich wird die Schleife nicht zurückgesetzt, sondern gar nicht erst durchlaufen.
Du hast einen entscheidenden Eintrag vergessen: Movelast
vor Movefirst.

Set RS = db.OpenRecordset(„Bestand“)
On Error GoTo 0

RS.MoveLAST

RS.MoveFirst

Grüße aus Rostock
Wolfgang
(Netwolf)

Hallo Netwolf,

vielen Dank für Deine Antwort.

vermutlich wird die Schleife nicht zurückgesetzt, sondern gar nicht erst durchlaufen. Du hast einen entscheidenden Eintrag vergessen Movelast vor Movefirst.

Allerdings habe ich etwas Entscheidendes vergessen, aber nicht das, was Du meintest:

Set RS = db.OpenRecordset("Bestand")
On Error GoTo 0
RS.MoveFirst
While Not RS.EOF
 BuildNames RS!ID, \_
 RS!NameVN, \_
 RS!VornameVN, \_
 RS!NameVP, \_
 RS!VornameVP

MoveNext

Wend
RS.Close

Ich hatte das vergessen, weil ich ursprünglich ein SQL-Konstrukt drin hatte, das kein Movenext erforderte.

Kaum macht man’s richtig, schon klappt’s.

Thomas