0

我在各种监禁中设置了以下查询,以提醒我在确认的到期日期前 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 是否具有该功能。

如果这不起作用,我还有什么其他方法可以确保我不会错过这些到期的通知?

4

2 回答 2

2

[编辑]如果您不是程序员,这里是另一种解决方案

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

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

"ww" - 指定周,2 指定星期一为一周的第一天,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之类的函数的工作日特性呢?

您可以计算 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
于 2009-10-27T13:42:50.233 回答
1

也许有点复杂:

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 中设置,那就更好了。

于 2009-10-27T14:08:19.250 回答