Pergunta

Estou tentando filtrar alguns recordes de um TadoQuery. Defino a propriedade filtrada como true e quando eu defino o filtro como field = 'value', tudo funciona bem. Eu gostaria de construir dinamicamente este filtro anexando

<space>AND field='value'

Para um valor sempre verdadeiro, e pensei que 1 = 1 faria o truque. Então, eu teria 1 = 1 como o filtro padrão e depois apenas anexar AND field='value' para ele conforme necessário.

Isso, no entanto, não funciona. A mensagem de erro diz:

Os argumentos são do tipo errado, estão fora de faixa aceitável ou estão em conflito entre si.

Alguém poderia me dizer o que eu poderia usar como uma expressão sempre versátil para este filtro?

Foi útil?

Solução

Suponho que não seja preciso dizer, mas depende do provedor OLE DB, independentemente de isso funcionar ou não. Quando você define um filtro em um conjunto de registros existente, ele acaba passando por uma interface Ole DB diferente (IViewFilter, se bem me lembro). Portanto, mesmo que um filtro funcione em uma cláusula onde em uma instrução SQL, isso não significa necessariamente que ele funcionará como um filtro. O filtro que você configura acaba separando as peças do componente e depois passou para a interface Ole DB. Pode ser que a implementação do provedor não esteja esperando um filtro do formulário "constante = constante". Como solução alternativa, você pode tentar definir tudo na cláusula WHERE da instrução SQL.

Outras dicas

Você deve definir a propriedade 'filtrada' como falsa se não estiver filtrando algo e configurá -la verdadeira e sua condição quando deseja que o ResultSet seja filtrado.

Eu construiria dinamicamente a propriedade SQL correta, para que você sempre saiba exatamente o que está sendo enviado para o banco de dados (e você tem certeza de que apenas os registros que você deseja é recebido pelo seu programa).

O truque 1 = 1 funciona bem na cláusula de uma consulta, mas não na propriedade filtrada. Se você deseja desativar o filtro, defina filtrada como falsa e todos os registros serão retornados.

O problema com a filtragem é que ela é feita do lado do cliente. Se você estiver usando um mecanismo de banco de dados, como o SQL Server e espera ter um grande conjunto de registros para filtrar, você é melhor atendido alterando a consulta SQL, que permitirá que o servidor de banco de dados retorne apenas os registros solicitados. Lembre-se de fechar o seu TadoQuery primeiro, altere o SQL e depois reabre.

Um truque que eu uso para evitar devolver todo o conjunto de dados (usado para grandes conjuntos de dados) é considerar um número máximo de registros que quero exibir e depois usar a sintaxe SQL superior para retornar um mais do que o número de registros que eu queria exibir 'n n '... Se eu chegar a esse número, notifiquei o usuário de que havia mais que os registros N-1 retornados e para ajustar os critérios de pesquisa/filtro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top