Optimisation d'une double boucle for

c4rr3r4 Messages postés 16 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 4 juin 2012 - 30 août 2010 à 14:43
c4rr3r4 Messages postés 16 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 4 juin 2012 - 31 août 2010 à 10:29
bonjour,
je suis débutant en vb et je voudrais savoir s'il est possible d'optimiser le code d'une double boucle for.
Elle compare les prix d'une datatable(dt1) de 6000 réf à une autre(dt2) de 6000 réf, et affiche le résultat dans une autre datatable(dt3). Le traitement dure pas loin de 10min, c'est un peu long .


voila mon code :

For i = 0 To dt1.Rows.Count - 1
    For j = 0 To dt2.Rows.Count - 1
        If dt1.Rows(i)("Réf1") = dt2.Rows(j)("Réf2") _
        And (dt1.Rows(i)("Tarif Site HT")) <> dt2.Rows(j)("Tarif Site HT) _
        And dt1.Rows(i)("Tarif Site HT") IsNot Nothing Then
            dr= dt3.NewRow()
            dr("Réf2") = dt2.Rows(j)("Référence Site")
            dr("Désignation") = dt2.Rows(j)("Désignation Site")
            dr("Tarif Site HT 2") = Math.Round(CDbl(dt2.Rows(j)("Tarif Site HT").ToString.Replace(".", ",")), 2)
            dr("Tarif Site HT 1") = Math.Round(CDbl(dt1.Rows(i)("Tarif Site HT")), 2)
            dt3.Rows.Add(dr)
        End If
        Application.DoEvents()
    Next j
Next i



Merci d'avance

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 août 2010 à 15:09
Salut

Formatage des sauts de ligne avant les And assez perturbant, inhabituel.

- Manque un " sur 2ème ligne du If
- Abus/manque de parenthèses
- risque de plantage si dt1 Is Nothing : Tu testes le IsNot Nothing sur la même instruction que qu'un même test par rapport à une valeur de dt2 : Le If, même si la première condition n'est pas bonne, fera les calculs des termes suivants.
--> Décomposer en plusieurs If = gain de temps puisqu'il n'aura pas à calculer systématiquement 3 équations à chaque passage mais
        For i = 0 To dt1.Rows.Count - 1
            For j = 0 To dt2.Rows.Count - 1
                If dt1.Rows(i)("Réf1") = dt2.Rows(j)("Réf2") Then
                    If dt1.Rows(i)("Tarif Site HT") IsNot Nothing Then
                        If (dt1.Rows(i)("Tarif Site HT")) <> dt2.Rows(j)("Tarif Site HT") Then
                            dr = dt3.NewRow()
                            dr("Réf2") = dt2.Rows(j)("Référence Site")
                            dr("Désignation") = dt2.Rows(j)("Désignation Site")
                            dr("Tarif Site HT 2") = Math.Round(CDbl(dt2...
                            dr("Tarif Site HT 1") = Math.Round(CDbl...
                            dt3.Rows.Add(dr)
                        End If
                    End If
                End If
                Application.DoEvents()
            Next j
        Next i

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
c4rr3r4 Messages postés 16 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 4 juin 2012
30 août 2010 à 17:13
Merci j'ai enlevé la condition isnot nothing qui n'apportait rien.
Je vais essayer de trouver une autre solution, car c'est toujours long.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 août 2010 à 17:26
Je ne connais pas bien le .Net, mais les DataTables n'ont pas de méthode .Find ou .Filter ?
0
c4rr3r4 Messages postés 16 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 4 juin 2012
30 août 2010 à 20:52
en effet on peut créer un Dataview et y appliquer un Rowfilter, mais ce filtre n'est pas très puissant.
J'ai vaguement vu sur le msdn qu'on pouvait faire des requête SQL avec LINQ sur un dataset, qqun pourrait m'en dire un peu plus et/ou me donner un exemple simple de requête sur un dataset contenant 2 datatable simples
0

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

Posez votre question
c4rr3r4 Messages postés 16 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 4 juin 2012
31 août 2010 à 10:29
en passant une requete avec LINQ sur mes datatable j'ai divisé le temps de traitement par 2
Pour les requetes LINQ, c'est très bien expliquer sur le msdn.

Merci a ceux qui m'ont répondu ;)
0
Rejoignez-nous