Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/12/2011, 14h32   #1
Invité de passage
 
Homme
Chargé de missions
Inscription : novembre 2011
Messages : 18
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Drôme (Rhône Alpes)

Informations professionnelles :
Activité : Chargé de missions
Secteur : Associations - ONG

Informations forums :
Inscription : novembre 2011
Messages : 18
Points : 4
Points : 4
Par défaut Requête LIKE * ne marche pas

Bonjour,

Ci-après le code de la bête :

Code :
1
2
3
4
5
6
7
 
Dim SQL2 As String
Dim GE As String
 
GE = "[PLANTAE_LRR_UNMATCHED_TOTAL_GE].[GenreEspece]"
 
SQL2 = "SELECT TAXREFv40.NOM_COMPLET, " & GE & " INTO PLANTAE_LRR_UNMATCHED_TOTAL_SPLIT_VERIF_1 FROM TAXREFv40 WHERE TAXREFv40.NOM_COMPLET Like '" & GE & "*' ;"
Objectif :

Chercher dans une table (TAXREF) les enregistrements dont le champ NOM_COMPLET contiennent la valeur du champ d'une autre table (aucune jointure possible ; c'est l'objectif final de la manip) : la variable GE.

"GE" est une chaîne de deux mots qui existent bien dans le champ NOM_COMPLET, toujours en début de string et suivant la même casse.

Problème(s) :

L'utilisation du Like *...
Les valeurs à trouver dans le champ NOM_COMPLET seront toujours de type "GE"* ; d'où l'écriture du SQL ci-avant.
Or, cette syntaxe ne me retourne jamais rien.
En revanche, si je double avec un "*" devant GE, là il me sort une kyrielle de valeurs...forcément très éloignées de ma recherche initiale !

Accessoirement, bien que je soupçonne que ce soit là l'origine du problème, à chaque lancement de la commande j'ai la fenêtre de paramètre qui s'ouvre...

Plus surprenant (enfin, pour un débutant comme moi ! ^^), je n'arrive à rien non plus en passant par InStr...bien qu'il ne soit pas exclu que je ne construise pas bien la requête !

Si une bonne âme voulait bien m'éclairer....
Gregorx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 17h43   #2
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 206
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 206
Points : 5 256
Points : 5 256
Bonjour

