Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Laufzeitfehler 3061

Begonnen von Will1974, Dezember 23, 2023, 09:47:27

⏪ vorheriges - nächstes ⏩

Will1974

Hallo liebe Experten,

ich habe mit folgendem Code das Problem, dass ich immer den Laufzeitfehler 3061 erhalte (1 Parameter wurde erwartet, aber es wurden zu wenig Parameter übergeben). Meine Abfrage qry_MoveFolders beinhaltet nur die Spalte "Foldername" und liefert die erwarteten Datensätze.

Weiss jemand woran das liegt und kann mir helfen?

PS: Ich weiss noch nicht ob mein Code überhaupt so funktionieren wird, weil es ja schon beim Öffnen des Recordets in Zeile 5 hakt und ich gar nicht bis zum Ende komme - Ich für jeden Tipp dankbar :-). LG aus Österreich.


Dim rst As DAO.Recordset
Dim strSQL As String
   
strSQL = "Select * FROM qry_MoveFolders"
Set rst = CurrentDb.OpenRecordset(strSQL)

If rst.BOF And rst.EOF Then GoTo Quit
rst.MoveFirst

Do While Not rst.EOF
 
Dim fso As Object
Dim srcFolder As String
Dim dstFolder As String

Set fso = CreateObject("Scripting.FileSystemObject")
 
srcFolder = DLookup("Pfad_Ordner", "tbl_Einstellungen") & "\" & rst!Foldername
dstFolder = DLookup("Pfad_Historie", "tbl_Einstellungen")
 
fso.MoveFolder srcFolder, dstFolder & "\"
Set fso = Nothing

Loop

Quit:
Exit Sub

ebs17

In Deiner Abfrage wird eine Filterung vorhanden sein, wo ein verwendetes Formularsteuerelement nicht direkt durch die DB-Maschine ausgewertet werden kann. Durch das Recordset wird die Abfrage der DB-Maschine anders zugeführt als bei einem direkten Öffnen.
Mit freundlichem Glück Auf!

Eberhard

Will1974

#2
Hallo @ebs17,

danke für den Hinweis!
Ich löse das Problem nun damit, dass ich das Abfrageergebnis in die Tabelle tbl_Temp schreibe und danach das Recordset von dieser Tabelle öffne - So weit so gut, das funktioniert nun, obwohl man es bestimmt auch eleganter machen könnte  ::) .

Nun habe ich aber ein weiteres Problem in meinem Code festgestellt...
Es wird nur der erste Ordner verschoben, nach Durchführung des Loops erhalte ich die Meldung "Pfad nicht gefunden" bei Zeile 21.

Hast du auch hier einen Denkanstoß/Tipp oder sogar die Lösung?

ebs17

Zur Bewegung im Recordset benötigt man ein rst.MoveNext.

Zum Code selber gibt es noch viele Hinweise.
- Das FSO-Objekt sollte einmalig und VOR der Schleife erzeugt werden.
- Ein Recordset, das man öffnet, sollte man selbst explizit schließen.
- Die DLookups in der Schleife sehen recht unbeholfen aus. tbl_Einstellungen mit den Pfaden würde ich direkt in die Abfrage, mit der das Recordset geöffnet wird, integrieren.

If rst.BOF And rst.EOF Then GoTo Quit
rst.MoveFirst

Do While Not rst.EOF
Die ersten beiden Zeilen können ersatzlos gestrichen werden. Mit der verwendeten richtigen Schleifenbedingung passiert sowieso nichts, wenn das Recordset leer ist. Ansonsten steh bei einem neu geöffneten Recordset der Datenzeiger automatisch auf dem ersten Datensatz.

Zur geklärten Frage:
Grundlagen - SQL ist leicht (16) - Abfragen mit Parametern
Mit freundlichem Glück Auf!

Eberhard

Will1974

Hallo @ebs17,

ich habe den Code nun nach deinem Vorschlag adaptiert, bis auf die unschönen Dlookups (da muss ich tiefer in die geschachtelten Abfragen eingreifen).

Aber nun erhalte ich den Laufzeitfehler 91 - Objektvariable oder With-Blockvariable nicht fetgelegt  :o
Mein Code sieht nun so aus:

Dim rst As DAO.Recordset
Dim strSQL As String
Dim fso As Object
   
strSQL = "Select * FROM tbl_Temp"
Set rst = CurrentDb.OpenRecordset(strSQL)
Set fso = CreateObject("Scripting.FileSystemObject")

Do While Not rst.EOF

Dim srcFolder As String
Dim dstFolder As String
 
srcFolder = DLookup("Pfad_Ordner", "tbl_Einstellungen") & "\" & rst!Foldername
dstFolder = DLookup("Pfad_Historie", "tbl_Einstellungen")

fso.MoveFolder srcFolder, dstFolder & "\"
Set fso = Nothing

rst.MoveNext
Loop

rst.Close
Set rst = Nothing

ebs17

Set fso = NothingDas Killen des Objektes sollte hinter das Ende der Schleife verschoben werden. Wie Du Dir denken kannst: Programmieren ist das Niederschreiben von logischen Anweisungen.
Mit freundlichem Glück Auf!

Eberhard

Will1974

Hallo @ebs17,

genau das wars, jetzt funktioniert es wie gewünscht.

ZitatWie Du Dir denken kannst: Programmieren ist das Niederschreiben von logischen Anweisungen.
Das ist mir völig klar. Ich bin kein professioneller Programmierer, habe aber sehr viel Freude daran immer wieder Neues zu lernen und meine Ideen umzusetzen  :). Es ist schön, dass man als Hobbybastler durch Foren wie dieses eine Chance hat, sich weiter zu entwickeln.

Vielen lieben Dank für deine Hilfe und ein schönes Weihnachtsfest!

LG aus Österreich

Beaker s.a.

Noch eine Kleinigkeit, - die Deklarationen (Dim ...) sollte man auch
nicht in der Schleife machen, sondern an den Anfang der Prozedur stellen.
Das unterstützt m.E. die Lesbarkeit des Codes.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)