3

私は現在MSAccessデータベースに取り組んでおり、日付の減算に問題があります。

基本的に、たとえば次のように目標日を作成しようとしています。

目標日=期限-リードタイム

つまり、リードタイムは30日になる可能性があるため、目標日は締め切りの30日前にする必要があります。

私が使用しようとしているコードは次のとおりです。

strSQL = "INSERT INTO dbo_DEALER_TASK ( Dlr_Number, Action_Id, Task_Id, Area_Id, 
Task_Deadline_Date, Responsible_Person_Id, Alternate_Person_Id, Priority, Comment, 
Suppress_Email, Dealer_Type ) "

strSQL = strSQL & "SELECT dbo_DEALER_ACTION.Dlr_Number, dbo_DEALER_ACTION.Action_Id, 
qryAllTasksToAdd.Task_Id, qryAllTasksToAdd.Area_Id, Deadline_Date - Deadline_adjustment 
AS 'Task_Deadline_Date', qryAllTasksToAdd.Person_Responsible_Id, 
qryAllTasksToAdd.Alternate_Responsible_Id, qryAllTasksToAdd.Priority, 
qryAllTasksToAdd.Comment, qryAllTasksToAdd.Suppress_Email, 
qryAllTasksToAdd.Applies_To_Dealer_Type "

strSQL = strSQL & "FROM dbo_DEALER_ACTION LEFT JOIN qryAllTasksToAdd ON 
(dbo_DEALER_ACTION.Dealer_Type = qryAllTasksToAdd.Applies_To_Dealer_Type) AND 
(dbo_DEALER_ACTION.Action_Id = qryAllTasksToAdd.Action_Id) "

strSQL = strSQL & WHERE (((qryAllTasksToAdd.Task_Id)=" & Me.Task_Id & ") AND 
((dbo_DEALER_ACTION.Date_Completed) Is Null));"

DoCmd.RunSQL strSQL

VBAコードがステートメントを実行すると、空白のままになっているTask_Deadline_Dateフィールドを除いて、すべてが正しく更新されます。

しかし、私を本当に混乱させているのは、このSQLステートメントをスタンドアロンで実行すると、期待どおりに機能していることです。さまざまなアイデアを試した後、「Deadline_Date --Deadline_adjustment AS'Task_Deadline_Date'」を文字列リテラルの日付に置き換えようとしましたが、ステートメントは正常に機能しました

誰かが何が悪いのか考えていますか?

ありがとう、

クリス

4

3 に答える 3

1

あなたはエイリアスを引用しました、あなたはそれをするべきではありません:

 Deadline_Date - Deadline_adjustment AS Task_Deadline_Date

いいえ

 Deadline_Date - Deadline_adjustment AS 'Task_Deadline_Date'


引用符を追加すると、フィールドの名前は次のようになります。'Task_Deadline_Date'

日付フィールドのデータ型とSQLServerを使用しているかどうかによっては、次のようにDateAddを使用する必要があります。

DateAdd("d",-[Deadline_adjustment],[Deadline_Date])
于 2013-02-21T15:15:06.883 に答える
0

Accessのクエリデザイナで、機能するバージョンのクエリから始めて、パラメータクエリに変換します。

WHERE
        qryAllTasksToAdd.Task_Id=[which_id]
    AND dbo_DEALER_ACTION.Date_Completed Is Null;

クエリの開始時にステートメントを追加してPARAMETERS、パラメータのデータ型についてデータベースエンジンに通知することもできます。例..。

PARAMETERS which_id Text ( 255 );
PARAMETERS which_id Long;

そのクエリが機能するようになったら、それを保存して名前を付けます。次に、VBAプロシージャはその保存されたクエリを使用し、パラメータ値をフィードして実行できます。

Dim db As DAO.database
Dim qdf As DAO.QueryDef

Set db = CurrentDb
Set qdf = db.QueryDefs("YourQuery")
qdf.Parameters("which_id").value = Me.Task_Id
qdf.Execute dbFailOnError
Set qdf = Nothing
Set db = Nothing

これは、実行する必要があるたびにVBAコードでSQLステートメントを再作成するよりもはるかに簡単です。

于 2013-02-21T16:29:27.687 に答える
0

dbo_DEALER_TASKに挿入している列のデータ型は、実際には日時フィールドではないようです。

「Deadline_Date--Deadline_adjustmentAS'Task_Deadline_Date'」を文字列リテラルの日付に置き換えようとしましたが、ステートメントは正常に機能しました

'02/20/2012'を意味する場合(たとえば、SQL Serverで正しく使用する場合)、これはAccessでは機能せず、出力列がテキスト(= varchar / char))データ型の場合にのみ機能します。 。Accessの日付定数は、#02/20/2012#のように指定されます

出力テーブルでTask_Deadline_Dateのデータ型を確認してください。

于 2013-02-21T22:05:44.413 に答える