Déjà, il ne faut pas entouré le nom du champ de quotes ('), mais uniquement le '*' :

Code sql :
1
2
3
4
5
6
7
 
Dim SQL2 AS String
Dim GE AS String
 
GE = "[PLANTAE_LRR_UNMATCHED_TOTAL_GE].[GenreEspece]"
 
SQL2 = "SELECT TAXREFv40.NOM_COMPLET, " & GE & " INTO PLANTAE_LRR_UNMATCHED_TOTAL_SPLIT_VERIF_1 FROM TAXREFv40 WHERE TAXREFv40.NOM_COMPLET Like [PLANTAE_LRR_UNMATCHED_TOTAL_GE].[GenreEspece] & '*' ;"

Ensuite, il faut mentionner dans la clause From le nom de la table "PLANTAE_LRR_UNMATCHED_TOTAL_GE"...

A+
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 17h53   #3
Invité de passage
 
Homme
Chargé de missions
Inscription : novembre 2011
Messages : 18
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Drôme (Rhône Alpes)

Informations professionnelles :
Activité : Chargé de missions
Secteur : Associations - ONG

Informations forums :
Inscription : novembre 2011
Messages : 18
Points : 4
Points : 4
Merci pour cette réponse : je vous attendais comme le Messie !!

Malheureusement, le quote du seul * ne lui convient pas...

Ci-après le code tel que modifié :

Code :
SQL2 = "SELECT TAXREFv40.NOM_COMPLET, " & GE & " INTO PLANTAE_LRR_UNMATCHED_TOTAL_SPLIT_VERIF_1 FROM TAXREFv40, PLANTAE_LRR_UNMATCHED_TOTAL_GE WHERE TAXREFv40.NOM_COMPLET Like " & GE & " & '*' ;"
J'avais déjà tenté le quote de l'astérisque, avec / sans les "[]" autour du champ... Je n'ai plus d'idée (de débutant).

Est-ce que, au moins, la syntaxe ci-dessus est bonne ?

EDIT : j'ai vu l'ajout du petit "&" entre le champ et l'astérisque quoté.
je ne sais pas si c'est bon signe, mais avec cette syntaxe là Access plante...
Gregorx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 18h03   #4
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 206
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 206
Points : 5 256
Points : 5 256
Re,

Il faut mettre le & dans l'expression chaîne, du style :

Code :
1
2
3
GE = "[PLANTAE_LRR_UNMATCHED_TOTAL_GE].[GenreEspece]"
 
SQL2 = "SELECT TAXREFv40.NOM_COMPLET, " & GE & " INTO PLANTAE_LRR_UNMATCHED_TOTAL_SPLIT_VERIF_1 FROM TAXREFv40, PLANTAE_LRR_UNMATCHED_TOTAL_GE WHERE TAXREFv40.NOM_COMPLET Like " & GE & " & '*' ;"
A tester...
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 18h23   #5
Invité de passage
 
Homme
Chargé de missions
Inscription : novembre 2011
Messages : 18
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Drôme (Rhône Alpes)

Informations professionnelles :
Activité : Chargé de missions
Secteur : Associations - ONG

Informations forums :
Inscription : novembre 2011
Messages : 18
Points : 4
Points : 4
Rien à faire, ça freeze toujours !

Le plus surprenant c'est que j'aboutis au même résultat (freez) lorsque je tente de passer par une requête dans Access directement...

je recolle la ligne, par acquis de conscience :

Code :
SQL2 = "SELECT TAXREFv40.NOM_COMPLET, " & GE & " INTO PLANTAE_LRR_UNMATCHED_TOTAL_SPLIT_VERIF_1 FROM TAXREFv40, PLANTAE_LRR_UNMATCHED_TOTAL_GE WHERE TAXREFv40.NOM_COMPLET Like " & GE & " & '*' ;"
Gregorx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 18h38   #6
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 206
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 206
Points : 5 256
Points : 5 256
Salut,

et si tu tapes, dans l'éditeur SQL ce code :

Code sql :
SELECT TAXREFv40.NOM_COMPLET, [PLANTAE_LRR_UNMATCHED_TOTAL_GE].[GenreEspece] FROM TAXREFv40, PLANTAE_LRR_UNMATCHED_TOTAL_GE WHERE TAXREFv40.NOM_COMPLET LIKE [PLANTAE_LRR_UNMATCHED_TOTAL_GE].[GenreEspece] & '*' ;

Tu as quoi à l'exécution...

A+
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 18h41   #7
Invité de passage
 
Homme
Chargé de missions
Inscription : novembre 2011
Messages : 18
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Drôme (Rhône Alpes)

Informations professionnelles :
Activité : Chargé de missions
Secteur : Associations - ONG

Informations forums :
Inscription : novembre 2011
Messages : 18
Points : 4
Points : 4
Toujours le même freez malheureusement...
Ce que je ne m'explique pas !
Gregorx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 18h51   #8
Invité de passage
 
Homme
Chargé de missions
Inscription : novembre 2011
Messages : 18
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Drôme (Rhône Alpes)

Informations professionnelles :
Activité : Chargé de missions
Secteur : Associations - ONG

Informations forums :
Inscription : novembre 2011
Messages : 18
Points : 4
Points : 4
La table taxref est costaude : 140 000 lignes de 20 champs majoritairement à string, assez longs...

Peut-être une autre solution est-elle envisageable ?

J'explique ce que je cherche à faire ; j'ai :

- Ma table TAXREF qui contient une nomenclature et une codification dont j'ai besoin ;
- une table contenant des noms "voisins" de certains champs de la table TAXREF.

Je veux :

- trouver la correspondance (un code numérique en fait) entre les noms "pas catholiques" de ma seconde table, et donc établir une jointure OU récupérer le code d'identification, qui fera office de jointure.

J'ai fait :

- split (artisanal) de mon champ "noms pas catholiques", qui me donne (chacun dans un champ) : motA ; motB ; mot C etc.
NB : il existe dans ma table TAXREF au moins un enregistrement qui contient l'enchaînement des "mots".

Il me reste à faire :

- Trouver quel est l'enregistrement de TAXREF qui contient le plus de mots de chaque ligne...

Un beau merd*ier, hein ?

Surtout considérant que j'en suis à la première comparaison : mot A & mot B... dont l'enchaînement existe en X (nombreux) exemplaires dans la table parcourue...

bref (difficile à croire après un tel roman), c'est mal engagé si je ne peux déjà pas rechercher l'enchaînement des 2 premiers mots !!

Une alternative vous apparaît-elle possible ?
Gregorx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 19h42   #9
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 206
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 206
Points : 5 256
Points : 5 256
Re,

Pas évident comme cela,

Tu peux joindre ta base avec juste l'essentiel, avec un minimum de données et la convertir au format 2000.

Je verrai certainement les choses plus clair comme cela...

A+
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 20h37   #10
Invité de passage
 
Homme
Chargé de missions
Inscription : novembre 2011
Messages : 18
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Drôme (Rhône Alpes)

Informations professionnelles :
Activité : Chargé de missions
Secteur : Associations - ONG

Informations forums :
Inscription : novembre 2011
Messages : 18
Points : 4
Points : 4
Merci encore de prêter tant de cas à...mon triste cas, justement !

je t'ai envoyé la db, récupérable ici : http://dl.free.fr/u3lWHHgI2

tu y retrouveras :

- la table TAXREFv40 (mon référentiel dans lequel chercher mes entrées),
- PLANTAE_LRR_UNMATCHED : les noms de ma liste à comparer qui n'ont pas trouvé de correspondant "direct" dans TAXREF;

- PLANTAE_LRR_171 : exemple du résultat auquel je souhaite parvenir (un nom = 1 code); en l'occurrence 171 noms qui ont trouvé une correspondance directe dans TAXREF (sur NOM_VALIDE, OU sur NOM_COMPLET, OU sur LB_NOM);

- PLANTAE_LRR_UNMATCHED_TOTAL_GE : mes "sans correspondance directe", que j'ai pris soin de décortiquer en "mot A", motB, motC, etc... Qui inclue par ailleurs un champ GenreEspece qui correspond à "motA motB" : chaque entrée de la table TAXREF fonctionnant nécessairement sur cette base (genre espèce, nomenclature binomiale selon Karl Von Linné pour la petite histoire ! ).

D'un certain côté j'espère que le qry fonctionne chez toi ; mais d'un autre pas du tout : parce que comment savoir ce qui cloche chez moi, dans cette éventualité ?!?
Gregorx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 20h40   #11
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 206
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 206
Points : 5 256
Points : 5 256
ok, je regarderai ca dans la soirée...

A+
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 20h45   #12
Invité de passage
 
Homme
Chargé de missions
Inscription : novembre 2011
Messages : 18
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Drôme (Rhône Alpes)

Informations professionnelles :
Activité : Chargé de missions
Secteur : Associations - ONG

Informations forums :
Inscription : novembre 2011
Messages : 18
Points : 4
Points : 4
C'est déjà bien aimable à toi de t'y pencher, alors ne va pas non plus te mettre la pression sur un quelconque délais !!
Gregorx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 21h19   #13
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 206
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 206
Points : 5 256
Points : 5 256
Bonjour,

Il y a plusieurs problèmes:

1) le volume de donnée dans la table "TAXREFv40" qui rend le temps d'exécution des requêtes à base de jointure hyper long.

2)Plusieurs CD_REF pour un même "Nom Complet".

3)On doit pouvoir contourner le problème du plantage (ou de l'extrême lenteur) uniquement dans le cas : premiers mots du champ Taxon identiques à premiers mots du champ "Nom Complet" de la table "TAXREFv40".

Une idée à explorer:

Ajouter un champ "CD_REF" à la table "PLANTAE_LRR_UNMATCHED"

Trier la table "PLANTAE_LRR_UNMATCHED" par ordre croissant du champ "Taxon".

Trier la table "TAXREFv40" par ordre croissant du champ "Nom Complet".

Pour chaque expression du champ "Taxon" la splitter dans un tableau

Puis Parcourir pour une chaine de 2,3 ou 4 mots , si elle se retrouve en début du champ "Nom Complet" et ceci jusqu'à ce que le "Nom Complet" soit supérieur ou égal à la chaine de mots.

Si la chaine est contenu dans le nom complet alors mettre à jour le "CD_REF" de la table "PLANTAE_LRR_UNMATCHED".


Outils pour mettre en place cet algo en VBA: les recordset.

Un exemple de code sur le même principe:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Public Function MatchData()
Dim db As DAO.Database
Dim rst1 As DAO.Recordset
Dim rst2 As DAO.Recordset
Dim t As Variant, i As Integer, NbOcc As Integer, MaxOcc As Integer, CD_REF As Long, Point As Variant
Dim Occ As String
 
Set db = CurrentDb
 
Set rst1 = db.OpenRecordset("select Taxon, CD_REF From PLANTAE_LRR_UNMATCHED Order By Taxon", dbOpenDynaset)
Set rst2 = db.OpenRecordset("select NOM_COMPLET, CD_REF FROM TAXREFv40 Order By NOM_COMPLET;", dbOpenSnapshot)
 
 
Do Until rst1.EOF
t = Split(rst1!Taxon, " ") 'Split des mots de la chaîne
MaxOcc = 0: CD_REF = 0
Occ = t(0) ' 1et mot indice=0
 
  For j = 1 To 3 ' mots suivant
 
  Occ = Occ & " " & t(j)
 
  Point = rst2.Bookmark
 
  Do While (rst2!NOM_COMPLET < Occ) ' tant que Nom complet inférieur
 
  rst2.MoveNext ' enregistrement suivant
 
     If rst2.EOF Then
        Exit Function
     End If
 
  Loop
 
     If InStr(rst2!NOM_COMPLET, Occ) <> 0 Then ' Si chaîne dans nom complet.
        CD_REF = rst2!CD_REF
     Else
        Exit For
     End If
 
  rst2.Bookmark = Point
 
  Next j
 
     If CD_REF <> 0 Then ' si CD_REF mis à jour alors
        rst1.Edit
        rst1!CD_REF = CD_REF
        rst1.Update
     End If
 
rst1.MoveNext
 
Loop
 
rst1.Close
Set rst1 = Nothing
 
rst2.Close
Set rst2 = Nothing
 
End Function
A+
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 13h37   #14
Invité de passage
 
Homme
Chargé de missions
Inscription : novembre 2011
Messages : 18
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Drôme (Rhône Alpes)

Informations professionnelles :
Activité : Chargé de missions
Secteur : Associations - ONG

Informations forums :
Inscription : novembre 2011
Messages : 18
Points : 4
Points : 4
Par défaut Merci...

un peu tardif, mais encore merci de votre aide !

En fait, je m'en suis sorti en toilettant les chaînes à comparer de la même façon.
Ce qui fait qu'au terme de la démarche il ne me restait plus qu'à comparer si chaîne A = chaîne B.

Merci.
Gregorx est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h49.


 
 
 
 
Partenaires

Hébergement Web