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

ASP.NET Discussion :

Faire un tri dans une DataTable


Sujet :

ASP.NET

  1. #1
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut Faire un tri dans une DataTable
    Bonjour

    Je voudrais savoir s'il est possible de trier les enregistrement dans une datatable une fois qu'elle est chargée. Je sais que ça serais mieux de la faire dans la requête au niveau SQL, mais j'ai pas trop le choix et je dois trier une fois la DAtaTable chargée.

    Voilà mon code de chargement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim dtParagraphe As DataTable = New DManager("Datadev").RetournerTable("EXEC PARA_Get_Paragraphe_Detail " & Id_ParaDet)
    Donc là je monte une DataTable à partir d'une Procédure stockée en lui envoyant un parametre.

    Maintenant je voudrais faire une truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dtParagraphe.fonction de triage sur un champ contenu dans la DataTable
    Vous voyez ce que je voudrais faire ?

    Merci pour votre aide.

    PS : j'ai pas trouvé dans la MSDN.

  2. #2
    Membre expérimenté Avatar de AJemni
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2008
    Messages : 242
    Par défaut
    Salut,
    tu peut utiliser DefaultView de la DataTable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dtParagraphe.DefaultView.Sort = "Colonne1,Colonne2 desc, Colonne3";
    DataTable dt = dtParagraphe.DefaultView.ToTable();
    A+

  3. #3
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci pour ton aide.

    J'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                Dim dt1 As DataTable = New DManager("Datadev").RetournerTable("EXEC PARA_Get_Paragraphe_Detail " & Id_ParaDet)
                dt1.DefaultView.Sort = "DateP DESC"
                Dim dtParagraphe As DataTable = dt1.DefaultView.ToTable()
    Et ça trie pas. DateP est le nom du chmap restitué par ma Proc Stock. En mettant DESC, je compte avoir le plus récent d'abords et ça fait pas ça.
    Dans le proc Stock le tri ce fait sur autre chose.

    Alors soit ce que tu propose marche C# mais pas en VB (cela serait étonnant), soit y a détail qui tue de planqué quelque part.

    Mais en plus, si je suis bien le raisonement on monte une DataTable que l'on déverse dans une autre, bialn j'ai deux DataTable en mémoire, c'est bien ça ?
    Faut que je pense à détruire la première juste aprés l'avoir déversée.

    Une autre idée peut être ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Dans ta DataTable, ta colonne DateP est bien de type DateTime ? Parce que que si elle est de type string, ça trie la date par ordre alphabétique...

  5. #5
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Aprés vérification, c'est bien un champ DateTime, tout simple, sans transformation, ni formatage.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Essaie de créer une DataView sur cette table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim dv As New DataView(dt1, null, "DateP DESC", DataViewRowState.CurrentRows)
    Mais c'est bizarre que ça marche pas avec la DefaultView

  7. #7
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Bon, j'ai refait un essai avec la default View et maintenant ça marche.
    J'avais un bon dieu de test qui byppassait le tri, bref, ça marche c'est cool.

    Mais je reste dubitatif sur le principe de faire une DataTable dans une autre DataTable.

    Merci beaucoup

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Mais je reste dubitatif sur le principe de faire une DataTable dans une autre DataTable.
    Heu... de quoi tu parles ? La table que tu crées avec DataView.ToTable n'est pas "dans" une autre DataTable...

    D'ailleurs, tu n'as probablement pas besoin de faire ça, tu peux utiliser directement la DataView comme source de données...

  9. #9
    Membre expérimenté Avatar de AJemni
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2008
    Messages : 242
    Par défaut
    Bonjour,
    pas de problème avec la 2eme DataTable, tu peut l'elliminer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim dtParagraphe As DataTable = New DManager("Datadev").RetournerTable("EXEC PARA_Get_Paragraphe_Detail " & Id_ParaDet)
    dtParagraphe.DefaultView.Sort = "DateP DESC"
    dtParagraphe = dtParagraphe.DefaultView.ToTable()
    A+

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par AJemni Voir le message
    Bonjour,
    pas de problème avec la 2eme DataTable, tu peut l'elliminer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim dtParagraphe As DataTable = New DManager("Datadev").RetournerTable("EXEC PARA_Get_Paragraphe_Detail " & Id_ParaDet)
    dtParagraphe.DefaultView.Sort = "DateP DESC"
    dtParagraphe = dtParagraphe.DefaultView.ToTable()
    A+
    Ben ça change rien... tu utilises une variable de moins, mais tu as quand même une 2e DataTable

  11. #11
    Membre expérimenté Avatar de AJemni
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2008
    Messages : 242
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ben ça change rien... tu utilises une variable de moins, mais tu as quand même une 2e DataTable
    si tu parle de DefaultView alors pouvons nous ajouter Dispose, et ça ellimine la vue, non?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dtParagraphe.DefaultView.Dispose()
    A+

  12. #12
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci les gars.

    Je comprends pas bien pourquoi j'ai quand même deux DataTable alors que je fais qu'un seul Dim dans cette dernière solution.

    Je préfère tout de même cette rédaction car une fois incluse dans mon code global elle est plus cohérente. J'ai volontairement ommis un détail de contexte car je ne voulais pas perturber le topic. Mais je vais vous raconter un autre morceau de cette histoire.

    Mon module (toujours dans mon système global de site à fabriquer des sites) gère des "Paragraphes". En gros je stocke dans une table un titre et des paramettres globaux pour formater un texte et dans une autre table les différents paragraphes avec des paramettres de formatage pour chaque paragraphe. Par exemple certains paragraphe peuvent être accompagné d'un photo ou d'un lien. En gros c'est un module pour envoyer des textes sur les pages du site concerné.

    Il y a un mode spécial qui permet de gérer les News, parce que les News ce n'ai jamais qu'une suite de paragraphe trié sur une date (contrairement aux autres qui ont un numéro d'ordre stocké en BDD). Et c'est là que j'avais besoins de trier ma liste de paragraphe dans ma DataTable car la Proc Stock fait un tri sur le numéro d'ordre. Lors de la saisie d'un News le numéro est 0 pour toutes les news. Et le Titre de paragraphe contient un nombre de News à afficher. C'est ce critère là qui fait que l'on sait si on est sur une liste de News ou un Paragraphe classique.

    Du coup je fais un test sur ce critère pour faire la différence et voici le code final :

    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
     
            Function RenvoiTbl() As Table
                Dim dtParagraphe As DataTable = New DManager("Datadev").RetournerTable("EXEC PARA_Get_Paragraphe " & Id_Para & "," & NbNews)
                If NbNews <> 0 Then
                    dtParagraphe.DefaultView.Sort = "DateP DESC"
                    dtParagraphe = dtParagraphe.DefaultView.ToTable()
                End If
     
                If dtParagraphe.Rows.Count > 0 Then
                    For Each dr As DataRow In dtParagraphe.Rows
                        Dim tblp As New Table
                        Dim r As New TableRow
                        Dim c As New TableCell
                        tblp.Width = Unit.Percentage(100)
                        Select Case dr.Item("Forma")
                            Case 1
                                Format1(tblp, dr.Item("Id_Detail"))
                            Case 2
                                Format2(tblp, dr.Item("Id_Detail"))
                            Case 3
                                Format3(tblp, dr.Item("Id_Detail"))
                            Case 4
                                Format4(tblp, dr.Item("Id_Detail"))
                            Case 5
                                Format5(tblp, dr.Item("Id_Detail"))
                            Case 6
                                Format6(tblp, dr.Item("Id_Detail"))
                            Case 101
                                Format101(tblp, dr.Item("Id_Detail"))
                            Case Else
                                FormatElse(tblp)
                        End Select
                        c.Controls.Add(tblp)
                        r.Cells.Add(c)
                        tbl.Rows.Add(r)
                    Next
                Else
                    Dim l As New Label
                    l.Text = "Aucun texte disponible"
                End If
                Return tbl
            End Function
    Cette fonction me retourne une Table HTML contenant l'enemble du texte formaté. Les fonctions Format + un nombre permette de spécifier des formats particuliers avec des liens vers des classes CSS, des ajouts de photos, de liens, de liens sur les photos, de date et tout ce que l'humain peut imaginer.

    Voilà, vous savez tout maintenant, mais me piquez pas mon idée, hein?
    Allez, si vous êtes sage, je vous raconterais la suite, demain peut être.

    Encore merci pour votre aide. Si dans mon exposé vous voyez quelque chose qui vous choque (techniquement) je suis ouvert à toute critiques constructives.

  13. #13
    Membre expérimenté Avatar de AJemni
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2008
    Messages : 242
    Par défaut
    Salut,
    Un tout p'tit truc, si les paragraphes que tu sauvegarde sont + ou - longues sa risque d'augmenter exponentiellement la taille de ta BD si on y ajoute au fur et à mesure des paragraphes, d'ou je vous conseille, de sauvegarder les paragraphes dans des fichiers à part et tu stock le lien dans ta base( ce truc tu l’a fait peut être pour les images).

    C’est une idée, A+

  14. #14
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci pour la remarque.

    En fait j'ai pris l'option de stocker le corps de paragraphe dans un champ au format Text. Du coup, c'est pas vraiment en dehors de la base de donnée, mais ça ne prends que 16 Octets dans la table.

    Mainenant, la place de la BDD n'est pas trés importante. Chez mon hébergeur il y a 4 To pour stocker sur le serveur de donnée. Et lorsque que j'aurais atteint la taille critique des sites j'aurais un serveur dédié, puis une ferme de serveur dédiée. Du coup, je ne me préoccupe pas trop de ça. J'attache plus de soin à bien optimiser mes requêtes au sien de mes Procédures Stockée (parce que je fais tout, même un bête Select, au sein d'une Proc Stock, sécurité et robustesse), du coup, les performances sont sauve, enfin sauf si je me plante dans mon codage SQL........

  15. #15
    Membre expérimenté Avatar de AJemni
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2008
    Messages : 242
    Par défaut
    4 To et un serveur dédié, c beau ça.

    bonne continuation

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par AJemni Voir le message
    si tu parle de DefaultView alors pouvons nous ajouter Dispose, et ça ellimine la vue, non?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dtParagraphe.DefaultView.Dispose()
    Euh... si tu fais un Dispose sur la DefaultView, ça risque d'avoir des conséquences désastreuses à mon avis
    Mais en fait je comprends pas trop le rapport avec ce que je disais

    Citation Envoyé par zooffy Voir le message
    Je comprends pas bien pourquoi j'ai quand même deux DataTable alors que je fais qu'un seul Dim dans cette dernière solution.
    Tu as 2 tables qui sont successivement affectées à la même variable. Tu n'as qu'une variable, mais la variable n'est pas l'objet DataTable lui-même, c'est seulement une référence vers l'objet. Il y a bien 2 instances de DataTable qui sont créées, mais il y en a une qui n'a plus de référence pointant dessus (elle sera donc ramassée par le garbage collector à un moment ou un autre...)

    Si ces histoires de références ne sont pas claires pour toi, je te conseille de (re-)faire un tour sur le cours de P. Lasserre :
    http://plasserre.developpez.com/v1-6val.htm

  17. #17
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci Tomlev pour ton lien.

    Pour moi ce sera faire un tour sur ce tuto (plutôt demain, vu l'heure...) car je crois que, même aprés 5 ans de programmation Objet, je n'ai toujours pas bien saisi les subitilités de la chose.

    Faut tout de même dire que je tiens plus de l'autodidacte que de l'ingénieur scolaire. Oui j'ai un niveau d'ingé info, mais je l'ai eu grâce à mon travail personnel et des formations professionnelles. J'ai quitté l'école en 3° et je me rends compte parfois que mon niveau de math me pose quelques soucis.

    Bonne nuit.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/11/2012, 14h48
  2. [AJAX] Ajax : faire "le tri" dans une réponse
    Par Soundboy39 dans le forum AJAX
    Réponses: 2
    Dernier message: 08/12/2011, 13h21
  3. [AC-2007] Faire un tri dans une requete et mettre un 0
    Par petchy dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 07/03/2010, 17h57
  4. Faire un tri dans une liste
    Par patmar83 dans le forum IHM
    Réponses: 5
    Dernier message: 17/12/2009, 08h37
  5. [PB 10.5] Faire un tri dans une datawindow
    Par lanageuse59 dans le forum Powerbuilder
    Réponses: 3
    Dernier message: 12/03/2009, 17h03

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