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

VBA Access Discussion :

Création de table et ajout de champs


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 41
    Points : 39
    Points
    39
    Par défaut Création de table et ajout de champs
    Bonjour,

    Je réalise un bout de code qui boucle les champs de plusieurs tables pour calculer des requêtes croisées sur chaque champs.

    Le but est d'assembler toutes ces requêtes en une seule table.
    J'ai Deux tables : Groupe et Individus. Un groupe est composé de plusieurs individus.

    Le champs de ligne est groupe. Chaque requête croisée compte le nombre d'individus possédant le critère X pour chaque groupe (tableau de contingence).

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    Option Compare Database
    Public Sub CreationTableSynthese()
     
    '---------------------Variables objets
     
    'Base de données
    Dim db As Database
     
    'Table à analyser(GROUPE ET INDIVIDUS)
    Dim tb As TableDef
     
    'Champs des tables à analyser(GROUPE ET INDIVIDUS)
    Dim fld As Field
     
    'Nouvelle table (TableSynthèse)
    Dim Ntb As TableDef
     
    'Champs de la table qui va être créée
    Dim Nfld As Field
     
    'RecordSet qui stock la requête SQL
    Dim rst As Recordset
     
    'Recordset qui stock la nouvelle table
    Dim Nrst As Recordset
     
    '---------------------Variables diverses
     
    'Nom de la nouvelle table
    Dim NomNouvelleTable As String
     
    'Variable SQL
    Dim MonSql As String
     
    'Variables Tables à croiser
    Dim TablesACroiser() As String
     
    'Variable pour stocker les champs de la requête SQL
    Dim fldSQL As Field
     
    '---------------------Affectation de la Base de données
     
    'Affectation de la BD
    Set db = CurrentDb
     
    '---------------------Création de la table
     
    'Nom de la nouvelle table
    NomNouvelleTable = "TableSynthese"
     
    'Test qui vérifie l'existence de la table qui va être créée
    If ExistTable(NomNouvelleTable) = True Then
     DoCmd.Close acTable, NomNouvelleTable
    db.TableDefs.Delete NomNouvelleTable
    End If
     
    'Création de la nouvelle table
    Set Ntb = db.CreateTableDef(NomNouvelleTable)
     
    '---------------------Définition des tables à analyser
     
    'Appel de la fonction qui définie les tables
    TablesACroiser = TablesPourTCD
     
    '---------------------
     
    Dim j As Integer
    'Boucle sur les Tables dont on va faire une requête croisée sur chaque champs
    For j = 0 To UBound(TablesACroiser)
     
        Set tb = db.TableDefs(TablesACroiser(j))
     
        'Boucle sur chaque champs de la table
        For Each fld In tb.Fields
     
            'Appel de la fonction qui initialise le code SQL selon le type de champ
            MonSql = EditSQL(tb, fld)
     
            'Affectation du RecordSet contenant le code SQL
            Set rst = db.OpenRecordset(MonSql, dbOpenDynaset)
     
     
     
            'Boucle sur chaque champs de la requête croisée
            For Each fldSQL In rst.Fields
     
                Set Nfld = Ntb.CreateField
                With Nfld
                    'On rajoute j pour éviter la redondance des champs entre les différentes tables
                    .Name = fld.Name & "_" & fldSQL.Name & " " & j
                    .Type = fld.Type
                End With
                'Ajout du nouveau champ dans la table
                Debug.Print Nfld.Name
                Ntb.Fields.Append Nfld
                Ntb.Fields.Refresh
     
            Next fldSQL
     
        Next fld
     
    Next j
     
    'On ajoute la nouvelle table à la BD
    db.TableDefs.Append Ntb
     
     
    rst.Close
    Application.RefreshDatabaseWindow
    End Sub
    Voila avec ce code je crée une table avec tous les champs présent dans mes requêtes croisées, mais je n'ai ajouté aucune valeur.

    Je n'arrive pas à trouver le solution.
    J'ai un autre module qui Ajoute le nombre de Recordset nécessaire (je calcul le nombre de groupe et j'ajoute autant de recordset) et un dernier module qui doit ajouter les valeurs en reprenant chaque requêtes une par une.

    C'est un peu tiré par les cheveux, aussi si quelqu'un voit une autre méthode pour ajouter les valeurs de chaque requête. Il est clair que je manque de méthode.

    Merci.

    Olivier.

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 124
    Points : 12 176
    Points
    12 176
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Je sais qu'il est enivrant de créer un script VBA mais dans ton cas je pense qu'il est inutile... de partir dans cette voie.

    Tu prends ton analyse croisée dans une nouvelle requête et tu créés une table à partir de celle-ci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT.... INTO TableSynthese FROM...
    Cette manip peut se faire en VBA biensur mais dans un premier temps, avec le QBE histoire de voir si le résultat attendu est le bon...

    Argy

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 41
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Le problème c'es que je n'ai pas qu'une seule requête croisée à faire, mais une bonne dizaine (et peut être plus encore).
    De plus quand on fait une requête croisée, le nom du champ correspond à la valeur du champ croisée.

    Ex: Nombre d'individus. Les noms de champs vont devenir 1, 2, 12 ,24, etc.
    Avec le VBA je crée un champ qui reprend l'ancien nom de champ + la valeur de ce champ. Ce qui me donne NB_INDIVIDU_1, NB_INDIVIDU_2, NB_INDIVIDU_12, etc.
    C'est beaucoup plus facile à interpréter.

    Pour faire Ma table unique, je pourrai aussi faire une joijture entre toute mes tables croisée sur le champ ID_GROUPE qui est commun à toutes les tables croisées, mais c'est un peu fastidieux.

    Si tu penses que le vba n'est pas nécessaire, je laisserai tomber, mais à chaque fois que je veux faire ça à la main, je me dis que ça va me prendre un temps fou et qu'à chaque modification je vais devoir tout recommencer.

    Olivier

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 124
    Points : 12 176
    Points
    12 176
    Billets dans le blog
    5
    Par défaut
    Humm, VBA, oui mais pas tel que tu étais parti pour inclure les données.

    J'ai du mal à cerner le pourquoi de cette "concaténation" de tables en une seule... Ca ne ressemble pas à quelque chose de standardisé au final et ce qui me taraude, c'est :

    Comment être sûr que la ligne d'enregistrement 1 de la table 1 correspond à celle de l'enregistrement 1 de la table 2 etc...?

    Quel est le but ?
    Que contiennent ces tables ?

    Argy

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 41
    Points : 39
    Points
    39
    Par défaut
    Effectivement ça n'est pas très conventionnel.

    Chaque requête croisée va effectuer un comptage de tous les champs pour chaque groupe.

    Champ Sexe
    Groupe 1 : Nombre d'Homme, Nombre de Femme
    Groupe 2 : Nombre d'Homme, Nombre de Femme

    Champ Age
    Groupe 1 : 15-30, 30-40
    Groupe 2 : 15-30, 30-40

    Donc chaque requête listera ces champs groupe par groupe. Je suis sur de pouvoir emboiter ces tables sans risque d'erreur (enfin j'espère).

    Mon code fonctionne correctement sauf au moment d'ajouter les valeurs.
    J'ai un problème avec le propriété ordinalValue qui n'est pas la même dans ma table général et celle de requête.

    le code est un peu long et avec les tables on comprend mieux. Si tu veux jeter un coup d'oeil. Mais encore une fois, si tu penses que je me presse le citron pour rien, je suis prêt à abandonner le vba.

    Cordialement.
    Olivier
    Fichiers attachés Fichiers attachés

  6. #6
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 124
    Points : 12 176
    Points
    12 176
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par othke Voir le message
    Mais encore une fois, si tu penses que je me presse le citron pour rien, je suis prêt à abandonner le vba.
    Non, pas jusque là, il faudra de toute façon passer par du code à moment donné ou à un autre...
    En fait, dans mon 1er post, je suggérais cela pour que ton code soit plus que simplifié...
    Ce qui m'interpelle c'est que tu n'aies pas réussi à sortir une analyse qui t'évite cela... Personnellement, je n'ai jamais été confronté à ce type de cas et je pense qu'il existe dans ton projet quelque chose qui n'a pas forcément été bien pensé pour que tu aies à en arriver à cette solution capilotractée...

    Citation Envoyé par othke
    Donc chaque requête listera ces champs groupe par groupe. Je suis sur de pouvoir emboiter ces tables sans risque d'erreur (enfin j'espère).
    Et cette citation n'est presque pas acceptable dans le monde où je travaille...
    Imagine un instant que ton projet soit dédié à la gestion informatisée de la sécurité d'une centrale nucléaire

    Humm, en fait, si tu as une clé commune unique dans chaque table, il ne devrait pas y avoir de problème mais il va falloir user du LEFT JOIN car selon ce qui se présente, les NULL seront inévitables...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT GROUPE_CAMERA.PARKING, GROUPE_CAMERA.DATE_ENQUETE, GROUPE_CAMERA.HEURE_PASSAGE, GROUPE_CAMERA.MINUTES_PASSAGE, GROUPE_CAMERA.NB_INDIVIDUS, INDIVIDUS_CAMERA.SEXE, INDIVIDUS_CAMERA.AGE, INDIVIDUS_CAMERA.TENUE, INDIVIDUS_CAMERA.ACTIVITE, INDIVIDUS_CAMERA.EQUIPEMENT
    INTO SyntheseFinale
    FROM GROUPE_CAMERA 
    LEFT JOIN INDIVIDUS_CAMERA ON GROUPE_CAMERA.ID_GROUPE = INDIVIDUS_CAMERA.ID_GROUPE;

    Argy

Discussions similaires

  1. [WM17] Modifier la structure d'une table .db (ajouter un champ)
    Par medhan dans le forum Windev Mobile
    Réponses: 0
    Dernier message: 23/06/2015, 02h12
  2. Réponses: 7
    Dernier message: 05/06/2014, 11h22
  3. Mise à jour d'occurences de table après ajout de champ
    Par js8bleu dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/10/2013, 16h10
  4. [AC-2000] requete ALTER TABLE pour ajout de champ
    Par niko8181 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 22/09/2010, 13h46
  5. macro access: supprimer ligne table et ajout texte champs
    Par uldrych.maillet dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/12/2007, 22h11

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