Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: voyager am Februar 04, 2021, 08:57:54

Titel: SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...
Beitrag von: voyager am Februar 04, 2021, 08:57:54
Hallo zusammen,
ich habe ein Modul zur Berechnung des Medians aus Spalten einer Tabelle/Abfrage erstellt, dass erst einmal auch funktioniert. In einfachen Testdatensätzen und Abfragen dieser (Testtabelle mit Primärschlüssel und zugehörigen Daten sowie Testabfrage aus der Tabelle) funktioniert das Modul. Bei komplexeren Datensätzen und Abfragen mit mehreren Spalten kommt aber: Laufzeitfehler '3061': 2 Parameter wurden erwartet, aber es wurden zu wenig Parameter Übergeben.
Kann mir jemand helfen, irgenwo in der SQL-Abfrage steckt ein Fehler?

Ich frage in meinem Formular-Textfeld ab (Qry-Bezeichnung und Spaltenüberschrift): =fMedian("TableName";"FieldName")

Das Modul:
Public Function fMedian(ByVal TableName As String, ByVal FieldName As String) As Double
    Dim numDS As Long
    Dim lowerValue As Double
    Dim upperValue As Double
    Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("Select " & FieldName & " From " & TableName & " Order By " & FieldName, dbOpenSnapshot)
    If Not rst.EOF Then
        With rst
            .MoveLast
            numDS = .RecordCount
            .MoveFirst
            If numDS Mod 2 = 0 Then
                .Move Int(numDS / 2) - 1
                lowerValue = .Fields(FieldName)
                .MoveNext
                upperValue = .Fields(FieldName)
                fMedian = (lowerValue + upperValue) / 2
            Else
                .Move Int(numDS / 2)
                fMedian = .Fields(FieldName)
            End If
        End With
        rst.Close: Set rst = Nothing
    Else
        rst.Close: Set rst = Nothing
        Err.Raise vbObjectError + 100, "Function fMedian", "Empty Recordset"
    End If
End Function
Titel: Re: SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...
Beitrag von: MzKlMu am Februar 04, 2021, 09:25:26
Hallo,
wenn mit & Texte verkettet werden (keine Zahlen) sind die Texte in Hochkomma einzuschließen.Versuche es mal so:
Set rst = CurrentDb.OpenRecordset("Select '" & FieldName & "' From '" & TableName & "' Order By '" & FieldName & "'", dbOpenSnapshot)
Titel: Re: SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...
Beitrag von: voyager am Februar 04, 2021, 11:19:35
Test durchgeführt: Es kommt nun "Laufzeitfehler '3450': Syntaxfehler in der Abfrag. Eine Abfrageklausel ist unvollständig."
Titel: Re: SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...
Beitrag von: MzKlMu am Februar 04, 2021, 11:40:43
Hallo,
lasse Dir mit Debug.Print den zusammengesetzten String anzeigen und poste den hier.
Den String kannst Du auch mal direkt in das SQL Fenster eingeben und dann die Abfrage auf die Entwurfsansicht umstellen.

Außerdem wäre es durchaus sinnvoll Deine Umsetzung hier zu zeigen, wie sonst soll man Fehler erkennen ?
Die ganze Sache ist mir aber ohnehin ein Rätsel, wieso benötigst Du den Tabellen und Feldnamen variabel ?

