Microsoft Access condenser plusieurs lignes dans une table
J'ai une question dans MS Access 2007 et j'espère que quelqu'un a la réponse. J'ai une longue mais simple tableau contenant les noms des clients et les jours de la semaine livraisons sont faites. Je voudrais résumer ce tableau en indiquant le nom et tous les jours dans un nouveau champ "ALLDays", tout en conservant toutes les données.
La table source ressemble à quelque chose comme ceci:
Name Day
CustomerA Monday
CustomerA Thursday
CustomerB Tuesday
CustomerB Friday
CustomerC Wednesday
CustomerC Saturday
Je voudrais avoir une requête qui renvoie des résultats comme ceci:
Name ALLDays
CustomerA Monday, Thursday
CustomerB Tuesday, Friday
CustomerC Wednesday, Saturday
Grâce.
Voir stackoverflow.com/questions/1920552/... avec une référence particulière à la note sur ADODB jeux d'enregistrements.
en général, vous utilisez une requête croisée. Allez à l'onglet "Créer" pour créer une requête, puis de création de Requête pour la vue de conception. Ajouter une table pour voir le contenu. Ensuite, sélectionnez "Design", onglet "tableau Croisé".
en général, vous utilisez une requête croisée. Allez à l'onglet "Créer" pour créer une requête, puis de création de Requête pour la vue de conception. Ajouter une table pour voir le contenu. Ensuite, sélectionnez "Design", onglet "tableau Croisé".
OriginalL'auteur Sam_H | 2011-03-02
Vous devez vous connecter pour publier un commentaire.
En général, vous devez écrire une fonction qui va vous permettre de créer une liste concaténée. Voici ce que j'ai utilisé:.
Remou version a ajouté l'option que vous pouvez passer un tableau de valeurs au lieu d'une instruction SQL.
Exemple de requête pourrait ressembler à:
Merci beaucoup pour votre aide, mais je suis assez nouveau à cela et votre réponse a été un peu au-dessus de mon niveau. Voulez-vous de bien vouloir me donner des détails? Ma table source est appelé CustomerRoutes. Les deux champs Nom et le Jour. J'ai donc créer un module et d'écrire ce code exact? et exactement comment dois-je appeler le GetList fonction, je suppose que je créer une nouvelle requête en mode SQL et écrire quelque chose comme Select("Nom, Jour de...? Merci.
Tout d'abord, vous avez besoin de déplacer le code dans un Module. Ensuite, vous créez un normal requête à l'aide de l'distinctes clients "SourceData", comme mentionné dans votre OP (Donc, d'une ligne par client). Vous pourriez avoir besoin pour en faire un Groupe Par requête. Ensuite, l'une des colonnes de la requête que vous entrez une formule:
=GetList("Select Day From SourceData As S1 Where S1.Day = " & SourceData.Col)
. De cette façon, vous êtes à l'aide d'une colonne dans la requête principale pour construire une requête Select dans la GetList fonction.Ce n'est pas une limitation de la fonction GetString. Je soupçonne que la requête à partir de laquelle vous êtes à l'appel de la fonction est la troncation de la colonne à 255 caractères. Il y a une série de scénarios pour lesquels un Memo/Long champ de Texte (qui est effectivement ce que nous voulons ici) obtient tranquillement tronquée par l'Accès. Ce lien est assez daté, mais parle du même problème qui, je crois, existe encore dans les versions actuelles d'Accès: allenbrowne.com/ser-63.html
+1. Note pour les lecteurs qui reçoivent le message d'erreur
user-defined type not defined
àDim oConn As ADODB.Connection
: C'est parce que "Vous devez définir une référence à Microsoft ActiveX Data Objects (ADO) en premier. Sélectionnez Outils -> Références. À partir de la boîte de dialogue qui s'affiche, faites défiler vers le bas jusqu'à ce que vous trouver une entrée qui lit quelque chose comme Microsoft ActiveX Data Objects 2.7 Bibliothèque (choisissez le nombre le plus élevé que vous voyez). Cochez la case à côté de cette entrée et cliquez sur ok." Source: p2p.wrox.com/excel-vba/...OriginalL'auteur Thomas
Voici une solution simple qui ne nécessite pas de VBA. Il utilise une requête mise à jour pour concaténer des valeurs dans un champ.
Je vais vous le montrer avec l'exemple que je viens de l'utiliser.
J'ai une table "emails_by_team" qui a deux champs "team_id" et "email_formatted". Ce que je veux est de collecter tous les e-mails pour une équipe dans une seule chaîne.
1) je crée une table "team_more_info" qui a deux champs: "team_id" et "team_emails"
2) remplir "team_more_info" avec tous les "team_id" à partir de "emails_by_team"
3) créer une requête de mise à jour qui définit "emails_by_team" NULL
Nom de la requête: team_email_collection_clear
4) C'est l'astuce ici: créer une mise à jour d'une requête
Nom de la requête: team_email_collection_update
5) pour garder l'info à jour de créer une macro qui exécute les deux requêtes chaque fois que nécessaire
Première: team_email_collection_clear
Deuxième: team_email_collection_update
CQFD
OriginalL'auteur user1867563
Puisque c'est juste une petite gamme d'options, une autre approche à pas de VBA serait de mettre en place une série de IIF états et concaténer les résultats.
Si vous êtes un perfectionniste, vous pourriez même obtenir débarrasser de la dernière virgule comme ce
Vous pouvez également envisager de les garder dans des colonnes distinctes, comme cela peut s'avérer plus utile si l'accès à cette requête à partir d'un autre. Par exemple, trouver uniquement des instances mardi serait plus facile de cette façon. Quelque chose comme:
OriginalL'auteur John Ink