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
| Sub CalculerUneLigne(MyidCategorie As Long, MyidPere As Long)
'Calculer une ligne du résultat avec récursivité
'Totaux calculés et mis dans le père par des requêtes SQL
Dim MesFils As DAO.Recordset
Dim MesCumuls As DAO.Recordset
'sélectionner les fils de la ligne courante
MySELECT = "SELECT idCategorie, idPere "
MyFROM = "FROM TempResultat "
MyWHERE = "WHERE (idCategorie <> 0) AND (idPere = " & MyidCategorie & ") "
MyQuery = MySELECT & MyFROM & MyWHERE & ";"
Set MesFils = CurrentDb.OpenRecordset(MyQuery)
's'il y a des fils, chercher leurs fils
'prendre leurs fils un par un jusqu'au dernier
'si un de ces fils a lui-même des fils, refaire le même processus (récursivité)
'sinon ajouter son montant (du fils) au total (du père)
If MesFils.BOF And MesFils.EOF Then
'ne rien faire: il n'y a pas de fils
Else
MesFils.MoveFirst
While Not MesFils.EOF
'pour chacun des fils, aller voir si le fils a lui-même des fils, etc. (récursivité)
Call CalculerUneLigne(MesFils!idCategorie, MesFils!idPere)
MesFils.MoveNext
Wend
'prendre le père et faire le total de tous ses fils et mettre ce total dans le père
MesFils.MoveFirst
'faire le total des fils
MyFROM = "FROM TempResultat AS ttt INNER JOIN Categories as aaa ON ttt.IdCategorie = aaa.IdCategorie "
MySELECT = "SELECT aaa.idPere, Sum(ttt.SumOperation) "
MyWHERE = "WHERE (aaa.idPere=" & MesFils!idPere "
MyGROUPBY = "GROUP BY aaa.idPere "
MyQuery = MySELECT & MyFROM & MyWHERE & MyGROUPBY & ";"
Set MesCumuls = CurrentDb.OpenRecordset(MyQuery)
'mettre ce total dans le père
MesCumuls.MoveFirst
MyUPDATE = "UPDATE TempResultat AS ttt "
MySET = "SET ttt.SumOperation = '" & MesCumuls(1) & " "
MyWHERE = "WHERE (ttt.IdCategorie=" & MesFils!idPere & ") "
MyQuery = MyUPDATE & MySET & MyWHERE & ";"
DoCmd.RunSQL MyQuery
MesCumuls.Close
Set MesCumuls = Nothing
End If
MesFils.Close
Set MesFils = Nothing
End Sub |
Partager