[Résolu] Simplification de code

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Résolu] Simplification de code

Message par Micoute »

Bonjour à tous,

je souhaite convertir un nombre en date valide, mais j'aimerais entrer n'importe quel nombre de 010101 (01/01/01) à 31129999 (31/12/9999), mais j'ai un problème de filtre pour les dates inférieures au 10 octobre 1010.

Pourriez-me secourir ? Voici le code que j'ai écrit:

Code : Tout sélectionner

ProcedureDLL.s NToD(Nombre.i) ; Convertit un nombre >= 10101000 <= 3112999 en date
	Protected sJour.s, sMois.s, sAnnee.s, Resultat.s
	Resultat = Str(Nombre)
	Annee = Val(Right(Resultat,4))
	Select Annee
		Case 1000 To 9999
			Select Val(Mid(Resultat,3,2))
				Case 2
					Select Val(Left(Resultat,2))
						Case 1 To 28 + SiBissextile(Annee)
							sJour = Left(Resultat,2)
							sJour = RSet(sJour,2,"0")+"/"
							sMois = Mid(Resultat,3,2)
							sMois = RSet(sMois,2,"0")+"/"
							sAnnee = Right(Resultat,4)
					EndSelect
				Case 1,3,5,7,8,10,12
					Select Val(Left(Resultat,2))
						Case 1 To 31
							sJour = Left(Resultat,2)
							sJour = RSet(sJour,2,"0")+"/"
							sMois = Mid(Resultat,3,2)
							sMois = RSet(sMois,2,"0")+"/"
							sAnnee = Right(Resultat,4)
					EndSelect
				Case 4,6,9,11
					Select Val(Left(Resultat,2))
						Case 1 To 30
							sJour = Left(Resultat,2)
							sJour = RSet(sJour,2,"0")+"/"
							sMois = Mid(Resultat,3,2)
							sMois = RSet(sMois,2,"0")+"/"
							sAnnee = Right(Resultat,4)
					EndSelect
			EndSelect
	EndSelect
	
	Resultat = sJour+sMois+sAnnee
	If Resultat
		ProcedureReturn Resultat
	Else
		ProcedureReturn "Erreur"
	EndIf
EndProcedure

;Debug NToD(31129999)
;Debug NToD(29022011)
;Debug NToD(29022012)
;Debug NToD(31112011)
;Debug NToD(31102011)
;Debug NToD(01010001)
Je vous en remercie tous par anticipation.
Dernière modification par Micoute le mer. 18/juin/2014 17:23, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Simplification de code

Message par Backup »

Code de Typhoon

Code : Tout sélectionner

Declare.s printusing(txt.s,mask.s,ForceMask.b=#False)

; printusing(Chaine$,MASK$)
; la chaine de sortie sera formaté grace au mask
; les "#" sont remplacés par les elements de la chaine
; par exemple pour séparer le mot "DOBRO" on peut ecrire :
;   Debug printusing("DOBRO","##----###") ; ---> resultat : "DO----BRO"
; les lettres de la chaine "DOBRO" ont remplacées les "#" 

Debug printusing("1250","###,###")
Debug printusing("8080000","### ### ### ###")
Debug printusing("26122009","##-##-####")
Debug printusing(RSet(Str(1250333), 9, "0"),"$### ### ###",#True)

Debug""
Debug ""
Debug "Pour Micoute :"
Debug Printusing("010101","##/##/##")
Debug Printusing("31129999","##/##/####") 

Debug Printusing("29022011","##/##/####") 
Debug Printusing("29022012","##/##/####") 
Debug Printusing("31112011","##/##/####") 
Debug Printusing("31102011","##/##/####") 
Debug Printusing("01010001","##/##/####") 


;-Zone Procedures 

Procedure.s printusing(txt.s,mask.s,ForceMask.b=#False)
	; de Thyphoon
	Result.s=""
	Quit=#False
	lt.b=Len(txt)+1
	lm.b=Len(mask)+1
	Repeat
		c.s=Mid(mask,lm,1)
		If c="#" And lt>0
			Result=Mid(txt,lt,1)+Result
			lt=lt-1
			lm=lm-1
			ElseIf c<>"" And lm>0
			Result=c+Result
			lm=lm-1
			Else
			lt=lt-1
			lm=lm-1
		EndIf
	Until (ForceMask=#False And lt<1) Or (ForceMask=#True And lm<1 And lt<1)
	ProcedureReturn Result
EndProcedure

; Epb

Demivec
Messages : 90
Inscription : sam. 18/sept./2010 18:13

Re: Simplification de code

Message par Demivec »

Code : Tout sélectionner

Procedure SiBissextile(Annee)
  If Not Annee % 400 Or (Not Annee % 4 And Annee % 100)
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

ProcedureDLL.s NToD(Nombre.i) ; Convertit un nombre >= 10101001 <= 31129999 en date
   Protected sJour.s, sMois.s, sAnnee.s, Resultat.s, valide, Jour, Mois, Annee
   Resultat = RSet(Str(Nombre),8,"0")
   
   Jour = Val(Left(Resultat,2))
   Mois = Val(Mid(Resultat,3,2))
   Annee = Val(Right(Resultat,4))
   valide = #True
   Select Annee
      Case 1 To 9999
         Select Mois
            Case 2
              If Jour < 1 Or Jour > 28 + SiBissextile(Annee)
                valide = #False
              EndIf
            Case 1,3,5,7,8,10,12
               If Jour < 1 Or Jour > 31
                valide = #False
              EndIf
            Case 4,6,9,11
               If Jour < 1 Or Jour > 30
                valide = #False
              EndIf
            Default
              valide = #False
          EndSelect
        Default
          valide = #False
   EndSelect
   
   If valide
      sJour = RSet(Str(Jour),2,"0")+"/"
      sMois = RSet(Str(Mois),2,"0")+"/"
      sAnnee = RSet(Str(Annee),4,"0")
     
      Resultat = sJour+sMois+sAnnee
      ProcedureReturn Resultat
   Else
      ProcedureReturn "Erreur"
   EndIf
EndProcedure


Debug NToD(31129999)
Debug NToD(29022011)
Debug NToD(29022012)
Debug NToD(31112011)
Debug NToD(31102011)
Debug NToD(01010001)
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Simplification de code

Message par Micoute »

Rebonjour à tous et merci beaucoup.

@Dobro, ta procédure est bonne, mais elle laisse passer un 31 novembre, ce n'est pas critique, c'est juste une histoire de filtre !

@Demivec, c'est tout à fait dans mon esprit de programmation, mais mieux que moi, puisque j'avais callé dessus !

en tous cas, merci à tous les deux !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [Résolu] Simplification de code

Message par Backup »

j'avais pas compris la question (comme d'hab )
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: [Résolu] Simplification de code

Message par Micoute »

Bonjour Dobro, s'il te plaît, ne t'autoflagelle pas, ça peut arriver à tout le monde, un quiproquo même si l'énoncé de ma question disait "je souhaite convertir un nombre en date valide"
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre