Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Contribuez
Contribuez Access : Vos contributions. Postez ici vos codes sources, conseils, astuces et autres propositions. Ce forum n'est pas un forum technique mais destiné aux contributions pour www.developpez.com
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 11/02/2011, 15h02   #1
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 037
Points : 11 037
Par défaut [FAQ]Comment présenter, dans un état, le détail des données sur une ligne plutôt que dans une liste

Bonjour,

Ceci pour répondre, d’une manière généralisée, à cette question parfois posée par des visiteurs du Forum.



Les données de l’exemple, la table Vins :



1re étape : construire et enregistrer une requête qui liste les couples père/fils distincts.
Le nom de la requête n’a pas d’importance. Dans l’exemple, « rExemple1 » est comme ceci :



2e étape : construire l’état.

Consignes :
- dans la source, faire apparaître le champ « Pere » ;
- le formulaire doit contenir un contrôle nommé « zdtPere », éventuellement non visible avec <Pere » comme source ;
- un contrôle indépendant pour recueillir le détail des fils mis en ligne, en utilisant une fonction décrite plus loin.
Dans notre exemple, comme ceci :




La fonction MiseEnLigne()
Elle est logée dans le module attaché au formulaire.
Elle permet de passer en paramètres :
- le nom de la requête qui contient l’ensemble des « Pere/Fils » ;
- les différents signes de ponctuation à utiliser dans le texte aligné.

Voici le code.
Les commentaires ajoutés doivent permettre à un utilisateur non familier de comprendre ce qui s’y passe.
Merci de réagir si ce n’est pas votre cas.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Function MiseEnLigne(NomRequete As String, _
                SigneDebut As String, Separateur As String, SigneFinal As String) As String
