2017-10-23 1 views
0

사용자가 날짜 범위, 시설 이름 (콤보 박스에서 제공) 및 배지를 입력 할 수 있도록 언 바운드 필드가있는 양식을 만들었습니다 Access에서 쿼리를 생성하는 번호입니다. 필드를 비워두면 모든 기능에 대해 선택한 날짜 범위 내에서 결과를 반환하거나 특정 기능이 선택된 경우 해당 기능 만 반환 할 수 있기를 원합니다. 나는 또한 결과를 사람의 배지 번호와 일치하는 것으로 제한 할 수 있기를 원합니다.입력 할 매개 변수 형식 값 또는 널을 사용하여 여러 필드가있는 쿼리 조건

그래서 나는 것 할 가능성 :

  1. 날짜 범위 = 사용자에 의해 정의 | 시설 - 선택하지 않은 경우 모두 | 배지 # = 선택하지 않은 경우 모두
  2. 날짜 범위 = 사용자가 정의 | 시설 - 선택하지 않은 경우 모두 | 배지 # = 사용자가 정의
  3. 날짜 범위 = 사용자가 정의 | 시설 - 사용자가 정의한 | 배지 # = 선택하지 않은 경우 모두
  4. 날짜 범위 = 사용자가 정의 | 시설 - 사용자가 정의한 | 배지 # = 사용자가 정의

원래 날짜 범위와 시설 이름으로 작성했는데 정상적으로 작동했습니다. 배지 #에 추가하려고하면 제대로 작동하지 않습니다. 그것이 내가 형태에서 얻을 할 네 가지 결과를 포함처럼 보이는, 나에게

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)); 

하지만 제대로 작동되지 않습니다 섹션에 WHERE에 대한

내 SQL입니다. 예를 들어 시설 필드를 비워두고 배지 번호를 정의하면 여전히 모든 결과를 제공합니다. 시설을 정의하고 배지 번호를 정의하면 정확한 결과를 얻을 수 있습니다.

아이디어가 있으십니까?

+0

와일드 카드가없는 LIKE 연산자는 쓸모가 없으므로 = 기호를 사용할 수도 있습니다. Is Null 기준은 사용 된 것처럼 말이되지 않습니다. 필자는 동적 인 매개 변수화 된 쿼리를 사용하지 않습니다. 나는 필터 기준 문자열을 구성하기 위해 VBA를 선호합니다. http://allenbrowne.com/ser-62.html – June7

+0

감사 6 월 7 일. 당신과 메리가 제공 한 것은 내가하려는 일보다 훨씬 더 의미가있었습니다. – 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

관련 문제