2013-08-28 2 views
0

제품 표가 포함 된 ADO 레코드가 있습니다. 내가 표를 필터링하는 데 사용되는 제품의 목록을 가지고 - 동적으로 (그러나 더 이상)와 같은 필터를 구축 :ADO 레코드 집합으로 필터링 된 항목을 보완하십시오.

rs.Filter = "productType = 'product A' " _ 
+ "or productType = 'product B' " _ 
+ "or productType = 'product C' " 

이 나를 위해 잘 작동, 나는, 별도의 워크 시트에 모든 벌금을 필터링 된 행을 복사.

그런 다음 새로운 프로젝트 요구 사항은 을 제외하고 항목을 제외해야한다는 것을 의미했습니다. 음, 부울 대수를 수행하고 반대 필터를 사용하여 동일한 쿼리를 실행했습니다.

rs2.Filter = "productType <> 'product A' " _ 
+ "and productType <> 'product B' " _ 
+ "and productType <> 'product C' " 

이 또한 정상적으로 작동합니다. 제외 된 항목을 다른 워크 시트에 복사하므로 포함 된 항목과 제외 된 항목이 모두 있습니다.

하지만 새로운 요구 사항은 특별한 경우에 대처해야한다는 것을 의미합니다. 제품 B는 특정 날짜에만 포함됩니다. 이제이 긍정적 인 필터 잘 작동 찾을 수있는 하나 항목 포함 :

rs.Filter = "productType = 'product A' " _ 
+ "or (productType = 'product B' and expiry = 16/08/2013) " _ 
+ "or productType = 'product C' " 

을하지만 부정적인 필터 (제외 항목을 찾을 수있는 하나의) 문제로 실행. restriction on nested OR's in ADO Recordset Filter으로 인해 다음은 허용되지 않습니다.

rs2.Filter = "productType <> 'product A' " _ 
+ "and (productType <> 'product B' or expiry <> 16/08/2013) " _ 
+ "and productType <> 'product C' " 

대체 솔루션이 있습니까? 예. 필터의 보완법을 얻는 방법 (즉 제외하는 행)은 무엇입니까?

내가 포함해야 할 제품 목록이 동적으로 작성되었으므로 코드 작성시 사용할 수 없습니다.

+0

'전체 포함 필터'가 허용됩니까? –

답변

0

나는 ADO를 꽤 많이 사용하며 ADO에서이 제한을 해결하기위한 두 가지 해결책을 찾았습니다.

일반적으로 첫 번째 해결 방법이 가장 좋습니다. 이 필터를/SQL 문에 추가하고 데이터 소스를 다시 쿼리하면됩니다.

두 번째 옵션은 비효율적이지만 더 작은 레코드 세트에서는 정상적으로 작동합니다. 필터링 된 레코드 세트를 반환하는 함수입니다. 당신이해야 할 일은 여러 번 호출하는 것입니다. 각 필터가 작동 할 때마다 한 번씩 (원하는 경우) 원하는 결과를 얻도록하십시오. 연결된 레코드 세트에서 이것이 어떻게 작동하는지 모르겠습니다. 나는 단절된 레코드 세트에서만 그것을 사용한다.

Public Function GetFilteredRecordset(ByRef rsSource As ADODB.Recordset, _ 
             ByVal sWhere As String, _ 
             Optional ByVal sOrderBy As String, _ 
             Optional ByVal LockType As ADODB.LockTypeEnum = adLockUnspecified) As ADODB.Recordset 

    Dim sOriginalOrderBy As String 
    sOriginalOrderBy = rsSource.Sort 

    rsSource.Filter = sWhere 
    If sOrderBy <> "" Then 
     If Left(LCase(sOrderBy), 8) = "order by" Then sOrderBy = Trim(Right(sOrderBy, Len(sOrderBy) - 8)) 
     rsSource.Sort = sOrderBy 
    End If 

    Dim objStream As ADODB.Stream 
    Set objStream = New ADODB.Stream 
    rsSource.Save objStream, adPersistXML 

    Dim rsF As ADODB.Recordset 
    Set rsF = New ADODB.Recordset 
    rsF.Open objStream, , , LockType 

    rsSource.Filter = "" 
    rsSource.Sort = sOriginalOrderBy 

    objStream.Close 
    Set objStream = Nothing 
    Set GetFilteredRecordset = rsF 

End Function 
관련 문제