Bonjour au forum,
J’ai un soucis sous Access 2003 avec la génération d’un état basé sur 1 requête « Analyse Croisée ». La mise en forme de l’état est issu du code VBA de caféine (15/05/2006) car j’ai un nombre de colonnes variable de 10 à 25.
De plus je souhaite que l’état provienne d’un formulaire sur lequel il ya un filtrage à partir d’une liste déroulante vers 1 zone de liste. Le filtrage fonctionne correctement et les données restituées dans la zone de liste sont correctes. Par contre lorsque je clique sur le bouton qui me génère l’état qui doit aussi être filtré les données ne sont pas bonnes ( le nombre de ligne est lui correct). Lorsque je consulte l’onglet « Données » de la boite de dialogue de l’état en mode création j’ai bien le filtre = ([R_Controle_Analyse]![Unite] = 'PCAC3' ) ce qui est correct.
Merci à ceux qui peuvent éclairer ma lanterne.
Ci-desous code utilsé.
USAC49


Code :
De la liste déroulante :
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
Private Sub cmbRechUnite_BeforeUpdate(Cancel As Integer)
Dim SQL As String
Dim SQLWhere As String
 
SQL = "SELECT Controle.N°, Controle.[date création fiche], Controle.Groupe, Controle.Unite, T_Appli.Appli, Controle.Dossier, T_Erreur.Type_Erreur, T_Objet.Objet, T_Ano.Ano FROM T_Ano INNER JOIN (T_Objet INNER JOIN (T_Erreur INNER JOIN (T_Appli INNER JOIN Controle ON T_Appli.id_appli = Controle.Appli) ON (T_Erreur.Id_Erreur = Controle.Type_Erreur) AND (T_Erreur.Id_Erreur = Controle.Type_Erreur)) ON T_Objet.Id_Objet = Controle.Objet) ON (T_Ano.Id_Ano = Controle.Ano) WHERE [Controle]![N°]<>0 "
 
If Me.cmbRechUnite.Visible = True Then
    SQL = SQL & "And Controle!Unite = '" & Me.cmbRechUnite & "' "
Else
    SQL = SQL & "And Controle!Groupe = '" & Me.cmbRechGroupe & "' "
 
End If
 
SQLWhere = Trim(Right(SQL, Len(SQL1) - InStr(SQL, "Where ") - Len("Where ") + 1))
 
SQL = SQL & ";"
 
Me.lblStats.Caption = "Nombre d'enregistrement(s) : " & DCount("*", "Controle", SQLWhere) & " / " & DCount("*", "Controle")
Me.lstResults.RowSource = SQL
Me.lstResults.Requery
End Sub
 
Du formulaire sur ouverture :
Private Sub Form_Load()
Me.cmbRechUnite.Visible = True
Me.lstResults_Etiquette.Caption = "Liste Globale"
 
Me.lstResults.RowSource = "SELECT Controle.N°, Controle.[date création fiche], Controle.Groupe, Controle.Unite, T_Appli.Appli, Controle.Dossier, T_Erreur.Type_Erreur, T_Objet.Objet, T_Ano.Ano FROM T_Ano INNER JOIN (T_Objet INNER JOIN (T_Erreur INNER JOIN (T_Appli INNER JOIN Controle ON T_Appli.id_appli = Controle.Appli) ON (T_Erreur.Id_Erreur = Controle.Type_Erreur) AND (T_Erreur.Id_Erreur = Controle.Type_Erreur)) ON T_Objet.Id_Objet = Controle.Objet) ON T_Ano.Id_Ano = Controle.Ano ORDER BY [date création fiche];"
 
Me.lstResults.Requery
DoCmd.SetWarnings False
DoCmd.OpenQuery "R_MAJ_Unite"
Me.Commande70.Visible = False
 
End Sub
Du bouton lancement édition :
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
Private Sub Commande70_Click()
On Error GoTo Err_Commande70_Click
 
    Dim stDocName As String
    stDocName = "E_Controle_Analyse4"
 
    If Me.cmbRechUnite.Visible = True Then
        DoCmd.OpenReport stDocName, acViewPreview, "", "[R_Controle_Analyse]![Unite] = '" & Me.cmbRechUnite & "' "
    'Else
    End If
 
Exit_Commande70_Click:
    Exit Sub
 
Err_Commande70_Click:
    MsgBox Err.Description
    Resume Exit_Commande70_Click
 
End Sub
De l’état :
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
Option Compare Database
' ***** déclaration des variables ***** '
Const Nombre_colonnes = 22 ' Nombre maximum d'étiquettes sur l'état (par rapport à l'exemple) & _
    on peut en afficher plus et donc modifier cette variable
