2012-02-13 5 views
2

に収まると、各プロジェクトはSTARTDATE、ENDDATEを持っており、ACTIVEのための真/偽フィールド場合の計算。今日の日付が開始日と終了日の範囲内であればアクティブですが、自動的にチェックしたりチェックを外したりします。日は、私はプロジェクトのテーブルを持って、私はMS Accessの2010</p> <p>で働いている与えられた範囲

このイベントをVBAに書き込むにはどうすればよいですか?

ありがとうございました!

答えて

0

vbaでは、Date.Nowを使用して現在の日付を取得できます。 あなたは、where句のようにあなたは、単純なプットをすることができ、クエリを構築する場合:あなたは、VBAコードでこれをやっている場合は、ループ内のインスタンスのために、あなたは

if Date.Now > STARTDATE and Date.Now < ENDDATE Then 
... 
end if 
+1

BETWEENと><は同じではないことはご存じですか?どちらが正しい? – ErikE

+0

@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 –

+0

< and >が明白でないときに両方の値を含めてしたがって、どのようにクエリを記述したいのかという問題です。 – bjorsig

1
のようなものを持つことができます

WHERE Now between STARTDATE and ENDDATE 

あなたのテーブルにActiveのフィールドが必要な理由がわかりません。あなたの説明に基づいて、現在の日付がその日付範囲内にある場合はTrue、それ以外の場合はFalseになります。これはクエリから実行できます。

SELECT 
    STARTDATE, 
    ENDDATE, 
    IIf(Date() >= STARTDATE AND Date() <= ENDDATE, 
     True, False) AS Active 
FROM YourTable; 

編集:私の意見では

UPDATE YourTable 
SET YourTable.Active = IIf(Date() >= [STARTDATE] 
    AND Date() <= [ENDDATE], 
    True, False); 
+0

プログラマがブール値に変換するためにブール値をIIf()にラップする理由を、私が決して理解したことはありません。 – ErikE

+0

'IIf()'は、 'STARTDATE'および/または' ENDATE'がNullであっても常にブール値を取得することを保証します。それは 'SELECT'にとってはそれほど重要ではないかもしれませんが、もし彼がその方法を選ぶならば' UPDATE'のためには重要です。アクセスはYes/NoフィールドでNullを受け付けません。 – HansUp

+0

そして、副作用に依存するのではなく、 'Nz()'を使用してください。これは、ブール変換ではなくNull処理の意図を明確に表しています。それ以外の場合は、コードを参照している他のプログラマーに騙されます。 – ErikE

1

:あなたは、テーブル内のフィールドとしてActive格納したいんしかし、もし、あなたがUPDATEクエリでその式IIf()表現を含むことができ、 行のアクティブなステータスがアクティブな日付に完全に依存している場合は、テーブルにはアクティブな列がありません。

まず、テーブルのアクティブ列を削除します。新しいクエリを作成します。

SELECT 
    *, 
    Now() >= StartDate And Now() < EndDate AS Active 
FROM YourTable 

現在、このテーブルを使用しているすべての場所でこのクエリを使用してください。パフォーマンス上の問題がある場合は、WHERE Active = Trueを上記の条件WHERE Now() >= StartDate And Now() < EndDateに置き換えてください。

いくつかの注意:これは間違いありません本当に説得力のある理由のためにパフォーマンスを傷つけるでしょう複雑の束を作成するよう

VBの関数の定義は良いアイデアではありません。

最終的に競合状態、更新プログラムの失敗、または間違ったデータを取得する矛盾が発生するため、テーブルを同期させておくことはお勧めできません。

列を保持して値を同期しようとする場合は、[開始時刻]テキストボックスと[終了時刻]テキストボックスのAfterUpdateイベントにForm Currentを設定し、アクティブフラグを設定します現在の時刻。これはまた、進行中の現在の時間に基づいて、表内のすべての行をアクティブまたは非アクティブに更新する何らかの頻繁な作業を必要とします。あなたが運が良ければ、このスキームにはあまりにも多くの問題がないかもしれません。

関連する問題