Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: YAcosta en Julio 05, 2011, 11:09:46 pm

Título: Numero a dias.
Publicado por: YAcosta en Julio 05, 2011, 11:09:46 pm
Hola
No encuentro una función que me haga lo siguiente

Quiero mandar un numero cualquiera, por ejemplo : 77
y obtener: 2 meses y 17 dias.

Realmente es fácil hacerlo con una división entre 30 y la parte decimal multiplicarla por 30 y luego dibujar "meses" y dias, Ahora si me complico un poco mas todavía podría expresarlo asi: "2 meses, 2 semanas y 3 dias"

Pero hago la pregunta por si alguien a visto algo similar y ahorrarme un tiempillo para hacerlo, solo si lo han visto no se molesten en hacerlo.

Gracias.
Título: Re:Numero a dias.
Publicado por: YAcosta en Julio 07, 2011, 07:30:06 am
Bueno, ya lo hice pero a medias, y ya no me merece la pena seguir haciendolo (por ahora), el asunto era hacerlo de forma mas sencilla, porque hacer el calculo es un "chongo". No es lo mismo que 1 mes tenga 4 semanas porque 4 semanas tampoco hacen 1 mes, segui haciendolo con la excusa de poner (por ejemplo): "Aproximadamente 3 meses, 2 semanas" pero no, no merece la pena.
Lo que pasa es que tengo un modulo que hace una proyección de venta, y el programa calcula por ejemplo que tiene 47 dias de stock. Pero poner 47 no es tan "imaginable" para el cliente que poner: "1 mes, 2 semanas y 3 dias" (esto le resulta mas "imaginable").

Código: [Seleccionar]
'YAcosta
Private Function MesSemDia(dias As Integer)
Dim xDia As Integer
Dim xSem As Integer
Dim xMes As Integer
Dim diasRest As Integer
lDia = " 1 dia"
lSem = " 1 semana"
lMes = " 1 mes"
Select Case dias
Case Is < 7:   MesSemDia = sDia(dias)
Case Is < 30
   If dias Mod 7 = 0 Then
      If dias = 7 Then MesSemDia = sSem(1) Else MesSemDia = sSem(dias / 7)
   Else
      xSem = Int(dias / 7)
      diasRest = Round(((dias / 7) - xSem) * 7, 0)
      MesSemDia = sSem(xSem) & " y " & sDia(diasRest)
   End If
Case Is >= 30
   If dias Mod 30 = 0 Then
      If dias = 30 Then MesSemDia = sMes(1) Else MesSemDia = sMes(dias / 30)
   Else
      xMes = Int(dias / 30)
      diasRest = Round(((dias / 30) - xMes) * 30, 0)
      If diasRest >= 7 Then
         If diasRest Mod 7 = 0 Then
            If diasRest = 7 Then
               MesSemDia = sMes(xMes) & " y " & sSem(1)
            Else
               MesSemDia = sMes(xMes) & " y " & sSem(diasRest / 7)
            End If
         Else 'aqui se me jode en los dias 58, 88, 118...etc
            xSem = Int(diasRest / 7)
            diasRest = Round(((diasRest / 7) - xSem) * 7, 0)
            MesSemDia = sMes(xMes) & " y " & sSem(xSem) & " y " & sDia(diasRest)
         End If
      Else
         MesSemDia = sMes(xMes) & " y " & sDia(diasRest)
      End If
   End If
End Select
End Function

Private Function sDia(dias As Integer) As String
If dias = 1 Then sDia = " 1 dia" Else sDia = dias & " dias"
End Function

Private Function sSem(sem As Integer) As String
If sem = 1 Then sSem = " 1 semana" Else sSem = sem & " semanas"
End Function

Private Function sMes(mes As Integer) As String
If mes = 1 Then sMes = " 1 mes" Else sMes = mes & " meses"
End Function

Asi que tire la toalla y daré al cliente la forma ortodoxa y mas sencilla: La fecha final con esta simple linea:

Label1 = "Tiene Stock hasta el: " & DateAdd("d", NumeroDias, Date)

y ya, a dormir.
Título: Re:Numero a dias.
Publicado por: ssccaann43 en Julio 07, 2011, 04:07:50 pm
Pero Yvan, para esos calculos por lo general se toma en cuenta 30 días como un mes y 7 para una semana...
En tal caso de que queden 4 semanas es decir 28 días - 30 días... Lo tomas como Mes...! No lo veo complicado..!
Título: Re:Numero a dias.
Publicado por: Bazooka en Julio 07, 2011, 06:09:16 pm
Creo que tendrias que orientar tu busqueda para utilizar la Funcion Datediff  . Buscare un ejemplo que tenia por algun lado!!!

Título: Re:Numero a dias.
Publicado por: YAcosta en Julio 07, 2011, 07:09:42 pm
Pero Yvan, para esos calculos por lo general se toma en cuenta 30 días como un mes y 7 para una semana...
En tal caso de que queden 4 semanas es decir 28 días - 30 días... Lo tomas como Mes...! No lo veo complicado..!

Pero eso estoy haciendo doc, la joda vino en el calculo de dias 58, 88, 118...etc porque me lo traduce como
1 mes y 4 semanas jajaja... (58 dias) y es bien chisotoso mostrarlo asi y tampoco quiero parchar.
2 meses y 4 semanas para el caso de 88 dias, etc.

Ahora si, si lo puedes pulir te lo agradecería, sino, igual lo retomo de unos dias porque ahorita me tiene harto esa vaina y no es bueno seguir asi jejeje.
Título: Re:Numero a dias.
Publicado por: YAcosta en Julio 07, 2011, 07:14:42 pm
Creo que tendrias que orientar tu busqueda para utilizar la Funcion Datediff  . Buscare un ejemplo que tenia por algun lado!!!

Claro, esa es la función (bueno esa no, porque esa resta) que tenia en mente antes de empezar todo, pero no me mostraba como yo queria mostrarlo por ese intente con ese codigo que trabaje anoche. Como aun no quedo bien estoy usando una simple y unica linea: que es:
Label1 = "Tiene Stock hasta el: " & DateAdd("d", NumeroDias, Date)

Yo le doy 47 (dias) y el me de: (asumiendo que hoy es 1 de julio de 2011)
Tiene Stock hasta el 16 de Agosto de 2011

Ya se lo mande al cliente y el ya esta contento con eso. Por el lado del cliente ya esta resuelto el tema, solo queda el deseo y las ganas de hacerlo, que en vez de que me de una fecha futura me de:
Tiene Stock para 1 mes y 17 dias
Eso es lo que quiero y mi codigo funciona bien salvo los casos 58 dias, 88 dias, etc.
Título: Re:Numero a dias.
Publicado por: YAcosta en Julio 07, 2011, 07:46:36 pm
Ojo, que el chiste tampoco diga: 1 dias, o 2 semanas y 1 dias...

Como interpretamos 58 dias?
Como 1 mes y 28 dias? feooo. porque hay semanas dentro de 28 y por eso me bota
1 mes 4 semanas... y supongo que debo dejarlo asi, osea:

58 dias = 1 mes y 4 semanas
59 dias = 1 mes y 4 semanas y 1 dia
60 dias = 2 meses
61 dias = 2 meses y 1 dia
etc

mmm, bueno creo que queda asi obviamente. Sino que me mareo ver 4 semanas en vez de 1 mes.
Título: Re:Numero a dias.
Publicado por: LeandroA en Julio 07, 2011, 08:34:15 pm
Hola Yvan te doy dos formas creo que la primera es igual a la tuya, pero un poco mas simplificada (no tiene la cocatenacion pero es para que veas como hacer el calculo)

Código: [Seleccionar]
Private Function MesSemDia(ByVal Valor As Long) As String
    Dim Meses As Long, Semanas As Long, Dias As Long
    Dim lDif As Long
   
    Meses = Valor \ 30
    lDif = Valor - (Meses * 30)
   
    Semanas = lDif \ 7
    Dias = lDif - (Semanas * 7)
   
    Debug.Print Meses, Semanas, Dias


End Function

la segunda redondea osea que si vos pones 58 son dos meses. por decir hoy 07/07/2011 falta agosto y septiembre

Código: [Seleccionar]
Private Function MesSemDia(ByVal Valor As Long) As String
    Dim Meses As Long, Semanas As Long, Dias As Long
    Dim lDif As Long
    Dim FI As Date
   
    FI = Date + Valor
   
    Meses = Month(FI) - Month(Date)
   
    lDif = Day(FI) - Day(Date)
    If lDif > 0 Then
        Semanas = lDif / 7
        Dias = lDif - (Semanas * 7)
    End If
   
    Debug.Print Meses, Semanas, Dias

End Function

es una discución segun como se quiera ver.
si usas la primera podrias hacer que si semanas es = 4  mostras dias = 28  y no mostras semanas.
Título: Re:Numero a dias.
Publicado por: ssccaann43 en Julio 08, 2011, 01:59:50 pm
Ojo, que el chiste tampoco diga: 1 dias, o 2 semanas y 1 dias...

Como interpretamos 58 dias?
Como 1 mes y 28 dias? feooo. porque hay semanas dentro de 28 y por eso me bota
1 mes 4 semanas... y supongo que debo dejarlo asi, osea:

58 dias = 1 mes y 4 semanas
59 dias = 1 mes y 4 semanas y 1 dia
60 dias = 2 meses
61 dias = 2 meses y 1 dia
etc

mmm, bueno creo que queda asi obviamente. Sino que me mareo ver 4 semanas en vez de 1 mes.

Mano, fijate...

58 dias = 2 Meses
59 dias = 2 Meses
60 dias = 2 meses
61 dias = 2 meses y 1 dia

Asi de simple...!

A eso me refiero.. Que al tener entre 28 dias y 30 dias lo coloques como un mes...! 31 dias.. 1 mes y 1 dia... Simple...!
Título: Re:Numero a dias.
Publicado por: YAcosta en Julio 08, 2011, 02:36:19 pm
jeje, doc, me subestimas, entiendo la idea, por el lado humano es clarisimo y simple, pero la verdad esta bien feo decir a nivel de programa mostrar la igualdad que planteas fijate:
58 dias = 59 dias = 60 dias = 2 meses 58 no es igual a 59 ni a 60.

Es por el lado de código que quiero expresar esa vaina, ademas que no me parece adecuado hardcodear solo para el caso de: 58 días (numero problemático), 88 días (otro numero problemático), 118 (otro) etc. que son lo casos en que me "salia" feo, pero ya esta resuelto doc, le he dado vueltas al tema y quedara expresado asi:

Mi muestra es 30 dias, asi hallan meses de 31 dias y/o 28-29
Quedara asi:
58 dias = 1 mes y 4 semanas
59 dias = 1 mes y 4 semanas y 1 dia
60 dias = 2 meses
61 dias = 2 meses y 1 dia
62 dias = 2 meses y 2 dias
...
88 dias = 2 meses y 4 semanas
89 dias = 2 meses y 4 semanas y 1 dia
90 dias = 3 meses
etc

Gracias a todos por su interes.