Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
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 14/09/2011, 11h25   #1
Membre habitué
 
Homme Christian Roignot
Logisticien
Inscription : janvier 2009
Messages : 308
Détails du profil
Informations personnelles :
Nom : Homme Christian Roignot
Âge : 59
Localisation : France

Informations professionnelles :
Activité : Logisticien
Secteur : Industrie

Informations forums :
Inscription : janvier 2009
Messages : 308
Points : 112
Points : 112
Par défaut Conseils pour diminuer le tps d'affichage d'un formulaire multicritère

Bonjour,
J’ai besoin de vos conseils, car J’ai un formulaire qui est très long à s’afficher.
C’est un formulaire multicritère (9 critères).
Il y a 3 sous-formulaires. Un des 3 sous-formulaires est basé sur une requête TDC.
Lorsque je change un critère, j’exécute un refresh et là aussi c’est un peu long.
Ci-dessous la requête :
Code :
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
 
Public Sub RefreshQuery()
    Dim IDEFIX As DAO.Database
    Dim sql As String, sql1 As String
    Dim maReq As DAO.QueryDef
    Dim qry As DAO.QueryDef
    Dim sNomRQ As String, ClauseAND As String, ClauseWhere As String
 
 
    Set IDEFIX = CurrentDb
    'Reconstuction de la requête "rqyQtéCapTotalExw"
    'nom de la requête
    sNomRQ = "rqyQtéCapTotalExw"
    'construction de la nouvelle requête
    sql = "PARAMETERS [Forms]![frmChDteExw]![SemaineD] Value, [Forms]![frmChDteExw]![AnneeD] Value;"
    sql = sql & " SELECT rqyQtéCap.[Dte Fin Prévue], rqyQtéCap.DteCarnetCdeXLS, rqyQtéCap.DteFinCarnet, rqyQtéCap.Qté, rqyQtéCap.[Statut des OF],"
    'sql = sql & " NumSemaine([DteCarnetCdeXLS]) AS Semaine, rqyQtéCap.idCAP, rqyQtéCap.LC, rqyQtéCap.CAP, rqyQtéCap.idIPU,"
    sql = sql & " rqyQtéCap.idCAP, rqyQtéCap.LC, rqyQtéCap.CAP, rqyQtéCap.idIPU,"
    sql = sql & " rqyQtéCap.idClient, rqyQtéCap.Client, rqyQtéCap.idArticle, rqyQtéCap.[Code Article],"
    sql = sql & " rqyQtéCap.Désignation, rqyQtéCap.[Dte Ddée EXW], rqyQtéCap.[Dte Expédition], rqyQtéCap.[Dte expédition modifiée], rqyQtéCap.Retard,"
    sql = sql & " rqyQtéCap.[Magasin expedition], rqyQtéCap.[Point expedition], rqyQtéCap.OV, rqyQtéCap.OF"
    sql = sql & " FROM rqyQtéCap"
    sql = sql & " WHERE ((rqyQtéCap.DteCarnetCdeXLS) Between InvDatePart(1,[Forms]![frmChDteExw]![SemaineD],"
    sql = sql & " [Forms]![frmChDteExw]![AnneeD]) And (InvDatePart(1,[Forms]![frmChDteExw]![SemaineD],"
    sql = sql & " [Forms]![frmChDteExw]![AnneeD])+13))"
 
    Select Case Me.gprStatutOF
    Case 1
    ClauseAND = ClauseAND & " AND [Statut des OF] = '" & "livrée" & "' "
    Case 2
    ClauseAND = ClauseAND & " And [Statut des OF] = '" & "non livrée" & "' "
    Case 3
    ClauseAND = ClauseAND & " And [Statut des OF] like '" & "Sans" & "' "
    'ClauseAND = ClauseAND & " And [Statut des OF] is null"
    Case 4
    ClauseAND = ClauseAND & " AND ([Statut des OF] Is Null Or [Statut des OF] Is Not Null)"
    End Select
 
    If Not Me.chkCAP Then
        ClauseAND = ClauseAND & " AND idCAP like '*" & Me.cmbCAP & "*' "
    End If
    If Not Me.chkIPU Then
        ClauseAND = ClauseAND & " AND idIPU like '*" & Me.cmbIPU & "*' "
    End If
    If Not Me.chkClient Then
        ClauseAND = ClauseAND & " AND idClient like '*" & Me.cmbClient & "*' "
    End If
    If Not Me.chkCdeArticle Then
        ClauseAND = ClauseAND & " AND idArticle like '*" & Me.cmbCodeArticle & "*' "
    End If
    If Not Me.ChkMagasin Then
        ClauseAND = ClauseAND & " AND [Magasin expedition] like '*" & Me.cmbMagasin & "*' "
    End If
 
    Select Case Me.grpRetard
    Case 1
    ClauseAND = ClauseAND & " AND [Retard] like '" & "Retard" & "' "
    Case 2
    ClauseAND = ClauseAND & " AND [Retard] like '" & "Pas retard" & "' "
    Case 3
    ClauseAND = ClauseAND & " AND [Retard] like '" & "" & "' "
    Case 4
    ClauseAND = ClauseAND & " AND ([Retard] is null or [Retard] is not null)"
    End Select
 
    Select Case Me.grpOF
    Case 1
    ClauseAND = ClauseAND & " AND [OF] not like '" & "Sans" & "' "
    Case 2
    ClauseAND = ClauseAND & " AND [OF] like '" & "Sans" & "' "
    Case 3
    ClauseAND = ClauseAND & " AND ([OF] is null or [OF] is not null) "
    End Select
 
    Select Case Me.grpLC
    Case 1
    ClauseAND = ClauseAND & " AND [LC] like '" & "x" & "' "
    Case 2
    ClauseAND = ClauseAND & " AND [LC] not like '" & "x" & "' "
    Case 3
    ClauseAND = ClauseAND & " AND ([LC] is null or [LC] is not null) "
    End Select
 
 
    If Len(ClauseAND) = 0 Then
        GoTo AménagerLaQueueDuSQL
    Else
        sql = sql & ClauseAND
    End If
 
