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
| Option Compare Database
Option Explicit
'variables visibles dans toutes les procédures de ce formulaire
'les 3 variables servant au filtre
Dim m_FiltreDateD As String
Dim m_FiltreDateF As String
Dim m_FiltreExp As String
'variables qui évite de réecrire le Sql fixe du record source du sous-formulaire1, elle est à l'ouverture du formulaire1 dans le Form-Load()
Dim m_strSqlSForm1 As String
'variables qui contient le filtre à appliquer sur le Sql du record source du sous-formulaire1,
'elle est initialisée dans le SForms_RecordSource() à une chaine vide ("") quand aucun filtre est rempli, comme à l'ouverture du formulaire1,
'du coup tous les enregistrements sont visibles dans les 2 sous-formulaires
Dim m_FiltreSform1 As String
'
Private Sub Form_Load()
' initialise le Sql du record source du sous-formulaire1 [cat] et aussi une partie du sous-formulaire [reqprod sous-formulaire1]
m_strSqlSForm1 = _
"SELECT to2018.Tope, Tore.produits, [T_famille produit].[FAMILLE PRODUIT], [T_Expe rece].recept, to2018.[Date Expédition], Sum(to2018.[Poids (Kg)]) AS [SommeDePoids (Kg)] " & _
"FROM [T_Expe rece] INNER JOIN ((Tore INNER JOIN to2018 ON Tore.take = to2018.[Tope]) INNER JOIN [T_famille produit] ON Tore.famille = [T_famille produit].[FAMILLE PRODUIT]) ON [T_Expe rece].recept = to2018.[Récep/Expéd] " & _
"GROUP BY to2018.Tope, Tore.produits, [T_famille produit].[FAMILLE PRODUIT], [T_Expe rece].recept, to2018.[Date Expédition]"
SForms_RecordSource ' initialise les records sources des 2 sous-formulaires, ils affiches ici tous les enregistrements
End Sub
Private Sub SForm1_RecordSource()
' ici on voit que le Record Source et formé de 2 variables,
' la première m_strSqlSForm1 initialisée à l'ouverture dans la Sub Form_Load()
' la seconde m_FiltreSform1 initialisée dans la Sub SForms_RecordSource()
' et ajout du ';' pour clore le Sql
Me.cat.Form.RecordSource = m_strSqlSForm1 & m_FiltreSform1 & ";"
End Sub
'affectations du filtre Me!Debut à la variable m_FiltreDateD
Private Sub Debut_AfterUpdate()
m_FiltreDateD = IIf(Nz(Me.Debut, 0) = 0, "", "[Date Expédition]<= #" & Format(Me!Debut, "mm/dd/yyyy") & "#")
SForms_RecordSource
End Sub
'affectations du filtre sur Me!Fin à la variable m_FiltreDateF
Private Sub Fin_AfterUpdate()
m_FiltreDateF = IIf(Nz(Me.Fin, 0) = 0, "", "[Date Expédition]>= #" & Format(Me!Fin, "mm/dd/yyyy") & "#")
SForms_RecordSource
End Sub
'affectations du filtre sur Me!filtrerecep à la variable m_FiltreExp
Private Sub filtrerecep_AfterUpdate()
m_FiltreExp = IIf(Nz(Me.filtrerecep, "") = "", "", "recept=""" & Me!filtrerecep & """")
SForms_RecordSource
End Sub
Private Sub SForms_RecordSource()
'calcul du filtre à appliquer aux records sources des 2 sous foemulaire
' pour le calcul du filtre "m_FiltreSform1", on ne sait pas lequel des 3 contrôles de filtre l'utilisateur va utiliser,
' donc cette série de 5 IIf pour en venir à bout des 3 filtres.
' la première difficulté est de concaténer les filtres actifs en les séparant par des " And " là où il y en a besoin.
m_FiltreSform1 = IIf(m_FiltreExp = "", "", m_FiltreExp) & _
IIf(m_FiltreDateD = "", "", IIf(m_FiltreExp = "", m_FiltreDateD, " And " & m_FiltreDateD)) & _
IIf(m_FiltreDateF = "", "", IIf(m_FiltreExp = "" And m_FiltreDateD = "", m_FiltreDateF, " And " & m_FiltreDateF))
' la deuxième difficulté est de concatténer le Sql du Record Source avec le filtre
' en ajouter devant le filtre " Having " que si le filtre n'est pas vide. ('Having' parce qu'il y a un regroupement dans le Sql autrement ça aurait été 'Where')
If m_FiltreSform1 <> "" Then
m_FiltreSform1 = " Having " & m_FiltreSform1
Else
m_FiltreSform1 = ""
End If
' affectation du Sql au sous-formulaire [cat]
SForm1_RecordSource
' ce qui suit est une requête imbriquée, j'ai fait comme toi dans tes requêtes,
' c'est ce qui permet au sous-formulaire [reqprod sous-formulaire1] d'afficher les bons resultats
' je selectionne [produits] que je regroupe et [SommeDePoids (Kg)] que j'additionne depuis la requête que j'appelle R2,
' et qui est définie par "FROM (" & m_strSqlSForm1 & m_FiltreSform1 & ") as R2 ",
' qui est le record source de sous-formulaire [cat]
' R2 est ta requête 'reqexpo' mais filtrée, d'ou tu tires [produits] et [SommeDePoids (Kg)].
' Il en résulte que le sous-formulaire [reqprod sous-formulaire1] est filtré par le record source du sous-formulaire [cat],
Me.[reqprod sous-formulaire1].Form.RecordSource = _
"SELECT R2.produits, Sum(R2.[SommeDePoids (Kg)]) AS [SommeDeSommeDePoids (Kg)] " & _
"FROM (" & m_strSqlSForm1 & m_FiltreSform1 & ") as R2 " & _
"GROUP BY R2.produits;"
End Sub |
Partager