Création de requête concaténer selon deux id différents

Résolu
Signaler
Messages postés
8
Date d'inscription
vendredi 14 janvier 2022
Statut
Membre
Dernière intervention
15 janvier 2022
-
Messages postés
8
Date d'inscription
vendredi 14 janvier 2022
Statut
Membre
Dernière intervention
15 janvier 2022
-
Bonjour,

Je suis actuellement bloqué sur la création de mon petit programme access.
Je souhaiterai trier ma concaténation selon deux colonnes id différentes mais impossible de trouver d'exemple à ce sujet et très limité en SQL je ne comprend pas comment réussir cela.
Pour faire simple je souhaite créer une requête selon idSP et ensuite IdArt.
idSP = Date de Spectacle
IdArt = Artiste
Le but étant de sortir un planning pour chaque artiste par date via un bouton sur mon formulaire Artiste.

Voici le code de base que j'utilise pour la concaténation :

VBA :
Public Function RecupNomtroupe122(idSP As Long) As String
Dim res As DAO.Recordset
Dim SQL As String
'Selectionne les participant du projet
SQL = "SELECT TROUPE_NomTroupe FROM GENERAL1 WHERE idSP=" & idSP
Set res = CurrentDb.OpenRecordset(SQL)

'Concatene les différents enregistrement
While Not res.EOF
RecupNomtroupe122 = RecupNomtroupe122 & res.Fields(0).Value & vbCrLf
res.MoveNext
Wend

Set res = CurrentDb.OpenRecordset(SQL)
'Enleve le dernier espace
RecupNomtroupe122 = Left(RecupNomtroupe122, Len(RecupNomtroupe122) - 1)
'libere la mémoire
Set res = Nothing
End Function


et Ensuite SQL :

SELECT DISTINCT GENERAL1.idSP, RecupNomTroupe122(idSP) AS TROUPE
FROM GENERAL1;


Donc je souhaiterai rajouté dans la clause where IdArt= & IdArt mais je ne trouve pas de solution :/

N'hésitez pas à me demander des informations que j'aurai oublié de donner.
Merci d'avance aux personnes donnant de leur temps pour résoudre ce problème et m'apporter un début de réponse.

Configuration: Windows / Chrome 97.0.4692.71

6 réponses

Messages postés
18291
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
21 janvier 2022
1 003
bonjour,
Tu mélanges la description de ce que tu veux obtenir avec la description de comment tu ne réussis pas à l'obtenir.

Oublie provisoirement les fonctions, les concaténations et les requêtes.

Ceci est clair, mais incomplet:
"Le but étant de sortir un planning pour chaque artiste par date via un bouton sur mon formulaire Artiste."
N'hésite pas à donner un exemple de contenu des tables, et du résultat attendu.

N'oublie pas de donner la liste de tes tables (concernées) et de leurs champs.
Ok si tu le souhaites le plus simple c'est d'avoir le fichier directement.
https://wetransfer.com/downloads/bd6e55cec6b5c3899599ddc7d372c8a620220114130837/26dc46

J'ai pris le temps de créer un fichier description avec des screens pour expliquer au mieux le tout.

Est-ce que cela te convient ou tu préfèrerais que je fasse autrement ?
Merci en tout cas de m'avoir répondu.
Messages postés
18291
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
21 janvier 2022
1 003
C'est amusant: rien, dans ton fichier, ne fait penser à ce qu'il y a dans ton code.

Si tu veux publier un état, le point de départ, c'est de créer une requête qui retourne l'information désirée.

SI je devine bien, tu veux publier un état avec, par ordre chronologique, les concerts d'un artiste.
Le point de départ, c'est une requête qui retourne toutes les infos de chaque spectacle.
Messages postés
8
Date d'inscription
vendredi 14 janvier 2022
Statut
Membre
Dernière intervention
15 janvier 2022
1
Et oui du coup j'ai supprimé car mon code ne fonctionnait pas comme je le souhaitais.
Oui voila c'est cela je veux par concert et pour chaque concert par artiste. et la je flanche :/
Messages postés
18291
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
21 janvier 2022
1 003
Le point de départ, c'est une requête qui retourne toutes les infos de tous les spectacles.
Messages postés
8
Date d'inscription
vendredi 14 janvier 2022
Statut
Membre
Dernière intervention
15 janvier 2022
1 >
Messages postés
18291
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
21 janvier 2022

Ok donc je dois créé une requête basique qui réunis tous les champs de table dont j'ai besoin pour créer les prochaines requête si je comprend bien.
Messages postés
8
Date d'inscription
vendredi 14 janvier 2022
Statut
Membre
Dernière intervention
15 janvier 2022
1
Ok donc je crée une requête basique qui contient tous les champs des divers tables dont j'ai besoin pour créer mes tableaux.
Messages postés
18291
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
21 janvier 2022
1 003
En effet, il suffira ensuite, à l'entrèe de l'état, de filtrer sur base de l'artiste.
>
Messages postés
18291
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
21 janvier 2022

