Bonjour à tous,

J'ai un bout de code qui devient de plus en plus long en temps de traitement (avec l'augmentation des données présentes)
J'aurais voulu savoir si l'un d'entre vous avait une idée pour l'optimiser ?
J'ai regardé si il existait pas un bout de code pour faire tous les INSERT en même temps mais j'ai pas trouvé.
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
 
 'Insérer les valeurs prolongées à l'aide des calculs à partir des bases précédentes et des indices de remplacements.
    Public Sub insererValeurProlongeePasse()
        Dim remplacement As Boolean = True
        Dim base As Boolean = True
        While (remplacement Or base)
            'Traitement des valeurs pour les anciennes base100
            'Requete permettant de détecter les indices dont il existe des valeurs pour les bases précédentes mais pas pour cet indice.
            Dim requete As String = "SELECT DISTINCT t1.v_abrege,t1.v_base100,t1.minMois FROM (SELECT  v_abrege,v_base100,MIN(v_valeurMois) as minMois FROM T_Valeurs GROUP BY v_abrege,v_base100) as t1, T_Valeurs as t2 WHERE t1.v_abrege=t2.v_abrege AND t1.v_base100 > t2.v_base100 AND t1.minMois>t2.v_valeurMois ORDER BY t1.v_abrege,t1.v_base100"
            Dim resultat = BDOutil.executeRequeteSelect(requete)
            If (resultat.Rows.Count = 0) Then
                base = False
            Else
                base = True
            End If
            For Each row In resultat.Rows
                Dim abrege As String = row(0).ToString()
                Dim base100 As String = row(1).ToString()
                Dim moisMin As String = row(2).ToString()
                'Après avoir récupérer les indices et leurs bases100, on crée une requete permettant de récupérer les valeurs pour la base100 précédentes qui manquent dans la nouvelle base100. On pense à récupérer le coefficient de changement dans la table de Base100 qui indique les liens des changements (de quel base100 à quel base100).
                Dim requete2 As String = "SELECT t1.V_Abrege,t1.V_Base100,t1.V_valeur,t1.V_ValeurMois,t2.B_Coefficient_Changement_Base FROM T_Valeurs As t1,T_base100 as t2 WHERE t2.B_Abrege='" + abrege + "' AND t2.B_Nouvelle_Base100=" + base100 + " AND t2.B_Base100=t1.V_Base100 AND t2.B_Abrege=t1.V_Abrege AND t1.V_ValeurMois<" + moisMin + ""
                Dim resultat2 = BDOutil.executeRequeteSelect(requete2)
                For Each row2 In resultat2.Rows
                    Dim dateDepart As Date = New Date(1900, 1, 1)
                    Dim valeurATraite As Double = CType(row2(2).ToString, Double)
                    Dim valeurMois As Integer = CType(row2(3).ToString, Integer)
                    Dim dateTemp = dateDepart.AddMonths(valeurMois)
                    Dim mois As String = dateTemp.Month.ToString + "/" + dateTemp.Year.ToString
                    Dim coefficient As Double = Math.Round(CType(row2(4).ToString, Double), 4)
                    Dim valeurTraite As Double = valeurATraite / coefficient
                    'On traite chacune des valeurs qu'on insère dans la base de données pour la base100 ou il manquait les valeurs (on pense bien à diviser la valeur de l'ancienne base par le coefficient avant de l'attribuer à la nouvelle base.)
                    Dim requeteInsertion As String = "INSERT INTO T_Valeurs VALUES('" + abrege + "'," + base100 + ",#" + mois + "#,'" + valeurTraite.ToString + "'," + valeurMois.ToString + ",'ProlongeeP')"
                    BDOutil.executeRequeteMAJ(requeteInsertion)
                    Threading.Thread.Sleep(15)
                Next
            Next row
            'Traitement des valeurs pour les indices de remplacements.
            'La logique du traitement est la même à la seule différence qu'on ne cherche pas les anciennes bases mais les remplacés.
            'On récupère les indices qui en ont remplacer d'autres et dont il n'existe pas de valeurs pour les dates avant le remplacement alors qu'elles existent pour les remplacés
            requete = "SELECT DISTINCT t1.v_abrege,t1.v_base100,t1.minMois FROM (SELECT  v_abrege,v_base100,IR_Abrege_Indice_Supprime,MIN(v_valeurMois) as minMois FROM T_Valeurs,T_Indice_Remplacement WHERE IR_Abrege_Indice_Remplacement=v_abrege AND IR_Base100_Indice_Remplacement=v_base100 GROUP BY v_abrege,v_base100,IR_Abrege_Indice_Supprime,IR_Date_Raccordement ORDER BY IR_Date_Raccordement) as t1, T_Valeurs as t2,T_Base100 as t3 WHERE IR_Abrege_Indice_Supprime=t2.v_abrege AND t2.v_base100=t3.b_base100 AND t3.b_derniere_base100=TRUE AND t3.b_abrege= IR_Abrege_Indice_Supprime AND t1.minMois>t2.v_valeurMois ORDER BY t1.v_abrege,t1.v_base100"
            resultat = BDOutil.executeRequeteSelect(requete)
            If (resultat.Rows.Count = 0) Then
                remplacement = False
            Else
                remplacement = True
            End If
            For Each row In resultat.Rows
                Dim abrege As String = row(0).ToString()
                Dim base100 As String = row(1).ToString()
                Dim moisMin As String = row(2).ToString()
                Dim requete2 As String = "SELECT t1.V_Abrege,t1.V_Base100,t1.V_valeur,t1.V_ValeurMois,t2.IR_Coefficient_Raccordement FROM t_Valeurs as t1,t_Indice_Remplacement as t2,t_Base100 as t3 WHERE t2.IR_Abrege_Indice_Remplacement='" + abrege + "' AND t2.IR_Base100_Indice_Remplacement=" + base100 + " AND t2.IR_Abrege_Indice_Supprime=t1.v_Abrege AND t2.IR_Reconstitue=TRUE AND t3.b_abrege=t1.v_Abrege AND t3.b_base100=t1.v_base100 AND t3.b_derniere_base100=TRUE AND t1.v_ValeurMois<" + moisMin + ""
                Dim resultat2 = BDOutil.executeRequeteSelect(requete2)
                For Each row2 In resultat2.Rows
                    Dim dateDepart As Date = New Date(1900, 1, 1)
                    Dim valeurATraite As Double = CType(row2(2).ToString, Double)
                    Dim valeurMois As Integer = CType(row2(3).ToString, Integer)
                    Dim dateTemp = dateDepart.AddMonths(valeurMois)
                    Dim mois As String = dateTemp.Month.ToString + "/" + dateTemp.Year.ToString
                    Dim coefficient As Double = Math.Round(CType(row2(4).ToString, Double), 4)
                    Dim valeurTraite As Double = valeurATraite / coefficient
                    'On traite chacune des valeurs qu'on insère dans la base de données pour la base100 ou il manquait les valeurs (on pense bien à diviser la valeur de l'ancienne base par le coefficient avant de l'attribuer à la nouvelle base.)
                    Dim requeteInsertion As String = "INSERT INTO T_Valeurs VALUES('" + abrege + "'," + base100 + ",#" + mois + "#,'" + valeurTraite.ToString + "'," + valeurMois.ToString + ",'ProlongeeP')"
                    BDOutil.executeRequeteMAJ(requeteInsertion)
                    Threading.Thread.Sleep(15)
                Next
            Next
        End While
    End Sub
Pour le code de la base données
De plus sur un PC plus puissant il me dit que j'ouvre trop de curseurs en même temps donc ça plante
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
 
Public Sub executeRequeteMAJ(ByVal requete As String)
        Dim commandOdbc As OdbcCommand
        Try
            'connexion.Open()
            'Dim command As OleDbCommand = New OleDbCommand(requete, connexion)
            'command.ExecuteNonQuery()
            'connexion.Close()
            'connexionOdbc.Open()
            commandOdbc = New OdbcCommand(requete, connexionOdbc)
            commandOdbc.ExecuteNonQuery()
        Catch e As Exception
            OutilModule.afficherErreur("Erreur: " + e.Message)
            Throw e
        Finally
            commandOdbc = Nothing
            'connexionOdbc.Close()
        End Try
    End Sub
Merci par avance