Problem mit Parameterübergabe an Abfrage per VBA

05/08/2010 - 20:50 von Matthias Körner | Report spam
Hallo an Alle,

auf folgende beiden Abfragen greife ich per VBA zu und übergebe die
benötigten Parameter wie folgt:

Public Function GetStartsaldoA(Buchungsoption As Long) As Currency
On Error GoTo Err_Proc
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim qdf As DAO.QueryDef
Dim prm1 As DAO.Parameter
Dim prm2 As DAO.Parameter
Dim prm3 As DAO.Parameter
Dim strSQL As String
Dim Betrag As Currency
Set db = DBEngine(0)(0)
Betrag = 0
If Buchungsoption = 1 Then
GetStartsaldoA = Betrag
Exit Function
Else
Set qdf = db.QueryDefs("qryB_Kassenbuch_A")
Set prm1 =
qdf.Parameters("[Forms]![frm_DruckenKassenbuch]![AuswahlGruppeUmsatz]")
Set prm2 = qdf.Parameters("[Forms]![frm_DruckenKassenbuch]![von]")
Set prm3 = qdf.Parameters("[Forms]![frm_DruckenKassenbuch]![bis]")
prm1 = 2
prm2 = DateValue("01.01.1900")
prm3 = DateValue(Forms!frm_DruckenKassenbuch.Controls!von - 1)
End If
Set rst = qdf.OpenRecordset(dbOpenDynaset)
If Not rst.EOF Then
rst.MoveFirst
Do Until rst.EOF
Betrag = Betrag + rst!Ausgang
rst.MoveNext
Loop
End If
qdf.Close
rst.Close
GetStartsaldoA = Betrag
Exit_Proc:
Exit Function
Err_Proc:
MsgBox Err.Number & Err.Description & " - SA"
Resume Exit_Proc
End Function


SQL-String von qryB_Kassenbuch_A:
SELECT [Vorgang Artikel Rechnungen].BelegDatum AS DatSort, "" AS
BuchungstextE, 0 AS Eingang, IIf(Len("" & [BelegNr])>0,[BelegNr] & " - " &
[Vorgang Artikel Rechnungen]!Reserve1Text,[Vorgang Artikel
Rechnungen]!Reserve1Text) AS BuchungstextA,
([Rechnungsbetrag]-([Rechnungsbetrag]*[SkontoSatz]/100)) AS Ausgang,
[Vorgang Artikel Rechnungen].Reserve2Text FROM [Vorgang Artikel Rechnungen]
WHERE
((([Vorgang Artikel Rechnungen].BelegNrID)>1) AND
(([Forms]![frm_DruckenKassenbuch]![AuswahlGruppeUmsatz])=1)) OR ((([Vorgang
Artikel Rechnungen].BelegDatum) Between
[Forms]![frm_DruckenKassenbuch]![von] And
[Forms]![frm_DruckenKassenbuch]![bis]) AND (([Vorgang Artikel
Rechnungen].BelegNrID)>1) AND
(([Forms]![frm_DruckenKassenbuch]![AuswahlGruppeUmsatz])=2)) ORDER BY
[Vorgang Artikel Rechnungen].BelegDatum, [Vorgang Artikel
Rechnungen].BelegNrID;

****************************************

Public Function GetStartsaldoE(Buchungsoption As Long) As Currency
On Error GoTo Err_Proc
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim qdf As DAO.QueryDef
Dim prm1 As DAO.Parameter
Dim prm2 As DAO.Parameter
Dim prm3 As DAO.Parameter
Dim strSQL As String
Dim Betrag As Currency
Set db = DBEngine(0)(0)
Betrag = 0
If Buchungsoption = 1 Then
GetStartsaldoE = Betrag
Exit Function
Else
Set qdf = db.QueryDefs("qryB_Kassenbuch_E")
Set prm1 =
qdf.Parameters("[Forms]![frm_DruckenKassenbuch]![AuswahlGruppeUmsatz]")
Set prm2 = qdf.Parameters("[Forms]![frm_DruckenKassenbuch]![von]")
Set prm3 = qdf.Parameters("[Forms]![frm_DruckenKassenbuch]![bis]")
prm1 = 2
prm2 = DateValue("01.01.1900")
prm3 = DateValue(Forms!frm_DruckenKassenbuch.Controls!von - 1)
End If
Set rst = qdf.OpenRecordset(dbOpenDynaset) 'hier Fehler 3001
If Not rst.EOF Then
rst.MoveFirst
Do Until rst.EOF
Betrag = Betrag + rst!Eingang
rst.MoveNext
Loop
End If
qdf.Close
rst.Close
GetStartsaldoE = Betrag
Exit_Proc:
Exit Function
Err_Proc:
MsgBox Err.Number & Err.Description & " - SE"
Resume Exit_Proc
End Function


