运行时错误3061太少参数预期1 DAO声明

时间:2018-02-20 22:39:44

标签: ms-access access-vba ms-access-2007 dao

我一直在寻找一些创建日历年的代码,并将从表中获取数据并将其放在日历上的相应日期。我发现了一些在线代码(来自较旧版本的访问)非常适合该法案,经过一些修改,它完全符合我的要求。最初,代码从一个表中提取数据,并设置为在当前年份运行。我使用两个查询qr_SafetyCal和qr_SafetyCal2来优化来自一个表的数据。第一个查询对数据进行优先级排序,并在任何给定日期消除多个事件。第二个查询使用第一个查询中的结果,并在查询条件中指定年份。

只要我在qr_SafetyCal2中设置年份标准并指定第一天,例如,代码就能完美运行。 1/1/2017(datStart)在我想要显示的日历年的基础代码中。

在获得代码平方后,我创建了一个弹出窗口,用户选择报告的年份但是当我运行报告时出现以下错误,运行时错误3061预期的参数太少了。

从我能够研究的内容来看,我相信当我在DAO Recordset使用的查询条件中引用表单时,我改变了代码的动态。 据我了解,查询中的条件不会传递给rs,因此需要在代码中声明。我无法弄清楚的是如何通过引用表单来声明代码中的变量。我希望这对某些人来说是有道理的,很长的解释但很难描述你不理解的东西。

以下是所有代码,你会看到我已经尝试过的一些东西,但我没有尝试过。任何帮助将不胜感激。如果代码格式不正确,我会提前道歉。

Option Compare Database
Option Explicit

Private m_strCTLLabel  As String
Private m_strCTLLabelHeader As String
Private colCalendarDates As Collection

Function getCalendarData() As Boolean
Dim rs As DAO.Recordset
Dim strDate As String
Dim strCode As String

Dim i As Integer

    'Dim qdf As DAO.QueryDef
    'Set qdf = CurrentDb.QueryDef("qr_SafetyCal2")
    'qdf.Parameters("[Forms]![fr_SafetyCal]![cboYear]") = [Forms]![fr_SafetyCal]![cboYear]
    'Set rs = qdf.OpenRecordset("qr_SafetyCal2", dbOpenDynaset)

    Set rs = CurrentDb.OpenRecordset("qr_SafetyCal2", dbOpenDynaset)

    Set colCalendarDates = New Collection
    With rs
        If (Not .BOF) Or (Not .EOF) Then
            .MoveLast
            .MoveFirst
        End If
        If .RecordCount > 0 Then
            For i = 1 To .RecordCount
                strDate = .Fields("Date")
                strCode = .Fields("ShortName")
                colCalendarDates.Add strCode, strDate
                .MoveNext
            Next i
        End If
        .Close
    End With
    'Return of dates and data collection form qr_SafetyCal2
    Set rs = Nothing

End Function

Public Sub loadReportYearCalendar(theReport As Report)
Dim i As Integer
Dim datStart As Date
Dim rptControl As Report

    m_strCTLLabel = "labelCELL"
    m_strCTLLabelHeader = "labelDAY"

    'Load calendar data for the specified year into the collection
    Call getCalendarData

    With theReport
        'Get the first month of the specified year
        datStart = "1/1/2017" '"1/1/" & Year(Date), "1/1/" & Forms!
        [fr_SafetyCal]![cboYear], Forms![fr_SafetyCal]![txtCalYear]
        'Add the specified year to the report's label
        .Controls("labelCalendarHeaderLine2").Caption = Year(datStart) & " 
        iCalendar"
        For i = 1 To 12
            'Set pointer to subreport control hosting the mini-calendar
            Set rptControl = .Controls("childCalendarMonth" & i).Report
            'Run procedure to populate control with it's respective year
            Call loadReportCalendar(rptControl, datStart)
            'Reset and obtain first day of the following month
            datStart = DateAdd("m", 1, datStart)
        Next i
     End With
    'Clean up
    Set colCalendarDates = Nothing
    Set rptControl = Nothing
End Sub


