Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Contribuez
Contribuez Access : Vos contributions. Postez ici vos codes sources, conseils, astuces et autres propositions. Ce forum n'est pas un forum technique mais destiné aux contributions pour www.developpez.com
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/05/2011, 09h40   #1
Rédacteur/Modérateur
 
Avatar de Philippe JOCHMANS
 
Homme Philippe JOCHMANS
Développeur informatique
Inscription : mai 2005
Messages : 17 615
Détails du profil
Informations personnelles :
Nom : Homme Philippe JOCHMANS
Âge : 44
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Communication - Médias

Informations forums :
Inscription : mai 2005
Messages : 17 615
Points : 30 962
Points : 30 962
Envoyer un message via MSN à Philippe JOCHMANS Envoyer un message via Skype™ à Philippe JOCHMANS
Par défaut Eclater une table en plusieurs en fonction d'un critère dans un champ

Bonjour

Suite à une discussion sur le forum, je vous propose une petite routine.

Il arrive que l'on ait à éclater des fichiers, par exemple différencier les hommes des femmes par la civilité, extraire des régions, etc.

Cela peut se faire par des requêtes de créations multiples, mais cela peut-être long et fastidieux.

Je vous propose donc cette petite routine générique qui permettra en sélectionnant la table, le champ et le type de champ d'avoir autant de tables que de données différentes dans le champ souhaité.

Pour cela, il faut déclarer une donnée de type Enum dans un module

Code :
1
2
3
4
5
Public Enum TypeChamp
    phTexte = 1
    phNum = 2
    phDate = 3
End Enum
Ensuite, dans le module coller la routine suivante (celle-ci est entièrement documenté).

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
Public Sub EclatageTable(strTable As String, strChamp As String, bytTypeChamp As TypeChamp)
    '---------------------------------------------------------------------------------------
    ' Procedure      : EclatageTable
    ' Auteur         : Philippe JOCHMANS - http://starec.developpez.com
    ' Date           : 02/05/2011
    ' Commentaires   : Routine d'éclatage de table
    ' Paramètres en entrée :
    '               strTable        : Nom de la table qui doit être éclatée
    '               strChamp        : Nom du champ de référence
    '               bytTypeChamp    : Type de champ pour réaliser la requête adéquate
    '
    '  Remarques      : Ne pas oublier de cocher la bibliothèque Microsoft DAO 3.6
    '---------------------------------------------------------------------------------------
 
    ' déclaration des variables
 
    Dim db As DAO.Database
    Dim rstChamp As DAO.Recordset           ' recordset pour récupérer les informations sur le champ qui sert de référence à l'éclatage
    Dim strSQL As String                    'stockage des chaines SQL
    Dim strSqlWhere As String               ' clause Where de la requête SQL qui éclatera le fichier
 
    ' affectation
 
    Set db = CurrentDb
 
    ' requête qui permettra de récupérer le nombre d'éléments différents du champs de référence
 
    strSQL = "SELECT " & strChamp & " FROM " & strTable & " GROUP BY " & strChamp
 
    ' utilisation d'un recordset en fonction du champ de critère pour récupérer les différents critères d'éclatage
 
    strSQL = "SELECT " & strChamp & " FROM " & strTable & " GROUP BY " & strChamp
    Set rstChamp = db.OpenRecordset(strSQL)
 
        While Not rstChamp.EOF
 
            ' génération de la clause Where de la requête de création en fonction du type de champ
 
            Select Case bytTypeChamp
                Case 1 ' champ de type texte
                    strSqlWhere = strChamp & "='" & rstChamp(strChamp) & "'"
                Case 2 ' champ de type numérique
                    strSqlWhere = strChamp & "=" & rstChamp(strChamp)
                Case 3 ' champ de type date
                    strSqlWhere = strChamp & "=#" & Format(rstChamp(strChamp), "mm/dd/yyyy") & "#"
            End Select
 
            ' création des différentes tables
 
            db.Execute "SELECT * INTO " & strTable & "_" & Replace(rstChamp(strChamp), "/", "_") & " FROM " & strTable & " WHERE " & strSqlWhere
 
            ' passage au critère suivant
 
            rstChamp.MoveNext
        Wend
 
    ' mise à jour de la fenêtre base de données
 
    Application.RefreshDatabaseWindow
 
    ' libération des  objets
    rstChamp.Close
    Set rstChamp = Nothing
 
    MsgBox "Fin de traitement"
 
End Sub
Par exemple, nous voulons à partir de la table Table1 créer une table différente par rapport aux différentes dates qui se trouvent dans le champ dte de type date.

Code :
Call EclatageTable("Table1", "dte", phDate)
Philippe
__________________
Détaillez vos questions, sinon vous aurez des réponses erronées et vous irez tout droit dans le et lisez les règles sinon
Si vous pensez commencer sans un livre, oublier : livres pour débuter
Vous pouvez consulter mes articles sur Access et PowerPoint
Le blog Office.

