Redim tableau à n dimension (2 ici) [Résolu]

Signaler
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
-
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
-
Salut la team, voila j'ai un petit (nan un gros) soucis !
j'ai posté ce soft :
http://www.vbfrance.com/codes/COMPTE_BANCAIRE-NET_50966.aspx

j'ai envie de bien le réécrire suite aux remarques de claudedetom.

Du coup je me lance dans un défi dépassant mes compétences, et du coup j'ai besoin de votre savoir.
Mon souci, je déclare un tableau à 2dim dans une classe (mon_compte), et lors de la lecture j'aimerais qu'il mette tout seul à jour les lignes qui sont "mensualisées" (x,7)=true
Mais voila le redim me jette car il ne peux redim que la dimension de droite -_- (c'est nul)
Donc j'imagine que je dois utiliser les collections. Mais voila aprés plein de lecture j'y pige pas grand chose.
Je vous post "ma bidouille tab_temp" qui revient en fait au même et qui biensur ne marche pas.
béwui lorsque je fais
 'balance le tableau lu dans tab_temp
        tab_temp = lecture.lignes
il redimmensionne ce que j'avais avant prévu (voir plus bas)
Si une bonne âme à une idée ou un exemple je prends.
amicalement @dn
' trouve le nombre de mise à jours à faire
        Dim NB_maj As Integer = 0
        ' trouve le nombre de ligne à traiter
        Dim NB_ligne As Integer = CInt((lecture.lignes.Length / 8) - 1)
        'calcule le nombre de ligne en divisant la longueur total par le nombre de colonne (-1 car on commence à 0)
        'utlise unbound pour voir ;)
        For ligne As Integer = 0 To NB_ligne
            ' ajoute le nombre de mise à jour à faire si la colonne 7 = true.
            If CBool(lecture.lignes(ligne, 7)) Then NB_maj += 1
        Next
        'dimensionne le tableaux en fonction du nombre de ligne.
        Dim tab_temp(NB_ligne + NB_maj, 8) As String
        'balance le tableau lu dans tab_temp
        tab_temp = lecture.lignes
        'pour chaque mise à jours à faire :
        For boucle As Integer = 0 To NB_maj
            'pour chaque ligne du compte
            For ligne As Integer = 0 To NB_ligne
                ' si c'est une ligne échéancier et que la date correspond au début du mois
                If Now.Day >= 1 AndAlso CBool(lecture.lignes(ligne, 7)) Then
                    ' et que ce mois n'est pas déja rempli (ou alors si c'est une nouvelle année) alors
                    If Now.Month > CDate(lecture.lignes(ligne, 0)).Month _
                    Or Now.Year > CDate(lecture.lignes(ligne, 0)).Year Then
                        'attribut la date d'aujourd'hui et le jour de l'opération mensuel
                        Dim maintenant As Date = CDate(CDate(lecture.lignes(ligne, 0)).Day & " " & Now.Month & " " & Now.Year)
                        ' retire à l'anciénne ligne le status de mensuel
                        lecture.lignes(ligne, 7) = "false"
                        ' ajouter cette nouvelle ligne !
                        'ajoute la nouvelle ligne  et active la mensualisation (encore une fois utilse unbound ! )
                        Dim index As Integer = CInt(tab_temp.Length / 8) - 1
                        tab_temp(index, 0) = maintenant.ToString("yyyy MM dd")
                        tab_temp(index, 1) = maintenant.ToString("dd MMMM yy")
                        tab_temp(index, 2) = lecture.lignes(ligne, 2)
                        tab_temp(index, 3) = lecture.lignes(ligne, 3)
                        tab_temp(index, 4) = lecture.lignes(ligne, 4)
                        tab_temp(index, 5) = lecture.lignes(ligne, 5)
                        tab_temp(index, 6) = "False"
                        tab_temp(index, 7) = "true"
                    End If
                End If
            Next ligne
        Next boucle
        ' attribut le tableaux à ME.
        Me.mdp = lecture.mdp
        Me.types = lecture.types
        Me.budgets = lecture.budgets
        Me.lignes = tab_temp


Tiens les balises ne sont pas reconnues ^_____^, zut alors.....

115 réponses

Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Et voila le premier cycle en run
création d'un nouveau fichier via un simple bouton, ça roule...
Puis test en ouverture et là
j'explique ce que je n'ai jamais piger (depuis toujours)
 Public Function load(ByVal fichier As String) As Boolean

        ' Try

        Dim myFileStream As Stream = File.OpenRead(fichier)
        Dim deserializer As New BinaryFormatter()
        Dim lecture As New Class_fichier_compte
        lecture = CType(deserializer.Deserialize(myFileStream), Class_fichier_compte)
        myFileStream.Close()

        'récupére le nombre de ligne initiale (avant mise à jour mensuel) 
        Dim NB_ligne As Integer = lecture.lignes.Count

et pan la référence d'objet n'est pas définie à une instance d'objet ! donc j'ai bien un new pour ma class, et en effet lignes=nothing (pas encore rempli), je dois donc le tester. Un try / catch ferai l'affaire, mais j'aimerai bien trouver quelque chose de plus propre. si tu as une idée.
@++
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
Private _ligne As NEW List(Of ligne_compte)
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
j'ai corrigé le soucis comme cela :

  ' si le fichier n'est pas un nouveau fichier
            If Not lecture.lignes Is Nothing Then

pour l'instant cela marche, c'est quoi la différence ? je commence à perdre un peu pied là

Private _ligne As NEW List(Of ligne_compte)
Je le rajoute, sans trop comprendre, c'est mieux dans la philosophie ? Aie ma tête.
merci pour ton soutient, je tente d'écrire une ligne pour voir.
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
et hop nouveau bug ^^
Le type 'compte2010.ligne_compte' dans l'assembly 'compte2010, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' n'est pas marqué comme sérialisable.
ce qui me parait pas du tout anormal, comme quoi je suis encore loin de la vérité ;)
Erreur que je n'avais pas avant le rajout du new
je passe donc la class ligne en sérialisable pour voir
++
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
bon je fais marche arriére, il y a plus rine qui marche. je tente l'écriture d'une ligne, et si je bloque je post (je sais pas ou d'ailleur) le projet basique (deux boutons et les class)
amicalement @dn
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
Class_fichier_compte est sérialisable mais pas ligne_compte, en effet

les messages d'erreur ont un sens hein

tu peux zipper sur cijoint.fr par exemple
(pense à mettre le txt correspondant bien sûr)
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
ok bon je stop là pour ce soir, tu m'as déja bien aidé
je reviens demain soir aprés le taff (les schémas elec et autres progs api deviennent reposant ) merci pour ton aide (vraiment, tu passes du temps, c'est sympa) @++
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
avec un sérieux remaniement c'est faisable ^^



j'te laisse continuer ou tu veux des indices?

genre.... ton COUNT est faux
genre... ton affichage listview n'est pas au point
genre... LECTURE perturbe
genre... le NEW est bien nécessaire


(tu vois finalement j'ai bien dû tout reprendre, imagine alors sur tout le projet?....)

++
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
pfff, ya des jours en me levant je baisserais bien les bras
Bon donc en gros c'est tout faux, donc si je persiste dans cette voie je vais agraver mes bétises de codes.
Tu as du voir que ce qui ne vas pas c'est bien que je ne comprend pas ce que j'écris, je crois que j'arrive aux limites de l'auto formation.

Bon je prends les indices car il faut que j'arrive à piger cette méthode POO.
Le count est faux, ah bon il manque -1 peut-être ?
l'affichage listV est baclé et des colonnes sont masqué, sinon je vois poa
LECTURE, Ah lecture fameuse merdouille que j'ai pondu, cela doit être le test sur le L_mensuel qui perturbe non ?
Pour finir avec le new, je m'en doute bien, même si j'ai pas encore assimilé la différence avec ou sans.
Merci de prendre du temps pour me faire grandir. (à 40ans cela prend plus de temps qu'a 16 ou 20 )
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
oh pinaize, ça va tout de suite mieux avec un bon prof

tu m'étonnes que cela m'éclairci, je vais même l'imprimer ! ben oui ma tête est déja pleine d'autre chose nuisible que l'on appelle le taff

Alors :
pour le new c'est nickel, dis comme ça je pige mieux, en fait je n'avais percuté qu'un dim ne fait que typer et déclarer, mais pas instancier. Du coup pour une string ou integer pas besoin car ce ne sont pas des objets, mais les button et class il le faut ! donc déja MERCI, l'autodidacte à fais un grand pas dans le monde de la POO

Pour la listview, dsl c'est moi qui fait le boulet, j'ai tappé trop vite et j'ai zappé l'items.clear, j'aurais pu le trouver si je n'étais pas débordé par les autres problémes.

pour le count, je reste perplexe car tu m'éxpliquais hier que justement en faisant un new list of bidule, le count passe à 0, du coup j'ai pas fais comme avec un tableau.
Sinon avec une list vide je me suis dis qu'un for i=0 to -1 risque de ne pas lui plaire ?

ps : pourquoi serialiser toute la classe et pas juste les lignes?
du coup le mot de passe est enregistré en clair...

ben j'ai d'autre tableaux à sérialiser, et pis le code en clair, je ne vois pas (à part un hash super trop balaise pour moi), comment l'enregistrer dasn le fichier binaire sans passer par la sérialisation de la classe mon_compte. On re-verra cela lorsque j'aurais déja reussi à faire ce que tu as fais

Pour que la classe renvoie directement une ligne de listview, je te suis parfaitement, mais sachant qu'aprés je vais faire des graphiques et autres filtres je vais rester comme cela pour l'instant (point trop n'en faut pour un noob, sinon )

Grace à ton aide et à ton temps, j'ai plus du tout envie de baisser les bras, je m'y colle de ce pas jusqu'a 20h ! Merci PCPT, cela fait plaisir d'avoir ton soutient, si un jour je peux te rendre la pareil en electronique ou autre klaxonne, bien cordialement.
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
En effet cela marche déja mieux,
Exemple : le count = 0 donc la boucle for i=0 to 0 se fait une fois et donc IndexOutOfRange, avec -1 il ne la fais pas si les lignes sont vides ! encore un pas de plus vers le bon chemin merci
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
si j'ai besoin d'un klaxonne.. j'te bipp

rhannn le missant prof que voila

bon bref je loose toujours, pour le count je corrige mon code suivant ton exemple, pfff vraiment j'suis à la ramasse parceque bien sûr j'écris for i=0 to x.count-1 !
et puis de toute façon il se passe rien de bien dans mon code
écoute je vais bosser un peu seul dessus et je t'appelle au secours si vraiment je pige plus
(style ajouter une nouvelle ligne)

exemple où je merdouille la form ajout :

        'remplir la nouvelle ligne compléte 
        Dim new_ligne As New ligne_compte 'déclare et instancie une nouvelle ligne => pcpt ^^
        new_ligne.L_date = ladate
        new_ligne.L_type = letype
        new_ligne.L_budget = lebudget
        new_ligne.L_credit = lecredit
        new_ligne.L_debit = ledebit
        new_ligne.L_pointage = pointage
        new_ligne.L_mensuel = mensuel
        F_compte.mon_compte.lignes.Insert(0, new_ligne)
        F_compte.mon_compte.save(F_compte.Fichier)

visiblement ne marche pas top top
bonne soirée l'ami ! et encore et toujours merci à toi (vais me faire un pti C&C3 pour me changer les idées )
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
effectivement tes 2 dernières lignes me sont très abstraites ^^
(enfin, pas utiles surtout)

bon jeu, à ta dispo en temps voulu
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
salut, la buse et de retour, mais juste pour te remercier pour ton attention
j'arrive à faire ce que tu as posté, je code encore ce soir mais avec les fêtes qui approche je vais devoir faire une pause

En attendant je te (vous) souhaites de trés bonne gueule de bois pour demain
Lachez vous ! pis aprés , pis , puis enfin on recode

Bonne année la team !
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
43
pas de souci

merci toi aussi amuse-toi bien

et bon dev
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Yep ! je dev, et tu vas avoir du taff avec moi
Tiens juste si tu as le temps (vraiment si tu as rien d'autre à foutre quoi) voici ce que j'ai écris pour faire comme toi.
Je trouve que le fichier sérialisé à une drole de tronche, surrement dû a t'as premiére analyse ou tu me demandais pourquoi ne pas sérialiser que la class ligne, mais bon là, cela me dépasse, en fin cela marche et cela doit être plus "clean" que la source initial, en fait la list view devient vraiment qu'un viewer.

je te joins le code pour info (ou critique, mais je préfére que tu profites de cette période de fête )

http://www.cijoint.fr/cjlink.php?file=cj200912/cijgfjBpWx.zip


@ trés binetôt
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Oui, je commence à entrevoir le coté obscur de mon code
Du coup c'est moi qui est du taff pour bien digérer le réveillon et ta façon de coder.
A l'année prochaine
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Bien àprés deux aspirines, j'ai recommencé à codé (en plus je l'avais déja fait, brrr qu'elle âne) suivant ton exemple.
Mais voila, il est poa content le VS

        'déclare une nouvel instance de la form F_op
        Dim add As New F_op
        ' Renseigne la variable "enfant" (dans F_op : Public new_ligne As New ligne_compte)
        add.txt_credit.Text = "0"
        add.txt_debit.Text = "0"
        add.Combo_budget.DataSource = mon_compte.budgets
        add.Combo_type.DataSource = mon_compte.types
        add.calendrier.TodayDate = Now
        add.Chk_pointage.Checked = False
        add.Chk_mensuel.Checked = False
        add.ShowDialog()
        If add.DialogResult = Windows.Forms.DialogResult.OK And Not add.annule Then
            mon_compte.lignes.Add(F_op.new_ligne)
            mon_compte.save(Fichier)
            ' a faire dans la classe compte la miseAjour_lv
            ' ListView1.Items.Add(F_op.new_ligne.ToListViewItem)
            ' à supprimer ensuite...
            MiseAjour_LV() 'renvoie un nothing et donc plante
        End If
        add = Nothing


tout ajout entraine une valeur par défaut de mon_compte.lignes, j'ai du merder dés le début dans la class, quant penses tu ?
++ M.prof
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Code de la form F_op :
Public Class F_op
    Public new_ligne As New ligne_compte 'déclare et instancie une nouvelle ligne
    Dim lecredit, ledebit As Double 'pour vérif que les valeurs sont correct (double quoi)
    Public annule As Boolean = False 'form invalide ou quité
    Private Sub txt_credit_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_credit.TextChanged
        Try
            Dim rien As String = Replace(txt_credit.Text, ".", ",")
            lecredit = Double.Parse(rien)
        Catch ex As Exception
            txt_credit.Text = "0"
        End Try
    End Sub
    Private Sub txt_debit_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_debit.TextChanged
        Try
            Dim rien As String = Replace(txt_debit.Text, ".", ",")
            ledebit = Double.Parse(rien)
        Catch ex As Exception
            txt_debit.Text = "0"
        End Try
    End Sub
    Private Sub Bp_ok_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bp_ok.Click

        ' vérifie que les champs crédit et débit sont valides avant  d'écrire ou modifier une ligne !
        If txt_credit.Text "0" And txt_debit.Text "0" Then
            Me.Close()
            MsgBox("opération invalide" & vbCrLf & " solde et débit nul ", MsgBoxStyle.Exclamation)
            annule = True
            Exit Sub
        End If

        ' ajoute les nouvelles valeurs à l'enfant new_ligne
        With Me.new_ligne
            .L_date = calendrier.SelectionRange.Start
            .L_type = Combo_type.Text
            .L_budget = Combo_budget.Text
            .L_commentaire = "pas encore fait"
            .L_credit = lecredit
            .L_debit = ledebit
            .L_pointage = Chk_pointage.Checked
            .L_mensuel = Chk_mensuel.Checked
        End With
        Me.Close()
    End Sub
End Class


l'idée est conforme non ?