PROBLEMA: Erro 3001 comparar campos como critérios para filtrar o conjunto de registos

Traduções de Artigos Traduções de Artigos
Artigo: 216873 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sintomas

Comparar dois campos na cadeia de critérios da propriedade ADO filtro (por exemplo: A cadeia critérios é constituída por cláusulas no formulário: "NomeCampo operador NomeCampo") gera o seguinte erro:
Erro de tempo de execução '3001':
A aplicação está a utilizar argumentos que são do tipo errado, estão fora do intervalo aceitável ou estão em conflito com um do outro.

Causa

Esta funcionalidade não pode ser efectuada com versões actuais do ADO. A sintaxe de critérios da propriedade Filtro de ADO é definida da seguinte forma:
"NomeCampo operador 'Literal_Value'"
O tipo de dados 'Literal_Value' pode ser cadeia, número ou data. Pode utilizar a expressão anterior para comparar dois campos. Tentar fazê-lo aumenta erro 3001.

Resolução

Uma solução consiste em ter várias expressões associadas por operadores booleanos, os critérios do filtro. Só pode utilizar isto se a são conhecidos pelos valores dos campos quando comparado com o programador. Desta forma o programador pode ser com uma fórmula para a cadeia de critérios que cumpre os resultados necessários. Por exemplo:
rs.Filter = "Field1 Operator1 'Value1' AND Field2 Operator2 'Value2'"
				

Se o programador não sabe os valores para o campo1, campo2, o programador tem de utilizar uma rotina de filtro personalizada (na aplicação cliente) ou um procedimento armazenado (no lado do servidor) para executar a funcionalidade dinamicamente. Pode utilizar instruções de fluxo de controlo a rotina de filtro personalizada (ou o procedimento armazenado) para efectuar as comparações de campo necessárias e gerar os resultados esperados.

Este artigo fornece uma demonstração para uma rotina na secção "Mais informação" deste artigo.

Aviso: A solução, fornecida na secção mais informações, é apenas fornecida para fim ilustração, sem qualquer garantia expressa ou implícita, incluindo, sem limitação, garantias implícitas de comercialização e/ou adequação a um fim específico.

Ponto Da Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados no início deste artigo.

Mais Informação

A documentação de ajuda do ADO indica o seguinte para expressão de critérios o filtro de método--em comentários:

A cadeia critérios é constituída por cláusulas no formulário NomeCampo - operador - valor (por exemplo, "Apelido = 'Amaral'"). Pode criar cláusulas compostas concatenar cláusulas individuais com AND (por exemplo, "Apelido = 'Silva' AND nome = 'João'") ou ou (por exemplo, "Apelido = 'Amaral' ou Apelido = 'Silva'").

Também indica as seguintes directrizes para o valor de critérios:

Valor é o valor com o qual vai comparar os valores do campo (por exemplo, 'Amaral', n.º 8/24/95 #, 12.345 ou $ 50.00). Utilize aspas simples com cadeias e sinais de cardinal (#) com datas. Para números, é possível utilizar vírgulas decimais, sinais de dólar e notação científica. Se operador como valor pode utilizar caracteres universais. Apenas o asterisco (*) e o sinal de percentagem (%) são permitidos caracteres universais e tem de ser o último carácter na cadeia. O valor não pode ser nulo.
Passos para reproduzir o comportamento
===========================

  1. Inicie um novo projecto do Microsoft Visual Basic. É criado o Form1 por predefinição.
  2. Defina uma referência de projecto para o Microsoft ActiveX Data Objects 2.x Library.
  3. Inserir um botão de comando no formulário. Command1 é criado por predefinição.
  4. Inserir o código seguinte na secção da 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
				
Prima F5 para executar o projecto e erro 3001 ocorre.

Referências

Para mais informações, consulte a documentação de ajuda do ADO.
Para obter informações adicionais, consulte o seguinte artigo na base de dados de conhecimento da Microsoft:
195222PROBLEMA: Método só suporta um critério de localização de ADO

Propriedades

Artigo: 216873 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 216873
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

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