Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

ajouter un total sur un pied de groupe état croisé

1 réponse
Avatar
Gundt
Bonjour à tous,

J'ai un état basé sur une requête analyse croisée (Access 97). Il
possède un total général pour tout l'état qui fonctionne très bien.
J'ai ajouté un champ supplémentaire qui s'affiche en en-tête de groupe
et je voudrais voir afficher le total de ce groupe dans le pied de groupe.
L'état fonctionne bien mais il me manque le total par groupe.

Comme le total général est calculé par code, je pense que cela va être
pareil pour le total par groupe. Mais j'ai besoin d'un coup de main.
J'ai ajouté un ctrl indépendant dans le pied de groupe. Il reste à faire
le code.
Le ctrl du pied de groupe s'appelle : Total_etab
Le ctrl où s'affiche le total général s'appelle : Total_général (le code
se trouve dans PiedEtat4_Print).

J'ai essayé d'adapter le code du pied d'état4 mais le calcul est faux.

Merci d'avance.

Gundt


voici le code (asses long ! ) de cet état :
Option Compare Database 'Utilise l'ordre de la base de données pour
les comparaisons de chaînes.
Option Explicit


' Constantes du nombre maximum de colonnes de la requête
Const conColonnesTotales = 26

Dim dbsEtat As Database
Dim rstEtat As Recordset

' Variables pour le nombre de colonnes et pour les totaux de ligne et
d'état.
Dim intCompteColonnes As Integer
Dim lngRgTotalColonne(1 To conColonnesTotales) As Single
Dim lngTotalEtat As Single

Function inv(monchamp As String)

If Me(monchamp) = 0 Then
Me(monchamp).Visible = False
Else
Me(monchamp).Visible = True
End If

End Function

Private Sub Détail1_Format(Cancel As Integer, FormatCount As Integer)
' Place des valeurs dans les zones de texte et masque les zones inutilisées.

Dim intX As Integer
' Vérifie que ce n'est pas la fin du recordset.
If Not rstEtat.EOF Then
' Si FormatCount vaut 1, place des valeurs à partir du
recordset dans les zones de texte de la section Détail.
If Me.FormatCount = 1 Then

' For intX = 2 To intCompteColonnes avant ajout du champ
nom établissement
For intX = 3 To intCompteColonnes
' Convertit les valeurs null à 0.
Me("Col" + Format$(intX)) = xtabCNulls(rstEtat(intX - 1))
Next intX

' Masque les zones de textes inutilisées de la section Détail.
For intX = intCompteColonnes + 3 To conColonnesTotales
Me("Col" + Format$(intX)).Visible = False
Next intX

'après placement des valeurs, test si la valeur vaut zéro
et si oui, le met invisible
On Error Resume Next
' For intX = 4 To 25
For intX = 5 To 26
inv ("Col" + Format$(intX))
Next intX

' Se positionne sur l'enregistrement suivant du recordset.
rstEtat.MoveNext
End If
End If

End Sub

Private Sub Détail1_Print(Cancel As Integer, PrintCount As Integer)

Dim intX As Integer
' Dim lngTotalLigne As Long
' Changement de nature de la variable ngTotalLigne pour éviter les
arrondis de centimes.
Dim lngTotalLigne As Single

' Si PrintCount vaut 1, initialise la variable lngTotalLigne.
' Ajoute aux totaux de colonnes.
If Me.PrintCount = 1 Then
lngTotalLigne = 0

