Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/03/2011, 09h56   #1
Invité de passage
 
Sebastien
Inscription : mars 2011
Messages : 2
Détails du profil
Informations personnelles :
Nom : Sebastien

Informations forums :
Inscription : mars 2011
Messages : 2
Points : 0
Points : 0
Par défaut optimiser le tps de traitement des calculs

Bonjour à tous,

Debutant, je suis confronter à un probleme. Le temps de traitement de 350 000 lignes d'une table est horriblement long.

j'ai une table tblNet avec des champs key, item, supplier, leadtime, qte
J'ai 80 000 item/supplier et 250 000 key.
Key correspond à la ligne de commande concatener avec le numero de commande.

Je realise sur l'interface d'access une requete :
en gros : pour chaque item et supp, je renvoie le resultat de deux fonctions fonction que j'ai realisé sous VBA DAO.
je selectionne le champs item, supplier en group by puis sur la colonne suivante, j'applique les fonctions en substituant strItem par la valeur de l'item de la ligne de tblnet.

Voici la 1ere fonction elles sont pas bien compliqué mais prenne un temps fou
Code :
1
2
3
4
5
6
7
Function calculerOTModele3(valeurLT As Double, strItem As String, strSupp As String)
 
Dim nbEnregistrement As Integer
nbEnregistrement = DCount("key","tblnet", "item='" & strItem & "' and suppnb='" & strSupp & "'")
 
calculerOTModele3 = Round(DCount("key","" & table & "", "item='" & strItem & "' and suppnb='" & strSupp & "' and ltcalcul=" & valeurLT & "") * 100 / nbEnregistrement, 0)
End Function
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
Function calculerModeSumQty(strItem As String, strSupp As String) As Double
Dim oDb As DAO.Database
Dim rst As DAO.Recordset
Dim strSql As String
'-------------------
'Calcul
'-------------------
Set oDb = CurrentDb
strSql = "SELECT TOP 1 ltcalcul "& vbCrLf & _
"FROM tblnet " & vbCrLf & _
"WHERE item='" & strItem & "' and suppnb='" & strSupp & "'" & vbCrLf & _
"GROUP BY ltcalcul " & vbCrLf & _
"ORDER BY Sum(qte) DESC, ltcalcul DESC;"
'----
Set rst = oDb.OpenRecordset(strSql)
'--------------------
'retourne la valeur
'--------------------
calculerModeSumQty = rst("ltcalcul")
End Function
Qu'est ce que je peux faire pour que les calculs dur moins longtemps?
faire un tri et une boucle tant que??

A mon avis, les fonctions doivent s'executer 350 000 fois au lieu de 80000 fois
Il faut que je prenne les bonnes habitudes maintenant.

Merci de votre aide
seb7t1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2011, 09h48   #2
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 037
Points : 11 037
Bonjour seb7t1,


Il faut sans doute chercher un moyen de réduire le nombre des appels aux fonctions.

— Existe-t-il un raisonnement qui te permettrait de déterminer a priori que le résultat des fonctions sera le même que celui de l’enregistrement précédent ?
Tu pourrais ainsi trier au préalable et solliciter les fonctions chaque fois qu’un critère change.

— Lorsque le calcul a été effectué, est-il définitif ? Je veux dire qu’il restera le même quelle que soit l’évolution du fichier dans l'avenir.
Tu pourrais alors stocker le résultat dans une table.
— Variante du précédent : trouver un critère qui permettrait de déterminer s’il est nécessaire de recalculer le résultat précédemment enregistré.
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2011, 15h45   #3
Invité de passage
 
Sebastien
Inscription : mars 2011
Messages : 2
Détails du profil
Informations personnelles :
Nom : Sebastien

Informations forums :
Inscription : mars 2011
Messages : 2
Points : 0
Points : 0
Bonjour claude,

Merci pour ta reponse.
Les calculs sont destinés à etre stocké dans une table pour etre reutilisé par la suite.

Avec ton idée, si je fait un sub :
J'ouvre un recordset en faisant un tri par item et supplier,
Boucle tant que l'item et le supplier sont egaux d'un enregistrement à l'autre, j'applique les fonctions.
Et je passe à l'autre item supplier?

Est-il possible de stocker les donnée leadtime et qty de meme supplier et meme item dans une table temporaire pour ensuite calculer? Est-ce que cela reduire le temps?

Faire un index sur item et supplier, est peut etre nécessaire?

Qu'en pense-tu?
seb7t1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2011, 16h06   #4
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 037
Points : 11 037
Citation:
J'ouvre un recordset en faisant un tri par item et supplier,
Boucle tant que l'item et le supplier sont egaux d'un enregistrement à l'autre, j'applique les fonctions.
Et je passe à l'autre item supplier?
Oui, si l'item et le supplier sont les seuls critères et qu'il y a de nombreuses combinaisons "item supplier" identiques.
On appelle la fonction lors de la 1re occurrence, on note le résultat, on applique ce résultat aux enregistrements suivants, jusqu'à ce que le couple change de valeur.
------------
Pour tes deux dernières questions, je ne suis pas compétent.
J'essaierais pour constater le résultat.
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2011, 18h02   #5
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 205
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 205
Points : 5 258
Points : 5 258
Bonjour à tous,

En plus de la solution très judicieuse de Claude

Il y a aussi la possibilité de faire des jointures entre tables ou requêtes sur des champs indexés (si possible) ou d'utiliser des sous-requête au lieu d'utiliser des fonctions.

Bonne suite
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h22.


 
 
 
 
Partenaires

Hébergement Web