Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Knopf am Juli 03, 2017, 11:03:10

Titel: Aktualisierungsabfrage mit vba öffnen
Beitrag von: Knopf am Juli 03, 2017, 11:03:10
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.
Titel: Re: Aktualisierungsabfrage mit vba öffnen
Beitrag von: DF6GL am Juli 03, 2017, 11:16:18
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...
Titel: Re: Aktualisierungsabfrage mit vba öffnen
Beitrag von: Knopf am Juli 03, 2017, 12:33:43
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!
Titel: Re: Aktualisierungsabfrage mit vba öffnen
Beitrag von: Lachtaube am Juli 03, 2017, 12:54:53
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
Titel: Re: Aktualisierungsabfrage mit vba öffnen
Beitrag von: DF6GL am Juli 03, 2017, 12:55:34
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
Titel: Re: Aktualisierungsabfrage mit vba öffnen
Beitrag von: Knopf am Juli 03, 2017, 14:17:54
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
Titel: Re: Aktualisierungsabfrage mit vba öffnen
Beitrag von: DF6GL am Juli 03, 2017, 14:24:48
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.
Titel: Re: Aktualisierungsabfrage mit vba öffnen
Beitrag von: markusxy am Juli 03, 2017, 17:35:13
@Lachtaube
weist du ob es einen Vorteil bringt, wenn man die Parameters Deklaration in ParameterAbfragen einsetzt, oder ob das für den Hugo ist.
Titel: Re: Aktualisierungsabfrage mit vba öffnen
Beitrag von: DF6GL am Juli 03, 2017, 17:50:57
Hi,


könnte helfen:

https://dbwiki.net/wiki/Access_Design:Parameterabfrage
Titel: Re: Aktualisierungsabfrage mit vba öffnen
Beitrag von: Lachtaube am Juli 03, 2017, 18:00:22
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. :)
Titel: Re: Aktualisierungsabfrage mit vba öffnen
Beitrag von: markusxy am Juli 03, 2017, 18:40:00
@Franz, interessanter Link.
@Lachtaube, mit dem Index meinst du wohl die Reihenfolge in der Parameters Collection sollte man ein QueryDef Objekt einsetzen?
Titel: Re: Aktualisierungsabfrage mit vba öffnen
Beitrag von: Knopf am Juli 09, 2017, 19:41:25
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!