Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado 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.
-
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").
'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.
-
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..!
-
Creo que tendrias que orientar tu busqueda para utilizar la Funcion Datediff . Buscare un ejemplo que tenia por algun lado!!!
-
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.
-
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.
-
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.
-
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)
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
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.
-
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...!
-
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.