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

VB.NET Discussion :

Boucle sur un Array avec 2 colonnes


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur VBA /VB.net
    Inscrit en
    Août 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur VBA /VB.net
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 30
    Par défaut Boucle sur un Array avec 2 colonnes
    Bonjour,

    Je me permet de demander de l'aide car impossible de trouver l'erreur depuis 1 jour ^^ .*

    Je développe actuellement un outil de suivi qui est censé mettre à jour une sa base de données Access via un extract quotidien de 150000 ligne et 98 Colonnes.

    Pour l'ouverture du Fichier TxT sur Excel et charger les données dans l'Array pas de soucis j'ai su faire (je ne garde que 7 colonnes au final).
    Par contre quand je dois boucler sur mon array pour comparer les valeurs de la DB (stocker sur des dicos) avec celle de l'array et éventuellement ajouter ou update la ligne.
    Malheureusement après avoir épluché le net, il me pète une erreur à la première boucle ^^

    j'ai bien mon array en variable local avec toutes mes valeurs dedans comme ceci :

    (0,0) val1
    (0,1) val2
    (0,2) val3
    (0,3) val4
    (0,4) val5
    (0,5) val6
    (0,6) val7

    (1,0) val1
    (1,1) val2
    (1,2) val3
    (1,3) val4

    etc...

    Msg d'erreur : Index was outside the bounds of the array

    code
    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
     
     
      Dim rng As Excel.Range = xlWorkSheet.Range("A2:G" & Nbligne)
            Dim MyArray As Object(,) = CType(rng.Value, Object(,))
     
            'requete addnew
            Sql = "SELECT *FROM Tbl_Prix Where [N°] = 0"
            Call  Rq_DB(Sql)
     
     
            For i = 0 To UBound(MyArray)
     
     
     
                If dico_REF.ContainsKey(CStr(MyArray(i, 0))) = False Then  <<<< erreur ici
                    'Addnew line
                    rsdb.AddNew()
                    rsdb.Fields("1").Value = CStr(MyArray(i, 0))          
                    rsdb.Fields("2").Value = CStr(MyArray(i, 1))          
                    rsdb.Fields("3").Value = CStr(MyArray(i, 2))              
                    rsdb.Fields("4").Value = CStr(MyArray(i, 3))                 
                    rsdb.Fields("5").Value = CStr(MyArray(i, 4))            
                    rsdb.Fields("6").Value = CStr(MyArray(i, 5))            
                    rsdb.Fields("7").Value = CStr(MyArray(i, 6))      
                    rsdb.Update()
     
    end if
    J'ai aussi essayer toto = MyArray(i, 0)) même erreur

    Alors juste pour préciser le VB.net c'est assez récent pour moi, j'ai développé 5 ans en VBA et j'ai du coder des millier de boucles sans jamais de problème donc j'ai pas encore la logique VB.

    socle : Visual studio express 2012

    Merci d'avance.

    Peall

  2. #2
    Membre chevronné Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 339
    Par défaut
    Salut,
    Je te conseille de ne pas utiliser des Array. Il y a bien plus efficace. Regarde du coté des List(Of T).
    Ensuite, tu peux te passer d'Excel et lire directement les données de ton fichier texte. Pour cela regarde ceci.
    A plus.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur VBA /VB.net
    Inscrit en
    Août 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur VBA /VB.net
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 30
    Par défaut
    Bonjour r.romel

    Merci pour ton aide !

    Je t’avoue que pour le moment je préfère nager où j'ai pied avant de me lancer dans une autre solution comme list(OF T) que je ne maîtrise pas du tout.

    Concernant boucler sur la feuille excel, oui c'est une solution mais comme je l'ai dis j'ai 150 000 ligne a traiter, la solution boucle sur tableau de variable sera plus rapide.

    Ceci dit ça ne répond pas vraiment a mon interrogation comment fait on pour bouclé sur un Array de 6 colonnes? j'aimerais vraiment comprendre car je compte m'en servir très souvent.

    Peall

  4. #4
    Membre chevronné Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 339
    Par défaut
    Je pense que c'est dommage de ne pas vouloir apprendre. Les Array sont dépassés autant focaliser tes efforts sur une solution plus efficace, d'autant plus si tu souhaites t'en servir souvent.

    Te passer d'Excel sera bien plus rapide.

    Montre nous, comment est structuré ton fichier texte avec un exemple. On pourra t'aider et t'expliquer.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur VBA /VB.net
    Inscrit en
    Août 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur VBA /VB.net
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 30
    Par défaut
    J'ai jamais dis que je voulais pas apprendre, je dois livrer mon outil lundi tout fonctionne sauf les mises à jours via l'extraction,je ne pense pas avoir le temps d'ici là de re-maitriser une autre manière de faire.

    le txt ressemble à ça :
    |Numéro de poste |Poste appel | Numéro Champs |Désignation Champs |Quantité besoin |UFQ |Quantité 1 |UQ |Mag.|TSZ|Date besoin|Date Couv.|Stat|Clé |Texte désignation

    le code pour l'ouvrir en Xlsx :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    xlApp.Workbooks.OpenText(Filename:=Path_Extract, Origin:=Excel.XlPlatform.xlMSDOS, DataType:=Excel.XlTextParsingType.xlDelimited, Comma:=False, Space:=False, Tab:=False, Other:=True, OtherChar:="|", StartRow:=2)
    Les tableaux de variable sont dépassés? Bon à savoir j'espère qu'il on aussi évolués en VBA car j'arrive souvent à la limite avec un beau message d'erreur "Capacité dépassée"...

    Peall.

  6. #6
    Membre chevronné Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 339
    Par défaut
    Essaye un truc comme cela :
    Une Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Class Poste
    #Region " Champs "
        Public NumeroPoste as Long
        Public PosteAppel as String
        Public NumeroChamp as Long
        Public DesiChamp as String
        Public Qte as Integer
        Public UFQ as String
        Public Qte1 as Integer
        Public Mag as String
        ' (...)
    #End Region
    End Class
    Ensuite tu lie le fichier texte et compile les données :
    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
    Dim ListePostes as New List(Of Poste)
    Dim FichierTXT As New StreamReader("Chemin_du_fichier_a_lire.TXT")
    Dim Ligne As String
    Dim MonPoste as New Poste 
     
    Do Until FichierTXT.Peek = -1
        Ligne = FichierTXT.ReadLine()
        '|Numéro de poste |Poste appel | Numéro Champs |Désignation Champs |Quantité besoin |UFQ |Quantité 1 |UQ |Mag.|TSZ|Date besoin|Date Couv.|Stat|Clé |Texte désignation
        For i As Integer = 0 To Ligne.Split("|").Length - 1
            Select Case i
                Case = 0
                    MonPoste.NumeroPoste = Ligne.Split("|")(i)
                Case = 1
                    MonPoste.PosteAppel = Ligne.Split("|")(i)
                Case = 2
                    MonPoste.NumeroChamp = Ligne.Split("|")(i)
                Case = 3
                    MonPoste.DesiChamp = Ligne.Split("|")(i)
                    '(...)
            End Select
            ListePostes.Add(MonPoste)
        Next
    Loop
    Enfin tu boucle ta liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For each MonPoste as Poste in ListePostes
    '(...)
    Next

  7. #7
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    L'erreur vient du fait que MyArray n'est pas "dimensionnée".

    Dim MyArray As Object(,) = CType(rng.Value, Object(,))
    Cette déclaration en signifie pas grand chose. Supposant qu'il s'agisse effectivement d'une matrice devant contenir des Object, la déclaration devrait être :
    Dim MyArray(,) As Object

    Mais ce n'est pas suffisant, avant son utilisation il faut faire un REDIM :
    Redim MyArray( N, 6)
    Cela permettra au 2ème indice d'évoluer de 0 à 6.

    Mais avant de faire ce Redim, il faut connaître la valeur de N. Il est possible de gérer dynamiquement des tableaux multi-dimensionnels, mais seulement sur le dernier indice, sauf à gérer des tableaux de tableaux mais là, c'est pas facile de ne pas s'y perdre ...

    Et donc, pour être plus clair, le mieux serait que tu connaisses les 2 limites de ta matrice avant de commencer. Mais si tu peux les connaître, pourquoi ne pas déclarer directement ta matrice avec ses limites connues :
    Dim MyArray(N,6) As Object et dans ce cas, pas besoin de Redim.

    J'espère que ceci te mettra sur la piste ...

  8. #8
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    Je valide l'intervention de r.morel. C'est plus compréhensible de bosser en objet.

  9. #9
    Membre averti
    Homme Profil pro
    Développeur VBA /VB.net
    Inscrit en
    Août 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur VBA /VB.net
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 30
    Par défaut
    @Phil Rob merci pour cet éclaircissement


    @r.morel

    j'ai réussi à adapter ta solution (j'aurais jamais trouvé seul^^) le chargement de la list<T> fonctionne et ça à l'aire plutôt puissant !

    par contre j'ai un bug sur la boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For each MonPoste as Poste in ListePostes
    '(...)
    Next
    Monposte est souligné en bleu et il me dit "hides variable in an enclosing block"

    du coup j'ai tester sans AS POSTE la boucle démarre mais bloque sur la même ligne ^^

    une idées?

    Sinon 2 questions :

    1- si je dois appliqué cette méthode pour chargé les données non pas a partir un fichier texte mais d'une feuille excel voir d'un recordset suite à requête ADO qu'elle est le code pour définir ces sources?

    2- j'avais l'habitude de proposer des extractions DB d'une table au choix, je faisais ma requête, je stockais mon recordset dans un tableau de variable et pour finir je collais directement ce tableau sur la feuille excel (Je transpose en gros).
    et ça aller très vite, puis je faire pareil avec ma "List"? la "transposer" directement sur une feuille Excel?

    Merci d'Avance.

    Peall

  10. #10
    Membre chevronné Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 339
    Par défaut
    Salut.
    Bravo
    Essaye de changer le nom de la variable MonPoste avec PosteEnCours par exemple. Car si tu utilises le même nom de variable cela pose problème.

    Tu peux bien sûr utiliser une méthode similaire avec une feuille Excel comme source. Tu dois pour cela remplacer la lecture du fichier texte par la lecture du tableur.

    Pour copier les données dans un classeur Excel tu peux utiliser la boucle pour remplir chaque cellule en récupérant les éléments de l'objet Poste. Tu peux aussi remplir un DataGridView très simplement.

  11. #11
    Membre averti
    Homme Profil pro
    Développeur VBA /VB.net
    Inscrit en
    Août 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur VBA /VB.net
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 30
    Par défaut
    C'est que je fais du coup, j'ai plus de trait bleu mais la boucle reste sur la même valeur et ne passe pas à la suivante voilà le code en résumé :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
     
     
            Dim ListePostes As New List(Of Poste)
            Dim FichierTXT As New IO.StreamReader(Path_Extract)
            Dim Ligne As String
            Dim alldata As New Poste
     
     
            Dim z As Long = 0
            Do Until FichierTXT.Peek = -1
                Ligne = FichierTXT.ReadLine()
                If z < 2 Then GoTo suite
                '|Numéro de poste |Poste appel | Numéro Champs |Désignation Champs |Quantité besoin |UFQ |Quantité 1 |UQ |Mag.|TSZ|Date besoin|Date Couv.|Stat|Clé |Texte désignation
                For x As Integer = 0 To Ligne.Split("|").Length - 1
     
                    Select Case x
                        Case Is = 3
                            alldata.reference = Ligne.Split("|")(x).Replace(" ", "")
                        Case Is = 4
                            alldata.Designation = Ligne.Split("|")(x)
                        Case Is = 9
                            alldata.MAG = Ligne.Split("|")(x)
                        Case Is = 10
                            alldata.TMS = Ligne.Split("|")(x)
                        Case Is = 28
                            alldata.appareil = Ligne.Split("|")(x)
                        Case Is = 49
                            alldata.STOCK = Ligne.Split("|")(x).Replace(".", "")
                        Case Is = 61
                            alldata.Prixmoyen = Ligne.Split("|")(x).Replace(".", "")
                            '(...)
                    End Select
                    ListePostes.Add(alldata)
                Next x
    suite:
                z = z + 1 ' ne prend pas en compte la 1 er ligne du TXT
            Loop
     
     
            For Each objdata As Poste In ListePostes << le for Each ne fonctionne pas
     
     
     
                If dico_Prix.ContainsKey(CStr(objdata.reference)) = False And dico_Doublon.ContainsKey(CStr(objdata.reference)) = False Then
                    'Addnew line
                    rsdb.AddNew()
                    rsdb.Fields("1").Value = objdata.NumPoste.Replace(" ", "")       
                    rsdb.Fields("2").Value = objdata.Posteappel              
                    rsdb.Update()
     
     
     
            Next

Discussions similaires

  1. Select sur 2 tables avec deux colonnes identiques
    Par LsMarx dans le forum Requêtes
    Réponses: 4
    Dernier message: 07/08/2012, 16h08
  2. Performance boucle sur table tempo avec identity
    Par Jean.Cri1 dans le forum Adaptive Server Enterprise
    Réponses: 7
    Dernier message: 31/08/2011, 11h42
  3. [XL-2007] Doublons sur deux feuilles avec 26 colonnes chacunes
    Par jimmycamelon dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 04/03/2011, 16h56
  4. [PHP 4] session et tableau array avec 4 colonnes
    Par sooprano dans le forum Langage
    Réponses: 1
    Dernier message: 30/06/2009, 13h38
  5. Boucle sur chaque div avec class= ....
    Par zevince dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/04/2006, 12h12

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