IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)



Auteur : Tofalu
Version : 05/03/2005
Page de l'auteur
Concaténer plusieurs enregistrements dans une seule colonne
Versions : 97 et supérieures

Important : Pour que ce code fonctionne, vous devez ajouter une référence Microsoft DAO à votre projet.

Voici un exemple de table :

Projet NomParticipant
1 Dupont
1 Durand
1 Paul
2 Dupont
2 Luc
Dans une requête R01, vous souhaitez obtenir la liste des projets ainsi que la liste des participants sur une seule colonne et une seule ligne par projet.

Projet LesParticipants
1 Dupont Durand Paul
2 Dupont Luc
Pour cela, il vous faut placer ce code dans un module :

Public Function RecupParticipant(Projet As Long) As String Dim res As DAO.Recordset Dim SQL As String 'Selectionne les participant du projet SQL = "SELECT NomParticipant FROM Tbl_Projet WHERE Projet=" & Projet Set res = CurrentDb.OpenRecordset(SQL) 'Concatene les différents enregistrement While Not res.EOF RecupParticipant = RecupParticipant & res.Fields(0).Value & " " res.MoveNext Wend 'Enleve le dernier espace RecupParticipant = Left(RecupParticipant, Len(RecupParticipant) - 1) 'libere la mémoire Set res = Nothing End Function
Puis créer la requête :

R01 :

SELECT DISTINCT Tbl_projet.Projet, Recupparticipant(Projet) AS LesParticipants FROM Tbl_projet;
Dans une requête R02, vous souhaitez obtenir la liste des participants ainsi que la liste de leurs projets sur une seule colonne et une seule ligne par participant.

NomParticipant LesProjets
Dupont 1;2
Durand 1
Luc 2
Paul 1
Pour arriver à un tel résultat, placer dans un module le code suivant :

Public Function RecupProjet(Nom As String) As String Dim res As DAO.Recordset Dim SQL As String 'Selectionne les projet du partcipant 'chr(34) correspond a des guillemets pour encadrer le texte SQL = "SELECT Projet FROM Tbl_Projet WHERE NomParticipant=" & _ Chr(34) & Nom & Chr(34) Set res = CurrentDb.OpenRecordset(SQL) 'Concatene les différents enregistrement While Not res.EOF RecupProjet = RecupProjet & res.Fields(0).Value & ";" res.MoveNext Wend 'Enleve le dernier ; RecupProjet = Left(RecupProjet, Len(RecupProjet) - 1) 'libere la mémoire Set res = Nothing End Function
Et enfin, créer la requête SQL :


R02 :

SELECT DISTINCT Tbl_projet.NomParticipant, Recupprojet(NomParticipant) AS LesProjets FROM Tbl_projet;

Auteur : Tofalu
Version : 05/03/2005
Page de l'auteur
Classer les résultats d'une requête
Cette section propose plusieurs requêtes pour classer des enregsitrements.

Voici notre table exemple (elle est nommée Tbl_Note) :

Note Nom
10 Paul
12 Dupont
6 Henry
20 Luc
16 Marc
12 Etienne
12 Simon
20 Lucien
1. Classement indexé à zéro des notes par ordre décroissant correspondant à :

Rang Note Nom
0 20 Lucien
0 20 Luc
2 16 Marc
3 12 Simon
3 12 Etienne
3 12 Dupont
6 10 Paul
7 6 Henry
SELECT (SELECT Count(Note) FROM tbl_note T2 WHERE T2.Note>T1.Note) AS Rang, T1.Note, * FROM tbl_note AS T1 ORDER BY T1.Note DESC;
Rang Note Nom
0 20 Lucien
0 20 Luc
1 16 Marc
2 12 Simon
2 12 Etienne
2 12 Dupont
3 10 Paul
4 6 Henry
SELECT (SELECT Count(Note) FROM (SELECT Distinct Note FROM tbl_note) T2 WHERE T2.Note>T1.Note) AS Rang, T1.Note, * FROM tbl_note AS T1 ORDER BY T1.Note DESC;
2. Classement indexé à zéro des notes par ordre croissant correspondant à :

