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
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)
Test durchgeführt: Es kommt nun "Laufzeitfehler '3450': Syntaxfehler in der Abfrag. Eine Abfrageklausel ist unvollständig."
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.
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
Hallo,
was ist denn die 4 nach dem SQL ?
Hi,
die 4 wird vom "dbOpenSnapshot" erzeugt. Als SQL-Befahl natürlich unbrauchbar.
Viele Grüße,
Lars
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ß.
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
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 ...?
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.
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.
Hast du mal das nicht funktionierende SQL in eine Access-Abfrage kopiert und dort direkt ausgeführt?
Wenn ja, was ist das Ergebnis?
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.
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.