Je suis d'accord mais c'est vrai que dans la description il y a quelque chose de mal expliqué. Malheureusement je suis en voiture et je pars en réunion. Mais en fait il est possible qu'un artiste intervient dans divers troupe pour le même spectacle. Et il faudrait donc que dans ce cas les données soient sur une seule ligne. D'ou le besoin de concaténer.
Messages postés
18291
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
21 janvier 2022
1 003 > Nix62
Je comprends maintenant ce que tu essayais d'expliquer au départ!
Le mot magique qui manquait, c'est agrégation, ou regroupement d'enregistrements.
Tu voulais agréger plusieurs enregistrements, regrouper tous les enregistrements ayant des valeurs identiques pour certains champs, en concaténant un autre champ.

Comme tu te décrivais "très limité en SQL", je n'ai pas fait confiance que ce que tu montrais était proche de ce dont tu avais besoin. Tu n'as pas non plus décris ce que cela donnait, et en quoi c'était différent de ce que tu voulais.

Pour commencer:
Public Function RecupNomtroupe122(idSP As Long, idArt as long) As String
' ...
SQL = "SELECT TROUPE_NomTroupe FROM GENERAL1 WHERE idSP=" & idSP & " and idArt = " & idArt
' ...


Puis je ferais une requête GENERAL2
SELECT DISTINCT ... FROM GENERAL1 ...
de tous les champs utiles, en éliminant TROUPE_NomTroupe de la liste des champs.

Puis la requête de base de l'état
SELECT ....., RecupNomTroupe122(idSP, idArt) AS TROUPE
FROM GENERAL2;


Le but étant de faire d'abord le DISTINCT, puis d'appeler RecupNomTroupe122 dans la requête suivante, afin de réduire le nombre d'appels à la fonction. Tu peux aussi ajouter simplement idArt à la requête que tu présentais au départ.
Messages postés
8
Date d'inscription
vendredi 14 janvier 2022
Statut
Membre
Dernière intervention
15 janvier 2022
1 >
Messages postés
18291
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
21 janvier 2022

Bonjour, désolé de n'avoir pu me reconnecté avant.
Et oui mon niveau n'est pas très bon mais niveau explication je suis peut-être encore pire ...
Je vais essayer cela et je reviens vers toi rapidement.
Messages postés
8
Date d'inscription
vendredi 14 janvier 2022
Statut
Membre
Dernière intervention
15 janvier 2022
1 >
Messages postés
8
Date d'inscription
vendredi 14 janvier 2022
Statut
Membre
Dernière intervention
15 janvier 2022

Voici un tableau mieux fait du résultat attendu ;) Désolé je ne l'avais pas bien fait dans l'exemple ...
et je constate que je l'ai de nouveau mal fait :/ SPECTACLE = NOM_TROUPE
Bonjour,
Je ramène mon grain de sel !
En fait ton problème est typique des problèmes qu'on rencontre dans ces situations. Le meilleur moyen est de construire une table relai qui te permette de sélectionner à partir de la table A les enregistrements de la table B lui correspondant, et réciproquement, ceux de la table A correspondant aux enregistrements de la table B . Dans ton exemple, ce sera toutes les dates où se produit un artiste, ou bien tous les artistes qui se produisent à une certaine date.
Ainsi ta table sera constituée de 3 champs : un champ IdTableLiaison, un champ IdArtiste, et un champ IdDate. Ainsi tu seras sûr qu'à chaque artiste correspond une série de date dont le couple IdArt/IdSp est unique. Après tu pourras construire toutes les liaisons dans un sens ou l'autre dont tu auras besoin. Mais oublie ton idée de concaténation qui n'est pas bonne;
Bon courage;
Messages postés
18291
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
21 janvier 2022
1 003
bonjour Tessel75,

Je n'ai pas vérifié la qualité de la structure des données, et il est possible qu'elle ne soit pas optimale.

Je ne vois cependant pas en quoi il est nocif de faire de l'agrégation par concaténation, ni en quoi cela serait un indice d'une mauvaise structure.

Si un artiste peut intervenir dans plusieurs troupes pour le même spectacle, je trouve tout à fait raisonnable, dans une requête, de regrouper toutes les combinaisons (article, spectacle) en concaténant les noms des troupes.

Peut-être confonds-tu avec la concaténation de plusieurs valeurs dans un champ d'un enregistrement d'une table? Il s'agit ici, non de table, mais de requête et d'état.
Messages postés
8
Date d'inscription
vendredi 14 janvier 2022
Statut
Membre
Dernière intervention
15 janvier 2022
1
Un merci à Yg_BE pour son aide. Mon problème est maintenant résolu, je clos donc ce sujet ;)