Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

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

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

Avertissement : cet article a été traduit automatiquement

Propriétés

ID d'article : 216873 - Dernière mise à jour : 08/24/2001 08:40:00 - Révision : 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 KbMtfr
Commentaires
var varCustomerTracking = 1; var Route = "76500"; var Ctrl = ""; document.write(" pe"> Uruguay - Español
대한민국 - 한국어
España - Español
Paraguay - Español
Venezuela - Español
//c1.microsoft.com/c.gif?DI=4050&did=1&t=">='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?"> >ow.location.protocol) + "//c.microsoft.com/ms.js'><\/script>"); &t=">