Neuigkeiten:

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

Mobiles Hauptmenü

Aktualisierungsabfrage mit vba öffnen

Begonnen von Knopf, Juli 03, 2017, 11:03:10

⏪ vorheriges - nächstes ⏩

Knopf

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.

DF6GL

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...

Knopf

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!

Lachtaube

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
Grüße von der (⌒▽⌒)

DF6GL

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

Knopf

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

DF6GL

#6
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.

markusxy

@Lachtaube
weist du ob es einen Vorteil bringt, wenn man die Parameters Deklaration in ParameterAbfragen einsetzt, oder ob das für den Hugo ist.


Lachtaube

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. :)
Grüße von der (⌒▽⌒)

markusxy

@Franz, interessanter Link.
@Lachtaube, mit dem Index meinst du wohl die Reihenfolge in der Parameters Collection sollte man ein QueryDef Objekt einsetzen?

Knopf

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!