Hallo Experten!
Ich möchte eine Aktualisierungsabfrage über einen Button im Formular starten. Die Aktualisierungsabfrage sieht so aus:
UPDATE tblEingabe SET tblEingabe.Prd = [Formulare]![frmPrdEingabe]![Prdfrm];
Meine Prozedur mit der ich sie Abfrage starten will lautet:
Function Aend()
Dim db As DAO.Database
Set db = CurrentDb()
db.Execute "abfPrdBearbeiten", dbFailOnError
End Function
Die Prozedur wird aus einem Klassenmodul heraus aufgerufen.
Ich bekomme den Laufzeitfehler 3061..Parameter fehlen...
Was kann man tun? Danke für eure Hilfe!
Den DoCmd-Befehl möchte ich dabei vermeiden.
Hallo,
Formbezüge in Abfragen sind meistens nicht optimal.
Function Aend()
Dim db As DAO.Database
Set db = CurrentDb()
db.Execute "UPDATE tblEingabe SET tblEingabe.Prd = " & nz(Me![Prdfrm],0) dbFailOnError
End Function
Wobei PRD den Datentyp Zahl,Long in der Tabelle aufweisen muss.
Bei TEXT müssen Hochkommata verwendet werden:
db.Execute "UPDATE tblEingabe SET tblEingabe.Prd = '" & Me![Prdfrm] & "'", dbFailOnError
Es stellt sich die Frage, ob und warum die Aktualisierung nicht gleich über ein gebundenes Form geschehen kann...
Vielen Dank, Franz!
Ein gebundenes Formular war leider nicht möglich, da ich für eine Spalte mehrere Daten übertragen muss. Denn in einer Auftragsnummer können mehrere Produktnummern enthalten sein...
Ich hatte gehofft der vereinfachte Code würde mich weiterbringen...Tut er aber leider nicht :(
Ich habe die Spalten Begdat und Enddat in der Tabelle (Datumsformat) und die Felder Begdat und Enddat im Formular, die ebenfalls aktualisiert werden sollen. Die Aktualisierung soll für alle Datensätze vorgenommen werden, die in der Tabelle die gleiche Auftragsnummer haben, wie im Formular in AftNrfrm eingegeben wird. Ich bekomme immer einen Laufzeitfehler 3075:
Function Aend()
Dim db As DAO.Database
Set db = CurrentDb()
db.Execute "UPDATE tblEingabe SET tblEingabe.Prd='" & Me![Prdfrm] & "', tblEingabe.Beg='" & Me![BegDat] & "', tblEingabe.End='" & Me![EndDat] & "' WHERE tblEingabe.AftNr = " '& Me![AftNrfrm], dbFailOnError
End Function
Vielen Dank nochmals für eure Hilfe!
Um keinen Kampf mit oder gegen Datentypen ausfechten zu müssen, schlage ich die Verwendung einer Parameterabfrage vor.Private Sub DeinKnopf_Click()
'besser wäre es, eine gespeicherte (ggf. auch versteckte) Abfrage verwenden.
Const QRY As String = _
"UPDATE tblEingabe" & _
" SET Prd = [@Prd]," & _
" Beg = [@Beg]," & _
" End = [@End]" & _
" WHERE AftNr = [@AftNr];"
On Error GoTo e
With CurrentDb.CreateQueryDef(vbNullString, QRY)
.Paramters("@Prd") = Me.Prdfrm
.Paramters("@Beg") = Me.BegDat
.Paramters("@End") = Me.EndDat
.Paramters("@AftNr") = Me.AftNrfrm
.Execute dbFailOnError
End With
Exit Sub
e:
MsgBox "Fehler-Nr: " & Err.Number & vbCrLf & vbCrLf & Err.Description
End Sub
Hallo,
Dein Argument "zieht" nicht... Vermeide Mehrwertfelder im Allgemeinen und setze das mit einer weiteren Tabelle (tblAuftragsPositionen) in 1:n-Beziehung um.
Für SQL muss das Datum im USA- oder ISO-Format vorliegen, zudem fehlt ein abschließendes Hochkomma (falls AftNr vom Datentyp TEXT):
Zitatdb.Execute "UPDATE tblEingabe SET tblEingabe.Prd='" & Me![Prdfrm] & "', tblEingabe.Beg=" & Format(Me![BegDat],"\#yyyy-mm-dd\#") & ", tblEingabe.End=" & Format(Me![EndDat],"\#yyyy-mm-dd\#") & " WHERE tblEingabe.AftNr = '" & Me![AftNrfrm] & "'", dbFailOnError
Hallo!
Ich habe Variante von Franz probiert...Leider funktioniert es nicht...Ab dem letzten = wird alles auskommentiert...Wo liegt der Fehler?
@ Franz: Ja das stimmt wohl, das ist kein gutes Argument. Aber das ganze gestaltet sich noch etwas komplexer: Es kommt noch ein Zeitfaktor hinzu. Ich will die Anzahl der Aufträge pro Tag und pro Produktgruppe wissen und in einer pivottabelle filtern können, deshalb wird für jede Produktnummer pro Auftragstag noch weitere Datensätze über VBA erzeugt. Aber vlt kann man das auch anders lösen?
Unter http://www.access-o-mania.de/forum/index.php?topic=22511.0 habe ich bereits meine Tabellenbeziehungen hochgeladen.
Lg
Hallo,
stelle mal Deinen aktuellen Code mit C&P hier herein....
Was heißt "auskommentiert"?
Außerdem stimmt das Ganz nicht mit dem Beziehungsfenster überein. Dort gibt es keine tblEingabe und auch keine solchen Tabellenfelder....
Bring das Alles auf den selben korrekten Stand und vergleich alle Tabellen- und Feldnamen auf Authentizität.
@Lachtaube
weist du ob es einen Vorteil bringt, wenn man die Parameters Deklaration in ParameterAbfragen einsetzt, oder ob das für den Hugo ist.
Hi,
könnte helfen:
https://dbwiki.net/wiki/Access_Design:Parameterabfrage
Bei Kreuztabellen ist die Parameter-Deklaration verpflichtend - ansonsten eher Kür. Es wird mit der Delaration jedoch der Index, falls man ihn statt des Namens einsetzt, festgelegt, der ansonsten von der Reihenfolge des Auftreten innerhalb der Abfrage bestimmt wird.
Das ist so ähnlich wie das Weglassen von Option Explicit in VBA - beim Verschreiben wird man mit neuen Parametern bzw. Variablen beglückt. :)
@Franz, interessanter Link.
@Lachtaube, mit dem Index meinst du wohl die Reihenfolge in der Parameters Collection sollte man ein QueryDef Objekt einsetzen?
Hallo!
Danke für eure tipps und sorry, dass ich mich erst so spät melde...
Ich weiß nicht genau so mein Fehler in dem code lag, aber ich habe einfach die reihenfolge, in der die felder geupdatet werden sollen und nun geht es...
Lg und danke nochmal!