Additionner subitems dans listview?

Résolu
sancho12345 Messages postés 131 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 18 mars 2012 - 11 févr. 2010 à 21:20
sancho12345 Messages postés 131 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 18 mars 2012 - 12 févr. 2010 à 21:10
Bonsoir à vous,

Pouvez-vous m?aider à résoudre ce problème s'il a une solution.

Voilà, j'ai une listview1 avec la config suivante:

With ListView1
              .MultiSelect = True               ' Séléction de plusieur lignes
              .HideSelection = False            ' Même sans le focus, la séléction reste
              .FullRowSelect = True             ' Séléctionne la ligne entière
              .GridLines = True                 ' Affiche les lignes de la grille
              .View = lvwReport                 ' Affichage en grille
              '--------------------------------------------------------------------------
              .ColumnHeaders.Add               ' Ajout d'une colonne
              .ColumnHeaders.Add                ' Ajout d'une colonne
              .ColumnHeaders.Add                ' Ajout d'une colonne
              .ColumnHeaders.Add                ' Ajout d'une colonne
              .ColumnHeaders(1).Text = "Réfèrence "  ' Spécifie la caption de la première colonne
              .ColumnHeaders(1).Width = .Width / 4
              .ColumnHeaders(2).Text = "GGGGG"  ' Spécifie la caption de la deuxième colonne
              .ColumnHeaders(2).Width = .Width / 4
              .ColumnHeaders(3).Text = "PPPPPP"  ' Spécifie la caption de la première colonne
              .ColumnHeaders(3).Width = .Width / 4
              .ColumnHeaders(4).Text = "MMMMM"  ' Spécifie la caption de la première colonne
              .ColumnHeaders(4).Width = .Width / 4
              .Arrange = lvwAutoLeft            ' Range tout à gauche
End With


Dans la colonne principale j'ai des références et dans les sub j'ai des quantités ( des nombres) mais il est possible que certaines références soient en doubles.

Est-ce possible lorsque 2 références sont identiques d'additionner le sub(1) de la première référence avec celui de la deuxième sub (1) même références et ceci avec les 3 sub et ensuite supprimer la ligne de la deuxième référence.

Toutes les autres références dans la listview1 ne doivent pas bouger.

Exemples :

Test 2 5 6
Test 1 8 4
Zozo 2 2 2
TITI 3 2 5


J'aimerai obtenir dans la même listview1:

Test 3 13 10
Zozo 2 2 2
TITI 3 2 5


J'espère que j'ai étais clair ?

Merci par avance.

8 réponses

Profil bloqué
12 févr. 2010 à 15:45
Salut Sancho12345

Une form avec 2 listview (Listview1 et Listview2) de taille identique
Ensuite le code à insérer dans la form (voir ci-dessous)
tu n'as plus qu'à t'en inspirer pour résoudre ton problème

Private Type lignedata
reference As String
data1 As Long
data2 As Long
data3 As Long
End Type

Private data() As lignedata ' données d'une ligne de la listview

Private Sub Form_Load()

' Initialisation Listview1 et Listview2
With ListView1
.MultiSelect = True ' Sélection de plusieurs lignes
.HideSelection = False ' Même sans le focus, la sélection reste
.FullRowSelect = True ' Sélectionne la ligne entière
.GridLines = True ' Affiche les lignes de la grille
.View = lvwReport ' Affichage en grille
'--------------------------------------------------------------------------
.ColumnHeaders.Add ' Ajout d'une colonne
.ColumnHeaders.Add ' Ajout d'une colonne
.ColumnHeaders.Add ' Ajout d'une colonne
.ColumnHeaders.Add ' Ajout d'une colonne
.ColumnHeaders(1).Text = "Réfèrence " ' Spécifie la caption de la première colonne
.ColumnHeaders(1).Width = .Width / 4
.ColumnHeaders(2).Text = "GGGGG" ' Spécifie la caption de la deuxième colonne
.ColumnHeaders(2).Width = .Width / 4
.ColumnHeaders(3).Text = "PPPPPP" ' Spécifie la caption de la troisième colonne
.ColumnHeaders(3).Width = .Width / 4
.ColumnHeaders(4).Text = "MMMMM" ' Spécifie la caption de la quatrième colonne
.ColumnHeaders(4).Width = .Width / 4
.Arrange = lvwAutoLeft ' Range tout à gauche
End With

With ListView2
.MultiSelect = True ' Sélection de plusieurs lignes
.HideSelection = False ' Même sans le focus, la sélection reste
.FullRowSelect = True ' Sélectionne la ligne entière
.GridLines = True ' Affiche les lignes de la grille
.View = lvwReport ' Affichage en grille
'--------------------------------------------------------------------------
.ColumnHeaders.Add ' Ajout d'une colonne
.ColumnHeaders.Add ' Ajout d'une colonne
.ColumnHeaders.Add ' Ajout d'une colonne
.ColumnHeaders.Add ' Ajout d'une colonne
.ColumnHeaders(1).Text = "Réfèrence " ' Spécifie la caption de la première colonne
.ColumnHeaders(1).Width = .Width / 4
.ColumnHeaders(2).Text = "GGGGG" ' Spécifie la caption de la deuxième colonne
.ColumnHeaders(2).Width = .Width / 4
.ColumnHeaders(3).Text = "PPPPPP" ' Spécifie la caption de la troisième colonne
.ColumnHeaders(3).Width = .Width / 4
.ColumnHeaders(4).Text = "MMMMM" ' Spécifie la caption de la quatrième colonne
.ColumnHeaders(4).Width = .Width / 4
.Arrange = lvwAutoLeft ' Range tout à gauche
End With