Dim rs As Recordset
MiseEnLigne = SigneDebut
'Créer un RecordSet sur base de la requête Pere/Fils,
'                                mais limitée au père en cours de traitement
Set rs = CurrentDb.OpenRecordset("SELECT * FROM " _
                            & NomRequete & " WHERE Pere=""" & Me.zdtPere & """;")
'lire chacun des enregistrements et aligner les fils
Do Until rs.EOF
     MiseEnLigne = MiseEnLigne & rs("Fils") & Separateur
     rs.MoveNext
Loop
'Supprimer le dernier Separateur et poser le SigneFinal
MiseEnLigne = Left(MiseEnLigne, (Len(MiseEnLigne) - Len(Separateur))) & SigneFinal
End Function
Merci déjà pour vos remarques et critiques.
En annexe, une BDD Access2000 avec la démo.

Cordialement.
Images attachées
Type de fichier : jpg DetailSurUneLigne01.jpg (41,3 Ko, 97 affichages)
Type de fichier : jpg DetailSurUneLigne02.jpg (103,6 Ko, 98 affichages)
Type de fichier : jpg DetailSurUneLigne03.jpg (152,2 Ko, 97 affichages)
Type de fichier : jpg DetailSurUneLigne04.jpg (102,3 Ko, 98 affichages)
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 11/02/2011, 21h16   #2
Membre Expert
 
Inscription : avril 2006
Messages : 1 318
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 318
Points : 1 580
Points : 1 580
bonjour,

pour ma part dans ce type de problème, j'utilise une fonction qui réalise la concaténation dans la requete.

La fonction à placer dans un module de code :
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 
'---------------------------------------------------------------------------------------
' Procédure    : ConcatColonne   [Function]
' Retour       : String
' Auteur       : PhilBen
' Version      : 1.06
' Création/Maj : Le mercredi 10 octobre 2007
' Objet        : Permet de concaténer en ligne les données d'une colonne
'              : d'enregistrements en fonction d'un pivot
' Arguments    : vValeurPivot : La valeur de la colonne pivot
'              : sNomColonnePivot : Nom de la colonne pivot
'              : sNomColonneConcat : Nom de la colonne à concaténer
'              : sNomDomaine : Table ou requête des colonnes
'              : sWhere : Permet d'appliquer un filtre sur le domaine ("" pour aucun)
'              : bGroupBy : Regroupement (True) pour éviter des doublons dans la concaténation
'              : vIsOrderAsc : Trier (Ascendant = True, Desc = False) ou Null les éléments concaténés
'              : sSeparateur : String qui sépare les éléments concaténés (ex: ",","---",...)
' Remarques    : * Ralentie sensiblement la requête
'              : * Le type de la colonne pivot peut être Date, numérique, string
'              : * Pour des raisons de performance, éviter de faire de regroupement sur la
'              :   colonne de concaténation, la déclarer si possible <Expression> !
' Exemple      : SELECT [MaColPivot],
'              : ConcatColonne([MaColPivot],"MaColPivot","MaColConcat","MaTable","",False,Null,",")
'              : FROM MaTable Group By [MaColPivot]
' Historique   : 1.03 : Correction bug si le pivot est de type date
'              : 1.04 : Complément d'information dans l'en-tête de la fonction
'              : 1.05 : Correction bug si Pivot numérique avec décimales (, -> .)
'              : 1.06 : Correction bug si chaine retournée est vide
'---------------------------------------------------------------------------------------
Public Function ConcatColonne(ByVal vValeurPivot As Variant, _
                              ByVal sNomColonnePivot As String, _
                              ByVal sNomColonneConcat As String, _
                              ByVal sNomDomaine As String, _
                              ByVal sWhere As String, _
                              ByVal bGroupBy As Boolean, _
                              ByVal vIsOrderAsc As Variant, _
                              ByVal sSeparateur As String) As String
   On Error GoTo errtag
   Dim odb As DAO.Database
   Dim ors As DAO.Recordset
   Dim sSql As String
 
   If Not IsNull(vValeurPivot) Then
      'Préparation de la requête
      sSql = "SELECT " & sNomColonneConcat & " & """ & sSeparateur & """ As C FROM " & _
             sNomDomaine & " WHERE " & sNomColonnePivot & "="
      Select Case VarType(vValeurPivot)
      Case vbString
         sSql = sSql & """" & vValeurPivot & """"
      Case vbDate
         sSql = sSql & Format(vValeurPivot, "\#m-d-yyyy h:n:s\#")
      Case Else 'Numériques
         sSql = sSql & Replace(vValeurPivot, ",", ".")
      End Select
      If Len(sWhere) Then sSql = sSql & " And " & sWhere
      If bGroupBy Then sSql = sSql & " GROUP BY " & sNomColonneConcat
      If IsNumeric(vIsOrderAsc) Then
         sSql = sSql & " ORDER BY " & sNomColonneConcat
         If vIsOrderAsc = 0 Then sSql = sSql & " DESC"
      End If
      'Lance la requête et concatène la colonne
      Set odb = CurrentDb
      Set ors = odb.OpenRecordset(sSql, dbOpenForwardOnly)
      While Not ors.EOF
         ConcatColonne = ConcatColonne & ors(0)
         ors.MoveNext
      Wend
      If ConcatColonne <> vbNullString Then
        ConcatColonne = Left$(ConcatColonne, Len(ConcatColonne) - Len(sSeparateur))
      End If
   End If
fin:
   Set ors = Nothing
   Set odb = Nothing
   Exit Function
errtag:
   ConcatColonne = "Erreur !"
   Resume fin
End Function
Et la requête dans ton cas :
Code :
1
2
3
4
5
6
 
SELECT VINS.MILLESIME, VINS.APPELLATION, 
ConcatColonne([MILLESIME] & [APPELLATION],"[MILLESIME] & [APPELLATION]","CATEGORIE","Vins","CLASSIFICATION='Rouges' AND CATEGORIE Is Not Null AND APPELLATION Is Not Null AND MILLESIME IS Not Null",True,True,", ") AS Ligne
FROM VINS
GROUP BY VINS.MILLESIME, VINS.APPELLATION
HAVING (((VINS.MILLESIME) Is Not Null) AND ((VINS.APPELLATION) Is Not Null) AND ((ConcatColonne([MILLESIME] & [APPELLATION],"[MILLESIME] & [APPELLATION]","CATEGORIE","Vins","CLASSIFICATION='Rouges' AND CATEGORIE Is Not Null AND APPELLATION Is Not Null AND MILLESIME IS Not Null",True,True,", "))<>""));
Puis l'état est créé avec l'assistant en prenant pour base la requête précédente.

Sinon ta solution fonctionne très bien et elle est même peut-être plus rapide pour afficher l'état pour des grosses tables.

Philippe
philben est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 12/02/2011, 09h42   #3
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 037
Points : 11 037
Merci philben pour ce retour.

Sur le plan de l’idée nos méthodes sont identiques.
Ta manière de construire l’équivalent de ma requête « rExemple1 » est impressionnante !
Ta méthode évite de s’encombrer d’une requête permanente spécifique à l’état.

Au plaisir de te recroiser.
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 17h17   #4
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 037
Points : 11 037
Bonjour,

ici http://www.developpez.net/forums/d10...e/#post5780103


Kobe007seb me suggère de modifier la fonction en ajoutant un paramètre supplémentaire : prévoir un dernier séparateur différent.

Le but, obtenir un résultat comme ceci :

élément01, élément02, [...] , élémentn-1 et élémentn.

Voici la fonction modifiée :

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
27
28
29
30
31
32
33
34
Private Function MiseEnLigne(NomRequete As String, _
                SigneDebut As String, _
                Separateur As String, DernierSeparateur As String, _
                SigneFinal As String) As String
Dim rs As Recordset, i As Integer, j As Integer
MiseEnLigne = SigneDebut
'Créer un RecordSet sur base de la requête Pere/Fils,
'                                mais limitée au père en cours de traitement
Set rs = CurrentDb.OpenRecordset("SELECT * FROM " _
                            & NomRequete & " WHERE Pere=""" & Me.zdtPere & """;")
'lire chacun des enregistrements et aligner les fils
Do Until rs.EOF
     MiseEnLigne = MiseEnLigne & rs("Fils") & Separateur
     rs.MoveNext
Loop
'Supprimer le dernier Separateur et poser le SigneFinal
MiseEnLigne = Left(MiseEnLigne, (Len(MiseEnLigne) - Len(Separateur))) & SigneFinal
'Remplacer le dernier séparateur
' y en a-t-il ?
i = 1
If InStr(i, MiseEnLigne, Separateur) = 0 Then Exit Function 'il n'y en a pas
'Chercher le dernier
Do
  j = InStr(i, MiseEnLigne, Separateur)
    If j <> 0 Then
        i = j + 1
    Else
        Exit Do  ' à la sortie de la boucle, i-1 = position du dernier séparateur
    End If
Loop
'Substitution
MiseEnLigne = Left(MiseEnLigne, i - 2) & DernierSeparateur & _
          Right(MiseEnLigne, Len(MiseEnLigne) - i)
End Function
Dans l’exemple la source du contrôle devient :

=MiseEnLigne("rExemple1";" : ";", ";" et ";".")

Version modifiée en annexe.
Fichiers attachés
Type de fichier : zip 20110215DetailSurUneLigne.zip (22,5 Ko, 30 affichages)
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h47.


 
 
 
 
Partenaires

Hébergement Web