PRB: Error 3001 comparación de campos como criterios para filtrar el conjunto de registros

Seleccione idioma Seleccione idioma
Id. de artículo: 216873 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Síntomas

Comparar dos campos en la cadena de criterios de la propiedad ADO Filtro (por ejemplo: la cadena de criterios se compone de cláusulas en el formulario: "NombreCampo Operador FieldName") genera el error siguiente:
Error de tiempo de ejecución '3001':
La aplicación utiliza argumentos que son del tipo correcto, están fuera del intervalo aceptable o están en conflicto con otra.

Causa

Esta funcionalidad no puede realizarse con las versiones actuales de ADO. La sintaxis de criterios de la propiedad Filter de ADO está definida así:
"NombreCampo Operador 'Literal_Value'"
El tipo de datos 'Literal_Value' podría ser cadena, número o fecha. No puede utilizar la expresión precedente para comparar dos campos. Cualquier intento de hacerlo genera el error 3001.

Solución

Una solución es que varias expresiones unidas por operadores booleanos como criterio de filtro. Sólo puede utilizar si el los valores de comparación de campos se sabe que el desarrollador. Este modo el desarrollador puede idear una fórmula para la cadena de criterios que cumpla los resultados necesarios. Por ejemplo:
rs.Filter = "Field1 Operator1 'Value1' AND Field2 Operator2 'Value2'"
				

Si el desarrollador no conoce los valores para Field1 y Field2, el desarrollador debe utilizar una rutina de filtro personalizada (dentro de la aplicación cliente) o un procedimiento almacenado (en el servidor) para realizar la funcionalidad de dinámicamente. Puede utilizar instrucciones de flujo de control dentro de la rutina de filtro personalizada (o el procedimiento almacenado) para realizar las comparaciones de campos necesarias y generar los resultados esperados.

En este artículo proporciona una demostración para tal una rutina en la sección "Más información" de este artículo.

Advertencia: La solución, en la sección más información, sólo tiene para ilustración propósito, sin ninguna cualquier garantía ya sea expresa o implícita, incluyendo, pero sin limitarse a, las garantías implícitas de comerciabilidad e idoneidad para un propósito determinado.

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "La información de este artículo se refiere a:" de este artículo.

Más información

La documentación de Ayuda de ADO indica que la siguiente expresión de criterios del filtro de método--bajo comentarios:

La cadena de criterios se compone de cláusulas en el formulario NombreCampo - Operador - valor (por ejemplo, "LastName = 'Smith'"). Puede crear cláusulas compuestas al concatenar cláusulas individuales con AND (por ejemplo, "LastName = 'Smith' AND FirstName = 'John'") o OR (por ejemplo, "LastName = 'Smith' OR LastName = 'Jones'").

También indica las siguientes directrices para el valor de criterios:

Es el valor con el que comparará los valores de campo (por ejemplo, 'Smith', # 8/24/95 #, 12.345 o $ 50.00). Utilice comillas sencillas con cadenas y signos de número (#) con las fechas. Para números, puede utilizar separadores decimales, signos de dólar y notación científica. Si operador es LIKE, valor puede utilizar caracteres comodín. Sólo el asterisco (*) y firmar de porcentaje (%) se permiten comodines y deben ser el último carácter de la cadena. Valor no puede ser nulo.
Pasos para reproducir este comportamiento
===========================

  1. Inicie un nuevo proyecto de Microsoft Visual Basic. Se creará Form1 de manera predeterminada.
  2. Establecer una referencia de proyecto a la biblioteca de Microsoft ActiveX Data Objects 2.x.
  3. Insertar un botón de comando en el formulario. Se crea Command1 de forma predeterminada.
  4. Inserte el código siguiente en la sección de declaraciones generales de 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
				
Presione F5 para ejecutar el proyecto y 3001 de error se produce.

Referencias

Para obtener más información, consulte la documentación de Ayuda de ADO.
Para obtener información adicional, consulte en contacto con el siguiente artículo en Microsoft Knowledge Base:
195222PRB: Método sólo admite un criterios de Find de ADO

Propiedades

Id. de artículo: 216873 - Última revisión: viernes, 24 de agosto de 2001 - Versión: 1.0
La información de este artículo se refiere 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
Palabras clave: 
kbmt kbcode kbdatabase kbfix kbprb KB216873 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 216873
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios

 

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