Public Sub loadReportCalendar(theReport As Report, Optional StartDate As 
Date, Optional theHeaderColor As Variant)
Dim i As Integer
Dim intCalDay As Integer
Dim datStartDate As Date
Dim intWeekDay As Integer

    datStartDate = StartDate
    intWeekDay = Weekday(datStartDate)

    With theReport

        .Controls("labelMONTH").Caption = Format(StartDate, "mmmm")

        'Change the day label's backcolor if necessary
        If Not (IsMissing(theHeaderColor)) Then
             For i = 1 To 7
                 .Controls("labelDayHeader" & i).BackColor = theHeaderColor
            Next
        End If

        For i = 1 To 42
            With .Controls(m_strCTLLabel & i)
                If (i >= intWeekDay) And (Month(StartDate) = 
                Month(datStartDate)) Then
                    If (datStartDate = Date) Then
                        .BackColor = 14277081
                    End If

                    On Error Resume Next

                    Dim strCaption As String
                    Dim strKey As String

                    strKey = datStartDate
                    strCaption = ""
                    strCaption = colCalendarDates.Item(strKey)
                    colCalendarDates.Remove strKey
                    'Set back color to grean on days in the past that have 
                    no corresponding event
                    If (datStartDate < Date) And (strCaption = vbNullString) Then
                    .Caption = Day(datStartDate)
                    .Bold = False
                    .BackColor = vbGreen
                    .ForeColor = vbWhite
                    .Heavy = True
                'Do not set a back color for days in the future
                ElseIf (datStartDate > Date) And (strCaption = vbNullString) Then
                    .Caption = Day(datStartDate)
                    .Bold = False
                'Set the corresponding labels and formats for each specified event
                Else
                    .Caption = strCaption
                    .Bold = True
                    Select Case strCaption
                        Case "FA"
                            .BackColor = vbYellow
                            .ForeColor = 0
                            .LeftMargin = 0
                            .TextAlign = 2
                        Case "FAM"
                            .BackColor = vbYellow
                            .ForeColor = 0
                            .LeftMargin = 0
                            .TextAlign = 2
                            .Heavy = True
                        Case "LTA"
                            .BackColor = vbRed
                            .ForeColor = vbWhite
                            .LeftMargin = 0
                            .TextAlign = 2
                        Case "MED"
                            .BackColor = vbRed
                            .ForeColor = vbWhite
                            .LeftMargin = 0
                            .TextAlign = 2
                    End Select

                End If

               datStartDate = DateAdd("d", 1, datStartDate)
            Else
                .Caption = ""
            End If
        End With
    Next i
End With

End Sub

以下是两个查询的SQL,第一个是qr_SafetyCal,第二个是qr_SafetyCal2:

SELECT tb_CaseLog.Date, Max(tb_Treatment.Priority) AS MaxOfPriority, 
Count(tb_Treatment.TreatmentID) AS CountOfTreatmentID
FROM tb_Treatment INNER JOIN tb_CaseLog ON tb_Treatment.TreatmentID = 
tb_CaseLog.Treatment
GROUP BY tb_CaseLog.Date;

SELECT qr_SafetyCal.Date, tb_Treatment.ShortName, 
qr_SafetyCal.CountOfTreatmentID AS [Count], Year([Date]) AS CalYear
FROM qr_SafetyCal INNER JOIN tb_Treatment ON qr_SafetyCal.MaxOfPriority = 
tb_Treatment.Priority;

1 个答案:

答案 0 :(得分:0)

无需引用QueryDef。

通过引用组合框来打开带有过滤数据集的记录集对象:

Set rs = CurrentDb.OpenRecordset("SELECT * FROM qr_SafetyCal2 WHERE CalYear=" & [Forms]![fr_SafetyCal]![cboYear], dbOpenDynaset)

或者如果代码在表单后面:

Set rs = CurrentDb.OpenRecordset("SELECT * FROM qr_SafetyCal2 WHERE CalYear=" & Me.[cboYear], dbOpenDynaset)

两个示例均假设该字段是数字类型。

如果查询中没有带年份值的字段,则可以从VBA构造中的日期值字段中提取该字段:

Set rs = CurrentDb.OpenRecordset("SELECT * FROM qr_SafetyCal2 WHERE Year([YourFieldnameHere])=" & [Forms]![fr_SafetyCal]![cboYear], dbOpenDynaset)

设置datStart变量的代码:

'Get the first month of the specified year
datStart = "1/1/" & Forms![fr_SafetyCal].[cboYear]