Dim dbBase As DAO.Database
Dim rstEnregistrement As DAO.Recordset
Dim NbColonnes As Integer
Dim Total_colonnes(1 To Nombre_colonnes) As Long
Dim Total_etat As Long
 
Private Sub Détail_Format(Cancel As Integer, FormatCount As Integer)
    Dim entX As Integer
 
    If Not rstEnregistrement.EOF Then
        If Me.FormatCount = 1 Then
            For entX = 1 To NbColonnes
                Me("Detail" + Format(entX)) = Nz(rstEnregistrement(entX - 1), 0)
            Next entX
 
            For entX = NbColonnes + 2 To Nombre_colonnes
                Me("Detail" + Format(entX)).Visible = False
            Next entX
 
            rstEnregistrement.MoveNext
        End If
    End If
 
End Sub
 
Private Sub Détail_Print(Cancel As Integer, PrintCount As Integer)
    Dim entX As Integer
    Dim Nblignes As Long
 
    If Me.PrintCount = 1 Then
        Nblignes = 0
 
        For entX = 4 To NbColonnes
            Nblignes = Nblignes + Me("Detail" & entX) '
 
            Total_colonnes(entX) = Total_colonnes(entX) + Me("Detail" + Format(entX))
        Next entX
 
        Me("Detail" + Format(NbColonnes + 1)) = Nblignes
        Total_état = Total_état + Nblignes
    End If
'utiliser Détail_Print, PAS Détail_Format qui est appelé PLUSIEURS fois
     If ([NoLigne] Mod 2) = 0 Then
          Section(0).BackColor = vbWhite
     Else
          Section(0).BackColor = 13434879
          'jaune pâle : joli et discret
     End If
 
End Sub
 
Private Sub Détail_Retreat()
    rstEnregistrement.MovePrevious
 
End Sub
 
Private Sub EntêteÉtat_Format(Annuler As Integer, FormatCount As Integer)
 
    rstEnregistrement.MoveFirst
    Initvar
 
End Sub
 
Private Sub PiedÉtat_Format(Annuler As Integer, NBimpression As Integer)
 
    Dim entX As Integer
   '
   ' ' Affecte la valeur Total_Colonne(entX) des champs en colonne au champs total
    For entX = 4 To NbColonnes
        Me("Total" + Format(entX)) = Total_colonnes(entX)
    Next entX
 
    ' Place TotalEtat dans une boite de texte dans le pied d'état.
    Me("Total" + Format(NbColonnes + 1)) = Total_état
    ' Cache les zones de texte inutilisées dans le pied d'état.
    'For entX = (NbColonnes + 2) To Nombre_colonnes
    For entX = (NbColonnes + 2) To Nombre_colonnes
        Me("Total" + Format(entX)).Visible = False
    Next entX
 
End Sub
Private Sub Report_Close()
 
    rstEnregistrement.Close
 
End Sub
Private Sub Report_NoData(Annuler As Integer)
 
    MsgBox "Aucun enregistrement n'a été trouvé.", vbExclamation, "Information"
    rstEnregistrement.Close
    Annuler = True
 
End Sub
Private Sub Report_Open(Annuler As Integer)
    Dim rstRequete As DAO.QueryDef
    Set dbBase = CurrentDb
    Set rstRequete = dbBase.QueryDefs("R_Controle_Analyse")
 
    Set rstEnregistrement = rstRequete.OpenRecordset()
    'Définit le nombre de colonnes de la requête
    NbColonnes = rstRequete.Fields.Count
 
End Sub
Private Sub Initvar()
 
    Dim entX As Integer
    Total_etat = 0
 
    For entX = 1 To NbColonnes
        Total_colonnes(entX) = 0
    Next entX
 
End Sub
 
Private Sub ZoneEntêtePage_Format(Cancel As Integer, FormatCount As Integer)
' Pour la version 2002 : remplacer EntêtePage_Format par Zone EntêtePage_Format. A voir pour les autres versions
 
    Dim entX As Integer
 
    ' Met les entêtes de colonnes
    ' dans des zones de texte dans la section Entête.
    'For entX = 1 To NbColonnes
    For entX = 2 To NbColonnes
        Me("Entete" + Format(entX)) = rstEnregistrement(entX - 1).Name
    Next entX
 
    ' Crée l'entête Totaux de la prochaine zone de liste disponible.
    Me("Entete" + Format(NbColonnes + 1)) = "Totaux"
 
    ' Cache les zones de texte inutilisées dans la section Entête.
    For entX = (NbColonnes + 2) To Nombre_colonnes
        Me("Entete" + Format(entX)).Visible = False
    Next entX
End Sub