Probléme d'incompatibilité de type avec un Recordset

Signaler
Messages postés
59
Date d'inscription
mardi 12 septembre 2006
Statut
Membre
Dernière intervention
21 août 2009
-
Messages postés
59
Date d'inscription
mardi 12 septembre 2006
Statut
Membre
Dernière intervention
21 août 2009
-
Je tente d'utiliser un recordset dans un algo en vb sous Access mais je pense avoir une erreur de déclaration de départ. Comme erreur le debogueur m'informe d'une incomptabilié de type voici les différents parties de mon code qui concernent ce recordset:

'variables
Dim UnRsSelection As ADODB.Recordset
Dim UneRequeteSelection As String

Set UnRsSelection = New ADODB.Recordset
UneRequeteSelection = "SELECT UnChampDeRecherche, COUNT(UnChampDeRecherche) FROM Un_Nom_de_table GROUP BY UnChampDeRecherche HAVING COUNT(UnChampDeRecherche) > 1"

Set db = CurrentDb

UnRsSelection.Open , UneRequeteSelection, db, adOpenStatic, adLockReadOnly



Voilà il me met l'erreur d'incompatibilité sur la derniére ligne, j'ai idéé que l'erreur pourrait provenir du db mais je ne vois pas comment faire autrement, merci de m'éclairer

11 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
68
Salut
Petite mise en forme pour la lisibilité :
UneRequeteSelection =  "SELECT UnChampDeRecherche, " & _
                      "       COUNT(UnChampDeRecherche) " & _
                      "  FROM Un_Nom_de_table " & _
                      " GROUP BY UnChampDeRecherche " & _
                      "HAVING COUNT(UnChampDeRecherche) > 1"

A priori, si erreur il y a (laquelle ?) , je tenterai de nommer le deuxième champ et je l'utiliserai dans le HAVING :
UneRequeteSelection  = "SELECT UnChampDeRecherche, " & _
                      "       COUNT(UnChampDeRecherche) As [Quantité]" & _
                      "  FROM Un_Nom_de_table " & _
                      " GROUP BY UnChampDeRecherche " & _
                      "HAVING [Quantité] > 1"


Les [ et ] encadrant le mot Quantité ne sont là que pour la compatibilité de Access avec les caractères spéciaux, ici l'accent.

En deuxième recours, je transformerai le HAVING par une clause WHERE :
UneRequeteSelection = "SELECT UnChampDeRecherche, " & _
                      "       COUNT(UnChampDeRecherche) As [Quantité]" & _
                      "  FROM Un_Nom_de_table " & _
                      " WHERE [Quantité] > 1 " & _
                      " GROUP BY UnChampDeRecherche "

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
59
Date d'inscription
mardi 12 septembre 2006
Statut
Membre
Dernière intervention
21 août 2009
2
J'ai tenté ces différentes solutions mais sans succès, avec toujours cette éternelle erreur:

Type incompatible (erreur 13
)

Les différentes requêtes:

"SELECT code_piece, " & _
                      "       COUNT(code_piece) " & _
                      "  FROM pieceintermediaire " & _
                      " GROUP BY code_piece " & _
                      "HAVING COUNT(code_piece) > 1"


"SELECT code_piece, " & _
                      "       COUNT(code_piece) As [nbcodepiece]" & _
                      "  FROM pieceintermediairee " & _
                      " GROUP BY code_piece " & _
                      "HAVING [nbcodepiece] > 1"



"SELECT code_piece, " & _
                      "       COUNT(code_piece) As [nbcodepiece]" & _
                      "  FROM pieceintermediaire " & _
                      " WHERE [nbrcodepiece] > 1 " & _
                      " GROUP BY code_piece ;"


Je ne sais pas si la structure de la requête est le problème pour ma part je pense que ce serait le paramètre du recordset relatif à la base de données, j'ai l'impression qu'il ne peut pas prendre quelquechose comme db = CurrentDb comme paramètre.

Histoire d'illustrer un peu plus, voilà mon code du moment:

