Laufzeitfehler 3067

Hallo zusammen,

hab ein kleines Problem. Bei folgender Abfrage in VBA kommt der Fehler 3067 („Die Abfrage muss auf mindestens einer Tabelle oder Abfragebasieren“):

CurrentDb.Execute " SELECT [Arbeitsplatz],[SummevonFeld3] INTO " & b & " FROM '" & c

Habe ich dort einen Syntaxfehler?
Das komische ist, dass genau die gleiche Abfrage bei einem anderen Formular funktioniert. (ich hab’s bloß kopiert)

Woran kann das liegen?

Viele Grüße von Beate

Hallo,

vermutlich:

CurrentDb.Execute " SELECT [Arbeitsplatz],[SummevonFeld3]
INTO " & b & " FROM " & c

Habe ich dort einen Syntaxfehler?

Ja, wenn man davon ausgeht, daß „b“ und „c“ String-Variablen sind, in denen in „a“ ein Abfragename und in „c“ ein Tabellenname steht.

Das komische ist, dass genau die gleiche Abfrage bei einem
anderen Formular funktioniert. (ich hab’s bloß kopiert)

glaub ich nicht…

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

hallo Franz,

danke für deine schnelle Antwort.

doch… bei einem anderen Formular klappts.
Ich schick dir nochmal die komplette Ereignisprozedur, denn so seh ich erstmal keinen Fehler.

Dim rs_e, rs_m, rs_A As Recordset
Dim a, b, c As String
Dim db As Database

Set db = CurrentDb()
Set rs = db.OpenRecordset(„Eingabe“)

DoCmd.SetWarnings False

a = Me.Produkt

Do Until rs![Produkt] = a
rs.MoveNext
Loop

Me.Maschinenanzahl = rs![Maschine/Jahr]
Me.Requery
Me.Refresh

b = „tbl_“ & a
c = „Abfr_“ & a

DoCmd.DeleteObject acTable, b
CurrentDb.Execute "SELECT [Arbeitsplatz],[SummevonFeld3] INTO " & b & " FROM " & c
DoCmd.RunSQL „Alter table " & b & " add column Kosten String“
DoCmd.RunSQL „Alter table " & b & " add column Stunden String“

Set rs_m = db.OpenRecordset(b)

rs_m.MoveFirst
Do Until rs_m.EOF
Do Until rs_m![Arbeitsplatz] = Me.Arbeitsplatz
rs_m.MoveNext
Loop

rs_m.Edit
rs_m![Kosten] = Me.Zeit
rs_m![Stunden] = Me.Stunden
rs_m.Update
rs_m.MoveNext

On Error GoTo Err_cmd_MoveNext

DoCmd.GoToRecord , , acNext

Loop

DoCmd.SetWarnings True

Hallo,

seh ich erstmal keinen Fehler.

aber ich jede Menge…
Woher hast Du denn solchen Code? Eigentlich wäre fast jede Zeile anzumeckern, von der Methodik ganz zu schweigen…

Dim rs_e As DAO.Recordset, rs_m As DAO.Recordset, rs_A As DAO.Recordset
Dim a As String, b As String, c As String 'richtig deklarieren

Dim db As DAO.Database

Set db = CurrentDb()

Set rs = db.OpenRecordset(„Eingabe“,dbOpenSnapshot) ’ was ist denn „Eingabe“ ??

DoCmd.SetWarnings False

a = Me.Produkt

Do Until rs![Produkt] = a
rs.MoveNext
Loop

Me.Maschinenanzahl = rs![Maschine/Jahr]

'Sonderzeichen sind tötlich in Namen…

‚statt dessen:
Me.Maschinenanzahl =Dlookup("[Maschine/Jahr]",„Eingabe“,"[Produkt] =‘" & a & „’“

Me.Requery 'wozu?
Me.Refresh 'wozu?

b = „tbl_“ & a 'hier wird’s ganz schlimm: Für jedes Produkt eine eigene Tabelle???

c = „Abfr_“ & a 'Für jedes Produkt eine eigene Abfrage???

DoCmd.DeleteObject acTable, b 'irgendwann platzt die DB dadurch. Deshalb ist Komprimieren/Reparieren periodisch nötig.

CurrentDb.Execute "SELECT [Arbeitsplatz],[SummevonFeld3] INTO
" & b & " FROM " & c 'das ist syntaktisch richtig, im Gegensatz zum vorherigen Posting.
DoCmd.RunSQL „Alter table " & b & " add column Kosten String“ '„Kosten“ wirklich(!!??) Text???
DoCmd.RunSQL „Alter table " & b & " add column Stunden String“ '„Stunden“ wirklich(!!??) Text???

’ besser auch db.Execute statt Docmd.RunSQL benutzen.

Set rs_m = db.OpenRecordset(b, dbOpenDynaset)

rs_m.MoveFirst
Do Until rs_m.EOF
Do Until rs_m![Arbeitsplatz] = Me.Arbeitsplatz
rs_m.MoveNext
Loop

’ anstelle:
rs_m.Findfirst „[Arbeitsplatz] = '“ & Me.Arbeitsplatz & „’“
if not Rs.Nomatch Then

rs_m.Edit
rs_m![Kosten] = Me.Zeit
rs_m![Stunden] = Me.Stunden
rs_m.Update

End if

rs_m.MoveNext

On Error GoTo Err_cmd_MoveNext

DoCmd.GoToRecord , , acNext 'statt dieses Makro nimm doch besser einen Recordset aus dem Form-Recordsetclone

Loop

DoCmd.SetWarnings True

’ Offene Recordsets sollen am Ende geschlossen und die Projektvariablen auf „Nothing“ gesetzt werden.

Allgemein sind solche Tabellemanipulationen von Übel. Tabelle sollten während der Entwicklung nach den Normalisierungsregeln einmalig erstellt und nur in wirklich nötigen Ausnahmefällen dynamisch erzeugt werden.

Soweit die Kommentare, ohne zu wissen, was eigentlich im Endeffekt herauskommen soll.

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!