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

Contribuez Discussion :

[FAQ]Comment présenter, dans un état, le détail des données sur une ligne plutôt que dans une liste


Sujet :

Contribuez

  1. #1
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    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 : 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
    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 Images attachées     
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    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.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  4. #4
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    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 : 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
    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 Fichiers attachés
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

Discussions similaires

  1. Insérer des données sur plusieurs lignes dans une seule en SQL
    Par nathantahiti dans le forum Développement
    Réponses: 1
    Dernier message: 03/08/2011, 10h47
  2. [Toutes versions] Comment travailler sur des données stockées en mémoire, plutôt que sur une feuille
    Par wyzer dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/04/2011, 13h35
  3. Afficher des données venant de PHP ailleurs que dans un DataGrid
    Par nonodup2 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 02/09/2008, 15h50
  4. Réponses: 0
    Dernier message: 04/03/2008, 22h02
  5. [C#] Comment mettre une ligne en couleur dans mon DataGrid ?
    Par vandeyy dans le forum Windows Forms
    Réponses: 7
    Dernier message: 19/07/2004, 10h03

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