Neuigkeiten:

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

Mobiles Hauptmenü

Laufzeitfehler 3021 bei Schleife

Begonnen von Mexi123, Januar 02, 2013, 10:32:08

⏪ vorheriges - nächstes ⏩

Mexi123

Hallo zusammen,

sehe momentan den Baum vor lauter Wäldern nicht mehr :-)

Ich beschäftige mich mit einem ungebundenen Formular, welches Werte in eine Tabelle zurück schreiben soll. Dabei sollen die eingegebenen Formular-Werte in vorhandene Datensätze zurückgeschrieben werden.

Folgenden Code habe ich dafür aufgebaut:


Dim rst As New ADODB.Recordset
Set rst = New ADODB.Recordset
       
With rst
.Open "tblModell", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
   
.MoveFirst
   
Do Until .EOF
   
.Find "[Vorgang] like '" & Me!DfVorgang & "'" 'können mehrere Vorgänge sein

rst!FehlerPlan = Me!Df FehlerPlan
rst!FehlerIst = Me!DfFehlerIst
rst!AuswertungPlan = Me!DfAuswertungPlan
rst.Update
   
.MoveNext
   
Loop

End With
Set rst = Nothing



Die Daten werden zwar in der Tabelle in die Datensätze zurückgeschrieben aber bei o.g. Code erhalte ich immer eine Fehlermeldung: Laufzeitfehler 3021. Ich würde diese gerne umgehen, weiss aber momentan nicht in welche Zeile ich etwas ergänzen muss, um entweder den Laufzeitfehler abzufangen oder die Schleifen sauber zu Ende zu führen. Wer kann mir helfen?

Danke im voraus für Euren Rat

MzKlMu

#1
Hallo,
warum tust Du Dir das an und verwendest ein ungebundens Formular?
Mit einem gebundenen Formular brauchst Du gar keinen Code, Werte ändern, fertig.

Und wenn mehrere DS geändert werden sollen, mache eine Aktualisierungsabfrage und verzichte auf das Recordsetgedöns und die Schleife.
Mit einer Aktualisierungsabfrage geht das so einfach und schnell, so schnell kannst Du gar nicht blinzeln.
Gruß Klaus

bahasu

Hi

ich vermisse in der Schleife den Befehl:
.edit

und nach der Schleife:
rst.close

Harald
Servus

Mexi123

Hi,

danke erst mal  ...

Im Augenblick ist mein Formular ungebunden und über eine temporäre Tabelle schreibe und verändere ich die Daten in meiner Quelltabelle.
MzKiMu: Normalerweise ist dein Hinweis auch konsequent der richtige Weg ...

Ich möchte nun aber gerne mit dem Code meine Aufgabe erledigen, da ich den Code dann wiederholend auch in andere Formularen anwenden möchte. In meinen speziellen Fall zu diesem speziellen Anlass würde ich gerne die Anzahl der queries so klein wie möglich halten wollen.

Der Code an sich funktioniert ja bereits (bis auf den Laufzeitfehler ...) Nur mit .edit komme ich nicht weiter. Die Fehlermeldung kommt wieder.

Vielleicht einen anderen Tipp, was ich ausprobieren kann?

Gruß

Mex


bahasu

Hi,

in welcher Zeile tritt der Fehler auf?

Harald
Servus

Mexi123

Hi Harald,

wenn ich debugge hängt der Code in der Zeile "rst!FehlerPlan = Me!Df FehlerPlan" stehen.

Gruß

Mex

bahasu

Hi,

hast Du schon geprüft, ob der gewünschte Datensatz gefunden wurde?
z.B. mit rst.NoMatch bzw. mit msgbox rst.FehlerPlan

Harald
Servus

DF6GL

#7
Hallo,


wenn Find nichts mehr findet, steht der Cursor auf EOF und die Zuweisungen erzeugen Fehler...

Wenn so, dann:

.
.
.Find "[Vorgang] like '" & Me!DfVorgang & "'"      'können mehrere Vorgänge sein
If .EOF Then Exit Do
!FehlerPlan = Me!DfFehlerPlan
.
.



Ich würde aber das "Such"-Kriterium gleich als SQL-String in die Open-Methode einbauen und auch auf "Like" verzichten, d. h. mit dem "="-Operator vergleichen.

Und noch besser: das Ganze als Update-SQL ausführen.

MzKlMu

Hallo,
Feldnamen mit Leerzeichen sind in [] Klammerpaar einzuschließen.
Daher sollte man Leer und Sonderzeichen vermeiden.
Versuche es mal so:
rst!FehlerPlan = Me![Df FehlerPlan]

Zitatwürde ich gerne die Anzahl der queries so klein wie möglich halten wollen
Das ist keine gute Idee, eine Datenbank mit wenig Querys ist nicht besonders performant.

Und der Zugriff auf eine Tabelle direkt ist langsamer als über eine gespeicherte Abfrage.
Gruß Klaus

Mexi123

Hallo zusammen,

DANKE!!!

Der Tipp "If .EOF Then Exit Do" hat geholfen und passt zudem was ich gerne möchte.

Zwischenzeitlich hatte ich mit On Error Resume Next bzw. On Error Goto 0 die Fehlermeldung zwar abgeschaltet, aber das wäre zuviel am Code vorbei "gemogelt".

Viele Grüße

Mex