PRB : Erreur 3001 Comparaison les champs en tant que critères pour filtrer le jeu d'enregistrements

Traductions disponibles Traductions disponibles
Numéro d'article: 216873 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Symptômes

Comparaison des deux champs dans la chaîne de critères de la propriété ADO Filter (par exemple : la chaîne de critères est composée de clauses sous la forme de: "NomChamp Opérateur FieldName") génère l'erreur suivante :
Erreur d'exécution '3001' :
L'application utilise les arguments de type incorrect, en dehors des limites acceptables ou en conflit avec d'autres.

Cause

Cette fonctionnalité ne peut pas être accomplie avec les versions actuelles de ADO. La syntaxe de critères de la propriété ADO Filter est définie comme suit :
"NomChamp opérateur 'Literal_Value'"
Le type de données 'Literal_Value' pourrait être chaîne, nombre ou date. Vous ne pouvez pas utiliser l'expression précédente pour comparer deux champs. La tentative de cela génère l'erreur 3001.

Résolution

Une solution de contournement consiste à avoir plusieurs expressions liées par des opérateurs booléens comme critère de filtre. Vous ne pouvez utiliser ce si les valeurs des champs comparés sont connus pour le développeur. Cette façon le développeur peut être pris avec une formule pour la chaîne de critères qui répond aux résultats requis. Par exemple :
rs.Filter = "Field1 Operator1 'Value1' AND Field2 Operator2 'Value2'"
				

Si le développeur ne connaissez pas les valeurs de champ1 et champ2, le développeur doit utiliser une routine de filtre personnalisée (au sein de l'application client) ou une procédure stockée (côté serveur) pour accomplir la fonctionnalité dynamiquement. Vous pouvez utiliser des instructions de flux de contrôle dans la routine de filtre personnalisée (ou dans la procédure stockée) pour exécuter les comparaisons de champs nécessaires et générer les résultats attendus.

Cet article fournit une démonstration pour ce une routine dans la section «Plus d'informations» de cet article.

Avertissement : La solution de contournement, fournie dans la section plus d'informations, uniquement dispose pour objectif de l'illustration, sans garantie expresse ou implicite, y compris, mais sans s'y limiter, les garanties implicites de qualité marchande et/ou d'adéquation à un usage particulier.

Statut

Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés au début de cet article.

Plus d'informations

La documentation ADO indique les informations suivantes pour l'expression des critères de la méthode Filter--sous Notes :

La chaîne de critères est composée de clauses de dans l'écran FieldName-, opérateur - valeur (par exemple, "LastName = 'Smith'"). Vous pouvez créer des clauses composées en concaténant des clauses individuelles avec AND (par exemple, "LastName = 'Smith' AND FirstName = 'John'") ou OR (par exemple, "LastName = 'Smith' OR LastName = 'Jones'").

Il indique également les instructions suivantes pour la valeur de critères :

Valeur est la valeur à laquelle vous comparez les valeurs de champ (par exemple 'Smith', # 8/24/95 #, 12.345 ou $ 50.00). Utilisez des guillemets simples pour les chaînes et le signe dièse (#) avec des dates. Pour les nombres, vous pouvez utiliser les séparateurs décimaux, les signes dollar et les notations scientifiques. Si opérateur est LIKE, celle valeur peut utiliser des caractères génériques. Seuls l'astérisque point 2.1 et symbole de pourcentage (%) les caractères génériques sont autorisés et ils doivent être le dernier caractère de la chaîne. La valeur ne peut pas être NULL.
Procédure pour reproduire le problème
===========================

  1. Démarrez un nouveau projet Microsoft Visual Basic. Form1 est créé par défaut.
  2. Définir une référence de projet à la bibliothèque Microsoft ActiveX Data Objects 2.x.
  3. Insérez un bouton de commande du formulaire. Command1 est créé par défaut.
  4. Insérez le code suivant dans la section de la déclaration général 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
				
Appuyez sur F5 pour exécuter le projet et Erreur 3001 se produit.

Références

Pour plus d'informations, reportez-vous à la documentation ADO.
Pour plus d'informations, consultez l'article suivant dans la base de connaissances Microsoft :
195222PRB : ADO Find méthode critères prend en charge un seul

Propriétés

Numéro d'article: 216873 - Dernière mise à jour: vendredi 24 août 2001 - Version: 1.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • 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
Mots-clés : 
kbmt kbcode kbdatabase kbfix kbprb KB216873 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 216873
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Exclusion de responsabilité concernant les contenus obsolètes dans la Base de connaissances
Cet article concerne des produits pour lesquels Microsoft n'offre plus de support. Il est par conséquent fourni « en l'état » et ne sera plus mis à jour.

Envoyer des commentaires

 

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