2017-10-23 10 views
0

私は、ユーザーが日付範囲、施設名(これらはコンボボックスに由来)を入力できるようにデザインされたフォームを構築しました。 Accessでクエリを生成する番号。フィールドが空白のままになっている場合はすべての施設の選択した日付範囲内の結果を返し、選択されている場合は特定の施設の結果のみを返したいと考えています。私はまた、結果を人のバッジ番号に一致するものに制限できるようにしたい。複数のフィールドを持つクエリの条件を入力する値またはヌル

だから私が望む可能性が次のようになります。

  1. 日付範囲=ユーザーによって定義|施設 - すべて選択されていない場合|バッジ#=選択されていない場合はすべて
  2. 日付範囲=ユーザー定義|施設 - すべて選択されていない場合|バッジ#=ユーザー定義
  3. 日付範囲=ユーザー定義|ファシリティ - ユーザ定義|バッジ#=選択されていない場合はすべて
  4. 日付範囲=ユーザー定義|ファシリティ - ユーザ定義|バッジ#=ユーザー定義

私はもともと、日付範囲と施設名だけでビルドしていて、うまくいきました。 #バッジを追加しようとすると、正しく動作しません。

セクションTO WHEREのための私のSQLは次のとおりです。私には

WHERE (((Diversion.Transaction_Date) Between [Forms]![Parameters]![FromDate] And [Forms]![Parameters]![ToDate]) 
AND ((Diversion.Employee_Badge_Number)=[Forms]![Parameters]![BadgeNumber]) 
AND ((Diversion.Facility)=[Forms]![Parameters]![FacilitySelect])) 
OR (((Diversion.Transaction_Date) Between [Forms]![Parameters]![FromDate] And [Forms]![Parameters]![ToDate]) 
AND ((Diversion.Facility)=[Forms]![Parameters]![FacilitySelect]) 
AND ((([Diversion].[Employee_Badge_Number]) Like [Forms]![Parameters]![BadgeNumber]) Is Null)) 
OR (((Diversion.Transaction_Date) Between [Forms]![Parameters]![FromDate] And [Forms]![Parameters]![ToDate]) 
AND ((Diversion.Employee_Badge_Number)=[Forms]![Parameters]![BadgeNumber]) 
AND ((([Diversion].[Facility]) Like [Forms]![Parameters]![FacilitySelect]) Is Null)) 
OR (((Diversion.Transaction_Date) Between [Forms]![Parameters]![FromDate] And [Forms]![Parameters]![ToDate]) 
AND ((([Diversion].[Employee_Badge_Number]) Like [Forms]![Parameters]![BadgeNumber]) Is Null) 
AND ((([Diversion].[Facility]) Like [Forms]![Parameters]![FacilitySelect]) Is Null)) 
OR (((([Diversion].[Facility]) Like [Forms]![Parameters]![FacilitySelect]) Is Null)); 

、それは私がフォームから取得したい四つの可能な結果を​​含めているように見えますが、それは正しく動作しません。たとえば、施設のフィールドを空白のままにして、バッジ番号を定義すると、それでもすべての結果が表示されます。ファシリティを定義し、バッジ番号を定義すると正しい結果が得られます。

アイデア?

+0

ワイルドカードを使用しないLIKE演算子は役に立たず、=記号を使用することもできます。 Is Null基準は使用される意味がありません。動的なパラメータ化クエリは決して使用しません。私はフィルタ基準文字列を構築するためにVBAを好む。 http://allenbrowne.com/ser-62.html – June7

+0

ありがとうJune7。あなたとメアリが提供してくれたことは、私がやろうとしていたことよりもはるかに意味がありました。 – CasWalker

答えて

0

これは、複数の基準値を持つ動的クエリを構築するアイデアを提供します。この例では、ユーザーは任意の数の基準を選択できます。これはVB.Netで書かれています。それはAccessで動作します。各フィールドをチェックして、条件が指定されているかどうかを確認し、有効な値があればクエリに追加します。 私はスペースがどこに行くのか分かりやすいので、補間された文字列を使用しました。代替は次のとおりです。

String.Format("RoasterId = {0} ", itgRoaster) 

私も作成し、各APPENDとそれらの廃棄のオーバーヘッドなしで文字列を変更するための効率的な方法である文字列ビルダを使用しました。これがVBAで利用できない場合は、&=を使用することができます。

Dim bolNeedAnd As Boolean = False 
     Dim sb As New Text.StringBuilder 
     sb.Append("SELECT Coffees.ID, Coffees.[Name], Coffees.RoasterID, Roasters.[Name], Coffees.[Type],Coffees.Rating, Coffees.Comment, Coffees.Description, Coffees.Roast, Coffees.IsExtraBold, Coffees.IsFavorite 
    From Coffees Inner Join Roasters on Coffees.RoasterID = Roasters.ID Where ") 
     If itgRoaster <> 0 Then 
      sb.Append($"RoasterID = {itgRoaster} ") 
      bolNeedAnd = True 
     End If 
     If strRoast <> "" Then 
      If bolNeedAnd Then 
       sb.Append($"AND Roast = '{strRoast}' ") 
      Else 
       sb.Append($"Roast = '{strRoast}' ") 
      End If 
      bolNeedAnd = True 
     End If 
     If strType <> "" Then 
      If bolNeedAnd Then 
       sb.Append($"AND Type = '{strType}' ") 
      Else 
       sb.Append($"Type = '{strType}' ") 
      End If 
      bolNeedAnd = True 
     End If 
     If strRating <> "" Then 
      If bolNeedAnd Then 
       sb.Append($"AND Rating = '{strRating}' ") 
      Else 
       sb.Append($"Rating = '{strRating}' ") 
      End If 
      bolNeedAnd = True 
     End If 
     If bolBold Then 
      If bolNeedAnd Then 
       sb.Append("AND IsExtraBold = 1 ") 
      Else 
       sb.Append("IsExtraBold = 1 ") 
      End If 
      bolNeedAnd = True 
     End If 
     If bolFavorite Then 
      If bolNeedAnd Then 
       sb.Append("AND IsFavorite = 1 ") 
      Else 
       sb.Append("IsFavorite = 1 ") 
      End If 
     End If 
     sb.Append("Order By Coffees.[Name];") 
     Debug.Print(sb.ToString) 

     Dim cmd As New OleDbCommand With { 
      .Connection = cn, 
      .CommandType = CommandType.Text, 
      .CommandText = sb.ToString} 
+0

メアリーありがとう! – CasWalker

+0

このVB.netですか?私はVBAが文字列の建物のために異なっていると期待します。 – June7

+0

@ June7、これは私の答えに述べられているVB.netです。 VBAが.Netフレームワークにアクセスできるかどうかわかりません。だからこそ、私は、私の答えに述べられていることを示唆したのです。 – Mary

関連する問題