我正在使用MS Access 2010。
我有一个项目表,每个项目都有一个STARTDATE,ENDDATE和一个True / False字段用于ACTIVE。如果今天的日期在开始日期和结束日期之内,则活动为真 - 我希望自动选中或取消选中它。
如何在VBA中编写此事件?
谢谢!
答案 0 :(得分:1)
我不明白为什么你的表需要一个Active字段。根据您的描述,如果当前日期在该日期范围内,则为True,否则为False。所以这可以通过查询来完成。
SELECT
STARTDATE,
ENDDATE,
IIf(Date() >= STARTDATE AND Date() <= ENDDATE,
True, False) AS Active
FROM YourTable;
编辑:但是,如果您确实希望将Active存储为表中的字段,则可以在UPDATE查询中包含该IIf()表达式:
UPDATE YourTable
SET YourTable.Active = IIf(Date() >= [STARTDATE]
AND Date() <= [ENDDATE],
True, False);
答案 1 :(得分:1)
在我看来,如果某行的有效状态完全取决于有效日期,那么该表不应具有有效列。
首先,删除表格中的“活动”列。创建一个新查询:
SELECT
*,
Now() >= StartDate And Now() < EndDate AS Active
FROM YourTable
现在在您当前使用该表的每个位置使用此查询。如果您遇到性能问题,请将WHERE Active = True
替换为上述条件WHERE Now() >= StartDate And Now() < EndDate
。
一些注意事项:
定义一个VB函数并不是一个好主意,因为这会产生一系列复杂性,这肯定会损害性能而没有真正令人信服的理由。
尝试保持表同步不是一个好主意,因为您最终会遇到竞争条件,更新失败或导致错误数据的不一致。
如果您坚持保留列并尝试同步这些值,那么您将在startdate和enddate文本框的AfterUpdate事件以及Form Current上放置一些代码,以根据当前时间。这还需要一些频繁的工作,根据当前时间进度将表中的所有行更新为“活动”或“非活动”。如果你很幸运,你可能没有太多问题。
答案 2 :(得分:0)
在vba中,您可以使用Date.Now获取当前日期。 如果要构建查询,可以简单地将其作为where子句:
WHERE Now between STARTDATE and ENDDATE
如果您在vba代码中执行此操作,例如在循环中,您可以使用类似
的内容if Date.Now > STARTDATE and Date.Now < ENDDATE Then
...
end if