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 08/02/2011, 17h25   #1
Nouveau Membre du Club
 
Inscription : novembre 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 105
Points : 36
Points : 36
Par défaut Requête Distinct sur un élément Splité

Bonjour tous,

Tout est dans le titre: je souhaiterais récupérer tous les auteurs individuellement de ma table TblReferences sachant que le champ auteur(s) peut contenir 3 cas différents (P. pour Prénom):

Nom1, P1.

Nom1, P1. and Nom2, P2.

Nom1, P1., Nom2, P2., Nom3, P3., Nom3, P3., ...

J'ai essayé ce code pour commencer mais Access n'a pas l'air d'aimé ^^
Code :
1
2
SELECT DISTINCT (Split(TblReferences.[Author(s)], ",*")
FROM TblReferences;
Une idée peut être?

Merci d'avance
Cinesra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 17h43   #2
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
Bonjour Cinesra,

Le plus simple serait que tu écrive une fonction dans un module externe qui, à partir de la valeur de ton champ , te retourne la valeur que tu recherche, et utiliser cette fonction dans ta requête

par ex (je te fais ça de tête, donc à adapter, mais le principe fonctionne)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
Public function split(ch_entrée as string) as string
dim nb_virgules as integer
-> comptage du nombre de virgules 
select case nb_virgules
case 1
split = right(ch_entrée,<position de ta virgule) 
exit function
case 2
split = <chaine que tu veux retourner>
case 3 
...
end select
 
end function
Ensuite tu fait ta requête
Code :
1
2
3
4
SELECT DISTINCT (Split(TblReferences.[Author(s)], ",*")
FROM TblReferences;

avec split = nom de ta fonction
si Split est un mot réservé, change de nom.

Avec ceci, tu as une infinie de possibilités pour coder ton SQL
__________________
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
si tout est OK, n'oubliez pas de cliquer sur
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 17h52   #3
Nouveau Membre du Club
 
Inscription : novembre 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 105
Points : 36
Points : 36
Oh boy!

Définitivement pas mon niveau les modules externes

N'y aurait il pas une autre méthode?? En attendant je vais qd même essayer d'utiliser ce que tu viens de m'écrire...
Cinesra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 22h23   #4
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
Si tu veux passer en SQL pur, cela sera beaucoup plus compliqué, car tu devra passer pas une combinaison de IIF(,,), ce qui va grandement enlever de la lisibilité au codage.
L'interêt de la built-in function est justement d'effectuer des tratements complexes sans avoir à le reporter dans le SQL. La limitation est que ces fonctions ne sont pas réutilisables dans du SQL standard.
__________________
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
si tout est OK, n'oubliez pas de cliquer sur
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 16h30   #5
Nouveau Membre du Club
 
Inscription : novembre 2010
Messages : 105
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 105
Points : 36
Points : 36
Salut,

Bon désolé mais pas moyen pour moi de comprendre comment écrire mon propre module.
Par contre je pensais à qlqchose de plus simple: utiliser une boucle For pour chaque élément de Liste2 à découper.
Exemple:

Code :
1
2
3
4
5
6
7
8
 
For Liste2(i) Then
 If Liste2 contient "and" Then 'cas où il y a seulement 2 auteurs
   split(...)
 Else  'les 2 autres cas précédemment cités
   split(...)
 EndIf
i = Liste2(end)
J'ai l'idée, quelqu'un pourrait m'aider pour le code correct de la fonction FOR (j'ai pas de souci pour les If)??

Merci d'avance
Cinesra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 16h43   #6
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
Attends, je ne comprends pas...
Ce que tu décris là est bien du code VBA, donc pas du SQL pur.
Si tu veux l'intégrer, il te faudra donc bien créer ton propre module !
A moins, que, comme Mr Jourdain, tu fasses des modules sans en avoir l'air ..
__________________
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
si tout est OK, n'oubliez pas de cliquer sur
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 16h55   #7
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
Citation:
Un module externe ... comment ça marche ?
Et bien, ce n'est pas compliqué (michel Chevalet)
Dans la base de donnée, on va dans le menu Créer -> à droite flèche sous l'icone Macro -> module

Et .. oh miracle .. l'objet Module1 (ou > 1 si déjà un autre module) apparait

Cliquer sur le module pour aller dans l'éditeur Visual Basic
Ensuite .. il n'y a pas de limite ... juste l'imagination
__________________
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
si tout est OK, n'oubliez pas de cliquer sur
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 17h51   #8
Membre éprouvé
 
Avatar de dumas.blr
 
Homme Jean-Yves DUMAS
Consultant informatique
Inscription : juin 2010
Messages : 325
Détails du profil
Informations personnelles :
Nom : Homme Jean-Yves DUMAS
Âge : 48
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : juin 2010
Messages : 325
Points : 447
Points : 447
Bonjour,

Je t'ai fais un exemple :

Dans une base de donnée, crée une table Table1 avec la structure suivante :
Livre Auteur (S)
A Allais Alphone
B Dumas Alexandre, Zola Emile
C BALZAC honoré
D DOYLE Conan, HOLMES Sherlock, WATSON John
E POTTER Harry, GRANGER hermione
F WYSLEY Ronald

Ensuite, créée un nouveau module
Dans ce module, insère le code suivant :

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
 
Option Compare Database
Public Function split2(entree As String, Optional position As Integer) As Variant
    Dim nb_auteur As Integer
    If IsNull(position) Then position = 1
    nb_auteur = CompteMots(entree, ",")
    Select Case nb_auteur
    Case 1
        Select Case position
        Case 1
            split2 = RetourneMot(entree, 1, ",")
        Case 2
            split2 = Null
        Case 3
            split2 = Null
        End Select
    Case 2
        Select Case position
        Case 1
            split2 = RetourneMot(entree, 1, ",")
        Case 2
            split2 = RetourneMot(entree, 2, ",")
        Case 3
            split2 = Null
        End Select
    Case 3
        Select Case position
        Case 1
            split2 = RetourneMot(entree, 1, ",")
        Case 2
            split2 = RetourneMot(entree, 2, ",")
        Case 3
            split2 = RetourneMot(entree, 3, ",")
        End Select
End Select
    End Function
Public Function CompteMots(S, Optional CarSep As String) As Integer
'
' compte les mots dans une chaine separés par au moins 1 séparateur (espace par défaut)
'
If CarSep = "" Then CarSep = " "
Dim wC As Integer, i As Integer, OnASpace As Integer
  If VarType(S) <> 8 Or Len(Trim(S)) = 0 Then
    CompteMots = 0
    Exit Function
  End If
  wC = 0
  OnASpace = True
 
 
  For i = 1 To Len(S)
    If Mid(S, i, 1) = CarSep Then
      OnASpace = True
    Else
      If OnASpace Then
        OnASpace = False
        wC = wC + 1
      End If
    End If
  Next i
  CompteMots = wC
End Function
Public Function RetourneMot(S, Indx As Integer, Optional CarSep As String) As String
'
' Extrait un mot dans le texte ou les mots sont separés par au moins 1 séparateur (espace par défaut)
'
If CarSep = "" Then CarSep = " "
Dim i As Integer, wC As Integer, count As Integer, SPos As Integer, EPos As Integer, OnASpace As Integer
  wC = CompteMots(S, CarSep)
  If Indx < 1 Or Indx > wC Then
    RetourneMot = ""
    Exit Function
  End If
  count = 0
  OnASpace = True
  For i = 1 To Len(S)
    If Mid(S, i, 1) = CarSep Then
      OnASpace = True
    Else
      If OnASpace Then
        OnASpace = False
        count = count + 1
        If count = Indx Then
          SPos = i
          Exit For
        End If
      End If
    End If
  Next i
  EPos = InStr(SPos, S, CarSep) - 1
  If EPos <= 0 Then EPos = Len(S)
  RetourneMot = Mid(S, SPos, EPos - SPos + 1)
End Function
Enfin, créée une nouvelle requête SQL, dans laquelle tu mettras le SQL suivant :

Code :
1
2
3
 
SELECT Table1.Livre, split2(Table1.[Auteur (S)],1) AS auteur1, nz(split2(Table1.[Auteur (S)],2),"vide") AS auteur2, nz(split2(Table1.[Auteur (S)],3),"vide") AS auteur3
FROM Table1;
Lance la requête,et regarde le résultat .

Nb : J'ai nommé cette fonction split2 car split est une fonction native du VBA
__________________
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
si tout est OK, n'oubliez pas de cliquer sur
dumas.blr est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h02.


 
 
 
 
Partenaires

Hébergement Web