Neuigkeiten:

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

Mobiles Hauptmenü

SQL in VBA Modul zeigt Laufzeitfehler 3061: 2 Parameter wurden erwartet,...

Begonnen von voyager, Februar 04, 2021, 08:57:54

⏪ vorheriges - nächstes ⏩

voyager

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

MzKlMu

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)
Gruß Klaus

voyager

Test durchgeführt: Es kommt nun "Laufzeitfehler '3450': Syntaxfehler in der Abfrag. Eine Abfrageklausel ist unvollständig."

MzKlMu

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.
Gruß Klaus

voyager

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

MzKlMu

Gruß Klaus

voyager

Hi,
die 4 wird vom "dbOpenSnapshot" erzeugt. Als SQL-Befahl natürlich unbrauchbar.

Viele Grüße,
Lars

ebs17

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ß.
Mit freundlichem Glück Auf!

Eberhard

voyager

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

ebs17

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 ...?
Mit freundlichem Glück Auf!

Eberhard

PhilS

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.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

voyager

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.

PhilS

Hast du mal das nicht funktionierende SQL in eine Access-Abfrage kopiert und dort direkt ausgeführt?
Wenn ja, was ist das Ergebnis?
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

voyager

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.

PhilS

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.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor