代码之家  ›  专栏  ›  技术社区  ›  Ben.Name

在Access中为网络日在表(或查询)中创建字段

  •  0
  • Ben.Name  · 技术社区  · 7 年前

    我知道Access不直接支持网络日。我还知道我可以使用VBA来求解网络天数中表单上一条记录的任意两个值。然而,我想解决一个表中所有记录的网络天数。示例:需要找到在少于一定数量的“工作周天数”内打开/完成/任何记录的百分比)要做到这一点,我需要一列每个项目花费了多少网络日。

    我在查询设计中尝试了以下方法来创建新字段。

    2)+1 (工作日([起始日期],3)>5) -(工作日([关闭日期],3)-4)*(工作日([关闭日期],3)>4)

    ((旁注:在设计视图中,我在查询的“字段”区域中输入了一个连续的行。有点像你如何通过使用…Newfieldname:[Field1]*[Field2]直接创建一个新字段。我只是在有人认为有必要编辑我的帖子并将测试移到自己的行时提出这个问题的。谁知道可能我使用测试:([广泛的东西])是问题的一部分!!!?如果有人真的在说“这是我在某处“拥有”的“东西”,那就别管原始帖子了。)

    我尝试过的另一个选择是在VBA中创建一个新字段,但具有fld。表达式引用函数。(我认为我做不到,甚至可能做得不正确……)

    注意:“tblVBA是一个临时表(我不存储这些计算值。)

    Private Sub btncreate_Click()
        Dim db As DAO.Database
        Dim TD As DAO.TableDef
        Dim fld As DAO.Field
    
        Set db = CurrentDb()
        Set TD = db.TableDefs("tblVBA") 
    
        Set fld = TD.CreateField("TotNetWrkDays", dbInteger)
        fld.Expression = wNetworkdays([Initiated Date], [Closed Date])
        TD.Fields.Append fld
        MsgBox "Added"
    End Sub
    
    Public Function wNetworkdays(beginDt As Date, endDt As Date) As Integer
        Dim tempDt As Date
        Dim count As Integer
        tempDt = beginDt
    
        For i = 1 To DateDiff("d", beginDt, endDt)
            tempDt = DateAdd("d", 1, tempDt)
            If Weekday(tempDt, 2) = 6 Or Weekday(tempDt, 2) = 7 Then  'Define your scheduled day off, you can define weekday instead of weekend
                count = count + 1
            End If
        Next i
        wNetworkdays = DateDiff("d", beginDt, endDt) + 1 - count
    End Function
    

    我可以在excel中完成这一切当然。。。但是,在excel中只能找到db之外的一些简单统计信息,这将是不幸的。



    更新:2017年11月2日下午2:30 *我仍然需要为所有关闭日期不可用的情况添加一个返回Null。。但不管怎样,问题都回答了谢谢!

    1 回复  |  直到 7 年前
        1
  •  0
  •   Kostas K.    7 年前

    您可以使用下面的函数查找两个日期之间的工作日数(不包括周末)。

    然后,您只需在查询中调用该函数。

    Public Function WeekdaysInDateRange(ByVal DateFrom As Date, ByVal DateTo As Date) As Long
        Dim weeks As Long
            weeks = CLng((((DateTo - Weekday(DateTo)) - (DateFrom - Weekday(DateFrom) + 1)) / 7) * 5)
    
        Dim days As Long
            days = Weekday(DateTo) - Weekday(DateFrom) + 1 + IIf(Weekday(DateFrom) = 1, -1, 0) + IIf(Weekday(DateTo) = 7, -1, 0)
    
        WeekdaysInDateRange = weeks + days
    End Function
    


    笔记 DateFrom 不包括在计算中。