我的項目表內,並每個項目都有一個STARTDATE,ENDDATE,併爲ACTIVE真/假現場。如果今天的日期在開始日期和結束日期之內,則激活是正確的 - 我希望它自動選中或取消選中。計算,如果日期落在我和MS Access 2010中</p> <p>工作給定的範圍
如何在VBA中編寫此事件?
謝謝!
我的項目表內,並每個項目都有一個STARTDATE,ENDDATE,併爲ACTIVE真/假現場。如果今天的日期在開始日期和結束日期之內,則激活是正確的 - 我希望它自動選中或取消選中。計算,如果日期落在我和MS Access 2010中</p> <p>工作給定的範圍
如何在VBA中編寫此事件?
謝謝!
在vba中,您可以使用Date.Now來獲取當前日期。 如果你正在建設一個查詢,你可以簡單的把儘可能在where子句:
WHERE Now between STARTDATE and ENDDATE
如果您在VBA代碼在一個循環中這樣做,例如,你可以有類似
if Date.Now > STARTDATE and Date.Now < ENDDATE Then
...
end if
我不明白你的表爲什麼需要一個字段爲活動。根據您的描述,如果當前日期在該日期範圍內,則爲真,否則爲False。所以這可以通過查詢來完成。
SELECT
STARTDATE,
ENDDATE,
IIf(Date() >= STARTDATE AND Date() <= ENDDATE,
True, False) AS Active
FROM YourTable;
編輯:但是,如果你想存儲活躍在你的表中的字段,可以包含IIF()在更新查詢表達式:
UPDATE YourTable
SET YourTable.Active = IIf(Date() >= [STARTDATE]
AND Date() <= [ENDDATE],
True, False);
我從來沒有完全理解爲什麼程序員會將一個布爾值封裝在IIf()中,以便將其轉換爲......布爾值。 – ErikE 2012-02-13 23:16:23
'IIf()'保證即使當'STARTDATE'和/或'ENDATE'爲空時我們也總是得到一個布爾值。對於'SELECT'來說這可能不是那麼重要,但如果他選擇了這種方式,那麼對於'UPDATE'來說就很重要。在Yes/No字段中,Access不會接受Null。 – HansUp 2013-02-27 15:09:12
然後用'Nz()'代替取決於副作用的另一個函數。這清楚地表達了你的空值處理而不是布爾轉換的意圖。否則,你會欺騙其他查看代碼的程序員。 – ErikE 2013-02-27 15:13:44
在我看來,如果一行的活動狀態完全依賴於活動日期,那麼該表不應該有活動列。
首先,刪除表格中的活動列。創建一個新的查詢:
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中放置一些代碼,以基於當前時間。這也需要一些頻繁的工作,根據當前時間進度將表中的所有行更新爲「活動」或「非活動」。如果你很幸運,你可能沒有太多的問題,這個計劃。
你知道BETWEEN與><是不一樣的嗎?哪個是對的? – ErikE 2012-02-13 23:17:37
@ErikE是的!我一直在咆哮10年。 2002:http://databases.aspfaq.com/general/should-i-use-between-in-my-database-queries.html 2009:http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16 /壞習慣,對開球處理不當,日期範圍查詢。aspx – 2012-02-21 18:48:50
顯然,在包含這兩個值的時候< and >不是。所以這是你想如何陳述你的查詢的問題。 – bjorsig 2012-02-21 22:59:58