' For intX = 2 To intCompteColonnes
' ' Débute à la colonne 2 (première zone de texte avec une
valeur d'analyse croisée),
' ' calcule le total pour la ligne en cours de la section Détail.
' lngTotalLigne = lngTotalLigne + Me("Col" + Format$(intX))
' ' Ajoute la valeur d'analyse croisée au total pour la
colonne en cours.
' lngRgTotalColonne(intX) = lngRgTotalColonne(intX) +
Me("Col" + Format$(intX))
' Next intX
' For intX = 4 To intCompteColonnes avant ajout du champ nom
établissement
For intX = 5 To intCompteColonnes
' Débute à la colonne 4 (première zone de texte avec une
valeur d'analyse croisée),
' calcule le total pour la ligne en cours de la section Détail.
lngTotalLigne = lngTotalLigne + Me("Col" + Format$(intX))
' Ajoute la valeur d'analyse croisée au total pour la
colonne en cours.
lngRgTotalColonne(intX) = lngRgTotalColonne(intX) +
Me("Col" + Format$(intX))
Next intX

' Place le total de ligne dans la zone de texte de la section
Détail.
Me("Col" + Format$(intCompteColonnes + 1)) = lngTotalLigne
' Ajoute le total de ligne pour la ligne en cours au total général.
lngTotalEtat = lngTotalEtat + lngTotalLigne
End If

End Sub

Private Sub Détail1_Retreat()

' Sauvegarde toujours l'enregistrement précédent lorsque la section
Détail est reformatée.
rstEtat.MovePrevious

End Sub

Private Sub EntêteEtat3_Format(Cancel As Integer, FormatCount As Integer)

rstEtat.MoveFirst

'Initialise les variables.
InitVars

End Sub

Private Sub EntêtePage0_Format(Cancel As Integer, FormatCount As Integer)

Dim intX As Integer

' Place les en-têtes de colonnes dans les zones de texte de
l'en-tête de page.
For intX = 1 To intCompteColonnes
Me("Tête" + Format$(intX)) = rstEtat(intX - 1).Name
Next intX

' Rend le prochain en-tête de zone de texte Totaux disponible.
Me("Tête" + Format$(intCompteColonnes + 1)) = "Tot/mal"

' Masque les zones de texte inutilisées de l'en-tête de page.
For intX = (intCompteColonnes + 2) To conColonnesTotales
Me("Tête" + Format$(intX)).Visible = False
Next intX

End Sub

Private Sub InitVars()


Dim intX As Integer

' Initialise la variable lngTotalEtat
lngTotalEtat = 0

' Initialise le tableau qui stocke les totaux de colonnes.
For intX = 1 To conColonnesTotales
lngRgTotalColonne(intX) = 0
Next intX

End Sub
Private Sub PiedEtat4_Print(Cancel As Integer, PrintCount As Integer)


Dim intX As Integer
For intX = 5 To intCompteColonnes
Me("Tot" + Format$(intX)) = lngRgTotalColonne(intX)
Next intX

' Place le total général dans la zone de texte du pied d'état.
Me("Tot" + Format$(intCompteColonnes + 1)) = lngTotalEtat
Me("Total_général") = lngTotalEtat

' Masque les zones de texte inutilisées du pied d'état.
For intX = intCompteColonnes + 4 To conColonnesTotales
Me("Tot" + Format$(intX)).Visible = False
Next intX


' Positionne le total général dans la zone de texte du pied d'état.
'Me("Tot" + Format$(IColCnt + 1)) = RptTotal
' Me("Total_général") = RptTotal


End Sub


Private Sub Report_Close()

On Error Resume Next

' Ferme le recordset.
rstEtat.Close

End Sub


Private Sub Report_NoData(Cancel As Integer)

MsgBox "Aucun enregistrement ne correspond au critère.", 48, "Aucun
enregistrement trouvé"
rstEtat.Close
Cancel = True
End Sub


Private Sub Report_Open(Cancel As Integer)
' Crée un recordset sous-jacent pour l'état en utilisant le critère
' entré dans le formulaire Boîte dialogue Ventes employés

Dim intX As Integer
Dim qdf As QueryDef

' N'ouvre pas l'état si le formulaire Bte de dial Etat récap BL
malades
' n'est pas chargé.
If Not (EstChargé("Bte de dial Etat récap BL malades")) Then
Cancel = True
MsgBox "Pour visualiser ou imprimer cet état, ouvrez le
formulaire Bte de dial Etat récap BL malades", 48, "Vous devez ouvrir la
boîte de dialogue"
Exit Sub
End If

' Définit la variable de base de données avec la base de données en
cours.
Set dbsEtat = CurrentDb()

' Ouvre le QueryDef.
Set qdf = dbsEtat.QueryDefs("Toutes cdes malades/mois Analyse*")
qdf.PARAMETERS("Forms![Bte de dial Etat récap BL malades]![Mois]")
= Forms![Bte de dial Etat récap BL malades]![Mois]
qdf.PARAMETERS("Forms![Bte de dial Etat récap BL
malades]![Année]") = Forms![Bte de dial Etat récap BL malades]![Année]

Set rstEtat = qdf.OpenRecordset()
' Définit une variable pour maintenir le nombre de colonnes dans la
requête analyse croisée.
intCompteColonnes = rstEtat.Fields.Count

DoCmd.Maximize
End Sub

Private Function xtabCNulls(varX As Variant)

' Teste si une valeur est null.
If IsNull(varX) Then
' Si varX est null, attribue 0 à varX.
xtabCNulls = 0
Else
' Autrement, renvoie varX.
xtabCNulls = varX
End If

End Function

1 réponse

Avatar
Gundt
bonjour à tous,

J'ai modifié l'état croisé avec maintenant un regroupement
supplémentaire. Il s'affiche bien mais les calculs sont faux. :-(
Il affiche en colonne le nom, prénom, des montants en euros dans les
colonnes calculées (jours ouvrés du mois) + 1 dernière colonne : total
de la ligne.
A la fin de chaque groupe (établissement), un total de chaque colonne
(jours) et un total du groupe.

Et à la fin de l'état, un total en colonne de chaque jour et le total
général.

Seuls les totaux en ligne sont bons.
En colonne : seuls les calculs pour le 1er regroupement sont exacts.

Les totaux de colonne par groupe sont faux (il reprend les valeurs du
1er regroupement si elles existent (dans le 1er) sinon il fait le total
du groupe en cours.
Le total par groupe est faux aussi : il trouve une valeur que je ne
retrouve nulle part.

Donc, je pense qu'il faudrait réinitialiser les variables après chaque
établissement.

Mais c'est là que j'aurai besoin d'un coup de main.

Voici le code dans le pied de groupe que j'ai ajouté :
Private Sub PiedGroupe0_Print(Cancel As Integer, PrintCount As Integer)

Dim int2X As Integer
Dim lngTotalLigne2 As Single

' Place les totaux de colonne dans les zones de texte du pied d'état.
'Débute en colonne 5 (première zone de texte avec la valeur analyse
croisée).
For int2X = 5 To intCompteColonnes
Me("Tot" + Format$(int2X)) = lngRgTotalColonne(int2X)
Next int2X

' Place le total général dans la zone de texte du pied d'état.
Me("Tot" + Format$(intCompteColonnes + 1)) = lngTotalpartiel
Me("Total_etab") = lngTotalpartiel

' Masque les zones de texte inutilisées du pied d'état.
For int2X = intCompteColonnes + 5 To conColonnesTotales
Me("Tot" + Format$(int2X)).Visible = False
Next int2X
End Sub
-------------------------------------------------
Le code du pied d'état que j'ai modifié :
Private Sub PiedEtat4_Print(Cancel As Integer, PrintCount As Integer)

Dim intX As Integer
For intX = 5 To intCompteColonnes
Me("Totg" + Format$(intX)) = lngRgTotalColonne(intX)
Next intX

' Place le total général dans la zone de texte du pied d'état.
Me("Totg" + Format$(intCompteColonnes + 1)) = lngTotalEtat
Me("Total_général") = lngTotalEtat

' Masque les zones de texte inutilisées du pied d'état.
For intX = intCompteColonnes + 4 To conColonnesTotales
Me("Totg" + Format$(intX)).Visible = False
Next intX

End Sub

------------------------------------------------------------

Le code d'origine (qui permettait de calculer uniquement le total
général dans le pied d'état) était :
' code d'origine du calcul total général :

Private Sub PiedEtat4_Print(Cancel As Integer, PrintCount As Integer)

Dim intX As Integer

' Place les totaux de colonne dans les zones de texte du pied d'état.
For intX = 5 To intCompteColonnes
Me("Tot" + Format$(intX)) = lngRgTotalColonne(intX)
Next intX

' Place le total général dans la zone de texte du pied d'état.
Me("Tot" + Format$(intCompteColonnes + 1)) = lngTotalEtat
Me("Total_général") = lngTotalEtat

' Masque les zones de texte inutilisées du pied d'état.
For intX = intCompteColonnes + 4 To conColonnesTotales
Me("Tot" + Format$(intX)).Visible = False
Next intX

End Sub

------------------------------------------------

Je suppose donc que les variables doivent être réinitialisées. Mais
comment faire et peut-être que mon code n'est pas top ?

Si quelqu'un spécialiste dans le code pouvait m'éclairer, merci d'avance.

Gundt