在访问和跳过假期中提取一系列日期

Pulling a range of dates in access and skipping holidays

我正在尝试使用 VBA 代码跳过假期。我已经编写了代码并且我让它在工作日工作,所以我只在周一到周五拉动。该代码旨在提取前一天的总数,所以我总是落后 1 天,但我的问题是当有假期时,代码会跳过假期,将其全部保留为 0,我需要它做的是一起否定这一天。

该代码逐步查找范围内有多少条记录,到目前为止我整周收集了 7 条记录,但如果包括假期,我们可能会有 2 条记录范围内的假期它将那些日子显示为记录(我在数据库中输入空记录)。有没有一种方法可以否定空值并让它跳过数据库中应该是工作日的空值,或者我可以创建一个子例程来从有假期的 table 中提取并跳过那些仍然显示 5 个业务的日子天。

    Dim iWeekDay As Integer
 Dim sSQL As String

Dim objRecordset As ADODB.Recordset
Dim objRecordsetConn As ADODB.Connection
Dim objRecordsetComm As ADODB.Command

iWeekDay = WeekDay(Date)



Set objRecordsetConn = New ADODB.Connection
objRecordsetConn.ConnectionString = CurrentProject.Connection
objRecordsetConn.Open

'Start new section Collections

sSQL = "Select CollDate From tblTXandVACollDist Where CollDate Between date()-7 and date()-1 Group by CollDate Order by CollDate;"

Set objRecordsetComm = New ADODB.Command
    objRecordsetComm.ActiveConnection = objRecordsetConn
    objRecordsetComm.CommandText = sSQL
    objRecordsetComm.CommandType = adCmdText

    'Open ADO recordset
    Set objRecordset = New ADODB.Recordset
    objRecordset.ActiveConnection = objRecordsetConn
    Set objRecordset.Source = objRecordsetComm
    objRecordset.CursorLocation = adUseClient
    objRecordset.CursorType = adOpenStatic    'Allows both forward and backward movement in recordset
    objRecordset.LockType = adLockPessimistic 'Allows records to be edited.
    objRecordset.Open
    'objRecordset.MoveLast
    'objRecordset.MoveFirst

If objRecordset.RecordCount >= 1 Then
            dCollDate1 = objRecordset("CollDate")

        Else
            Select Case iWeekDay ' This is if there are no collection totals form the table the report will search for the current date and then use the below case to set the days so all other information that is pulled in will match with the collection date.
                Case 2   ' This is if the current day is monday
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 5
                    dCollDate4 = Date - 4
                    dCollDate5 = Date - 3
                Case 3 ' This is if the current day is Tue
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 5
                    dCollDate4 = Date - 4
                    dCollDate5 = Date - 1
                Case 4   ' This is if the current day is Wend
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 5
                    dCollDate4 = Date - 2
                    dCollDate5 = Date - 1
                Case 5    ' This is if the current day is Thur
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 3
                    dCollDate4 = Date - 2
                    dCollDate5 = Date - 1
                Case 6  ' This is if the current day is Fri
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 4
                    dCollDate3 = Date - 3
                    dCollDate4 = Date - 2
                    dCollDate5 = Date - 1
            End Select

        End If

        If objRecordset.RecordCount >= 2 Then
            objRecordset.MoveNext

            dCollDate2 = objRecordset("CollDate")

        Else
        Select Case iWeekDay ' This is if there are no collection totals form the table the report will search for the current date and then use the below case to set the days so all other information that is pulled in will match with the collection date.
                Case 2   ' This is if the current day is monday
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 5
                    dCollDate4 = Date - 4
                    dCollDate5 = Date - 3
                Case 3 ' This is if the current day is Tue
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 5
                    dCollDate4 = Date - 4
                    dCollDate5 = Date - 1
                Case 4   ' This is if the current day is Wend
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 5
                    dCollDate4 = Date - 2
                    dCollDate5 = Date - 1
                Case 5    ' This is if the current day is Thur
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 3
                    dCollDate4 = Date - 2
                    dCollDate5 = Date - 1
                Case 6  ' This is if the current day is Fri
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 4
                    dCollDate3 = Date - 3
                    dCollDate4 = Date - 2
                    dCollDate5 = Date - 1
            End Select

        End If

        If objRecordset.RecordCount >= 3 Then
            objRecordset.MoveNext


            dCollDate3 = objRecordset("CollDate")

        Else
            Select Case iWeekDay ' This is if there are no collection totals form the table the report will search for the current date and then use the below case to set the days so all other information that is pulled in will match with the collection date.
                Case 2   ' This is if the current day is monday
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 5
                    dCollDate4 = Date - 4
                    dCollDate5 = Date - 3
                Case 3 ' This is if the current day is Tue
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 5
                    dCollDate4 = Date - 4
                    dCollDate5 = Date - 1
                Case 4   ' This is if the current day is Wend
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 5
                    dCollDate4 = Date - 2
                    dCollDate5 = Date - 1
                Case 5    ' This is if the current day is Thur
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 3
                    dCollDate4 = Date - 2
                    dCollDate5 = Date - 1
                Case 6  ' This is if the current day is Fri
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 4
                    dCollDate3 = Date - 3
                    dCollDate4 = Date - 2
                    dCollDate5 = Date - 1
            End Select

        End If

        If objRecordset.RecordCount >= 4 Then
            objRecordset.MoveNext

            dCollDate4 = objRecordset("CollDate")


        Else

        Select Case iWeekDay ' This is if there are no collection totals form the table the report will search for the current date and then use the below case to set the days so all other information that is pulled in will match with the collection date.
                Case 2   ' This is if the current day is monday
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 5
                    dCollDate4 = Date - 4
                    dCollDate5 = Date - 3
                Case 3 ' This is if the current day is Tue
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 5
                    dCollDate4 = Date - 4
                    dCollDate5 = Date - 1
                Case 4   ' This is if the current day is Wend
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 5
                    dCollDate4 = Date - 2
                    dCollDate5 = Date - 1
                Case 5    ' This is if the current day is Thur
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 3
                    dCollDate4 = Date - 2
                    dCollDate5 = Date - 1
                Case 6  ' This is if the current day is Fri
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 4
                    dCollDate3 = Date - 3
                    dCollDate4 = Date - 2
                    dCollDate5 = Date - 1
            End Select

        End If

        If objRecordset.RecordCount = 5 Then 'this is a test portion to see if i have to adjust the chart to make sure the chart works on an individual basis per day
            objRecordset.MoveNext

            dCollDate5 = objRecordset("CollDate")


        Else

        Select Case iWeekDay ' This is if there are no collection totals form the table the report will search for the current date and then use the below case to set the days so all other information that is pulled in will match with the collection date.
                Case 2   ' This is if the current day is monday
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 5
                    dCollDate4 = Date - 4
                    dCollDate5 = Date - 3
                Case 3 ' This is if the current day is Tue
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 5
                    dCollDate4 = Date - 4
                    dCollDate5 = Date - 1
                Case 4   ' This is if the current day is Wend
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 5
                    dCollDate4 = Date - 2
                    dCollDate5 = Date - 1
                Case 5    ' This is if the current day is Thur
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 6
                    dCollDate3 = Date - 3
                    dCollDate4 = Date - 2
                    dCollDate5 = Date - 1
                Case 6  ' This is if the current day is Fri
                    dCollDate1 = Date - 7
                    dCollDate2 = Date - 4
                    dCollDate3 = Date - 3
                    dCollDate4 = Date - 2
                    dCollDate5 = Date - 1
            End Select


        End If

我最初的想法是您可以执行如下查询:

Select MAX(CollDate) FROM tblTXandVACollDist WHERE [otherfield] <> 0 AND (CollDate <> (select max(CollDate) FROM tblTXandVACollDist [otherfield] <> 0))  )

根据您使用的数据库的不同,语法可能会略有不同,但像这样的查询会告诉数据库为您提供今天的最后日期,其中您要比较的任何字段都不是 = 0。

然后您可以更改它以提供 today-2、today-3 等,这应该会减少您必须在那里使用的很多逻辑。 (也可以使用此查询,您可能更容易修改。取决于您的数据库)

Select MAX(CollDate) FROM tblTXandVACollDist WHERE [otherfield] <> 0 AND (CollDate <> (select TOP 1 CollDate FROM tblTXandVACollDist WHERE [otherfield] <> 0 ORDER BY CollDate))

并将其更改为此以打折最近两天

Select MAX(CollDate) FROM tblTXandVACollDist WHERE [otherfield] <> 0 AND (CollDate not IN(select TOP 2 CollDate FROM tblTXandVACollDist WHERE [otherfield] <> 0 ORDER BY CollDate))

如果您有 table 个假期,您应该能够计算出工作日的数量,比如五个,通过简单的查询选择昨天和之后的日期,而不是周末,也不是假期:

Select 
    Top 5 *
From 
    tblTXandVACollDist 
Where 
    CollDate < Date()
    And
    Weekday([CollDate], 2) <= 5
    And
    CollDate Not In (Select HolidayDate From tblHolidays)
Order By
    CollDate Desc