Private Sub Commande63_Click()


Dim Resultat As Boolean
Dim UnRsSelection As ADODB.Recordset
Dim uneRequeteLigne As String
Dim UneRequeteSelection As String
Dim unRsligne As ADODB.Recordset
Dim Champ1, Champ2, Champ3, Champ4, Champ5, Champ6, Champ7, Champ8, ChampDeRecherche As String
Set unRsligne = New ADODB.Recordset
Set UnRsSelection = New ADODB.Recordset


'Cette requête permet de sélectionner les lignes de la table pour lesquelles la valeur "UnChampDeRecherche" apparait sur 2 ligne au moins

UneRequeteSelection = "SELECT code_piece, " & _
                      "       COUNT(code_piece) As [nbcodepiece]" & _
                      "  FROM pieceintermediaire " & _
                      " WHERE [nbrcodepiece] > 1 " & _
                      " GROUP BY code_piece ;"



'Paramétrer cette chaîne de connexion à votre guise pour accéder à votre base de données
Set db = CurrentDb

UnRsSelection.Open , UneRequeteSelection, db, adOpenStatic, adLockReadOnly



'adOpenStatic, adLockReadOnly

'boucler sur les lignes ayant des doublons

    While Not UnRsSelection.EOF And UnRsSelection.BOF
    
        uneRequeteLigne = "SELECT code_piece, libel_piece, date_saisie, date_bac, devise, code_fournisseur, type_facture, code_signataire, code_operation FROM pieceintermediaire WHERE code_piece='" & UnRsSelection("code_piece") & "'"
        unRsligne.Open uneRequeteLigne, adOpenStatic, adLockReadOnly
        RaisonSocial = unRsligne("RaisonSociale")
        
        'ranger Une valeur de ligne dans des variables
        ChampDeRecherche = unRsligne("code_piece")
        Champ1 = unRsligne("libel_piece")
        Champ2 = unRsligne("date_saisie")
        Champ3 = unRsligne("date_bac")
        Champ4 = unRsligne("devise")
        Champ5 = unRsligne("code_fournisseur")
        Champ6 = unRsligne("type_facture")
        Champ7 = unRsligne("code_signataire")
        Champ8 = unRsligne("code_operation")
       
        'Supprimer ttes les lignes de doublons
        db.Execute "DELETE FROM pieceintermediaire WHERE code_piece='" & ChampDeRecherche & "'"
        'Insérer une ligne unique
        db.Execute "INSERT INTO pieceintermediaire VALUES ('" & ChampDeRecherche & "', '" & Champ1 & "', '" & Champ2 & "','" & Champ3 & "','" & Champ4 & "','" & Champ5 & "','" & Champ6 & "','" & Champ7 & "','" & Champ8 & "')"
        'fermeture du recordset
        unRsligne.Close
        UnRsSelection.MoveNext
    Wend
MsgBox "Traitement de suppression des doublons effectué avec succès"

Unload Me
End Sub
Messages postés
59
Date d'inscription
mardi 12 septembre 2006
Statut
Membre
Dernière intervention
21 août 2009
2
Visiblement l'édition de postes n'est pas possible sur ce forum, alors une petite précision, l'erreur apparait sur cette ligne:

UnRsSelection.Open , UneRequeteSelection, db, adOpenStatic, adLockReadOnly
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3
Bonjour,

Ce message signale que la requeste est Incompatible avec la structure de la base.

juste une suggestion,
est tu bien certain que dans ta base de donnée, le champs "code_piece" ne contient que des valeurs numériques. Et je dirait même plus, est-ce-que ton champs "code_piece" est de type Numeric(ou integer long ...) ?

j'esphère que cela t'aidera à avancer
cordialement

VB6, quand yen a plus yen a encore
Il y a tant a apprendre et seulement 24 heures dans une journée
Messages postés
59
Date d'inscription
mardi 12 septembre 2006
Statut
Membre
Dernière intervention
21 août 2009
2
il est bien type numérique et je viens de passer les données en revue il n'y a que des valeurs numériques, cela est vraiment étrange que le probème puisse provenir de la requête ou du résultat de la requête.

