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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

Eclater une table en plusieurs en fonction d'un critère dans un champ


Sujet :

Contribuez

  1. #1
    Invité
    Invité(e)
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Call EclatageTable("Table1", "dte", phDate)
    Philippe
    Dernière modification par Invité ; 08/05/2011 à 09h57.

  2. #2
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  3. #3
    Invité
    Invité(e)
    Par défaut
    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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/02/2015, 08h27
  2. Scinder une table en plusieurs tables
    Par hyol dans le forum Access
    Réponses: 4
    Dernier message: 22/02/2006, 14h05
  3. Bien structurer ma base, une table ou plusieurs ?
    Par jeyspy dans le forum Langage SQL
    Réponses: 5
    Dernier message: 10/10/2005, 14h18
  4. Creation d'une table avec plusieurs clés
    Par mic79 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 21/06/2005, 11h17
  5. [postgresql]creer une table avec plusieurs clés primaire??
    Par perlgirl dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/11/2004, 17h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo