Modifier la quantité si article et couleur identique

Résolu
trucss Messages postés 181 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 9 mai 2023 - Modifié le 22 févr. 2022 à 17:48
Whismeril Messages postés 18423 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 8 juin 2023 - 22 févr. 2022 à 14:46
Bonjour,
J'ai un fichier .TXT j'arrive a le lire je l'écris dans une listview (tableau)composée de 3 colonnes article, couleur, quantité.
Si on a le même article et couleur alors on fait +1 à la quantité sinon on le rajoute au tableau.
Avec ce code quand je veux modifier la quantité si article et couleur identique ça me le rajoute sur la ligne du dessous qui est vide ( pas d'article ni couleur)

 Dim monStreamReader As New StreamReader("T:\test.TXT") 'Stream pour la lecture
 Dim article,, couleur, ligne As String
 Do
      ligne = monStreamReader.ReadLine
      If ligne <> "" Then
             article= ligne.Split(";")(3)
             couleur = ligne.Split(";")(4)
             If tableau.Items.Count = 0 Then
                      Dim str As String() = New String(2) {}
                      str(0) = article
                      str(1) = couleur
                      str(2) = +1
                      Dim lvi As New ListViewItem(str)
                      tableau.Items.Add(lvi)
             Else
                      With tableau
                               Dim itm As ListViewItem
                               itm = .FindItemWithText(ref, True, 0, True)
                               Dim itm1 As ListViewItem
                               itm1 = .FindItemWithText(couleur, True, 0, True)
                               If Not itm Is Nothing And Not itm1 Is Nothing Then
                                      MsgBox("est deja dans la liste")>
                                      Dim str As String() = New String(2) {}
                                      str(2) = +1
                                      Dim lvi As New ListViewItem(str)
                                     tableau.Items.Add(lvi)
                                Else
                                     Dim str As String() = New String(2) {}
                                     str(0) = article
                                     str(1) = couleur
                                     str(2) = +1
                                     Dim lvi As New ListViewItem(str)
                                     tableau.Items.Add(lvi)
                                End If
                      End With
             End If
      End If
Loop Until ligne Is Nothing
monStreamReader.Close()

68 réponses

Whismeril Messages postés 18423 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 8 juin 2023 624
19 févr. 2022 à 08:57
Si je comprend bien on regarde le nombre de carractere par exemple pour
non l est un tableau.
l.Length retourne le nombre d'item (de cellules si tu veux un comparaison approximatives avec Excel) de ce tableau

blabla;blublu;Non;Article1
blabla;blublu;Non

La première ligne va générer un tableau de 4 item, alors pour la seconde ligne se sera 3 items seulement.


J'ai une erreur alors que dans le fichier j'ai supprier le . j'ai arrondie le prix
System.FormatException : 'Input string was not in a correct format.'


As tu lu l'article sur la conversion des string en nombres?
0
trucss Messages postés 181 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 9 mai 2023 1
Modifié le 19 févr. 2022 à 09:44
Maintenant pour ouvrir un fichier actuellement je renseigne le chemin en dur.
j'ai un fichier de crée par jour ex 20220215.TXT (annee,mois,jour) et je voudrais pouvoir par exemple saisir du 1/02/2022 au 19/02/2022
et m'afficher le résultat donc lire dans plusieurs fichier si il sont présent.
Comment devrais je faire simplement.

Je dois crée 2 textboxs et renseigner directement au format 20220201 20220219
0
Whismeril Messages postés 18423 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 8 juin 2023 624
19 févr. 2022 à 09:55
Tu peux peut-être aller voir le chapitre 4.7 du cours de Tahé.
0
trucss Messages postés 181 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 9 mai 2023 1
19 févr. 2022 à 11:25
Dernier point
J'ai un fichier par jour sous la forme 20220215.txt
et je voudrais si il y a le fichier compter sur plusieurs jour
textbox 1 date du au textbox2
et compte les artciles suivant la date merci
0
Whismeril Messages postés 18423 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 8 juin 2023 624
19 févr. 2022 à 12:17
Qu'as tu tiré du chapitre 4.7?
0

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

Posez votre question
trucss Messages postés 181 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 9 mai 2023 1
Modifié le 19 févr. 2022 à 13:18
oups desolé du doublons sur le forum on change de page mdr pour le string en nombre je pensais que c'était le virgule qui pose probléme et dans mon fichier c'est toujours un point donc c'est ok je vais regarder
0
trucss Messages postés 181 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 9 mai 2023 1
19 févr. 2022 à 13:41
je dois remplacer le point par une virgule
var = (l6)
longueur = (var, ",", ".")
ail ail ail
0
trucss Messages postés 181 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 9 mai 2023 1
19 févr. 2022 à 14:00
Pour les dates je pense utiliser DateTimePicker entre 2 date et venir récupérer les fichiers si present
0
Whismeril Messages postés 18423 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 8 juin 2023 624
19 févr. 2022 à 15:25
Oui un datetimepicker est une solution adapté à la gestion de dates.
Mais pas directement à la gestion de fichiers.

C'est pourquoi avant de passer du temps à faire un exemple qui au final ne serait peut-être pas le mieux, j'aimerais ton avis sur le chapitre 4.7.
0
trucss Messages postés 181 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 9 mai 2023 1
Modifié le 19 févr. 2022 à 17:19
J'ai pas trouvé
0
trucss Messages postés 181 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 9 mai 2023 1
Modifié le 19 févr. 2022 à 18:20
Sur les composants non visuel openfiledialog?
0
Whismeril Messages postés 18423 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 8 juin 2023 624
19 févr. 2022 à 18:59
oui.

Ça présente un certain nombre d'avantages
  • pas besoin de vérifier si le fichier existe
  • pas de contraintes par rapport au dossier ou même aux dossiers dans lesquels sont les fichiers
  • pas de contraintes quand au formalisme du nom
  • pas de contraintes quand à l'extension


Mais c'est ça ne correspond pas à ton idée initiale, donc à toi de voir
0
trucss Messages postés 181 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 9 mai 2023 1
19 févr. 2022 à 19:29
effectivement c'est intéressant.
Est ce qu'on peut sélectionner plusieurs fichier ou c'est un seul fichier ?

Et imaginons si on a plusieurs répertoire par exemple magasin 1 repertoire1 magasin 2 repertoire2 magasin 3 repertoire3 afin de tout regrouper dans un meme tableau selon des dates .
0
Whismeril Messages postés 18423 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 8 juin 2023 624
19 févr. 2022 à 20:05
Oui
0
trucss Messages postés 181 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 9 mai 2023 1
19 févr. 2022 à 20:14
ok je vais déjà me focaliser sur le nombre a virgule(prix)
0
trucss Messages postés 181 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 9 mai 2023 1
19 févr. 2022 à 21:07
Mon fichier et avec un point j'ai fait ça et ça fonctionne est ce correct pour vous ou c'est de la bidouille ?

If l.Length > 6 Then longueur = CDbl(Val(l(6)))
0
Whismeril Messages postés 18423 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 8 juin 2023 624
Modifié le 19 févr. 2022 à 23:32
C'est du VB6 et pas du .Net
As tu lu l'article sur la conversion des nombres?
0
trucss Messages postés 181 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 9 mai 2023 1
Modifié le 19 févr. 2022 à 21:29
Donc si j'abandonne la date et je garde le openfiledialog comment faire pour ouvrir les memes nom de fichiers mais dans des dossier differents et de charger la listview ?

Pour l'instant j'ai fait ça
OpenFileDialog1.ShowDialog()
        Dim selectedFile As String
        selectedFile = OpenFileDialog1.FileName


        'on va lire le fichier d'un coup avec la classe File et en faire un tableau dont chaque ligne est une entrée
        Dim lignes As String() = File.ReadAllLines(selectedFile)
0
Whismeril Messages postés 18423 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 8 juin 2023 624
19 févr. 2022 à 23:33
Ha je n'ai peut-être pas bien compris ta question de 19:29;
Je regarde ça demain
0
trucss Messages postés 181 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 9 mai 2023 1
20 févr. 2022 à 12:29
est ce possible par exemple renseigner 3 textbox avec chemin fichiers si un seul textbox de renseigner alors ça va cherhce le fichier dans le chemin sinon si les 3 sont renseignes on importe les 3 fichiers dans la meme listview .
C'est possible ça ?
0
Whismeril Messages postés 18423 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 8 juin 2023 624
20 févr. 2022 à 15:54
On va essayer de faire par étape

Comme on hésite encore sur l'ergonomie pour l'utilisateur, on va écrire un code qui permet de lire plusieurs fichiers, de stoker toutes les données, mais de ne pas charger 2 fois le même fichier.

Je choisis que c'est à la classe DataTrucss de savoir si un fichier a déjà été lu. Pour cela j'ajoute une propriété Shared, car ça n'est pas lié à une instance (si tu ne sais pas ce que c'est, je te renvois vers le cours de Tahé).

