VBA - choix ADO : lire une clé composée de deux éléments
damedom41
Messages postés79Date d'inscriptionmercredi 14 avril 2010StatutMembreDernière intervention 2 août 2014
-
8 juil. 2012 à 22:03
damedom41
Messages postés79Date d'inscriptionmercredi 14 avril 2010StatutMembreDernière intervention 2 août 2014
-
9 juil. 2012 à 08:08
Bonjour,
Je code en VBA sous ACCESS. J'utilisais jusqu'ici la méthode DAO, mais je passe à ADO.
j'ai un fichier GEOINS qui contient (entre autres) deux champs : GEOCOM et GEOCPO.
Je veux rechercher si un couple GEOCOM/GEOCPO existe.
En sql cela donnerait : "select * from GEOINS where GEOCOM 'DHUIZON' and GEOCPO '41220'"
J'ai écrit une routine de lecture qui fonctionne pour le champ GEOCPO :
adorsgeo.MoveFirst
dbfindado1 = "GEOCPO like '" & 41220 & "'"
adorsgeo.Find dbfindado1, 0, adSearchForward, 1
If adorsgeo.EOF = True Then
adolec_geoins2 = 0
Else: adolec_geoins2 = 1
End If
J'ai écrit une routine de lecture qui fonctionne pour le champ GEOCOM :
adorsgeo.MoveFirst
dbfindado2 = "GEOCOM like '" & DHUIZON & "'"
adorsgeo.Find dbfindado2, 0, adSearchForward, 1
If adorsgeo.EOF = True Then
adolec_geoins2 = 0
Else: adolec_geoins2 = 1
End If
Je voudrais pouvoir tester les deux ensemble.
Avec DAO j'écrivais :
adorsgeo.MoveFirst
dbfindado1 = "GEOCPO like '" & 41220 & "'"
dbfindado2 = "GEOCOM like '" & DHUIZON & "'"
dbfindado = dbfindado1 & ' and ' & dbfindado2
adorsgeo.Find dbfindado, 0, adSearchForward, 1
If adorsgeo.EOF = True Then
adolec_geoins2 = 0
Else: adolec_geoins2 = 1
End If
et cela fonctionnait.
Avec ADO je reçois le message suivant :
Erreur d'éxécution 3001
Les arguments sont de type incorrect, en dehors des limites autorisées, ou en conflit les uns avec les autres.
Or ma requête sql fonctionne, ce qui semble prouver que les arguements ne sont pas de type incorrect, et pas en conflit.
J'ai plusieurs tables dont la clé primaire est composée de deux éléments (par exemple numéro de facture + code article).
J'ai donc besoin de pouvoir vérifier si ce code existe déjà ou non.
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 8 juil. 2012 à 22:36
Bonjour,
dbfindado1 = "GEOCPO like '" & 41220 & "'"
dbfindado2 = "GEOCOM like '" & DHUIZON & "'"
Est différent de :
GEOCOM 'DHUIZON' and GEOCPO '41220'
Car, là, tu concatène un nombre avec des chaines (dans la première condition)
Et une variable dans la 2ième.
En général, on préfère filtrer dans la requête SQL, car cela limite la quantité de données à charger.
Et si
GEOCOM = 'DHUIZON'
Cette condition est totalement en désaccord avec :
GEOCPO = '41220'
Donc, cela te retournera toujours un résultat vide.
---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list ---
Mon site
damedom41
Messages postés79Date d'inscriptionmercredi 14 avril 2010StatutMembreDernière intervention 2 août 2014 8 juil. 2012 à 23:01
Merci de répondre si vite.
Dans ce cas précis, 41220 est une chaîne, comme DHUIZON, et le fichier contient bien une ligne qui a GEOCPO '41220' et GEOCOM 'DHUIZON'
or la requête sql suivante fonctionne et renvoie 1 ligne
"select * from GEOINS where GEOCPO '41220' and GEOCOM 'DHUIZON'"
Je m'inquiète un peu car il semble que la fonction find avec ADO ne reçoive qu'un paramètre. Par quoi peut-on remplacer find ?
J'ai trouvé une parade, mais elle me semble lourde : je crée un recordset basé sur ma requête sql et je teste le recordset.recordcount
Si il est égal à zéro, ma clé/couple n'existe pas, sinon elle existe déjà.
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 8 juil. 2012 à 23:37
Bonjour,
Désolé, mais j'ai cru que c'était le même champ qui était contrôle.
Sinon, il y a SELECT COUNT(*) FROM ...
En général, j'évite l'usage de Find, je préfère les requêtes SQL, bien plus aisées à l'usage.
Sinon :
"GEOCPO like '" & 41220 & "'"
C'est clairement :
"GEOCPO like '" Concaténé à 41220 (entier) Concaténé à "'"
Et :
"GEOCOM like '" & DHUIZON & "'"
C'est :
"GEOCOM like '" Concaténé à DHUIZON (Variable) Concaténé à "'"
---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list ---
Mon site
damedom41
Messages postés79Date d'inscriptionmercredi 14 avril 2010StatutMembreDernière intervention 2 août 2014 9 juil. 2012 à 08:08
DAO comprenait très bien que 41220 était un texte de même que Dhuizon, et acceptait même le passage de plusieurs tests : (champ1 = variable1 et champ2 = variable2), mais c'était avec findfirst.
Si je comprends bien ADO (qui devait être un progrès) ne supporte plus findfirst, et find ne supporte qu'un "test".
Je croyais que ma solution de 'contournement' via sql était une mauvaise idée, mais tu me rassures. D'ailleurs je me suis dit cette nuit que finalement on "balayait" le fichier en entier de toute façon, mais je reste imprégnée par le temps (que tu n'as sans doute pas connu) où on accédait en "direct" à la clé, sans lire tout le fichier.
Merci encore de voler si vite et si efficacement à mon secours quand le recours à l'aide et à mes bouquins ne suffit pas