' Chargement de la Listview 1
Set Lview = ListView1.ListItems.Add()
With Lview
.Text = "Test"
.SubItems(1) = "2"
.SubItems(2) = "5"
.SubItems(3) = "6"
End With
Set Lview = ListView1.ListItems.Add()
With Lview
.Text = "Test"
.SubItems(1) = "1"
.SubItems(2) = "8"
.SubItems(3) = "4"
End With
Set Lview = ListView1.ListItems.Add()
With Lview
.Text = "zozo"
.SubItems(1) = "2"
.SubItems(2) = "2"
.SubItems(3) = "2"
End With
Set Lview = ListView1.ListItems.Add()
With Lview
.Text = "Titi"
.SubItems(1) = "3"
.SubItems(2) = "2"
.SubItems(3) = "5"
End With
Set Lview = ListView1.ListItems.Add()
With Lview
.Text = "zozo"
.SubItems(1) = "1"
.SubItems(2) = "8"
.SubItems(3) = "4"
End With
Set Lview = ListView1.ListItems.Add()
With Lview
.Text = "Test"
.SubItems(1) = "2"
.SubItems(2) = "9"
.SubItems(3) = "10"
.Text = "zozo"
End With
Set Lview = ListView1.ListItems.Add()
With Lview
.Text = "Titi"
.SubItems(1) = "7"
.SubItems(2) = "6"
.SubItems(3) = "11"
End With

'Création et remplissage du tableau
' C'est le début de la résolution du problème <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ATTENTION
ReDim data(0 To ListView1.ListItems.Count - 1)
i& = 0
For Each lstItm In ListView1.ListItems
With data(i&)
.reference = lstItm.Text
.data1 = Val(lstItm.SubItems(1))
.data2 = Val(lstItm.SubItems(2))
.data3 = Val(lstItm.SubItems(3))
End With
i& = i& + 1
Next

' Tri du tableau
For i& = 0 To UBound(data) - 1
For j& = i& + 1 To UBound(data)
If data(i&).reference <> "" Then
If data(i&).reference = data(j&).reference Then
data(j&).reference = ""
data(i&).data1 = data(i&).data1 + data(j&).data1
data(i&).data2 = data(i&).data2 + data(j&).data2
data(i&).data3 = data(i&).data3 + data(j&).data3
data(j&).data1 = 0
data(j&).data2 = 0
data(j&).data2 = 0
End If
End If
Next j&
Next i&

' remplissage de la listview2 pour contrôle
For i& = 0 To UBound(data)
If data(i&).reference <> "" Then
Set Lview = ListView2.ListItems.Add()
With Lview
.Text = data(i&).reference
.SubItems(1) = Str$(data(i&).data1)
.SubItems(2) = Str$(data(i&).data2)
.SubItems(3) = Str$(data(i&).data3)
End With
End If
Next i&

End Sub


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
3
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
12 févr. 2010 à 08:52
Bonjour,

Et d'où proviennent les données initiales. Il me semble plus simple d'agir en amont par tri sur ton recordset par exemple si c'est de cla qu'il s'agit.


Calade
0
sancho12345 Messages postés 131 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 18 mars 2012
12 févr. 2010 à 09:19
Salut,

Les données initiales proviennent d'un import GMAO dont je n'ai pas la main, c'est pour cette raison que j'essaye de travailler directement dans la LISTVIEW. Sinon effectivement cela serait bien plus simple.

++
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
12 févr. 2010 à 09:50
C'est dommage.

Sinon, j'ai peut-être une idée mais je ne sais pas ce que cela pourrait donner je ne l'ai pas testé, je te laisse ce soin.

En partant du principe que chaque noeud parent contient une référence, il te faudra jouer sur la clé de ce noeud et tenter une insertion avec récupération d'erreur (et en gardant en mémoire la quantité). A partir de là tu devrais pouvoir faire quelque chose.

Je sais que c'est très flou ce que je dis, mais je n'ai pas VB6 sur ce micro pour le tester et je te donne une idée telle qu'elle me vient à l'esprit.

Bon courage.


Calade
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sancho12345 Messages postés 131 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 18 mars 2012
12 févr. 2010 à 10:53
Salut,


Merci pour tes idées c'est toujours une piste.



++
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 févr. 2010 à 16:45
Bonjour, Galain,
Ne serait-il pas plus simple de trier la listview, puis de boucler de bas en haut en (chaque fois que l'item de la ligne au dessus est le même que celui de la ligne en cours):
- faisant les additions des subitems de la ligne en cours et de ceux de la ligne au-dessus
- détruisant la ligne en cours ?



____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
Profil bloqué
12 févr. 2010 à 18:58
tout à fait d'accord ucfoutu
C'est une autre façon de faire
J'ai mis 2 listviews afin de voir avant et après traitement


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
sancho12345 Messages postés 131 Date d'inscription jeudi 21 mai 2009 Statut Membre Dernière intervention 18 mars 2012
12 févr. 2010 à 21:10
Salut Alain,



Un grand merci à toi, cela me convient parfaitement.


Bonne soirée

++

Sancho 12345
0
Rejoignez-nous