''' <summary>
''' Classe représentant tes données
''' </summary>
Class DataTrucss

    ''' <summary>
    ''' Un constructeur qui prend une ligne issue du CSV comme paramètre d'entrée
    ''' </summary>
    ''' <param name="LigneCsv"></param>
    Public Sub New(ByVal LigneCsv As String)
        Dim l As String() = LigneCsv.Split(";"c)

        Verif = l(2)

        If l.Length > 3 Then Article = l(3)

        If l.Length > 4 Then Couleur = l(4)

        If l.Length > 6 Then Prix = Convert.ToDouble(l(6))
    End Sub

    'les propriétés sont les données utiles de chaque ligne

    Public Property Article As String

    Public Property Couleur As String

    Public Property Prix As Double

    Public Property Verif As String

    ''' <summary>
    ''' Surcharge de ToString pour afficher un résumé parlant de l'instance, et qui va servir au tri
    ''' </summary>
    ''' <returns></returns>
    Public Overrides Fonction ToString As String
        Return String.Format("{0}, {1}", Article, Couleur)
    End Function

    ''' <summary>
    ''' List des fichiers déjà lus
    ''' </summary>
    ''' <returns></returns>
    Public Shared Property FichiersLus As List(Of String) = New List(Of String)

End Class


0
Whismeril Messages postés 18423 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 8 juin 2023 624
20 févr. 2022 à 15:54
Ensuite, je te propose une méthode qui à partir d'une liste de chemins de fichiers et d'une liste de données existante, va lire chaque nouveau fichier et ajouter les données dans la liste
    ''' <summary>
    ''' Ajoute des données à partir de chemins de fichiers valides 
    ''' </summary>
    ''' <param name="Chemins">liste de chemins de fichiers valides</param>
    ''' <param name="LesDatas">Liste des données à compléter</param>
    Private Sub ChargeFichier(Chemins As List(Of String), LesDatas As List(Of DataTrucss))
        Dim lignes As String()

        For Each f In Chemins
            'on vérifie que le fichier n'a pas déjà été lus
            Dim cheminComplet As String = Path.GetFullPath(f) 'pour qu'il n'y ait aucune ambiguité entre 2 fichiers nommés pareils 1 dans le répertoire de l'exécutable et l'autre ailleurs
            If DataTrucss.FichiersLus.Contains(cheminComplet) Then Continue For 'si c'est le cas, on passe directement à l'itération suivante

            'on ajoute ce nouveau chemin dans la liste des chemins lu
            DataTrucss.FichiersLus.Add(cheminComplet)

            'on lit le fichier
            lignes = File.ReadAllLines(cheminComplet)

            'on ajoute son contenu à la liste
            For Each l In lignes
                LesDatas.Add(New DataTrucss(l))
            Next
        Next
    End Sub

