Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access
Access Forum d'entraide sur Microsoft Access. Avant de poster -> La F.A.Q Access
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 04/07/2011, 15h34   #1
Invité de passage
 
Homme Thierry Bataille
Chargé d'affaire
Inscription : juin 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Thierry Bataille
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 : 1
Points : 1
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"
tibat31520 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 20h31   #2
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 324
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

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

Informations forums :
Inscription : février 2006
Messages : 17 324
Points : 29 226
Points : 29 226
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 !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 20h44   #3
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
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 !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 15h44   #4
Invité de passage
 
Homme Thierry Bataille
Chargé d'affaire
Inscription : juin 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Thierry Bataille
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 : 1
Points : 1
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 !
tibat31520 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 14h36   #5
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
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 !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 14h52   #6
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 324
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

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

Informations forums :
Inscription : février 2006
Messages : 17 324
Points : 29 226
Points : 29 226
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 !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 18h50   #7
Invité de passage
 
Homme Thierry Bataille
Chargé d'affaire
Inscription : juin 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Thierry Bataille
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 : 1
Points : 1
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
Type de fichier : zip BD1X.zip (163,5 Ko, 3 affichages)
tibat31520 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 19h06   #8
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
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 !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 12h28   #9
Invité de passage
 
Homme Thierry Bataille
Chargé d'affaire
Inscription : juin 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Thierry Bataille
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 : 1
Points : 1
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 :
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
Type de fichier : zip BD1X.zip (177,9 Ko, 1 affichages)
tibat31520 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 16h39   #10
Membre confirmé
 
Homme
Chercheur
Inscription : juin 2011
Messages : 150
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 : 150
Points : 231
Points : 231
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 :
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
fbtsra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 17h24   #11
Invité de passage
 
Homme Thierry Bataille
Chargé d'affaire
Inscription : juin 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Thierry Bataille
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 : 1
Points : 1
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 :
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
tibat31520 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 17h54   #12
Membre confirmé
 
Homme
Chercheur
Inscription : juin 2011
Messages : 150
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 : 150
Points : 231
Points : 231
Par exemple :

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
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
fbtsra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 18h19   #13
Invité de passage
 
Homme Thierry Bataille
Chargé d'affaire
Inscription : juin 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Thierry Bataille
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 : 1
Points : 1
Merci Florian ainsi qu'à tous.

Vous avez répondu à mes questions

Merci
tibat31520 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h17.


 
 
 
 
Partenaires

Hébergement Web