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

Access Discussion :

créer une requête dont les champs ont été sélectionnés dans une table [AC-2003]


Sujet :

Access

  1. #1
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut créer une requête dont les champs ont été sélectionnés dans une table
    Bonjour à tous,

    Je ne suis pas développeur (désolé !) mais un utilisateur "avec de l'expérience" : je pourrais donc à l'occasion être utile. Je consulte régulièrement votre forum pour lequel j'ai franchi le pas de l'adhésion depuis peu.
    Je maintiens une base d'indices INSEE pour une communauté d'acheteurs et de chefs de projets.
    L'ensemble des indices maintenus en catalogue est stocké dans une grosse table "INSEE" et les caractéristiques de chacun des Indices font l'objet d'une table "Nomenclature".
    La Table "Nomenclature" comprend notamment les champs "IdBANK" : numéro Insee de l'indice; "SIGLE" : identifiant maison de l'indice et un champ "Choix" sous forme de liste de choix avec les occurrences "retenu" ou "exclu".
    Je cherche un code vba qui me permettrait de créer une nouvelle table à partir de la table INSEE et dont le nombre et le choix des indices la composant seraient dépendant du critère "retenu" dans le champ "Choix" de la table "Nomenclature".
    Pourriez-vous m'aider ?
    PS : Ci-jointes les tables "INSEE" et "Nomenclature"

  2. #2
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Pourquoi du VBA sur des fichiers Excel alors que je pense qu'une requête sur des Tables Access devrait être beaucoup plus facile à mettre en oeuvre.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  3. #3
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Tibat31520 et Heureux-oli,

    Juste pour compléter la réponse de Heureux-oli : tu peux créer une base Access avec des tables liées Excel. Il s'agit là de liaison, donc la mise à jour du fichier Excel cible entraîne la "mise à jour" immédiate du fichier Access lié (une sorte de raccourci).

    Je ne connais pas ton niveau Access. Si besoin, les tutos, FAQ et forum regorgent de formation d'excellente qualité.

    Il te faut des connaissances dans :
    • les tables liées ;
    • la création de requête ;
    • l'utilisation de fichiers joints dans les requêtes ;
    • etc...
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  4. #4
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Rédaction dynamique d'une requête
    Les fichiers xls sont extrait de ma BD jointe zippée.
    La table INSEE contient bcp trop d'indices (IdBANK dans Nomenclature).
    Mon idée est tjs la même :
    Réaliser une requête ou une nvelle table dont le nombre de champs dépendrait des éléments retenus une autre table "Nomenclature" par le biais du champs "Choix" de cette dernière table, de type binaire (1 /0 ou encore "retenu" / "exclu).

    Il est aisé de filtrer les enregistrements avec des critères mais comment le faire sur des colonnes ? (qry : ttes les col. sauf...)

    J'espère vraiment une réponse de votre part.

    Alors je vous dit à bientôt !

  5. #5
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Tibat31520,

    Si j'ai bien compris, le problème de base est d'établir un rapprochement avec le nom du champ de la table INSEE et les valeurs de IdBANK de la table Nomenclature (IdBANK contient le nom des champs de INSEE).

    L'idéal serait de transformer la table INSEE actuelle :
    - Année
    - Mois
    - AnnéeMois
    - AnnéeTrim
    - 001532540 (contient la valeur de 001532540)
    - 000604030 (contient la valeur de 000604030)
    ...

    en INSEE_Retravaillée :
    - Année
    - Mois
    - AnnéeMois
    - AnnéeTrim
    - Code (001532540, 000604030, etc...)
    - Valeur (valeur de 001532540, valeur de 000604030, etc...)

    De cette manière, la liaison entre INSEE et Nomenclature s'effectue aisément.

    Pour obtenir INSEE_Retravaillée à partir de INSEE, il faut du code qui "balaye" la liste des noms de champs de INSEE pour alimenter Code de INSEE_Retravaillée et la valeur des champs de INSEE pour alimenter Valeur de INSEE_Retravaillée.

    Je ne connais pas VBA mais un codeur peut, peut-être, donner un coup de main.
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  6. #6
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    On peut déjà avoir une piste là : http://warin.developpez.com/access/dao/
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  7. #7
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Rédaction dynamique d'une requête
    Bonjour,

    Chacun selon ses moyens.

    J'ai bien compris l'idée de Richard_35. Elle devrait aboutir à une table de trois champs utiles, qui pourrait se résumer ainsi :"AnnéeMois", "Code_1X" et "Valeur_1X".
    Je remercie également Heureux-oli, qui tente à sa façon de me guider sur les chemins de la connaissance DAO mais je pense que j'aurai rejoins l'orient éternel avant davoir réalisé trois pas cohérents en matière de code.
    J'ai donc essayé d'avancer autrement.
    • Jai récupéré sur le forum un code qui permet de concatener dans un même champ les données d'une même colonne.

    • J'ai adapté ce code pour l'appliquer, via la fonction "Recup1X()" dans le module que j'ai nommé "EltQry", à la requête "1X_choix_1".

    • Le résultat de la requête "1X_choix_1" affiche une seule cellule dans laquelle est composé le texte de la requête qui permettrait d'arriver au résultat final.

    Est-il alors possible d'exploiter le résultat de la requête "1X_choix_1" dans un code et qui de fait exécuterait de façon dynamique la requête ainsi composée ?
    Merci de vos contributions
    PS: Zip mis à jour
    Fichiers attachés Fichiers attachés

  8. #8
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Il me semble que tu veux aller trop vite.

    Pour arriver au résultat que tu souhaites et s'ouvrir la porte pour d'autres besoins, il faut des tables exploitables par des requêtes : donc, des valeurs affectées à des champs et non pas des noms de champs étant, eux-mêmes, une valeur.

    Comme je te l'ai dit, je ne connais pas VBA, mais il semble que tu as trouvé comment récupérer le nom des champs (res.Fields(0) => res.Fields(n), si je ne m'abuse).

    Donc, il est facile de créer la table INSEE_Retravaillée :
    - Année
    - Mois
    - AnnéeMois
    - AnnéeTrim
    - Code (res.Fields(0) => res.Fields(n))
    - Valeur

    Une fois la table INSEE_Retravaillée bétonnée, tu peux effectuer toutes les analyses que tu souhaites.
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  9. #9
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Bonjour à tous,

    je n'ai pas poursuivi sur l'idée de Richard 35 mais j'ai plutot tenté d'adapter du code glanné au fil du forum.

    1. dans un 1er tps, à partir de la table "Nomenclature", je concatène le champ "IdBank" (numéro des indices disponibles dans la base) mais seulement ceux "retenu" par l'intermédiaire du champ "Choix" (type binaire : "retenu"/"exclu") ;

    1. je compose la totalité de la requête finale ;

    1. et je l'exécute.

    voici le code (Module2) dans le doc joint :

    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
    Sub X_util()
    Dim Choix1X As String 'recoit la concaténation des indices choisis
    Dim res As DAO.Recordset
    Dim SQL As String
    Dim QRY As String 'rédaction de la requête complète finale
     
    'Selectionne et concatène les 1X choisis
    SQL = "SELECT IdBANK FROM Nomenclature WHERE Choix=" & 1
    'Concatene les différents enregistrement
    Set res = CurrentDb.OpenRecordset(SQL)
    While Not res.EOF
    Choix1X = Choix1X & "[" & res.Fields(0).Value & "], "
    res.MoveNext
    Wend
    'Enleve la dernière ","
    Choix1X = Left(Choix1X, Len(Choix1X) - 2)
    'rédaction de la requête complète finale
    QRY = "SELECT INSEE.AnnéeMois, " & Choix1X & " FROM INSEE;"
    'Exécution de la requête
    DoCmd.RunSQL QRY
    'libere la mémoire
    Set res = Nothing
    End Sub
    et là sa bug sur "DoCmd.RunSQL QRY"
    Sinon j'ai vérifié que dans la fenètre Exécution que ? QRY donnait le résultat attendu i.e la bonne rédaction de la requête

    Merci de votre aide
    Fichiers attachés Fichiers attachés

  10. #10
    Membre actif
    Homme Profil pro
    Chercheur
    Inscrit en
    Juin 2011
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2011
    Messages : 162
    Points : 248
    Points
    248
    Par défaut
    Bonjour,

    Si j'ai bien compris votre demande, voici quelques modifs sur votre code. L'erreur finale que vous avez s'explique par votre requête qui n'a pas de destination (nouvelle table, mise à jour ...).

    Dans l'exemple suivant une nouvelle table est créée automatiquement avec les données de la requête.

    En espérant que cela vous aide.

    Bcdt,
    Florian


    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
    Dim Choix1X As String 'recoit la concaténation des indices choisis
    Dim res As Recordset
    Dim SQL As String
    Dim QRY As String 'rédaction de la requête complète finale
     
    'Selectionne et concatène les 1X choisis
    SQL = "SELECT Nomenclature.IdBANK FROM Nomenclature WHERE (((Nomenclature.Choix)=1));"
    'Concatene les différents enregistrement
    Set res = CurrentDb.OpenRecordset(SQL)
     
    'Initialise le recordset
    res.MoveLast
    res.MoveFirst
     
    While Not res.EOF
    Choix1X = Choix1X & "INSEE." & res.Fields(0).Value & ", "
    res.MoveNext
    Wend
    'Enleve la dernière ","
    Choix1X = Left(Choix1X, Len(Choix1X) - 2)
    'rédaction de la requête complète finale à destination d'une nouvelle table Test
    QRY = "SELECT INSEE.AnnéeMois, " & Choix1X & " INTO TEST FROM INSEE;"
    'Exécution de la requête
    DoCmd.RunSQL QRY
    'libere la mémoire
    Set res = Nothing

  11. #11
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci à fbtsra.

    vous m'avez aidé.

    Votre résultat est je pense ce que proposait Richard 35.
    Deux inconvénients à cette proposition :
    - je ne sais pas comment finalement j'aurais pu m'en servir et
    - deuxièmement : un pb avec l'entête des colonnes de la table résultat (TEST), ils sont du type "Exprxxx".

    En revanche, je suis revenu à mon code initial pour la partie concaténation et j'ai enlevé le "INSEE. dans la text de la variable QRY et

    j'ai le résultat attendu.

    Petit plus.
    j'aimerai pouvoir créer plusieures tables à partir de ce code et donc paramétrer le nom de la table destination.

    Comment m'y prendre ?

    PS : voici le code qui correspond à mon résultat attendu :
    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
    Sub xutil()
     
    Dim Choix1X As String 'recoit la concaténation des indices choisis
    Dim res As Recordset
    Dim SQL As String
    Dim QRY As String 'rédaction de la requête complète finale
     
    'Selectionne et concatène les 1X choisis
    SQL = "SELECT Nomenclature.IdBANK FROM Nomenclature WHERE (((Nomenclature.Choix)=1));"
    'Concatene les différents enregistrement
    Set res = CurrentDb.OpenRecordset(SQL)
    While Not res.EOF
    Choix1X = Choix1X & "[" & res.Fields(0).Value & "], "
    res.MoveNext
    Wend
    'Enleve la dernière ","
    Choix1X = Left(Choix1X, Len(Choix1X) - 2)
    'rédaction de la requête complète finale à destination d'une nouvelle table Test
    QRY = "SELECT AnnéeMois, " & Choix1X & " INTO TEST FROM INSEE;"
    'Exécution de la requête
    DoCmd.RunSQL QRY
    'libere la mémoire
    Set res = Nothing
     
    End Sub

  12. #12
    Membre actif
    Homme Profil pro
    Chercheur
    Inscrit en
    Juin 2011
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2011
    Messages : 162
    Points : 248
    Points
    248
    Par défaut
    Par exemple :

    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
    Dim Choix1X As String 'recoit la concaténation des indices choisis
    Dim res As Recordset
    Dim SQL, QRY, NTA As String
     
    'Selectionne et concatène les 1X choisis
    SQL = "SELECT Nomenclature.IdBANK FROM Nomenclature WHERE (((Nomenclature.Choix)=1));"
    'Concatene les différents enregistrement
    Set res = CurrentDb.OpenRecordset(SQL)
    While Not res.EOF
    Choix1X = Choix1X & "[" & res.Fields(0).Value & "], "
    res.MoveNext
    Wend
    'Enleve la dernière ","
    Choix1X = Left(Choix1X, Len(Choix1X) - 2)
    'rédaction de la requête complète finale à destination d'une nouvelle table Test
     
    NTA = InputBox("Saisie du nom de la table", "Création Table")
     
        If NTA <> "" Then
        QRY = "SELECT AnnéeMois, " & Choix1X & " INTO " & NTA & " FROM INSEE;"
        DoCmd.RunSQL QRY
        End If
     
    'libere la mémoire
    Set res = Nothing
    Bcdt,
    Florian

  13. #13
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci Florian ainsi qu'à tous.

    Vous avez répondu à mes questions

    Merci

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

Discussions similaires

  1. [AC-2003] Ajout d'enregistrements dans une table dont un champ est le résultat d'une requête
    Par ostrich95 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 08/03/2014, 09h09
  2. Réponses: 0
    Dernier message: 30/08/2010, 10h24
  3. Réponses: 1
    Dernier message: 16/05/2007, 15h52
  4. Récupérer les champs d'un formulaire dans une jsp
    Par lalyly dans le forum Struts 1
    Réponses: 1
    Dernier message: 19/04/2007, 10h50
  5. Réponses: 2
    Dernier message: 27/03/2007, 17h47

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