PS:
Zur Codedarstellung bitte die Codetags des Forums benutzen.
Titel: Re: SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...
Beitrag von: voyager am Februar 04, 2021, 12:32:37
Hallo,
vielen Dank schon mal.
Debug.Print wirft aus (A_test2 ist TableName:
Select Freibuchungszeit From A_test2 Order By Freibuchungszeit         4
In einer Abfrage funktioniert der Code auch (ohne Hochkommata).

Die Umsetzung: Im Textfeld steht: =fMedian("A_test2";"Freibuchungszeit")
Gruß,
Lars
Titel: Re: SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...
Beitrag von: MzKlMu am Februar 04, 2021, 13:43:44
Hallo,
was ist denn die 4 nach dem SQL ?
Titel: Re: SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...
Beitrag von: voyager am Februar 04, 2021, 14:16:48
Hi,
die 4 wird vom "dbOpenSnapshot" erzeugt. Als SQL-Befahl natürlich unbrauchbar.

Viele Grüße,
Lars
Titel: Re: SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...
Beitrag von: ebs17 am Februar 04, 2021, 15:56:20
ZitatBei komplexeren Datensätzen und Abfragen mit mehreren Spalten kommt aber: Laufzeitfehler '3061' ...
Würde man sich dann bei einer Fehleranalyse nicht diesen zuwenden statt den einfachen funktionierenden ...?
So als Logikanstoß.
Titel: Re: SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...
Beitrag von: voyager am Februar 05, 2021, 09:46:49
Hallo,
bei den einfachen Tabellen/Abfragen funktioniert es ja, aber bei "normalen", verknüpften Tabellen und Datensätzen erscheint der Fehler. Da ich schon einiges ausprobiert habe, was alles nicht zum erwünschten Ergebnis geführt hat, wende ich mich an die Experten.
Grüße, Lars
Titel: Re: SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...
Beitrag von: ebs17 am Februar 05, 2021, 10:50:18
ZitatDa ich schon einiges ausprobiert habe, was alles nicht zum erwünschten Ergebnis geführt hat, wende ich mich an die Experten.
Eine "Normalität" stellt sich für einzelne recht unterschiedlich dar.

Der Glaube, man würde jedem jederzeit über die Schulter sehen können und wollen, ist recht oft realitätsfern. Aber vielleicht ist noch das Orakel von Delphi in Betrieb ...?
Titel: Re: SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...
Beitrag von: PhilS am Februar 05, 2021, 11:55:07
Zitat von: voyager am Februar 05, 2021, 09:46:49bei den einfachen Tabellen/Abfragen funktioniert es ja, aber bei "normalen", verknüpften Tabellen und Datensätzen erscheint der Fehler.
Du solltest mal eine funktionierende Abfrage mit einer nicht funktionierenden genau vergleichen.

Wenn du dabei nicht weiterkommst, dann poste beides hier, aber bitte mit einer klaren Beschreibung was funktioniert und was nicht. Bei deinen bisherigen Posts hier ist für mich unklar ob die jeweiligen Beispiele aus der "Funktionier" oder "Funktioniert nicht" Kategorie stammen.
Titel: Re: SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...
Beitrag von: voyager am Februar 05, 2021, 16:42:14
Hier der Vergleich:
Funktionierende Abfrage: SELECT T_FWCH.SAPStock AS Sortiert
FROM T_FWCH
ORDER BY T_FWCH.SAPStock;
Nicht funktionierende Abfrage: SELECT A_KPIsGesamt.Freibuchungszeit AS Sortiert
FROM A_KPIsGesamt
ORDER BY A_KPIsGesamt.Freibuchungszeit;

Die Abfragen habe ich jeweils "A_test" und die Spalte "Sortiert" benannt, um auch dies als Quelle auszuschließen. Natürlich hatten die beiden Abfragen nie gleichzeitig denselben Namen. In beiden Datenblättern ist jeweils derselbe Datensatz mit lediglich einer Spalte und 30 Zahlen.
Der VBA Code wie im ersten Post ist unverändert.
Titel: Re: SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...
Beitrag von: PhilS am Februar 05, 2021, 16:47:48
Hast du mal das nicht funktionierende SQL in eine Access-Abfrage kopiert und dort direkt ausgeführt?
Wenn ja, was ist das Ergebnis?
Titel: Re: SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...
Beitrag von: voyager am Februar 08, 2021, 14:44:36
Hallo,

hab beide SQLs in eine Access-Abfrage kopiert, beide funktionieren. Es muss an irgendwas bezüglich "Abfrage aus Abfrage" liegen. Ich hab das Problem jetzt gelöst, in dem ich von hinten durch die Brust ins Auge schieße und eine Tabellenerstellungsabfrage erstellt hab und meine Medianberechnung aus dieser heraus erledige. Damit klappt es.
Ist aber natürlich nicht Sinn der Sache, das so kompliziert bauen zu müssen.
Würde mich freuen, wenn jemand das mal nachstellen könnte mit einer Übungsdatenbank mit einer Tabelle und zwei Abfragen sowie dem den Zielmedian ausspuckendem Formular. Kann die Minidatenbank auch gerne irgendwo hochladen als Bespiel, benötige nur den Link.
Titel: Re: SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...
Beitrag von: PhilS am Februar 08, 2021, 15:18:55
Zitat von: voyager am Februar 08, 2021, 14:44:36Kann die Minidatenbank auch gerne irgendwo hochladen als Bespiel, benötige nur den Link.
Du kannst deine Beispieldatenbank hier hochladen (als ZIP-Archiv).
Wenn du explizit den "Antwort"-Button am Ende des Threads benutzt, kannst du Dateien an deine Antwort anhängen.