2011-09-18 19 views
0

나는 내 MS Acccess 데이터베이스에서 검색 페이지를 만들고 Search_Click() 하위의 DoCmd.ApplyFilter과 관련된 문제로 실행되는 일부 VBA를 작성하고 있습니다.MS 액세스 VBA DoCmd.ApplyFilter 거짓을 평가하는 IsNull()

enter image description here 내 코드는 ...

Shows results where true... 
([site column] = txtbox1 OR isnull(txtbox1)) 
AND 
([asset col ] = txtbox2 OR isnull(txtbox2)) 

물론, 원하는 기능은 다음과 같다 ...이

Private Sub Search_Click() 
DoCmd.ApplyFilter "", _ 
    "([site] = [Forms]![SWP Search]![txtSite] " & _ 
      " Or IsNull([Forms]![SWP Search]![txtSite])) " & _ 
    "AND " & _ 
    "([asset] = [Forms]![SWP Search]![txtAsset] " & _ 
     " Or IsNull([Forms]![SWP Search]![txtAsset]))" 
End Sub 

같은 또는 의사 코드에

  1. 사이트를 찾습니다 선택된 자산 블랭크 -> 사이트 내 필터에만 적용
  2. 사이트 선택, 자산 선택 -> 빈 모두
  3. 사이트에 필터 자산 빈 - 자산에만

에> 필터 그러나 실제로 일어나는 것은 -> 모든

  • 사이트 빈 행, 자산 선택을 돌려줍니다. ..

    1. 사이트 선택, 자산 빈 - 자산이 빈>
    2. 사이트 빈 작동 - ->는
    3. 사이트 자산 선택, 선택 작동>개 행이
    4. 사이트 빈, 자산이 선택한 반환 ->행이 사이트는 비어있는 경우, ISNULL()가 true와 그렇게 첫 번째 부분은 평가되지 같은

    그래서 보인다 반환 필터는 FALSE이며, 그저 거기에서 종료됩니다.

    왜 그런가?

  • 답변

    1

    봅니다 빈 txtbox이 예상대로되지 NULL, 빈 문자열을 반환 할 수 있습니다로 IsEmpty() 대신 IsNull() 메이크업의 차이, 즉

     "(IsEmpty([Forms]![SWP Search]![txtSite]) " & _ 
         " Or [site] Like [Forms]![SWP Search]![txtSite])" & _ 
    "AND" & _ 
        "(IsEmpty([Forms]![SWP Search]![txtAsset])" & _ 
        " Or [asset] Like [Forms]![SWP Search]![txtAsset])" 
    

    를 사용한다. 또는 빈 문자열에 대해 텍스트 상자 값을 비교하십시오. 아마도 trim()을 먼저 사용하십시오.

    +0

    IsEmpty()는 Variant 유형의 변수에만 적용됩니다. –

    +0

    콤보 상자에 대해 "" "기본값으로 설정되어 있습니다. 나는 그것이 NULL을 의미 할 것이라고 생각했지만 분명히 그렇지 않다. 나는 디버거에서 체크하고'IsNull()'이 비어있을 때 true로 평가하지 않았다. 그래서 나는 기본값을 없애고'IsNull()'이 훌륭하게 작동했다. 문제 해결됨! –

    +0

    기본값을 Null로하려면 기본 값 속성을 "Null"(따옴표 제외)로 설정하십시오. –