Inutile de m'envoyer un MP pour des questions techniques ou de me relancer , je n'y répondrais pas.
Philippe JOCHMANS est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/05/2011, 17h16   #2
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 040
Points : 11 040
Bonjour Philippe,

Bravo pour cette proposition.

Une suggestion : on peut faire l'économie du paramètre qui renseigne le type de donnée (et donc de l'Enum).
La routine peut la rechercher elle-même. Par exemple, comme ceci :


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
Public Sub EclatageTable(strTable As String, strChamp As String)
    '---------------------------------------------------------------------------------------
    ' Procedure      : EclatageTable
    ' Auteur         : Philippe JOCHMANS - http://starec.developpez.com
    ' Date           : 02/05/2011
    ' Commentaires   : Routine d'éclatage de table
    ' Paramètres en entrée :
    '               strTable        : Nom de la table qui doit être éclatée
    '               strChamp        : Nom du champ de référence
    '                   '
    '  Remarque      : Ne pas oublier de cocher la bibliothèque Microsoft DAO 3.6
    '---------------------------------------------------------------------------------------
 
    ' déclaration des variables
 
    Dim db As DAO.Database
    Dim rstChamp As DAO.Recordset           ' recordset pour récupérer les informations sur le champ qui sert de référence à l'éclatage
    Dim strSQL As String                    'stockage des chaines SQL
    Dim strSqlWhere As String               ' clause Where de la requête SQL qui éclatera le fichier
    Dim intTypeChamp As Integer             'type de donnée
    ' affectation
 
    Set db = CurrentDb
 
    ' requête qui permettra de récupérer le nombre d'éléments différents du champs de référence
 
    strSQL = "SELECT " & strChamp & " FROM " & strTable & " GROUP BY " & strChamp
 
    ' utilisation d'un recordset en fonction du champ de critère pour récupérer les différents critères d'éclatage
    Set rstChamp = db.OpenRecordset(strSQL)
'Recherche du type de donnée
If IsNumeric(rstChamp(0)) Then
  intTypeChamp = 2
ElseIf IsDate(rstChamp(0)) Then
  intTypeChamp = 3
Else
  intTypeChamp = 1
End If
'boucler sur les valeurs distinctes
        While Not rstChamp.EOF
 
        strSqlWhere = strChamp & "=" & rstChamp(strChamp)
            ' génération de la clause Where de la requête de création en fonction du type de champ
 
            Select Case intTypeChamp
                Case 1 ' champ de type texte
                    strSqlWhere = strChamp & "='" & rstChamp(strChamp) & "'"
                Case 2 ' champ de type numérique
                    strSqlWhere = strChamp & "=" & rstChamp(strChamp)
                Case 3 ' champ de type date
                    strSqlWhere = strChamp & "=#" & Format(rstChamp(strChamp), "mm/dd/yyyy") & "#"
            End Select
 
            ' création des différentes tables
 
            db.Execute "SELECT * INTO " & strTable & "_" & Replace(rstChamp(strChamp), "/", "_") & " FROM " & strTable & " WHERE " & strSqlWhere
 
            ' passage au critère suivant
 
            rstChamp.MoveNext
        Wend
 
    ' mise à jour de la fenêtre base de données
 
    Application.RefreshDatabaseWindow
 
    ' libération des  objets
    rstChamp.Close
    Set rstChamp = Nothing
 
    MsgBox "Fin de traitement"
 
End Sub
Bien à toi.
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 18h46   #3
Rédacteur/Modérateur
 
Avatar de Philippe JOCHMANS
 
Homme Philippe JOCHMANS
Développeur informatique
Inscription : mai 2005
Messages : 17 615
Détails du profil
Informations personnelles :
Nom : Homme Philippe JOCHMANS
Âge : 44
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Communication - Médias

Informations forums :
Inscription : mai 2005
Messages : 17 615
Points : 30 962
Points : 30 962
Envoyer un message via MSN à Philippe JOCHMANS Envoyer un message via Skype™ à Philippe JOCHMANS
Salut Claude

Tout à fait, j'y pensais ce matin, tu m'as devancé

Mine de rien je l'ai utilisé 2 fois aujourd'hui pour un éclatage de fichiers.

Philippe
__________________
Détaillez vos questions, sinon vous aurez des réponses erronées et vous irez tout droit dans le et lisez les règles sinon
Si vous pensez commencer sans un livre, oublier : livres pour débuter
Vous pouvez consulter mes articles sur Access et PowerPoint
Le blog Office.

Inutile de m'envoyer un MP pour des questions techniques ou de me relancer , je n'y répondrais pas.
Philippe JOCHMANS 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 12h50.


 
 
 
 
Partenaires

Hébergement Web