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 :

"champs" d'un recordset


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 22
    Par défaut "champs" d'un recordset
    Voilà mon p'tit souci :


    Je fais quelques essais pour trier une table "Adhérents" assez mal faite, et qui possède un grand nombre de champs.

    Cette table dispose d'un champ "Type" qui permet de regrouper les enregistrements en 3 types différents : Personnes, Sociétés, Coopératives.

    Le but de ce tri serait de remplir 3 autres tables ("Personnes", "Sociétés", "Coopératives") ayant les mêmes champs que la table initiale "Adhérents", en insérant dans ces 3 tables que les enregistrements concernés.



    J'ai prévu un petit formulaire pour effectuer ce tri, ça me permet de me remettre doucement la tête dans Access vu que je suis en stage.

    Une liste déroulante me permet d'abord de sélectionner quel type je veux extraire.
    Ensuite, un bouton de commande lance le tri via une procédure évènementielle.


    Un Select Case sur le choix de la liste déroulante me permet de sélectionner les requêtes à exécuter :


    - Je stocke les enregistrements de la table "Adhérents" dans un recordset


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ExtractPersonne = "Select * From Adherents Where Type='Personne'"
     
    Set recordset = CurrentDb.OpenRecordset(ExtractPersonne, dbOpenForwardOnly, dbReadOnly)

    - Je parcours le recordset en faisant un INSERT INTO dans la table "Personnes" à chaque enregistrement parcouru

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    
    requete = "INSERT INTO Personnes (champ1,champ2,...,champ20) "
    requete = requete & "VALUES ('" & recordset("Champ1").Value & "', '" & recordset("Champ2").Value & "',..., '" & recordset("Champ20").Value & "')"
    
    CurrentDb.Execute requete

    Mon problème arrive donc ici :

    J'ai marqué en orange les 2 énumérations qui me posent problème. En gros dans mon insert into, je dois tapper 20 nom de champs successifs (champs destination dans la table "Personnes"), puis 20 valeurs à insérer piochées dans le recordset par recordset("Nom_du_Champ").value.

    Les noms des champs sont assez lourds à tapper, c'est pourquoi je cherche une procédure pour m'éviter ça et construire ma requête (string) dans une boucle while. Un truc du type :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    tant qu il reste des champs dans le recordset faire
     
          requete = requete + nom_du_champ_courant
     
          aller au champ du recordset suivant
     
    fin tant que
    Pour résumer, je voudrais parcourir le recordset afin de récupérer le nom des champs qui le composent. J'ai cherché un moment, je n'ai rien trouvé là dessus, et je ne sais pas si c'est possible.

    Voilà je crois que j'ai fait le tour de mon souci. J'espère qu'il existe une solution pour faire ça. Merci d'avance pour vos réponses

    Halz.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 22
    Par défaut
    J'viens de trouver un recordset.Fields(i).Name qui visiblement permet de faire ce que je veux, en parcourant avec un While i < recordset.RecordCount


    Je teste ça


    Edit : visiblement, recordset.Fields(i).Name permet bien de récupérer le nom d'un champ, mais recordset.RecordCount compte le nombre d'enregistrements, non pas le nombre de champs

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Par défaut
    Citation Envoyé par Halzard
    Edit : visiblement, recordset.Fields(i).Name permet bien de récupérer le nom d'un champ, mais recordset.RecordCount compte le nombre d'enregistrements, non pas le nombre de champs
    Exact. C'est un For Each ... Next qu'il faut à la place du While

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim MonChamp As Field
    For Each MonChamp In recordset.Fields
         .....
    Next

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 22
    Par défaut
    Impec, merci beaucoup !

  5. #5
    Membre Expert
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Par défaut
    Bonjour,

    Tu as aussi cette solution (sans passer par un recordset) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into table2 (select * from table1)

+ Répondre à la discussion
Cette discussion est résolue.

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