0

ASP に 2 つのテキスト ボックスがあるフォームがあります。ユーザーがそれに値を入力して送信すると、ユーザーが選択した日付の MS Access クエリからのデータが表示されます。ユーザーが両方のテキスト ボックスを空白のままにしておくだけで、データベースからの完全な出力を表示したいと考えています。
これは、アクセスのサンプル クエリです。

select column_date, field1, field2, sum(field3) from table1
where field1 like '*xyz' and 
column_date between [@startdate] and [@enddate]
group by column_date, field1, field2

私のaspコードは以下に似ています:

objCmd.CommandText = "Query"
objCmd.CommandType = adCmdStoredProc
Set objParam = objCmd.CreateParameter("@startdate" , adInteger, adParamInput, 0, 0)
objCmd.Parameters.Append objParam
Set objParam = objCmd.CreateParameter("@enddate" , adInteger, adParamInput, 0, 0)
objCmd.Parameters.Append objParam
if request.form ("startdate") = "" Then
objCmd.Parameters ("@startdate") = 1
Else
objCmd.Parameters("@startdate") = request.form("startdate")
objCmd.Parameters("@enddate") = request.form("enddate")
End if
if request.form ("enddate") = "" Then
objCmd.Parameters ("@enddate") = 31
Else
objCmd.Parameters("@startdate") = request.form("startdate")
objCmd.Parameters("@enddate") = request.form("enddate")
End if
................

私の開始日と終了日は、1、2、3、4、5 などの数字のみのテキスト データ型であることに注意してください (1 は 2012 年 7 月 1 日を意味し、2 は 2012 年 7 月 2 日を意味します)。

「開始日」と「終了日」という名前の 2 つのテキスト ボックスがあります。ユーザーがボックスに日付を入力すると、クエリから 2 つの日付の間のデータが返されます。ユーザーが空白のままにすると、エラーが表示されます。

しかし、ユーザーが両方のテキスト ボックスを空白のままにすると、クエリからすべての値が返されることを確認したいと思います。ユーザーが 2 つのテキスト ボックスのいずれかに単一の値を入力すると、その日付のデータのみが返されます。

どうすれば達成できるかわかりません。

4

2 に答える 2

1

問題の 1 つは、@startdate と @enddate の両方で CreateParameter を呼び出しているが、adDate である必要があると思われる場合に、入力タイプとして adInteger を指定していることです。

値の問題については、クエリを送信する前に、フォームの startdate と enddate の値を確認する方法があります。startdate が空白の場合、デフォルトで「1900 年 1 月 1 日」などの「魔法の」日付 (または、アプリケーションのこのフィールドに表示される可能性が最も高い日付を表すもの) に、同様の「魔法」を使用できます。表現する可能性が最も高い日付を表すenddate のデフォルトの日付。そうすれば、ユーザーがどちらの値にも何も入力しなくても、何らかの結果が返されます。また、日付値をキャプチャするために使用されるテキスト ボックスが空白値または有効な日付のいずれかを保持するように、いくつかの検証を追加することもできます。

デフォルトの日付を実装する方法の例は、次のようになります。

if request.form("enddate")="" then
    objCmd.Parameters("@enddate")="12/31/2099"
else
    objCmd.Parameters("@enddate")=request.form("enddate")
end if

この問題を解決する方法は他にもあります。これは単なる (テストされていない) 例であり、正しい方向へのプッシュを目的としています。

それが役立つことを願っています。

于 2012-07-13T20:31:25.710 に答える
0

あなたは言う

「私の開始日と終了日は、1、2、3、4、5などの数字だけのテキストデータ型であることに注意してください(1は2012年7月1日を意味し、2は2012年7月2日を意味します)。」

これは、日付が1未満または31を超えることはできないことを示唆しています。日付に対して前処理を行うことはできますか?

最初の日付がnullで、2番目の日付がnullの場合、「日付」は1と31である必要があります。2つの日付のいずれかがnullで、もう一方がnullでない場合、「日付」は互いに等しくなければなりません。

擬似コード:

If IsNull(firstdate) Then
    If IsNull(seconddate)
        firstdate=1
        seconddate=31
    Else
        firstdate=seconddate
    End If
End If

If IsNull(seconddate) Then
   seconddate=firstdate
End If

これはあなたに与えるでしょう:

BETWEEN 1 And 31 '' All

そして、言います

BETWEEN 2 And 2 ''A single day
于 2012-07-13T20:55:12.953 に答える