SQL-String von qryB_Kassenbuch_E:
SELECT DISTINCTROW [Vorgang Kunde].Bezahlt AS DatSort, [Vorgang
Kunde]!VorgangNr & " - " & qryQ_KundenName!Kunde AS BuchungstextE,
IIf([VK_Reserve9JaNein]=True,Nz([Rechnungsbetrag],0),Nz([Rechnungsbetrag],0)-Nz([Vorgang
Kunde 2]![Reserve2Zahl],0)) AS Eingang, "" AS BuchungstextA, 0 AS Ausgang,
[Vorgang Kunde].Reserve3Text FROM (qryQ_KundenName INNER JOIN ([Vorgang
Kunde] INNER JOIN [Vorgang Kunde 2] ON [Vorgang Kunde].VorgangNr = [Vorgang
Kunde 2].VorgangNr) ON qryQ_KundenName.KundenNr = [Vorgang Kunde].KundenNr)
INNER JOIN [Vorgang Kunde DetailVorgang] ON [Vorgang Kunde].VorgangNr =
[Vorgang Kunde DetailVorgang].HauptVorgangNr WHERE ((([Vorgang
Kunde].Bezahlt) Is Not Null) AND (([Vorgang Kunde].VorgangNr)>0) AND
((BitAnd(([Status]),256))=False) AND ((BitAnd(([Status]),8) Or
BitAnd(([Status]),16))=True) AND (([Vorgang Kunde
DetailVorgang].BelegArtID)=IIf(BitAnd(([Status]),8)=True,3,4)) AND
(([Forms]![frm_DruckenKassenbuch]![AuswahlGruppeUmsatz])=1)) OR ((([Vorgang
Kunde].Bezahlt) Between [Forms]![frm_DruckenKassenbuch]![von] And
[Forms]![frm_DruckenKassenbuch]![bis]) AND (([Vorgang Kunde].VorgangNr)>0)
AND ((BitAnd(([Status]),256))=False) AND ((BitAnd(([Status]),8) Or
BitAnd(([Status]),16))=True) AND (([Vorgang Kunde
DetailVorgang].BelegArtID)=IIf(BitAnd(([Status]),8)=True,3,4)) AND
(([Forms]![frm_DruckenKassenbuch]![AuswahlGruppeUmsatz])=2)) ORDER BY
[Vorgang Kunde].Bezahlt, [Vorgang Kunde].VorgangNr;

****************************************

Wàhrend die Prozedur GetStartsaldoA ohne Probleme làuft, wird die Prozedur
GetStartsaldoE mit dem Fehler 3001-Ungültiges Argument abgebrochen.

Das "Schlimme" daran ist, dass die Abfrage GetStartsaldoE bei "hàndischer"
Eingabe der Parameter fehlerfrei ausgeführt wird und ich keinen Anhaltspunkt
finde, wo der Fehler liegen könnte.

Hat jemand vielleicht eine Idee, wo der Hebel anzusetzen ist?

Viele Grüße
Matthias
 

Lesen sie die antworten

#1 Matthias Körner
05/08/2010 - 23:44 | Warnen spam
Nachtrag:

Inzwischen habe ich das Problem durch Einbinden des SQL-Strings in die
Prozedur gelöst (oder soll ich sagen "umgangen"?).

Einbußen bzgl. der Performance scheint es gegenüber der Abfrage jedenfalls
nicht zu geben, von daher bin ich erst mal zufrieden.

Viele Grüße
Matthias

Ähnliche fragen