【问题标题】:Create field in a table (or query) for Network Days in Access在表(或查询)中为 Access 中的网络天数创建字段
【发布时间】:2018-04-15 01:28:56
【问题描述】:

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

我已经尝试过他在查询设计中创建新字段。

Test:DateDiff([Initiated Date],[Closed Date],"d")-((DateDiff([Initiated Date],[Closed Date],"d")+Weekday([Initiated Date],3 )-Weekday([Closed Date],3))/7)2)+1(Weekday([Initiated Date],3)>5)-(Weekday([Closed Date],3) -4)*(平日([关闭日期],3)>4)

我已经尝试了一些我在网上找到的变体,但这是我唯一可以执行的变体,但所有值都带有#Error。

((旁注:在设计视图中,我在查询的“字段”区域中将其输入为一条连续的线。有点像您可以使用...直接创建一个新字段。新字段名:[Field1]*[Field2] 。我只是提出这个问题,因为有人认为有必要编辑我的帖子并将 Test: 移动到自己的行....谁知道我对 Test 的使用:([广泛的东西] ) 是问题的一部分!!!?如果有人字面上说“这是我在某处“拥有”的“东西”,请不要理会原始帖子))

我尝试过的另一个选项是在 VBA 中创建一个新字段,但让 fld.Expression 引用一个函数。 (我不相信我能做或什至做不正确......)

注意:'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 中找到数据库之外的一些简单统计数据。



更新:2017 年 11 月 2 日下午 2:30 非常感谢 Kostas K. !!!我没有意识到您可以从基本上解决了我的问题的查询中调用函数。然而,我确实使用我的原始函数作为提供的解决方案......示例:在 2016 年 3 月 17 日和 2016 年 8 月 11 日之间产生 105 的结果,而不是 NETWORKDAYS 的 106。我之前发布的代码(我发现在线顺便说一句)确实像excel一样给出106。 *对于关闭日期不可用的所有情况,我仍需要添加返回 Null。但无论哪种方式,问题都已回答谢谢!

【问题讨论】:

  • 这是 NETWORKDAYS 或网络工作日,但“网络日”会让您的读者感到困惑。

标签: ms-access vba field datediff


【解决方案1】:

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

然后您可以简单地在查询中调用该函数。

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 不包含在计算中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2012-12-17
    相关资源
    最近更新 更多