0
Whismeril Messages postés 18423 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 8 juin 2023 624
20 févr. 2022 à 15:55
On peut tester tout ça avec 3 fichiers identiques à celui que tu as posté au message 19, de cette façon
        'On crée une liste de fichiers de test
        Dim lesFichiers As List(Of String) = New List(Of String) From
            {
                "trucss.csv",
                "trucss2.csv"
            }

        'on initialise la liste de toutes les données
        Dim datas As List(Of DataTrucss) = New List(Of DataTrucss)

        'on charge les fichiers
        ChargeFichier(lesFichiers, datas)

        'Ha zut on a oublié un fichier
        lesFichiers.Add("trucss3.csv")
        ChargeFichier(lesFichiers, datas)

        'on fait le regroupement
        Dim regroupement = datas.Where(Function(x) x.Verif = "Oui" And x.Prix < 10.5).GroupBy(Function(x) x.ToString())

        'peuplement de la listview à partir du regroupement
        For Each groupe In regroupement
            ListView1.Items.Add(New ListViewItem({groupe.First().Article, groupe.First().Couleur, groupe.Count.ToString(), groupe.First().Prix.ToString(), groupe.First().Verif}))
        Next

En exécutant ce dernier code en pas à pas, tu pourras constater que trucss.csv et trucss2.csv ne sont bien lus qu'une seule fois.


