【问题标题】:Remind me Friday, what I should see on the weekend周五提醒我,周末我应该看什么
【发布时间】:2010-12-09 06:04:33
【问题描述】:

我在各种监禁中设置了以下查询,以提醒我在确认的到期日期前 0、7、30、60 和 90 天合同到期。我计算通知日期的方法没有给我任何灵活性。例如,假设我有 30 份合同将于 12 月 5 日到期,周六我的办公室不营业。我会错过那天合同到期的通知,还有 7 天。

SELECT qryAllSold.SoldID, qryAllSold.CompanyName, qryAllSold.Product, qryAllSold.Description, qryAllSold.Quantity, qryAllSold.Price, qryAllSold.ConfirmedExpires, qryAllSold.Note
FROM qryAllSold
WHERE (((qryAllSold.ConfirmedExpires)=DateAdd("d",0,Int(Now()))) AND ((qryAllSold.RenewedToID) Is Null) AND ((qryAllSold.NonOpportunity)=No));

这些查询中的每一个都将显示在一个“仪表板”表单上,作为日常任务列表。如果我可以让表单代表一个日期,然后单击箭头一次向前或向后移动一天,那就太好了,但我不知道 Access 是否具有该功能。

如果这不起作用,我可以通过哪些其他方式确保不会错过有关这些到期的通知?

【问题讨论】:

    标签: ms-access calendar ms-access-2007 scheduled-tasks dashboard


    【解决方案1】:

    [编辑]如果您不是程序员,这里有一个替代解决方案

    为什么不在查询中使用 Format 函数,例如

    Format([ConfirmedExpires],"ww",2,1)
    

    "ww" - 指定星期,2 指定星期一为一周的第一天,1 表示第 1 周包含 1 月 1 日

    现在可以很容易地在几周内进行日期计算,例如未来 4 周以上到期的合同:

    Format([ConfirmedExpires],"ww",2,1)-Format(Now(),"ww",2,1))>4
    

    未来 4 周以上和最多 5 周到期的合同

    Format([ConfirmedExpires],"ww",2,1)-Format(Now(),"ww",2,1))>4 -
    Format([ConfirmedExpires],"ww",2,1)-Format(Now(),"ww",2,1)),=5
    

    这有帮助吗?


    您为什么不直接使用 DateAdd 等函数的 weekday 功能?

    您可以计算 25 或任何其他数量的工作日,而不是提前 30 个日历日。

    下面的代码显示了一个消息框,但您同样可以在消息框后面的 SQL 查询中使用该函数。

    Sub TestWeekDay()
        Dim FirstDate As Date    ' Declare variables.
        Dim IntervalType As String
        Dim Number As Integer
        Dim Msg
    
        IntervalType = "ww"    ' "ww" specifies weeks as interval.
        FirstDate = InputBox("Enter a date")
        Number = InputBox("Enter number of weekdays to add")
        Msg = "New date: " & DateAdd(IntervalType, Number, FirstDate)
        MsgBox Msg
    End Sub
    

    【讨论】:

    • 我想过这个,但是周日 - 1 W 会给我周五吗?这将如何允许假期?
    • 如果您的合同是财务合同,例如外汇、大宗商品等,然后合约将指定如果结算是在周六、周日或公共假日时该怎么做。您的程序应遵循文档。 Sun - 1w = Friday,因为该函数会返回到它找到的第一个工作日。这是大多数时候需要的,即您在周末前的周五结算交易。
    • 在我的 SQL 中哪里插入这个?抱歉,我是一名推销员,编写自己的工具,而不是程序员。
    • 我已经改写了我的解决方案,以便它可以在没有代码的情况下完成
    【解决方案2】:

    也许有点复杂:

    IIf(Weekday(DateAdd("d", 0, Date())) = 7, DateAdd("d", 0, Date()) + 2, IIf(Weekday(DateAdd("d", 0, Date())) = 1, DateAdd("d", 0, Date()) + 1, DateAdd("d", 0, Date())))
    

    这可以放在你的 where 语句中,像这样:

    SELECT q.SoldID, q.CompanyName, q.Product, 
           q.Description, q.Quantity, q.Price, 
           q.ConfirmedExpires, q.Note
    FROM qryAllSold AS q
    WHERE q.ConfirmedExpires=IIf(Weekday(DateAdd("d", 0, Date())) = 7, DateAdd("d", 0, Date()) + 2, IIf(Weekday(DateAdd("d", 0, Date())) = 1, DateAdd("d", 0, Date()) + 1, DateAdd("d", 0, Date())))
    AND q.RenewedToID Is Null AND q.NonOpportunity=No
    

    请注意,我为 qryAllSold 使用了别名 q,因为这样可以更轻松地阅读查询: FROM qryAllSold AS q

    最好使用 False 而不是 No。

    如果你愿意,你应该可以使用参数:

    PARAMETERS NoDays Short;
    SELECT q.SoldID, q.CompanyName, q.Product, 
           q.Description, q.Quantity, q.Price, 
           q.ConfirmedExpires, q.Note
    FROM qryAllSold AS q
    WHERE q.ConfirmedExpires=IIf(Weekday(DateAdd("d",[NoDays],Date()))=7,DateAdd("d",[NoDays],Date())+2,IIf(Weekday(DateAdd("d",[NoDays],Date()))=1,DateAdd("d",[NoDays],Date())+1,DateAdd("d",[NoDays],Date())))
    AND q.RenewedToID Is Null AND q.NonOpportunity=No
    

    该参数允许您选择天数。如果它引用表单上的字段或在 VBA 中设置,那就更好了。

    【讨论】:

    • 我真的不知道这对我有什么帮助。我读错了吗?它看起来不像在 SQL 查询中起作用的东西。以下是我用伪阅读的方式: If today+0=7 then today+0+2 Else IF today+0=1 then today+0+1 Else Today+0 Endif Endif
    • 如果今天 = 一周的第 7 天(星期六,星期从星期日开始),日期 + 2(星期一),如果今天 = 一周的第 1 天(星期日),日期 + 1(星期一),其他今天。
    • 在我的 SQL 中哪里插入这个?抱歉,我是一名推销员,编写自己的工具,而不是程序员。
    • 我已添加评论。您还应该能够使用参数来表示天数。
    • 我试着给你两个复选标记,因为我喜欢这两个回答......我只偏爱 heferav,因为他似乎更需要代表。谢谢老哥!
    猜你喜欢
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多