Il n'y aurait pas quelquechose qui pourrait provenir du paramètre lié a la base de données ?
Messages postés
59
Date d'inscription
mardi 12 septembre 2006
Statut
Membre
Dernière intervention
21 août 2009
2
Bon j'ai tenté de modifier mes paramètres pour ce qui est de la base de données histoire d'enlever le currentdb pour voir si le problème pouvait venir de là mais non.

Les modifs:
Dim Conn As ADODB.Connection

Set Conn = CurrentProject.Connection
UnRsSelection.Open , UneRequeteSelection, Conn, adOpenKeyset, adLockReadOnly
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
68
Si code_piece est un champ de type numérique dans la DB, il ne faut pas encadrer sa valeur par des ' (réservé aux chaines).
WHERE code_piece=" & UnRsSelection("code_piece")

Rappel aussi :
Dim VarA, VArB, VarC As String
ne signifie pas que toutes les varaibles de la ligne seront de type String.
Seule la dernière le sera.
Les précédentes seront de type Variant
Cela ne change rien dans ton cas précis

Revenons à ta requète :
UneRequeteSelection = "SELECT UnChampDeRecherche, " & _
                      "       COUNT(UnChampDeRecherche) " & _
                      "  FROM Un_Nom_de_table " & _
                      " GROUP BY UnChampDeRecherche " & _
                      "HAVING COUNT(UnChampDeRecherche) > 1"

Je n'avais pas tilté à la première lecture :
Si, dans la première partie du Select, tu demande à voir chaque "UnChampDeRecherche" et en plus le nombre de ces champs, SQL va pas aimer, en effet.
Il ne peut pas afficher, dans ce terme, une donnée individuelle ET une donnée "sommatrice"
Il faut, je pense, utiliser la clause "Compute By" (syntaxe de mémoire) :
UneRequeteSelection = " SELECT COUNT(UnChampDeRecherche) " & _
                      "   FROM Un_Nom_de_table " & _
                      " HAVING COUNT(UnChampDeRecherche) > 1" & _
                      "COMPUTE BY UnChampDeRecherche "
Syntaxe à vérifier et à tester

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
59
Date d'inscription
mardi 12 septembre 2006
Statut
Membre
Dernière intervention
21 août 2009
2
J'ai modifié pour les variables et les ' mais pour cette fameuse requête avec un compute by je ne parviens pas à la modifier au niveau de la Synthaxe (j'ai trouvé très peu d'infos sur cette instruction et son utilisation).

Ce qui m'étonne c'est qu'après un test de la toute première requête en tant que requête seule hors code, cela fonctionne, deux colonnes, une avec le numéro des pièces apparaissant plus d'une fois et l'autre avec le nombre de fois qu'elles apparaissent, donc elle fonctionne en elle-même mais lorsqu'elle est utilisée dans le recordset ça coince.

Des fois ne je sais plus trop ou chercher.
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Salut,
je ne crois pas que le type du champ à quelque chose à voir avec ça.
La requete ne fait pas la somme, mais compte le nombre d' occurence.
Moi je pense au type du recordset, ou alors au paramètre adOpenStatic,
qu' il faudra changer en adOpenDynamic.

Enfin, je pense...
[] Ce qui va sans dire. va mieux en le disant.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
68
Excuse moi, je t'ai passé la commande Compute de mémoire, mais la syntaxe n'est pas la bonne :
 Select xxx
   From maTable
Compute Count(xxx) By xxx 

Désolé
Messages postés
59
Date d'inscription
mardi 12 septembre 2006
Statut
Membre
Dernière intervention
21 août 2009
2
Je note mais je ne suis toujours pas parvenu à faire fonctionner mon code, j'ai opté pour une autre solution afin de supprimer les doublons de ma table, à savoir un ensemble d'instructions en sql intégré avec une table temporaire.