AménagerLaQueueDuSQL:
    sql = sql & " ORDER BY rqyQtéCap.[Dte Expédition];"
    'Debug.Print sql
 
    'supprime la raquête si elle existe
    If ExistQuery(sNomRQ) Then DoCmd.DeleteObject acQuery, sNomRQ
    'créer la nouvelle requête
    Set maReq = IDEFIX.CreateQueryDef(sNomRQ, sql)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
 
    'Requete analyse croisé pour le sous_formulaire
    sql = "TRANSFORM nz(Sum(rqyQtéCapTotalExw.Qté),0) AS SommeDeQté"
    sql = sql & " SELECT rqyQtéCapTotalExw.[Dte Expédition]"
    sql = sql & " FROM rqyQtéCapTotalExw"
    sql = sql & " WHERE rqyQtéCapTotalExw.[Dte Expédition] Is Not Null"
    sql = sql & " GROUP BY rqyQtéCapTotalExw.[Dte Expédition]"
    sql = sql & " ORDER BY DateDiff('d',InvDatePart(1,[Forms]![frmChDteExw]![SemaineD],[Forms]![frmChDteExw]![AnneeD]),[DteCarnetCdeXLS])+1"
    sql = sql & " PIVOT DateDiff('d',InvDatePart(1,[Forms]![frmChDteExw]![SemaineD],[Forms]![frmChDteExw]![AnneeD]),[DteCarnetCdeXLS])+1 In (1,2,3,4,5,6,7,8,9,10,11,12,13,14);"
 
 
 
    'Rafaichi le sous-formulaire
    Me.sfrmChDteExw.Form.RecordSource = sql
    Me.sfrmChDteExw.Form.Refresh
 
    'rafraichi le nombre d'OV
    sql = "SELECT Count([rqyOVSelectionnéExw].[OV]) AS nbOv"
    sql = sql & " FROM rqyOVSelectionnéExw;"
 
    Me.s_frmNbOVExw.Form.RecordSource = sql
    Me.s_frmNbOVExw.Form.Refresh
 
    'rafraichi le nb d'Ov sans date Expédition
    sql = "SELECT Count(rqyOvSansDteExwAvecDteModif.OV) AS CompteDeOV"
    sql = sql & " FROM rqyOvSansDteExwAvecDteModif;"
 
    Me.s_frmNbOVSansDteExw.Form.RecordSource = sql
    Me.s_frmNbOVSansDteExw.Form.Refresh
 
End Sub
Lorsque je passe en mode création, là aussi le formulaire est long à s'afficher.

J'aimerai savoir, si il est possible d'améliorer ce temps d'affichage.
Merci d'avance de votre aide.

Christian
rch05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 19h42   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 475
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 475
Points : 7 561
Points : 7 561
Les requêtes Tableau Croisé Dynamiques peuvent être assez longue à exécuter. Si tu as un enchainement de requêtes, vois si tu peux utiliser des tables temporaires. Un truc du genre :
  1. Appel Requête1 -> Rempli table1
  2. Appel Requête2 : utilise Table1 au lieu de Requête1 -> Rempli table2
  3. etc..

Autre idée : calculer un tableau croisé dynamique qui comprend toutes les donneées et le mettre dans une table puis ne plus faire que des select sur cette table.

Autre astuce, si tu as des sous-formulaires qui ne sont pas tous visibles en même temps tu peux décider de leur assigner une source de données seulement au moment où ils deviennent visibles. Comme cela tu ne 'payera' le temps du calcul qu'au moment où tu voudras vraiment voir les infos.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/09/2011, 07h26   #3
Membre habitué
 
Homme Christian Roignot
Logisticien
Inscription : janvier 2009
Messages : 308
Détails du profil
Informations personnelles :
Nom : Homme Christian Roignot
Âge : 59
Localisation : France

Informations professionnelles :
Activité : Logisticien
Secteur : Industrie

Informations forums :
Inscription : janvier 2009
Messages : 308
Points : 112
Points : 112
Bonjour Marot_r,

Merci de ta réponse.
Je vais revoir tout ça en prenant compte tes conseils.

Merci d'avance

Ch.
rch05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 07h28   #4
Membre habitué
 
Homme Christian Roignot
Logisticien
Inscription : janvier 2009
Messages : 308
Détails du profil
Informations personnelles :
Nom : Homme Christian Roignot
Âge : 59
Localisation : France

Informations professionnelles :
Activité : Logisticien
Secteur : Industrie

Informations forums :
Inscription : janvier 2009
Messages : 308
Points : 112
Points : 112
Bonjour Marot_r,

J'ai suivi tes conseils, et cela est bien plus rapide en passant par des tables temporaires.

Merci et bonne journée

Cdt
Christian
rch05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h45.


 
 
 
 
Partenaires

Hébergement Web