Você está offline; aguardando reconexão

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

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.
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

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 216873 - Última Revisão: 08/24/2001 08:40:00 - Revisão: 1.0

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

  • kbmt kbcode kbdatabase kbfix kbprb KB216873 KbMtpt
Comentários