Bonjour,
je suis tjs dans le cadre de la conversion d'un code VBA (où je réalisais un certain nb de calculs sur des données simplement stockées dans une feuille Excel + transfert dans une matrice au lancement de l'algo) à un code VB.Net où mes données sont désormais dans une base ACCESS.
Evidemment, étant débutant, je tâtonne pour chaque opération/chaque syntaxe et chaque opération me prend un tps ridiculement long et aboutit à un code vraiment pas optimisé (je n'utilise pas les fonctions les plus rapides mais, en essayant plusieurs, j'utilise celle qui fonctionne/ne me renvoie pas de message d'erreur).
Exemple: à un moment je calcul qq stats de base
Table1 contient notamment des données numériques (COL2) et des indicatrices (IND1). Colonnes que je souhaite sommer pour une valeur spécifiée du champ COL1.
En VB je lisais simplement la colonne et en sommais les valeurs.
En SQL je me dis qu'on peut faire bcp plus rapidement et pourtant, à force de buter sur des pb de syntaxe, j'utilise au final la solution suivante:
Voici mon code:
J'ai écrit une 30 aine de calculs/sommation de ce genre x disons 1.000 fois (calcul pour 1.0000 valeurs de str1). Donc disons 30.000 fois des calculs comme ci-dessus, réalisés sur Table1 qui ne fait que 10.000 lignes (la table risque de grandir fortement à l'usage, raison pour laquelle j'essaie de passer de VBA à VB.Net + base ACCESS).
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 strConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Users\b4ruk\Documents\BD1.mdb;" strSql = "SELECT Table1.* FROM Table1" ObjetConnection = New OleDbConnection() ObjetConnection.ConnectionString = strConn ObjetConnection.Open() ObjetCommand = New OleDbCommand(strSql) ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand) ObjetCommand.Connection() = ObjetConnection ObjetDataAdapter.Fill(ObjetDataSet, "Table1") ObjetDataTable1 = ObjetDataSet.Tables("Table1") For i=1 to 1.000 str1=BD(i).Evenement 'Calcul du nb de fois où un événement se produit: en comptant le nb de fois où l'indicatrice IND1 vaut 1 (IND1=1 <=> l'événement qu'on veut suivre s'est produit) FoundRows = ObjetDataTable1.Select("COL1= " & str1 & " AND IND1 = 1") iResult1 = FoundRows.Count 'Calcul de la somme d'une colonne strSql = "SELECT Table1.COL2 FROM Table1 WHERE Table1.COL1 = " & str1 ObjetCommand = New OleDbCommand(strSql) ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand) ObjetCommand.Connection() = ObjetConnection myReader = ObjetCommand.ExecuteReader Do While myReader.Read() BD(i).Somme = BD(i).Somme + myReader.GetString(0) Loop myReader.Close() Next i
Et ce calcul prend une 40aine de secondes, contre 1 ou 2 en VBA en stockant simplement les données dans une matrice.
Mon intuition:
-Le calcul du nb de fois où l'indicatrice IND1 vaut 1 est certainement maladroit mais je suppose qu'il n'est pas très chronophage
-Le calcul de la somme de la colonne COL2 est probablement ce qui est le plus mal programmé. Çà doit manger énormément de tps.
Dans un tutoriel du site j'ai vu qu'on évoquait l'utilisation d'une méthode ExecuteScalar mais je n'ai pas réussi à la faire fonctionner (oui les débuts sont vraiment très difficiles lol).
Si ExecuteScalar est la solution , quelle en serait la syntaxe dans mon exemple, avec l'option SUM ?
(Note: la coexistence dans mon code de la solution 'matrice' (BD(i)) et de la solution SQL/ACCESS est a priori temporaire, le temps que je bascule tout mon programme VB vers une solution ACCESS totale, enfin à espérer que j'arrive à me dépatouiller de mes soucis de conception).
Souvenez vous de vos débuts, soyez indulgents svp
Au plaisir de vous lire !
Partager