Bonjour tout le monde !
Je développe une application access, et dedans j'ai la possibilité de faire une exportation. Le problème c'est que le client dit que cette opération est trop longue. Sachant que je doit donc exporter un peu plus de 2400 enregistrements dans un fichier texte sous un format spécial.
Je vous mets le code, afin que vous compreniez mieux.
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 Public Function GenerationExport(Nomtable As String, Chemin As String) As Boolean On Error GoTo CodeErreur Dim sngDepart As Single Dim sngArrivee As Single sngDepart = Timer ' enregistrement servira à stocker l'enregistrement à écrire ' CadreEspace servira pour cadrer et formater les données Dim enregistrement, CadreEspace As String enregistrement = "" CadreEspace = "" '----------------------------------------------------------------- ' Teste si la table Query existe Dim i, y As Integer Dim Position As Long Dim tableexiste As Boolean tableexiste = False For i = 0 To CurrentDb.TableDefs.Count - 1 If CurrentDb.TableDefs(i).Name = Nomtable Then tableexiste = True Exit For End If Next i ' Si la table n'existe pas on sort avec la sortie à faux If tableexiste = False Then GenerationExport = False Exit Function End If '----------------------------------------------------------------- 'Si la table existe on continue 'On crée le recordset à utiliser Dim oRst As Adodb.Recordset Dim cnx As Adodb.Connection ' Dim SQL As String 'On utilise la database courante Set cnx = CurrentProject.Connection Set oRst = New Adodb.Recordset ' On crée le numéro de fichier Dim iNumFichier As Integer ' On attribue un numéro de fichier non utilisé iNumFichier = FreeFile ' Ouverture du fichier en écriture Open Chemin For Output As iNumFichier 'On ouvre le recordset oRst.Open Nomtable, cnx ' On parcourt chaque enregistrement de la table Position = 1 While Not oRst.EOF ' Pour chaque champ de la table ' /!\ On commence par le 1 car on ne veut pas inclure le premier champ jusqu'au dernier champ For i = 1 To CurrentDb.TableDefs(Nomtable).Fields.Count - 1 ' On ajoute à la string enregistrement le champ sélectionné de l'enregistrement sélectionné ' Et ceci au bon format ' On crée une chaîne ayant des blancs de la taille du champ CadreEspace = Space(CurrentDb.TableDefs(Nomtable).Fields(i).Size) If Not IsNull(oRst.Fields(i).Value) Then ' Dans cette chaîne, on cadre à gauche la valeur du champ actuel de l'enregistrement actuel LSet CadreEspace = CStr(oRst.Fields(i).Value) ' Et on ajoute cette chaîne dans l'enregistrement End If enregistrement = enregistrement + CadreEspace Next i ' On ajoute l'enregistrement au fichier Print #iNumFichier, enregistrement ' On vide la string enregistrement enregistrement = "" 'Définit le texte à afficher et la valeur actuelle de la jauge. Application.SysCmd acSysCmdUpdateMeter, Position Position = Position + 1 ' On passe à l'enregistrement suivant oRst.MoveNext Wend ' Une fois tous les enregistrements passés ' On ferme le recordset et le fichier connexion oRst.Close cnx.Close Set oRst = Nothing Set cnx = Nothing ' On ferme le fichier Close #iNumFichier ' Et on retourne True pour dire que l'opération s'est bien déroulée GenerationExport = True sngArrivee = Timer MsgBox "Temps écoulé = " & sngArrivee - sngDepart & " secondes", vbInformation, "Chronomètre" sngDepart = 0 sngArrivee = 0 Exit Function ' En cas d'erreur, on renvoie false CodeErreur: MsgBox Err.Description GenerationExport = False End Function
Ma question est donc : Comment améliorer le temps d'exécution de mon exportation. J'avais pensé a mettre des recordset mais je ne pense pas que cela va changer grand chose. Je pense que le temps assez long vient de ma copie de chaque ligne sur le fichier (pour chaque enregistrement), qu'en pensez-vous ?
Mon timer m'indique que la copie des 2400 enregistrements (environ) met 2min et 7sec.
Merci d'avance.
Partager