PROBLEMA: Erro 3001 comparando campos como critérios para filtrar o conjunto de registros

Traduções deste artigo Traduções deste artigo
ID do artigo: 216873 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sintomas

Comparando dois campos na seqüência de critérios da propriedade Filtrar do ADO (por exemplo: A seqüência de critérios é composta de cláusulas no formulário: "FieldName operador FieldName") gera o seguinte erro:
Erro de tempo de execução '3001':
O aplicativo está usando argumentos que são do tipo errado, estão fora do intervalo aceitável ou estão em conflito com outro.

Causa

Essa funcionalidade não pode ser feita com as versões atuais do ADO. A sintaxe de critérios da propriedade Filtrar do ADO é definida como a seguir:
"FieldName operador 'Literal_Value'"
O tipo de dados 'Literal_Value' pode ser seqüência de caracteres, número ou data. Não é possível usar a expressão anterior para comparar dois campos. Tentativa de fazer isso gera erro 3001.

Resolução

Uma solução é ter várias expressões Unidos por operadores booleanos como critério de filtro. Você pode usar somente se aos valores dos campos comparados são conhecidos por desenvolvedor. Dessa maneira o desenvolvedor pode surgir com uma fórmula para a seqüência de critérios que atende os resultados necessários. Por exemplo:
rs.Filter = "Field1 Operator1 'Value1' AND Field2 Operator2 'Value2'"
				

Se o desenvolvedor não sabe os valores para Field1 e Field2, em seguida, o desenvolvedor deve usar uma rotina de filtro personalizada (dentro do aplicativo de cliente) ou um procedimento armazenado (no lado do servidor) para realizar a funcionalidade dinamicamente. Você pode usar instruções de fluxo de controle dentro a rotina de filtro personalizada (ou o procedimento armazenado) para realizar as comparações de campo necessárias e gerar os resultados esperados.

Este artigo fornece uma demonstração de como uma rotina na seção "Mais informações" deste artigo.

Aviso: A solução, fornecida na seção mais informações, é apenas fornecida para finalidade de ilustração, sem qualquer garantia expressa ou implícita, incluindo, mas não se limitando a, garantias implícitas de comercialização para uma finalidade específica e/ou.

Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados no começo deste artigo.

Mais Informações

A documentação da Ajuda ADO afirma o seguinte para expressão de critério do filtro método--em comentários:

A seqüência de critérios é composta de cláusulas no formulário FieldName - operador - valor (por exemplo, "Sobrenome = 'Smith'"). Você pode criar cláusulas compostas, concatenando as cláusulas individuais com E (por exemplo, "Sobrenome = 'Smith' AND nome = 'John'") ou OR (por exemplo, "Sobrenome = 'Smith' ou Sobrenome = 'Jones'").

Ele também informa as diretrizes a seguir para o valor de critérios:

É o valor com o qual você irá comparar os valores de campo (por exemplo, 'Smith', nº 8/24/95 #, 12.345 ou US$ 50,00). Use aspas simples com seqüências de caracteres e sinais de sustenido (#) com datas. Para números, você pode usar pontos decimais, cifrão e notação científica. Se for o operador LIKE, Value pode usar caracteres curinga. Somente o asterisco (1) e assinar de porcentagem (%) são permitidas curingas e eles devem ser o último caractere na seqüência de caracteres. Valor não pode ser nulo.
Etapas para reproduzir o problema
===========================

  1. Inicie um novo projeto Microsoft Visual Basic. O Form1 é criado por padrão.
  2. Defina uma referência de projeto à biblioteca Microsoft ActiveX Data Objects 2.x.
  3. Inserir um botão de comando no formulário. Command1 é criado por padrão.
  4. Insira o código a seguir na seção de declaração geral do Form1:
   Option Explicit
   Dim cn As New ADODB.Connection
   Dim rs As New ADODB.Recordset

   Private Sub Command1_Click()
       cn.Open "provider=SQLOLEDB;Data Source=<your data source>;User ID=<uid>;" _ 
    "password=;Initial Catalog=pubs;"
       On Error Resume Next
       cn.Execute "drop table tblFilterTest"
       On Error GoTo errh
       ' Create the test table
       cn.Execute "create table tblFilterTest(ID int primary key, Field1  
    varchar(20), Field2 varchar(20))"
       ' Open ADO recordset
       rs.Open "select * from tblFilterTest", cn, adOpenKeyset, 
    adLockOptimistic
       ' Add first record
       rs.AddNew
       rs("ID") = 1
       rs("Field1") = "A"
       rs("Field2") = "B"
       rs.Update
       rs.Requery
   
       ' Add 2nd record
       rs.AddNew
       rs("ID") = 2
       rs("Field1") = "D"
       rs("Field2") = "C"
       rs.Update
       rs.Requery
    
       ' Print original recordset
       Debug.Print "Original Recordset:"
       Debug.Print "====================="

       While Not rs.EOF
            Debug.Print rs("Field1") & vbTab & rs("Field2") 
             rs.MoveNext
       Wend

       rs.MoveFirst

       ' You get error 3001 on the following line
       rs.Filter = " Field1 > Field2 "

       ' To demonstrate the workaround, comment the preceding line and
       ' uncomment the following line:

       ' Call Filter
       Exit Sub

   errh:
       Debug.Print "Error Number:", Err.Number
       Debug.Print "Error Source:", Err.Source
       Debug.Print "Error Description:", Err.Description
   End Sub

   Private Sub Filter()
       Debug.Print "Filtered Recordset: "
       Debug.Print "====================="
    
       While Not rs.EOF
         If rs("Field1") > rs("Field2") Then
             Debug.Print rs("Field1") & vbTab & rs("Field2") 
         End If
         rs.MoveNext
       Wend
   End Sub
				
Pressione F5 para executar o projeto e erro 3001 ocorre.

Referências

Para obter mais informações, consulte a documentação do ADO.
Para obter informações adicionais, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft:
195222PROBLEMA: O método somente suporta um critério Find do ADO

Propriedades

ID do artigo: 216873 - Última revisão: sexta-feira, 24 de agosto de 2001 - Revisão: 1.0
A informação contida neste artigo aplica-se a:
  • Microsoft ActiveX Data Objects 2.0
  • Microsoft ActiveX Data Objects 2.01
  • Microsoft ActiveX Data Objects 2.1
  • Microsoft ActiveX Data Objects 2.1 Service Pack 2
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft ActiveX Data Objects 2.6
  • Microsoft ActiveX Data Objects 2.7
Palavras-chave: 
kbmt kbcode kbdatabase kbfix kbprb KB216873 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 216873
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com