0
Whismeril Messages postés 18423 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 8 juin 2023 624
20 févr. 2022 à 16:21
Là je te propose une ergonomie avec un openfiledialog.
Je présents que ça ne va pas vraiment te convenir mais pour que tu me donnes tes impressions
  • ce qui est bien
  • ce qui n'est pas bien


J'ai donc un openfiledialog sur mon formulaire.
  • La propriété CheckFileExists est à True
  • La propriété Filter est
     Fichiers csv|*.csv|Fichiers textes|*.txt|Tous les fichiers|*.*
  • La propriété Multiselect est à True


Je mets un bouton appelé ButSelectFichiers.
Au dessus et dans le code associé à l'évènement Click de ce bouton, on va écrire ceci

    'On crée une liste de fichiers de test
    Dim lesFichiers As List(Of String) = New List(Of String)

    Private Sub ButSelectFichiers_Click(sender As Object, e As EventArgs) Handles ButSelectFichiers.Click
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            lesFichiers.AddRange(OpenFileDialog1.FileNames) 'on ajoute les fichiers selectionnés à la liste
        End If
    End Sub


Je mets un second bouton appelé butChargerDatas
    Private Sub butChargerDatas_Click(sender As Object, e As EventArgs) Handles butChargerDatas.Click
        Dim datas As List(Of DataTrucss) = New List(Of DataTrucss)

        ChargeFichier(lesFichiers, datas)

        Dim regroupement = datas.Where(Function(x) x.Verif = "Oui" And x.Prix < 10.5).GroupBy(Function(x) x.ToString())

        For Each groupe In regroupement
            ListView1.Items.Add(New ListViewItem({groupe.First().Article, groupe.First().Couleur, groupe.Count.ToString(), groupe.First().Prix.ToString(), groupe.First().Verif}))
        Next
    End Sub


En cliquant une première fois sur butChargerDatas, je peux aller choisir les fichiers que je veux dans un répertoire.


En cliquant une seconde fois sur ce bouton, je peux aller choisir d'autres fichiers, dans le même répertoire ou dans un autre


Et ainsi de suite.
Y'a moyen de peupler une listbox (ou autre) au fur et à mesure pour contrôler.

En cliquant sur le bouton butChargerDatas, ça lance la lecture des fichiers, le tri des patates et l'affichage dans la liste view
0
trucss Messages postés 181 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 9 mai 2023 1
Modifié le 20 févr. 2022 à 21:51
Merci de prendre du temps a m'expliquer c'est cool
J'ai plusieurs erreur sur

Public Overrides Fonction ToString As String
        Return String.Format("{0}, {1}", article, Couleur)
    End Function


Si je comprend bien le message 48 c'est dans une classe et 49 dans form et je renseigne qu'un chemins.
Je vais tester toute t solution afin de comprend c'est nikel merci.
Est ce que si dans la presentation je donne une textbox pour la date au format du fichier ex: 20220220.TXT aujourd'hui et avec 3 textbox si je dois importer 3 chemins de fichier qui vont avoir le meme nom.
Il faut renseigner au moins 1 chemin pour faire apparaitre dans listview si on a les 3 chemin alors importe les 3 ou alors coché le chemin que l'on souhaite extraire
0