je vous offre ce petit bout de code permettant de calculer le premier jour ouvré d'un mois et d'une année donnés, je suis passé par une structure, mais il y a d'autres façons plus simples.
Code : Tout sélectionner
;Premier jour ouvré du mois
;par Micoute 23 mars 2021
EnableExplicit
Enumeration Fenetres
#Fenetre_principale
EndEnumeration
Enumeration Gadgets
#Txt_Enonce
#Str_Annee
#Cmb_Annees
#Lst_Mois
#Btn_Quitter
EndEnumeration
Enumeration Polices
#Police
EndEnumeration
Structure sMois
Nom.s
Numero.i
EndStructure
Structure sJour
Nom.s
Numero.i
EndStructure
Structure Jour_ouvre
NomMois.s
NomJour.s
J.i
M.i
A.i
EndStructure
LoadFont(#Police, "Verdana", 12)
SetGadgetFont(#PB_Default, FontID(#Police))
Global Evenement, i, Jour_ouvre.Jour_ouvre, Jour, Mois, Annee, JourSem, DatePremierJourOuvre
Global Dim TabNomMois.sMois(12), Dim TabNomJours.sJour(6)
For i = 1 To 12
TabNomMois(i)\Nom=StringField("janvier février mars avril mai juin juillet août septembre octobre novembre décembre",i," ")
TabNomMois(i)\Numero=i
Next i
For i = 0 To 6
TabNomJours(i)\Nom=StringField("dimanche lundi mardi mercredi jeudi vendredi samedi",i+1," ")
TabNomJours(i)\Numero=i
Next i
Declare Programme_principal()
Declare Calcul_Dates()
Declare Quitter()
Declare.s Premier_Jour_ouvre(Annee, Mois)
Programme_principal()
Procedure Programme_principal()
If OpenWindow(#Fenetre_principale, 0, 0, 400, 420, "Premiers jours ouvrés", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget(#Txt_Enonce, 20, 20, 360, 20, "", #SS_CENTERIMAGE|#SS_CENTER)
ListIconGadget(#Lst_Mois, 30, 60, 350, 270, "Date", 340, #LVS_NOCOLUMNHEADER)
ComboBoxGadget(#Cmb_Annees, 140, 350, 100, 30)
i = 2010
While i <= 2037
AddGadgetItem(#Cmb_Annees, -1, Str(i))
i + 1
Wend
;SetGadgetState(#Cmb_Annees, Year(Date())-2010)
ButtonGadget(#Btn_Quitter, 140, 390, 100, 20, "Quitter")
BindGadgetEvent(#Cmb_Annees, @Calcul_Dates())
BindGadgetEvent(#Btn_Quitter, @Quitter())
BindEvent(#PB_Event_CloseWindow, @Quitter())
Repeat
Evenement = WaitWindowEvent()
Select Evenement
Case #PB_Event_Gadget
Select EventGadget()
Case #Btn_Quitter
EndSelect
EndSelect
ForEver
EndIf
EndProcedure
Procedure Calcul_Dates()
ClearGadgetItems(#Lst_Mois)
Annee = Val(GetGadgetText(#Cmb_Annees))
SetGadgetText(#Txt_Enonce, "Premiers jours ouvrés en " + Annee)
i = 1
While i <= 12
Premier_Jour_ouvre(Annee, i)
AddGadgetItem(#Lst_Mois, i, Jour_ouvre\NomJour + " " + Jour_ouvre\J + " " +TabNomMois(i)\Nom + " " + Jour_ouvre\A)
i + 1
Wend
EndProcedure
Procedure Quitter()
Select EventType()
Case #PB_EventType_LeftClick
CloseWindow(#Fenetre_principale)
End
EndSelect
EndProcedure
Procedure.s Premier_Jour_ouvre(Annee, Mois)
Jour=1
JourSem = DayOfWeek(Date(Annee, Mois, Jour, 0, 0, 0))
Select Mois
Case 1, 5, 11
Select JourSem
Case 0:Jour + 1:JourSem = 1
Case 1 To 4:Jour + 1:JourSem + 1
Case 5:Jour + 3:JourSem = 1
Case 6:Jour + 2:JourSem = 1
EndSelect
Case 2 To 4, 6 To 10, 12
Select JourSem
Case 0:Jour + 1:JourSem = 1
Case 1 To 5:DatePremierJourOuvre=Date(Annee,Mois,Jour,0,0,0)
Case 6:Jour + 2:JourSem = 1
EndSelect
EndSelect
DatePremierJourOuvre=Date(Annee,Mois,Jour,0,0,0)
Jour_ouvre\A = Annee
Jour_ouvre\J = Day(Date(Annee, Mois, Jour, 0, 0, 0))
Jour_ouvre\NomJour = TabNomJours(DayOfWeek(DatePremierJourOuvre))\Nom
Jour_ouvre\M = Mois
Jour_ouvre\NomMois = TabNomMois(Mois)\Nom
EndProcedure