Rang Note Nom
0 6 Henry
1 10 Paul
2 12 Simon
2 12 Etienne
2 12 Dupont
5 16 Marc
6 20 Lucien
6 20 Luc
SELECT (SELECT Count(Note) FROM tbl_Note T2 WHERE T2.Note<T1.Note) AS Rang, T1.Note, * FROM tbl_note AS T1 ORDER BY T1.Note;
Rang Note Nom
0 6 Henry
1 10 Paul
2 12 Simon
2 12 Etienne
2 12 Dupont
3 16 Marc
4 20 Lucien
4 20 Luc
SELECT (SELECT Count(Note) FROM (SELECT Distinct Note FROM tbl_note) T2 WHERE T2.Note<T1.Note) AS Rang, T1.Note, * FROM tbl_note AS T1 ORDER BY T1.Note;
3. Classement indexé à 1 :

Il suffit d'ajouter 1 à chaque ligne

Rang Note Nom
1 6 Henry
2 10 Paul
3 12 Simon
3 12 Etienne
3 12 Dupont
6 16 Marc
7 20 Lucien
7 20 Luc
SELECT (SELECT Count(Note) FROM tbl_note T2 WHERE T2.Note<T1.Note) +1 AS Rang, T1.Note, * FROM tbl_note AS T1 ORDER BY T1.Note;
4. Classeement sur deux champs :

Cet exemple tri par note et par nom :

Rang Note Nom
1 6 Henry
2 10 Paul
3 12 Dupont
3 12 Etienne
3 12 Simon
6 16 Marc
7 20 Luc
7 20 Lucien
SELECT (SELECT Count(Note) FROM tbl_note T2 WHERE T2.Note<T1.Note) +1 AS Rang, T1.Note, * FROM tbl_note AS T1 ORDER BY T1.Note,Nom ;

Auteur : Tofalu
Version : 05/03/2005
Page de l'auteur
Téléchargez le zip
Effectuer des recherches phonétiques
Versions : 2000 et supérieures

Ce code permet de rechercher des occurences proches phonétiquement d'un critère. Pour cela, la méthode utilisée est celle de l'algorithme Soundex. Vous en trouverez les origines ici.

Je vous propose donc une traduction de cet algorithme en VBA :

Option Compare Database Option Explicit Public Function Prepare(Mot As String) As String 'Cette fonction est inspirée de : 'http://sqlpro.developpez.com/cours/soundex/ 'On enleve les espaces et convertit en majuscule Dim I As Integer Dim Caractere Mot = Trim$(UCase$(Mot)) 'On convertit les caractères accentués For I = 1 To Len(Mot) Caractere = Mid(Mot, I, 1) Select Case Asc(Caractere) Case 192, 194, 196 Prepare = Prepare & "A" Case 199 Prepare = Prepare & "S" Case 200 To 203 Prepare = Prepare & "E" Case 204, 206, 207 Prepare = Prepare & "I" Case 212, 214 Prepare = Prepare & "O" Case 217, 219, 220 Prepare = Prepare & "U" Case Else If Caractere <> " " & Caractere <> "-" Then _ Prepare = Prepare & Caractere End Select Next I End Function Public Function Soundex(Mot As String) As String Dim TLettre() As Variant Dim I As Integer Dim Lettre As String Dim Tmp As String 'Tableau de correspondance TLettre = Array("", "1", "2", "3", "", "1", "2", "", "", "2", _ "2", "4", "5", "5", "", "1", "2", "6", "2", "3", _ "", "1", "", "2", "", "2") Mot = Prepare(Mot) 'cas particulier de chaine vide If Len(Mot) = 0 Then Soundex = "0000" Else 'cas particulier de chaine à 1 caractère If Len(Mot) = 1 Then Soundex = Mot & "000" Else 'Enleve le H (si présent) au début If Left(Mot, 1) = "H" Then Mot = Mid(Mot, 2) Soundex = Left(Mot, 1) For I = 2 To Len(Mot) Lettre = Mid(Mot, I, 1) 'Transcode If Lettre >= "A" And Lettre <= "Z" Then Tmp = TLettre(Asc(Lettre) - Asc("A")) 'Evite les doublons If Tmp <> Right(Soundex, 1) Then Soundex = Soundex & Tmp End If Next I End If End If 'on recupère les 4 premiers If Len(Soundex) >= 4 Then Soundex = Left(Soundex, 4) Else 'sinon on complete For I = Len(Soundex) To 3 Soundex = Soundex & "0" Next I End If End Function
Ainsi, Soundex("Martin") et Soundex("Martan") renvoient la même valeur.

Vous trouverez un exemple d'utilisation complet dans des requêtes SQL en télechargeant le fichier Zip.



Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2004-2005 Maxence Hubiche Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.