TraitementDonnees.bas 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. Option Compare Database
  2. Public Function suppression(Tbl As String, ByVal CodeAgent As String, ByVal moisRH As Integer, ByVal anneeRH As Integer, avertissement As Integer)
  3. 'ATTENTION: fonction à utiliser avec précaution (ajouter éventuellement une distinction entre valide et invalide)
  4. If avertissement = 0 Then DoCmd.SetWarnings False
  5. DoCmd.RunSQL "DELETE " & Tbl & ".*, " & Tbl & ".CodeAgent, " & Tbl & ".MoisRH, " & Tbl & ".AnneeRH " & _
  6. "FROM " & Tbl & " " & _
  7. "WHERE (((" & Tbl & ".CodeAgent)='" & CodeAgent & "') AND ((" & Tbl & ".MoisRH)=" & moisRH & ") AND ((" & Tbl & ".AnneeRH)=" & anneeRH & "));"
  8. DoCmd.SetWarnings True
  9. End Function
  10. Public Function invalidation(Tbl As String, ByVal CodeAgent As String, ByVal moisRH As Integer, ByVal anneeRH As Integer, avertissement As Integer)
  11. If avertissement = 0 Then DoCmd.SetWarnings False
  12. DoCmd.RunSQL "UPDATE " & Tbl & " SET " & Tbl & ".Valide = False " & _
  13. "WHERE (((" & Tbl & ".CodeAgent)='" & CodeAgent & "') AND ((" & Tbl & ".MoisRH)=" & moisRH & ") AND ((" & Tbl & ".AnneeRH)=" & anneeRH & "));"
  14. DoCmd.SetWarnings True
  15. End Function
  16. Public Function CumulHS(CodeAgent As String, DateRH As Date) '!!! Obsolete
  17. Dim moisRH, anneeRH As Integer
  18. Dim rs As DAO.Recordset
  19. Dim TotalHS, diff As Double
  20. 'total des heures sup du mois (tout compris) jusqu'à la date indiquée
  21. moisRH = Month(DateRH)
  22. anneeRH = Year(DateRH)
  23. TotalHS = 0
  24. Set rs = CurrentDb.OpenRecordset("SELECT tbl_ImportRH.CodeAgent, tbl_ImportRH.DateRH, Month([dateRH]) AS moisRH, Year([dateRH]) AS anneeRH, tbl_ImportRH.HeureSup1, tbl_ImportRH.HeureSup2, tbl_ImportRH.HeureSupDimanche " & _
  25. "FROM tbl_ImportRH " & _
  26. "WHERE (((tbl_ImportRH.codeagent) = '" & CodeAgent & "') And ((Month([dateRH])) = " & moisRH & ") And ((Year([dateRH])) = " & anneeRH & ")) " & _
  27. "ORDER BY tbl_ImportRH.DateRH;")
  28. rs.MoveFirst
  29. Do Until rs.EOF = True
  30. If rs![DateRH] > DateRH Then Exit Do
  31. TotalHS = TotalHS + rs![HeureSup1] + rs![HeureSup2] + rs![HeureSupDimanche]
  32. If rs![DateRH] = DateRH Then Exit Do
  33. rs.MoveNext
  34. Loop
  35. CumulHS = TotalHS
  36. End Function
  37. Sub test()
  38. MsgBox Itineraire("r_FormDep_1", "Localisation", "T32", 2, 12, 2013)
  39. End Sub
  40. Public Function Itineraire(Requete, Source, ByVal CodeAgent, ByVal JourRH As Integer, ByVal moisRH As Integer, ByVal anneeRH As Integer)
  41. Dim rst As DAO.Recordset
  42. Dim critere, strSQL As String
  43. Itineraire = ""
  44. critere = "[CodeAgent]='" & CodeAgent & "' AND [JourRH]=" & JourRH & " AND [MoisRH]=" & moisRH & " AND [AnneeRH]=" & anneeRH
  45. strSQL = "SELECT " & Requete & ".* FROM " & Requete & " WHERE " & critere & ";"
  46. If DCount(Source, Requete, critere) = 0 Then
  47. Exit Function
  48. End If
  49. Set rst = CurrentDb.OpenRecordset(strSQL)
  50. rst.MoveFirst
  51. Itineraire = Nz(rst(Source), "")
  52. If rst.RecordCount > 1 Then
  53. rst.MoveNext
  54. Do Until rst.EOF
  55. Itineraire = Itineraire & "-" & Nz(rst(Source), "")
  56. rst.MoveNext
  57. Loop
  58. End If
  59. Set rst = Nothing
  60. End Function
  61. Public Function HSinf14(H1 As Double, CodeAgent As String, DateRH As Date)
  62. Dim moisRH, anneeRH As Integer
  63. Dim rs As DAO.Recordset
  64. Dim TotalHS As Double
  65. moisRH = Month(DateRH)
  66. anneeRH = Year(DateRH)
  67. JourRH = Day(DateRH)
  68. TotalHS = 0
  69. If JourRH = 1 Then
  70. If H1 > 14 Then
  71. HSinf14 = 14
  72. Else
  73. HSinf14 = H1
  74. End If
  75. Else
  76. 'calcul du total des heures sup jusqu'à cette date
  77. Set rs = CurrentDb.OpenRecordset("SELECT r_HeuresSup.CodeAgent, r_HeuresSup.JourRH, r_HeuresSup.moisRH, r_HeuresSup.anneeRH, r_HeuresSup.HS, r_HeuresSup.HSNuit, r_HeuresSup.HeureSupDimanche " & _
  78. "FROM r_HeuresSup " & _
  79. "WHERE ((r_HeuresSup.codeagent) = '" & CodeAgent & "') And ((r_HeuresSup.moisRH) = " & moisRH & ") And ((r_HeuresSup.anneeRH) = " & anneeRH & ") " & _
  80. "ORDER BY r_HeuresSup.JourRH;")
  81. rs.MoveFirst
  82. Do Until rs.EOF = True
  83. If rs![JourRH] > JourRH - 1 Then Exit Do
  84. TotalHS = TotalHS + Nz(rs![HS], 0) + Nz(rs![HSNuit], 0) + Nz(rs![HeureSupDimanche], 0)
  85. If rs![JourRH] = JourRH - 1 Then Exit Do
  86. rs.MoveNext
  87. Loop
  88. Debug.Print JourRH, TotalHS
  89. If TotalHS > 14 Then
  90. HSinf14 = 0
  91. ElseIf TotalHS + H1 > 14 Then
  92. HSinf14 = 14 - TotalHS
  93. Else
  94. HSinf14 = H1
  95. End If
  96. End If
  97. End Function
  98. Public Function HSsup14(H1 As Double, CodeAgent As String, DateRH As Date)
  99. Dim moisRH, anneeRH As Integer
  100. Dim rs As DAO.Recordset
  101. Dim TotalHS As Double
  102. moisRH = Month(DateRH)
  103. anneeRH = Year(DateRH)
  104. JourRH = Day(DateRH)
  105. TotalHS = 0
  106. If JourRH = 1 Then
  107. If H1 > 14 Then
  108. HSsup14 = H1 - 14
  109. Else
  110. HSsup14 = 0
  111. End If
  112. Else
  113. 'calcul du total des heures sup jusqu'à cette date
  114. Set rs = CurrentDb.OpenRecordset("SELECT r_HeuresSup.CodeAgent, r_HeuresSup.JourRH, r_HeuresSup.moisRH, r_HeuresSup.anneeRH, r_HeuresSup.HS, r_HeuresSup.HSNuit, r_HeuresSup.HeureSupDimanche " & _
  115. "FROM r_HeuresSup " & _
  116. "WHERE ((r_HeuresSup.codeagent) = '" & CodeAgent & "') And ((r_HeuresSup.moisRH) = " & moisRH & ") And ((r_HeuresSup.anneeRH) = " & anneeRH & ") " & _
  117. "ORDER BY r_HeuresSup.JourRH;")
  118. rs.MoveFirst
  119. Do Until rs.EOF = True
  120. If rs![JourRH] > JourRH - 1 Then Exit Do
  121. TotalHS = TotalHS + Nz(rs![HS], 0) + Nz(rs![HSNuit], 0) + Nz(rs![HeureSupDimanche], 0)
  122. If rs![JourRH] = JourRH - 1 Then Exit Do
  123. rs.MoveNext
  124. Loop
  125. If TotalHS > 14 Then
  126. HSsup14 = H1
  127. ElseIf TotalHS + H1 > 14 Then
  128. HSsup14 = (TotalHS + H1) - 14
  129. Else
  130. HSsup14 = 0
  131. End If
  132. End If
  133. End Function
  134. Public Function Bareme(NomBareme As String, Valeur As Double, ByVal moisRH As Integer, ByVal anneeRH As Integer)
  135. Dim rs As DAO.Recordset
  136. Dim PeriodeValidite As Integer
  137. PeriodeValidite = PeriodeBareme(NomBareme, moisRH, anneeRH)
  138. Set rs = CurrentDb.OpenRecordset("SELECT * FROM tbl_baremes WHERE [NomBareme]='" & NomBareme & "' AND [PeriodeValidite]=" & PeriodeValidite & ";")
  139. If rs.RecordCount = 0 Then
  140. Bareme = 0
  141. Exit Function
  142. End If
  143. rs.MoveFirst
  144. If Nz(rs![BorneInf], "") = "" And Nz(rs![BorneSup], "") = "" Then
  145. Bareme = rs![Valeur]
  146. Exit Function
  147. End If
  148. Do Until rs.EOF = True
  149. If Valeur >= rs![BorneInf] And Valeur <= rs![BorneSup] Then
  150. Bareme = rs![Valeur]
  151. Exit Function
  152. End If
  153. rs.MoveNext
  154. Loop
  155. Bareme = -1
  156. End Function
  157. Public Function AnalyseDonnees(IDSuivi As Double, ByVal CodeAgent As String, ByVal moisRH As Integer, ByVal anneeRH As Integer, ByVal avertissement As Integer)
  158. Dim critere, sql As String
  159. Dim JourRH As Integer
  160. Dim rsS, rsC As Recordset 'recordset source, recordset cible
  161. 'ATTENTION: la requête d'insertion dans tbl_formHS utilise des résultat de la table tbl_FormDep. Celle-ci doit donc impérativement être remplie en premier.
  162. If CodeAgent = "" Or Not anneeRH > 2000 Or Not moisRH <= 12 Or Not moisRH > 0 Then
  163. AnalyseDonnees = -1
  164. Exit Function
  165. End If
  166. Call AfficherMsgProgression("Traitement", "Analyse des données de " & CodeAgent & " (" & moisRH & "/" & anneeRH & ")")
  167. Call MajMsgProgression(1, 5)
  168. DoEvents
  169. 'CREATION FORM DEPLACEMENTS
  170. 'vérification
  171. If VerifEtat("tbl_FormDep", CodeAgent, moisRH, anneeRH, avertissement) = -1 Then Exit Function '4e arg=0 pour pas d'avertissement avant MAJ/Suppr
  172. 'ajout des lignes à tbl_formDep
  173. critere = "[CodeAgent]='" & CodeAgent & "' AND [MoisRH]=" & moisRH & " AND [AnneeRH]=" & anneeRH
  174. sql = "INSERT INTO tbl_FormDep ( AnneeRH, MoisRH, CodeAgent, JourRH, Distance1_perso, Distance2_perso, Distance2_service, Itineraire, HeuresDep, HeuresDepNuit, " & _
  175. "Repas, IDSuivi, Valide, CreePar, CreeLe ) " & _
  176. "SELECT r_FormDep2.AnneeRH, r_FormDep2.MoisRH, r_FormDep2.CodeAgent, r_FormDep2.JourRH, r_FormDep2.SommeDeDistance1_perso AS Distance1_perso, " & _
  177. "r_FormDep2.SommeDeDistance2_perso AS Distance2_perso, r_FormDep2.SommeDeDistance2_service AS Distance2_service, r_FormDep2.Itineraire, " & _
  178. "r_FormDep2.SommeDeHeuresDep AS HeuresDep, r_FormDep2.SommeDeHeuresDepNuit AS HeuresDepNuit, r_FormDep2.SommeDeRepas AS Repas, " & _
  179. "" & IDSuivi & " AS Expr1, True AS Expr3, '" & Environ("username") & "' AS Expr4, Now() AS Expr5 " & _
  180. "FROM r_FormDep2 " & _
  181. "WHERE " & critere & ";"
  182. 'Debug.Print sql
  183. If avertissement = 0 Then DoCmd.SetWarnings False
  184. DoCmd.RunSQL sql
  185. DoCmd.SetWarnings True
  186. Call MajMsgProgression(3, 5)
  187. 'CREATION FORM HEURES SUP
  188. 'vérification
  189. If VerifEtat("tbl_FormHS", CodeAgent, moisRH, anneeRH, avertissement) = -1 Then Exit Function '4e arg=0 pour pas d'avertissement avant MAJ/Suppr
  190. 'ajout des lignes à tbl_formHS
  191. critere = "[CodeAgent]='" & CodeAgent & "' AND [MoisRH]=" & moisRH & " AND [AnneeRH]=" & anneeRH
  192. sql = "INSERT INTO tbl_FormHS ( CodeAgent, JourRH, MoisRH, AnneeRH, HeureSup1, HeuresDep, HeuresDepNuit, " & _
  193. "[HeureSup1<=14], [HeureSup1>14], HeureSupNuit, HeureSupDim, HS_VHCanal, HS_Chantier, CreePar, CreeLe, Valide, IDSuivi ) " & _
  194. "SELECT r_HeuresSup2.CodeAgent, r_HeuresSup2.JourRH, r_HeuresSup2.MoisRH, r_HeuresSup2.AnneeRH, " & _
  195. "r_HeuresSup2.HeureSup1, r_HeuresSup2.HeuresDep, r_HeuresSup2.HeuresDepNuit, " & _
  196. "r_HeuresSup2.[H<14], r_HeuresSup2.[H>14], r_HeuresSup2.HSNuit, r_HeuresSup2.HeureSupDimanche, HS_VHCanal, HS_Chantier, " & _
  197. "'" & Environ("Username") & "' AS Expr2, Now() AS Expr3, True AS Expr4, " & IDSuivi & " As Expr5 " & _
  198. "FROM r_HeuresSup2 " & _
  199. "WHERE " & critere & " " & _
  200. "ORDER BY [JourRH];"
  201. 'Debug.Print sql
  202. If avertissement = 0 Then DoCmd.SetWarnings False
  203. DoCmd.RunSQL sql
  204. DoCmd.SetWarnings True
  205. Call MajMsgProgression(4, 5)
  206. 'AnalyseDonnees = Nz(VerifCompteLignes(CodeAgent, moisRH, anneeRH), -1)
  207. Call MajMsgProgression(5, 5)
  208. 'résultat: -1 -> erreur inconnue ou mauvais paramètres d'entrée
  209. ' 0 -> erreur dans le décompte des lignes
  210. '1-> parait être bon
  211. End Function
  212. Public Function TypeAuto(CodeAgent As String, moisRH As Integer, anneeRH As Integer)
  213. Dim critere As String
  214. Dim DateRH, validite As Date
  215. Dim puissance As Double
  216. 'dateRH = CDate("#15/" & moisRH & "/" & anneeRH & "#")
  217. 'validite = LigneValide("tbl_Agents", dateRH, "[CodeAgent]='" & CodeAgent & "'")
  218. critere = "[CodeAgent]='" & CodeAgent & "'"
  219. If DLookup("TypeVehicule", "r_Agents", critere) = 1 Then
  220. puissance = Nz(DLookup("PuissanceFiscVP", "r_Agents", critere), 1)
  221. TypeAuto = Bareme("Puissance Fiscale", puissance, moisRH, anneeRH)
  222. Else
  223. TypeAuto = ""
  224. End If
  225. End Function
  226. Public Function DistanceAnnee(CodeAgent As String, moisRH As Integer, anneeRH As Integer)
  227. 'cette fonction renvoie le nombre de kilomètres parcourus par l'agent depuis le début de l'année
  228. 'jusqu'au mois indiqué NON-COMPRIS
  229. 'Cette fonction est utilisée dans le calcul des frais kilométriques
  230. 'Des kilomètres additionnels peuvent être ajoutés manuellement lors de la création d'un nouvel agent (cf. tbl_KmSuppl)
  231. Dim rs As DAO.Recordset
  232. Dim Distance As Double
  233. Dim KmSuppl As Double
  234. If CodeAgent = "" Or Not anneeRH > 2000 Or Not moisRH <= 12 Or Not moisRH > 0 Then
  235. DistanceAnnee = 0
  236. MsgBox "Erreur Paramètres dans l'appel de la fonction DistanceAnnee"
  237. Exit Function
  238. End If
  239. DistanceAnnee = 0
  240. 'recherche d'éventuels km supplémentaires
  241. KmSuppl = Nz(DSum("KmSuppl", "tbl_KmSuppl", "[CodeAgent]='" & CodeAgent & "' AND [AnneeRH]=" & anneeRH), 0)
  242. DistanceAnnee = KmSuppl
  243. If moisRH = 1 Then 'cas du mois de janvier
  244. Exit Function
  245. End If
  246. Set rs = CurrentDb.OpenRecordset("SELECT tbl_FormDep.CodeAgent, tbl_FormDep.JourRH, tbl_FormDep.MoisRH, tbl_FormDep.AnneeRH, tbl_FormDep.Distance2_perso, tbl_FormDep.Distance1_perso, [Distance2_perso]+[Distance1_perso] AS DistancePerso " & _
  247. "FROM tbl_FormDep WHERE (((tbl_FormDep.CodeAgent)='" & CodeAgent & "') AND ((tbl_FormDep.MoisRH)<" & moisRH & ") AND ((tbl_FormDep.AnneeRH)=" & anneeRH & "));")
  248. Distance = 0
  249. If rs.RecordCount > 0 Then
  250. rs.MoveFirst
  251. Do Until rs.EOF = True
  252. Distance = Distance + rs![DistancePerso]
  253. rs.MoveNext
  254. Loop
  255. End If
  256. DistanceAnnee = DistanceAnnee + Distance
  257. End Function
  258. Public Function NvellePeriode(ByVal table As String, ByVal Champ1_valeur As String, ByVal DateInf As Date)
  259. 'cette fonction permet la création d'une nouvelle periode de validité dans la table tbl_Periodebareme ou tbl_PeriodeAgent
  260. 'le champ1 correspond selon la table au code de l'agent ou au nom du bareme
  261. 'la fonction attribue une date de fin à l'ancienne periode, créé la nouvelle période, et lui attribue un nouveau code et une date de début
  262. Dim rs As DAO.Recordset
  263. Dim champ1_nom, sql, msg As String
  264. Dim conflit, avertissement, CodePeriode, AnciennePeriode As Integer
  265. Dim dateconflit As Date
  266. Set rs = CurrentDb.OpenRecordset(table)
  267. champ1_nom = rs.Fields(0).Name
  268. avertissement = parametre("avertSQL")
  269. conflit = CtrlValidite(table, Champ1_valeur, DateInf)
  270. CodePeriode = Nz(DMax("[CodePeriode]", table, "[" & champ1_nom & "]='" & Champ1_valeur & "'"), 0) + 1
  271. 'la fonction CtrlValidite renvoie le code de la période avec laquelle la nouvelle date entre en conflit
  272. 'si ce code est positif, la nouvelle date est comprise dans la période en question
  273. 's'il est négatif, elle y est antérieure et la date de fin sera automatiquement remplie
  274. If conflit <> 0 Then
  275. Select Case conflit
  276. Case Is < 0
  277. dateconflit = DLookup("[DateInf]", table, "[" & champ1_nom & "]='" & Champ1_valeur & "' AND [CodePeriode]=" & -1 * conflit)
  278. If IsNull(dateconflit) Then
  279. msg = "Erreur: conflit avec la periode " & -1 * conflit & ". Veuillez vérifier la date de début de cette période ou contacter un administrateur."
  280. NvellePeriode = 0
  281. Exit Function
  282. Else
  283. msg = "ATTENTION: La date choisie est antérieure à une période existante (période " & -1 * conflit & ") dont la date de début est " & _
  284. dateconflit & "." & vbNewLine & "Si vous continuez, la date de fin de la période en création sera automatiquement enregistrée comme étant " & dateconflit - 1 & "."
  285. If MsgBox(msg, vbYesNo) = vbNo Then
  286. NvellePeriode = 0
  287. Exit Function
  288. End If
  289. End If
  290. Case Is > 0
  291. msg = "ATTENTION: La date choisie est comprise dans une période existante (période " & conflit & "). " & vbNewLine & "Veuillez choisir une autre date ou contacter un administrateur."
  292. MsgBox msg
  293. NvellePeriode = 0
  294. Exit Function
  295. End Select
  296. End If
  297. msg = "Une nouvelle période va être créée qui prendra effet à compter du " & DateInf
  298. If MsgBox(msg, vbYesNo) = vbNo Then
  299. NvellePeriode = 0
  300. Exit Function
  301. End If
  302. If avertissement = 0 Then DoCmd.SetWarnings False
  303. Select Case conflit
  304. Case 0
  305. AnciennePeriode = Nz(DLookup("[CodePeriode]", table, "[" & champ1_nom & "]='" & Champ1_valeur & "' AND [DateSup] is null"), 0)
  306. 'fermeture de l'ancienne periode
  307. If AnciennePeriode <> 0 Then
  308. sql = "UPDATE " & table & " SET " & table & ".DateSup = Format(#" & CDate(DateInf) - 1 & "#,'mm/dd/yyyy') " & _
  309. "WHERE (((" & table & "." & champ1_nom & ")='" & Champ1_valeur & "') AND ((" & table & ".CodePeriode)=" & AnciennePeriode & "));"
  310. DoCmd.RunSQL sql
  311. End If
  312. 'creation de la nouvelle periode
  313. rs.AddNew
  314. rs(champ1_nom) = Champ1_valeur
  315. rs![DateInf] = CDate(DateInf)
  316. rs![CodePeriode] = CodePeriode
  317. rs.Update
  318. Case Is < 0
  319. 'creation de la nouvelle periode avec pour date de fin la veille de la période qui suit
  320. rs.AddNew
  321. rs(champ1_nom) = Champ1_valeur
  322. rs![DateInf] = DateInf
  323. rs![DateSup] = dateconflit - 1
  324. rs![CodePeriode] = CodePeriode
  325. rs.Update
  326. End Select
  327. DoCmd.SetWarnings True
  328. NvellePeriode = CodePeriode
  329. End Function
  330. Public Function EtatSuivi(CodeAgent As String, moisRH As Integer, anneeRH As Integer)
  331. 'renvoie l'état des données depuis tbl_SuiviRH
  332. Dim critere As String
  333. If CodeAgent <> "" And anneeRH > 2000 And moisRH <= 12 And moisRH > 0 Then
  334. critere = "[CodeAgent]='" & CodeAgent & "' AND [MoisRH]=" & moisRH & " AND [AnneeRH]=" & anneeRH
  335. If Nz(DLookup("[Edite]", "tbl_SuiviRH", critere), False) = False Then
  336. EtatSuivi = Nz(DLookup("[Etat]", "tbl_SuiviRH", critere), "Pas de données")
  337. Else
  338. EtatSuivi = "Edité"
  339. End If
  340. Else
  341. EtatSuivi = "erreur"
  342. End If
  343. End Function