Additionner subitems dans listview? [Résolu]

sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 11 févr. 2010 à 21:20 - Dernière réponse : sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

8 réponses

cs_Galain 1270 Messages postés mardi 11 novembre 2003Date d'inscription 24 juillet 2013 Dernière intervention - 12 févr. 2010 à 15:45
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Galain
Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 12 févr. 2010 à 08:52
0
Utile
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
Commenter la réponse de Calade
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 12 févr. 2010 à 09:19
0
Utile
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.

++
Commenter la réponse de sancho12345
Calade 1212 Messages postés dimanche 20 avril 2003Date d'inscription 4 juin 2016 Dernière intervention - 12 févr. 2010 à 09:50
0
Utile
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
Commenter la réponse de Calade
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 12 févr. 2010 à 10:53
0
Utile
Salut,


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



++
Commenter la réponse de sancho12345
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 12 févr. 2010 à 16:45
0
Utile
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
Commenter la réponse de ucfoutu
cs_Galain 1270 Messages postés mardi 11 novembre 2003Date d'inscription 24 juillet 2013 Dernière intervention - 12 févr. 2010 à 18:58
0
Utile
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
Commenter la réponse de cs_Galain
sancho12345 131 Messages postés jeudi 21 mai 2009Date d'inscription 18 mars 2012 Dernière intervention - 12 févr. 2010 à 21:10
0
Utile
Salut Alain,



Un grand merci à toi, cela me convient parfaitement.


Bonne soirée

++

Sancho 12345
Commenter la réponse de sancho12345

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.