我在各种监禁中设置了以下查询,以提醒我在确认的到期日期前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是否具有该功能。
如果这不起作用,我可以通过其他方式确保我不会错过这些到期的通知吗?
答案 0 :(得分:2)
[编辑]如果您不是程序员,这里是替代解决方案
为什么不在查询中使用格式功能,例如
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 等功能的工作日功能?
而不是计算提前30个日历日,您可以计算25个日历或任何其他工作日数。
下面的代码显示了一个消息框,但您可以在消息框后面的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 :(得分: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,因为这样可以更轻松地读取查询: 来自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中设置,那就更好了。