consulta para calcular los dias x de un mes

921 views
Skip to first unread message

Marcelo Barberis

unread,
Apr 1, 2019, 1:28:36 AM4/1/19
to publicesvfoxpro
Hola buenas noches, deseo consultar un tema que no estoy pudiendo resolver.
Estoy en un sistema de pagos por meses o periodos vencidos, pero en el mes de febrero me esta dando problema por que tiene 28 dias por lo que el cliente que debe cancelar febrero no le aparece debido a que el codigo que uso me salta al mes de marzo y febrero lo pasa, ese es el problema que tengo en manos que no he podido resolver, lo que estoy haciendo es esto;

lcDias = DiasDelMes(lfeultipago)
IF lcDias < 30
lcDias = 30
ENDIF 
ldContaFecha = lfeultipago
ldFechaIngreso = ldContaFecha + lcDias

FUNCTION DiasDelMes(tdFecha)
LOCAL ld
ld = GOMONTH(tdFecha,1)
RETURN DAY(ld - DAY(ld))
ENDFUNC 

Algunas consideraciones con respecto, si el cliente se registra un dia 1 de enero o de cualquier mes pero dia 1 el calculo es 1 mas lo que retorna la funcion diasdelmes(), pero si me toca que el siguiente mes es febrero de acuerdo a la funcion se pasa febrero y se va a marzo, ahora si le quito el
IF lcDias < 30
lcDias = 30
ENDIF 
en este caso he tenido problema cuando el cliente se registra el dia 1 de cualquier mes por que no me pasa al siguiente mes.
graficamente lo que estoy haciendo es:

Mes: Enero
Venc; 01 Febrero

Mes; Febrero
Venc 02 Marzo

Mes Marzo
Venc 02 Abril

Cualquer comentario se lo agradecere de antemano agradecer cualquier ayuda
--
Marcelo Barberis Gutierrez
Sistemas Informaticos
Villa Montes - Bolivia
Telef.: +591-76830544

HernanCano

unread,
Apr 1, 2019, 1:43:11 AM4/1/19
to Comunidad de Visual Foxpro en Español
Hola, Marcelo.

Para generar la fecha del sgte mes, no utilices "sumar 30".

Más bien mira el sgte código:

**
?'=='
?gomonth ( date(2019,01,01 ), 01 )
?gomonth ( date(2019,01,20 ), 01 )
?gomonth ( date(2019,01,28 ), 01 )
?'--'
?gomonth ( date(2019,01,31 ), 01 )
?gomonth ( date(2019,01,31 ), 02 )
?gomonth ( date(2019,01,31 ), 03 )
?gomonth ( date(2019,01,31 ), 04 )
**

Esto te da alguna info que pueda resolver tu necesidad.

Sea que soluciones o no, vuelve y nos cuentas.

Víctor Hugo Espínola Domínguez

unread,
Apr 1, 2019, 1:04:16 PM4/1/19
to publice...@googlegroups.com
No entiendo lo que quiere hacer, pero estas funciones es seguro que serán útiles  https://www.tek-tips.com/faqs.cfm?fid=3683 
 
Saludos,
Víctor.
Lambaré - Paraguay.


Message has been deleted

Jorge Galván Pérez

unread,
Apr 2, 2019, 7:03:58 PM4/2/19
to Comunidad de Visual Foxpro en Español
no se entiende lo que deseas hacer pon los datos que introduces y los que quieres que te haga la funcion, asi sera mas falcil que te des a entender.

Saludos

Luis Maria Guayan

unread,
Apr 3, 2019, 12:15:18 PM4/3/19
to Comunidad de Visual Foxpro en Español

Marcelo Barberis

unread,
Apr 6, 2019, 11:27:38 PM4/6/19
to publicesvfoxpro
hola buenas noches, despues de varios dias regreso de nuevo por aqui,lo que hago es calcular la fecha de vencimiento de pagos de clientes, por lo que deseo calcular cuantos dias tiene un mes de acuerdo al vencimiento de las cuotas por ej.
Fecha Reg. Cliente: 01/04/2019 
Mes: Abril
Venc: 01/05/2019
Dias: 30

Ahora se me presenta algunos problemas, para los meses que tienen 31 dias, si en el caso que la funcion me devuelva que el mes de vec pasado como parametro me devuelva que es 30, los meses que contienen 31 dias al momento de validar los meses no me pasa al siguiente mes porque no logra devolver el siguiente mes, es decir, estoy en mayo, y mayo tiene 31 dias por lo que cliente paga abril de 30 dias al validar las fechas no logra pasar al siguiente mes puesto que si uso una funcion que me devuelva la cant de dias de abril 30 ahora al 1/05/2019 + 30 me da 31 y como mayo trae 31 dias no logra pasar al siguiente mes.

2.- problema que me pasa es para los meses que trae 28 dias que es febrero, de igual forma al ser mes de 28 dias al hacer los calculos para obtener la fec de venc de febrero me salta al siguiente mes puesto que hago los calculos y sumo y se va a marzo directamente no valida febrero.

en resumen seria como un plan de pagos con fechas de venc de las entidades financieras cuando uno obtiene algun prestamo

Víctor Hugo Espínola Domínguez

unread,
Apr 6, 2019, 11:42:57 PM4/6/19
to publice...@googlegroups.com
Hola Marcelo, creo entender que el primer vencimiento será siempre el día 1 del mes siguiente, si es así el enlace que ya te pasé tiene una función para calcular el primer día del siguiente mes   https://www.tek-tips.com/faqs.cfm?fid=3683  

Una fórmula más sencilla es:  DATE(YEAR(GOMONTH(FecRegCli, 1)), MONTH(GOMONTH( FecRegCli  , 1)), 1)

Si esa no esa es la idea muestra unos ejemplos de lo que quieres calcular.

Saludos,
Víctor.
Lambaré - Paraguay.


HernanCano

unread,
Apr 8, 2019, 2:31:14 AM4/8/19
to Comunidad de Visual Foxpro en Español
Como ya Victor te respondió dos veces pero parece que sigues sin resolver, entonces toma mi segunda:

** Vencimientos.prg

local M.dFecPrestamo, M.nNumCuotas, M.I
M.nNumCuotas   = ThisForm.txtCuotas.Value
M.dFecPrestamo = ThisForm.txtFecha.Value

for M.I=1 to M.nNumCuotas

   MessageBox('Cuota '+padl(M.I,3)+chr(13);
       +'Vence :'+transform(gomonth(M.dFecPrestamo,I)) )

next

Luis Maria Guayan

unread,
Apr 8, 2019, 7:21:12 AM4/8/19
to Comunidad de Visual Foxpro en Español

Utiliza GOMONTH() que tiene en cuenta los dias de cada mes y los años bisiestos.

EJ:

? GOMONTH(DATE(2019,01,31),1)
? GOMONTH(DATE(2019,01,31),2)
? GOMONTH(DATE(2019,01,31),3)



Luis María Guayán
Tucumán, Argentina
_______________________________
Comunidad Visual FoxPro en Español
http://comunidadvfp.blogspot.com

El 03/04/19 a las 13:15, Luis Maria Guayan escribió:

HernanCano

unread,
Apr 8, 2019, 11:19:41 AM4/8/19
to Comunidad de Visual Foxpro en Español
Claro, Luis.
Fue lo que le indiqué en el primer mensaje mío. Pero no atendió.
Esperemos que después de esta tu respuesta y mi aclaración, se le pellizque el cerebro.

Marcelo Barberis

unread,
Apr 8, 2019, 2:56:29 PM4/8/19
to publicesvfoxpro
hola buenas tardes, bueno creo o capaz que no explique bien por eso algunos me respondian que no sabian que era lo que pedia bueno les paso a explicar un poco mas detallado,

1.- esta es una imagen del resultado pero se me pasa el mes de febrero con el codigo que yo uso, de hecho no esta bien, deberia incluirse el mes de febrero, por que el cliente pierde un mes sin cobrar al usuario
Sin título.jpg

2,. este es el codigo que utilizo
lfeultipago = CTOD("30/12/2018")  o  CTOD("31/12/2018")
lcTotDeuda = 4
 
lcDias = DiasDelMes(lfeultipago)
*IF lcDias < 30
* lcDias = 30
*ENDIF 
ldContaFecha = lfeultipago
ldFechaIngreso = ldContaFecha + lcDias

FOR npagos = 1 TO lcTotDeuda
INSERT INTO cuentas (cod_factura,nro_mes,periodo_cuenta,fe_venc,costo_serv,desc_serv,total_cuenta,nomb_serv) ;
VALUES (ALLTRIM(lcCveFact),;
MONTH(ldContaFecha),;
mes_palabra_l(ldContaFecha),;
ldFechaIngreso,;
THIS.lnPrecioServ,;
THIS.lnTotDesc,;
lnSubTotServ,;
ALLTRIM(lcServNombre))

lcDias1 = DiasDelMes(ldContaFecha)
* IF lcDias1 < 30
* lcDias1 = 30
* ENDIF 
lcDias2 = DiasDelMes(ldFechaIngreso)
* IF lcDias2 < 30
* lcDias2 = 30
* ENDIF

ldContaFecha   = ldContaFecha + lcDias1
ldFechaIngreso = ldFechaIngreso + lcDias2
ENDFOR

aqui utilizamos el sistema de cuota con mes vencido, es decir, si me registro un 01 de enero, mi cuota se vence el 01 o 02 de febrero, o si me registro un 12 de enero mi cuota se vence un 12 de febrero.
mes_palabra_l(ldContaFecha), te muestra el mes que se esta pagando y ldFechaIngreso te muestra la fecha de vencimiento

mes_palabra_l(ldContaFecha)  = Diciembre/2018 
 ldFechaIngreso = 30/01/2019

FUNCTION DiasDelMes(tdFecha)
LOCAL ld
ld = GOMONTH(tdFecha,1)
RETURN DAY(ld - DAY(ld))
ENDFUNC

esta funcion me trae la cantidad de dia de la fecha que le paso como parametro

FUNCTION mes_palabra_l
LPARAMETERS ldfecha
RETURN mes_year_l(ldfecha)+"/"+STR(YEAR(ldfecha),4)
*!* RETURN STR(DAY(ldfecha),2)+ " de "+mes_year_l(ldfecha)+" de "+STR(YEAR(ldfecha),4)
ENDFUNC

FUNCTION mes_year_l
    LPARAMETERS ldfecha
    LOCAL ARRAY lames(12)
    lames(1)  = "Enero"
    lames(2)  = "Febrero"
    lames(3)  = "Marzo"
    lames(4)  = "Abril"
    lames(5)  = "Mayo"
    lames(6)  = "Junio"
    lames(7)  = "Julio"
    lames(8)  = "Agosto"
    lames(9)  = "Septiembre"
    lames(10) = "Octubre"
    lames(11) = "Noviembre"
    lames(12) = "Diciembre"
    RETURN lames(MONTH(ldfecha))
ENDFUNC

estas funciones mes_palabra_l() es para traer el mes que se esta pagando 

Bueno amigo este es el codigo que uso el tema es usando esta forma me salta el mes de febrero, creo que lo arme mal paro los otros mes no me da problema pero al pagar meses que incluyen o deben incluir febrero me causa este problema.

Desde ya agradezco por el tiempo invertido en responder mi consulta

El lun., 1 abr. 2019 a las 1:28, Marcelo Barberis (<alexm...@gmail.com>) escribió:

Juan Manuel Féliz Jimenez

unread,
Apr 8, 2019, 3:37:33 PM4/8/19
to Comunidad de Visual Foxpro en Español
No use Sumar  Dias, sino suma meses con la funcion GOMONTH() Asi no importa si el mes tiene 30, 31 o como febrero que trae 28 o 29 si es bisiesto
asi es que utilizo mi funcion para calcular pagareses, el calculo de dias lo uso solo para calculo de mora sobre los pagareses ya vencidos 

Te recomiendo usar GOMONTH Ya que al sumar dias tiene que tener muchas condicines adicionales para que te valide los meses correctamente
si quieres enviame un privado para ayudarte a crear una funcion bien correcta para tu necesidad

HernanCano

unread,
Apr 8, 2019, 11:32:44 PM4/8/19
to Comunidad de Visual Foxpro en Español
Marcelo:
Supongamos que no te explicaste bien al comienzo.
Supongamos que la dificultad está "con el código que tú usas; probablemente es lo que no está bien".

Entonces te pido que pruebes el código que te expongo (que tiene bases similares, por no decir las mismas) que lo que te recomienda Luis M y Juan M), el cual hace lo que tú mismo dices: "calcular las fechas de vencimiento".

=====================================================================================================================

Marcelo: dice:
>>>> ... el tema es usando esta forma me salta el mes de febrero, creo que lo armé mal....
 
Hernán dice:
Entonces cambia de forma.

Por el momento concéntrate en obtener las fechas de vencimiento y en otro momento el resto del código.

¿Con el código que  te propongo obtienes fechas de vencimiento correctas??????????????????????????????

HernanCano

unread,
Apr 9, 2019, 12:37:59 AM4/9/19
to Comunidad de Visual Foxpro en Español

Vamos a despescuezar tu código. 

1. La instrucción
lfeultipago = CTOD("30/12/2018")  o  CTOD("31/12/2018")

parece que corresponde a la fecha de inicio de la obligación/préstamo/crédito

Lo que te digo aquí es que debes evitar el uso de CTOD() en la forma que se ve que lo estás usando en tu código, de forma que sea más genérico, más general, más adecuado a un ("buen") programa de computador.....

La variable no debería llamarse "Fecha de Ultimo Pago" sino "Fecha de Inicio".

2. La instrucción
lcTotDeuda = 4

parece corresponde al "número de cuotas".

La variable no debería llamarse "Total Deuda" sino "Número de Cuotas".

3. Dentro del ciclo tienes lo sgte:
    ldContaFecha   = ldContaFecha   + lcDias1
    ldFechaIngreso = ldFechaIngreso + lcDias2

con lo que intentas obtener la fecha "siguiente", sumando el número de días que tiene el mes "anterior".
Aquí es donde nosotros te decíamos que "no sumaras treinta"....
Lo que hacías era igual de "peor" (¿qué?): buscar cuántos días tiene el mes, para sumarlos.... a una fecha mal calculada....

El tu código manejas dos fechas: 
   Al inicio de tu código:
     ldContaFecha   = lfeultipago
     ldFechaIngreso = ldContaFecha + lcDias

   Dentro del ciclo:
     ldContaFecha   = ldContaFecha   + lcDias1
     ldFechaIngreso = ldFechaIngreso + lcDias2
 
Se observa que no hay consistencia "en el núm.días que se pretende sumar".

Es tan errático ésto que pretendes con las fechas.. que no voy a decir nada más sobre ellas.....

=================================================================
Ahora pasemos a mi recomendación:

1. Necesitamos la fecha de inicio.
Se considera como fecha de inicio la fecha en que se "firmó" la obligación/préstamo/crédito por parte del cliente/titular/firmante.
En tu código veo que la variable para éso es lFeUltiPago.
En lo personal debería llamarse algo como M.dFecPrestamo, M.dFecFirmaPrestamo... Voy a llamarla M.dFecPrestamo (pero sí: es la que parece corresponder ---de acuerdo a tu código--- a lFeUltiPago).

2. Necesitamos el número de cuotas.
Su mismo nombre es suficiente explicación..... ¿cierto????....
En tu código veo que la variable para éso es lcTotDeuda.
En lo personal veo que tiene nombre de "valor total (en pesos/dólares) de la deuda", no parece "número de meses en que se va a pagar la obligación"; me parece que debería llamarse algo como M.nNumCuotas, M.nTotCuotas... Voy a llamarla M.nNumCuotas.

3. Si tomamos los datos básicos que nos muestras en tu código
lFeUltiPago = CTOD("31/12/2018")
lcTotDeuda  = 4
 
entonces el algoritmo que te propongo debería dar los sgtes resultados:

!---------!------------------------
! Cuota # ! Fecha en que se vence !
!---------!------------------------
!    1    !   2019-01-31          !
!    2    !   2019-02-28          !
!    3    !   2019-03-31          !
!    4    !   2019-04-30          !
!---------!------------------------

4. Pregunta:
El código que te expuse: ¿da los resultados esperados, o no?

** Vencimientos.prg
local M.dFecPrestamo, M.nNumCuotas, M.I
M.nNumCuotas   = 4
M.dFecPrestamo = date(2018,12,31)

Marcelo Barberis

unread,
Apr 9, 2019, 2:30:33 AM4/9/19
to publicesvfoxpro
estimado amigo, te comento algunas cosas, el sistema es una sistema para gestionar abonos de videocable, es decir una empresa da el servicio de videocable a usuarios, por lo que cobra por dicho servicio, y bueno el abonado cancela los meses vencido por eso le puse la  lFeUltiPago que carga la fecha_venc que esta en una tabla.

la variable lcTotDeuda, es pasada como parametro que trae desde una tabla donde guardo la cant de periodos o meses que debe el abonado del videocable

ahora CTOD("30/12/2018")  o  CTOD("31/12/2018") solo lo puse para ilustracion porque en realidad no uso de esa forma, yo guardo en la variable la fecha_venc que esta guardada en una tabla que se pasa como parametro al inicio de todo el proceso.
Ahora el proceso que me pasaste *!* Vencimientos.prg realizando las pruebas efectivamente me soluciona la anomalia expuesta estimado, ahora el problema o tema seguido es vaciar los datos al cursor temporal que voy creando para generar los datos de la mora, a la grafica que me pasaste deberia quedar de esta manera aumentado el nombre del mes/año

!---------!-----------------------------------------------
! Cuota # ! Mes !        Periodo ! Fecha en que se vence !
!---------!-----------------------------------------------
!    1    !  12 ! Diciembre/2018 !   2019-01-31          !
!    2    !   1 ! Enero/2019     !   2019-02-28          !
!    3    !   2 ! Febrero/2019   !   2019-03-31          !
!    4    !   3 ! Marzo/2019     !   2019-04-30          !
!---------!-----------------------------------------------
Ahora el nro mes yo lo obtenia usando month(lfeultipago) y el periodo (Diciembre/2018) lo obtengo de la funcion mes_palabra_l(ldContaFecha), ahora con todo lo que me pasaste y la forma que cambiaria la variable lfeultipago se utilizaria solo para el for endfor, se me armaria otro problema como mostrar de la forma que esta el grafica de arriba con los nuevos datos, la funcio que uso para mostrar los periodos es esta, al cual se le debe pasar como parametro una fecha valida

FUNCTION mes_palabra_l
LPARAMETERS ldfecha
RETURN mes_year_l(ldfecha)+"/"+STR(YEAR(ldfecha),4)
ENDFUNC

FUNCTION mes_year_l
    LPARAMETERS ldfecha
    LOCAL ARRAY lames(12)
    lames(1)  = "Enero"
    lames(2)  = "Febrero"
    lames(3)  = "Marzo"
    lames(4)  = "Abril"
    lames(5)  = "Mayo"
    lames(6)  = "Junio"
    lames(7)  = "Julio"
    lames(8)  = "Agosto"
    lames(9)  = "Septiembre"
    lames(10) = "Octubre"
    lames(11) = "Noviembre"
    lames(12) = "Diciembre"
    RETURN lames(MONTH(ldfecha))
ENDFUNC

desde ya muy agradecido por compartir tu conocimiento y a todos de igual forma que me colaboran en forma desinteresada y de mostrarme que utilizo de muy mala manera desde ya gracias por sus comentarios

HernanCano

unread,
Apr 10, 2019, 2:47:19 AM4/10/19
to Comunidad de Visual Foxpro en Español
Marcelo:
Concluimos que el "recorrido" de fechas de mi propuesta, es acertado (cumple tus expectativas). Terminamos bien una primera fase.

Con respecto a lo que mencionas.... te entiendo: nos falta algo......

Para poder avanzar necesitamos la otra parte de mi propuesta: la fecha de inicio...... sinceramente veo difícil cómo resolver ese impasse.....

Lo que pasa es si el mes es Enero, pero se vence el último día de Febrero.... lo veo raro... no me cuadra.....


Si la cosa fuera así:

!---------!-------------------------------------------------------
! Cuota # ! Mes !  Período       ! Fecha de inicio ! Fecha final !
!         !     !                ! del Período     ! del Período !
!---------!-------------------------------------------------------
!    1    !  12 ! Diciembre/2018 ! 2018-12-31      ! 2019-01-30  !
!    2    !   1 ! Enero/2019     ! 2019-01-31      ! 2019-02-27  !
!    3    !   2 ! Febrero/2019   ! 2019-02-28      ! 2019-03-30  !
!    4    !   3 ! Marzo/2019     ! 2019-03-31      ! 2019-04-29  !
!---------!-------------------------------------------------------
!    1    !  12 ! Diciembre/2018 ! 2018-12-22      ! 2019-01-21  !
!    2    !   1 ! Enero/2019     ! 2019-01-22      ! 2019-02-21  !
!    3    !   2 ! Febrero/2019   ! 2019-02-22      ! 2019-03-21  !
!    4    !   3 ! Marzo/2019     ! 2019-03-22      ! 2019-04-21  !
!    5    !   4 ! Abril/2019     ! 2019-04-22      ! 2019-05-21  !
!    6    !   5 ! Mayo/2019      ! 2019-05-22      ! 2019-06-21  !
!---------!-------------------------------------------------------

considero que podemos programar algo que funcione mejor para tus expectativas.

O sea que se debe definir bien el esquema de financiación. Si gustas, avanzamos con lo que te propongo.

Marcelo Barberis

unread,
Apr 17, 2019, 10:31:40 PM4/17/19
to publicesvfoxpro
Hola buenas noches, bueno despues de varios dias de ponerme al dia con temas retrasado y vuelto por aqui para consulta si este codigo esta correcto siguiendo el hilo que puse al iniciar la consulta, utilizando las recomendaciones de algunos solo me faltaba colocar en literal el mes que se vencia lo que hice fue lo siguiente:

local ldFecPrestamo, lnNumCuotas, I
lnNumCuotas   = 4
ldFecPrestamo = DATE(2018,12,26)

FOR i = 1 TO lnNumCuotas
lcVenc = GOMONTH(ldFecPrestamo,i)
lcVencLit = mes_palabra_l(GOMONTH(lcVenc,-1))
MESSAGEBOX("Couta: "+PADL(i,3)+" - "+lcVencLit+CHR(13)+;
"Vence: "+TRANSFORM(lcVenc))
ENDFOR 

Las funciones que utiliza el codigo
FUNCTION mes_palabra_l
LPARAMETERS ldfecha
RETURN mes_year_l(ldfecha)+"/"+STR(YEAR(ldfecha),4)
*!* RETURN STR(DAY(ldfecha),2)+ " de "+mes_year_l(ldfecha)+" de "+STR(YEAR(ldfecha),4)
ENDFUNC

FUNCTION mes_year_l
    LPARAMETERS ldfecha
    LOCAL ARRAY lames(12)
    lames(1)  = "Enero"
    lames(2)  = "Febrero"
    lames(3)  = "Marzo"
    lames(4)  = "Abril"
    lames(5)  = "Mayo"
    lames(6)  = "Junio"
    lames(7)  = "Julio"
    lames(8)  = "Agosto"
    lames(9)  = "Septiembre"
    lames(10) = "Octubre"
    lames(11) = "Noviembre"
    lames(12) = "Diciembre"
    RETURN lames(MONTH(ldfecha))
ENDFUNC

bueno si alguien me dice que este codigo esta equivocado me diga para que lo resuelva y no este volviendo a consultar lo mismo, mi objetivo es que en una tabla que estoy obiando por aqui pero los resultado lo guardo en un cursor temporal, bueno mi objetivo es que me aparezca de esta manera:
MES    PERIODO            FECHA VENC
12      Diciembre/2018     30/01/2019
1        Enero/2019           28/02/2019
2       Febrero/2019        30/03/2019

De antemano gracias por cualquier comentario



El lun., 1 abr. 2019 a las 1:28, Marcelo Barberis (<alexm...@gmail.com>) escribió:

HernanCano

unread,
Apr 18, 2019, 5:12:22 PM4/18/19
to Comunidad de Visual Foxpro en Español
Marcelo:
En mi último comentario (abril-10) quise proponerte un escenario que --si lo aceptas-- podría resolver lo que necesitas....
Pero no lo contestaste: ni afirmativamente ni negativamente, ni comentaste acerca de él....

Pero en lo que comentaste --posterior a mi propuesta--, lo que mencionas es aceptando mi propu....

Entonces avanzaré como si hubieras aceptado mi propuesta....

Tú insistes en hablar de una sola fecha, a la que llamas "Fecha Vencimiento".

Yo te he propuesto que hablemos de dos fechas "Fecha de Inicio del período" y "Fecha Final del período", donde --para compatibilizar los dos escenarios (el tuyo con el mío) sería concluir la que en mi propuesta se llama "Fecha Final del período" es la que tú llamas "Fecha de Vencimiento".

Entonces lo que nos queda es ------->>>>>> El "Nombre del período" corresponde al mes de la "Fecha Inicial del período"..... Problema resuelto!!!!

El código para ello sería el sgte:

** Vencimientos.prg

clear

text 
!---------!-------------------------------------------------------
! Cuota # ! Mes !  Período       ! Fecha de inicio ! Fecha final !
!         !     !                ! del Período     ! del Período !
!---------!-------------------------------------------------------
!    1    !  12 ! Diciembre/2018 ! 2018-12-31      ! 2019-01-30  ! 
!    2    !   1 ! Enero/2019     ! 2019-01-31      ! 2019-02-27  ! 
!    3    !   2 ! Febrero/2019   ! 2019-02-28      ! 2019-03-30  ! 
!    4    !   3 ! Marzo/2019     ! 2019-03-31      ! 2019-04-29  !
!---------!-------------------------------------------------------
!    1    !  12 ! Diciembre/2018 ! 2018-12-22      ! 2019-01-21  !
!    2    !   1 ! Enero/2019     ! 2019-01-22      ! 2019-02-21  !
!    3    !   2 ! Febrero/2019   ! 2019-02-22      ! 2019-03-21  !
!    4    !   3 ! Marzo/2019     ! 2019-03-22      ! 2019-04-21  !
!    5    !   4 ! Abril/2019     ! 2019-04-22      ! 2019-05-21  !
!    6    !   5 ! Mayo/2019      ! 2019-05-22      ! 2019-06-21  !
!---------!-------------------------------------------------------
endtext

set date ansi
set century on

local M.dFecPrestamo, M.nNumCuotas, M.I
M.nNumCuotas   = 6                && 4                && ThisForm.txtCuotas.Value
M.dFecPrestamo = date(2018,12,22) && date(2018,12,31) && ThisForm.txtFecha.Value

for M.I=1 to M.nNumCuotas

   **MessageBox('Cuota '+padl(M.I,3)+chr(13);
   **    +'Vence :'+transform(gomonth(M.dFecPrestamo,I)-1) )

   M.dInicial = gomonth(M.dFecPrestamo,I-1)
   M.dFinal   = gomonth(M.dFecPrestamo,I  )-1
   M.cNomMes  = Mes_Year_L(M.dInicial)
   
   MessageBox('Cuota '+padl(M.I,3)+chr(13);
       +'Inicial: '+transform(M.dInicial )+chr(13) ;
       +'Final  : '+transform(M.dFinal   )+chr(13) ;
       +'NomMes : '+transform(M.cNomMes  )+chr(13) ;
       +'' ) 
   
next

function Mes_Year_L
    lparameters M.ldFecha
    local array M.laMes(12)
    M.laMes(01) = "Enero"
    M.laMes(02) = "Febrero"
    M.laMes(03) = "Marzo"
    M.laMes(04) = "Abril"
    M.laMes(05) = "Mayo"
    M.laMes(06) = "Junio"
    M.laMes(07) = "Julio"
    M.laMes(08) = "Agosto"
    M.laMes(09) = "Septiembre"
    M.laMes(10) = "Octubre"
    M.laMes(11) = "Noviembre"
    M.laMes(12) = "Diciembre"
    return M.laMes(month(M.ldFecha))+'-'+str(year(M.ldFecha),4)
endfunc

**

Hernan Cano

unread,
Apr 19, 2019, 4:54:29 AM4/19/19
to Marcelo Barberis
Marcelo:
En tu pregunta #2 dices que no entiendes el restarle uno a la fecha de "final del período".
Amigo: no le estoy restando uno a la fecha de fin de período; lo que estoy haciendo es "obteniendo la fecha final del período", que como ves es uno menos que la fecha de inicio del período sgte".

Esto es algo que debes entender antes de seguir y es precisamente lo que quería que entendieras con el mensaje que no me contestaste.

(como te dije en ese mensaje,) Si tú quieres que la "fecha de vencimiento" (como la llamas tú) del período Diciembre-2018 sea Enero-31-2019, entonces me queda difícil programar algo que pueda resolver la dificultad que estás teniendo.
En cambio si aceptas que las fechas de inicio y fin de período sean como te menciono en ese cuadro, observamos que la fecha de inicio corresponde al "nombre del período" que quieres obtener.....
De esta forma si necesitas el mes de diciembre, pues decimos que inicia en un día de diciembre; por lo tanto enero empezará el mismo número de día... pero de enero; febrero empezará el mismo número de día... pero de  febrero; marzo empezará el mismo número de día... pero de marzo;... y así sucesivamente.

Si un período empieza el 26 de diciembre, entonces como el sgte período empieza el 26-enero; y entonces el período de diciembre termina en enero-25..... ¿estás en sintonía?

Si estás de acuerdo con esa idea (es lo que te mencionaba en el mensaje de abril-10), tu impasse se resuelve, pues el nombre del mes corresponde al mes de la fecha de inicio..... Y como bien mencionas, no necesitas grabarla ---utilizando el comando INSERT---, sólo lo usas en cálculos internos: la fecha de inicio de cada período.
----------------------------------------------------------------------
Ahora la lógica de obtener la fecha del período sgte, no falla cuando pasa por febrero..... ¿estás en sintonía?

Por lo tanto diríamos que para que tu escenario funciona bien, sólo debes obtener las fechas de inicio de cada período.... Con esas fechas de inicio obtienes los nombres de período de forma correcta.
Y la "fecha de vencimiento" o "fecha de fin de período" será uno antes de la fecha de inicio del sgte período.
----------------------------------------------------------------------
Como conclusión a las imágenes uno y dos de tu mensaje, dices:
>>> ... es igual pero con una óptica diferente pero el resultado es el mismo, ....
Discrepo, pues observa que en mi solución --imagen 1-- digo que la "fecha final del período" es enero-25-2019, mientras que en la imagen 2 muestras que la "fecha de vencimiento" sería enero-26-2019.
((como te decía, --si aceptas mi propuesta-- ese enero-26-2019 debiera ser la fecha de inicio del sgte período)).

Por favor: con cualq fecha entre el 1 del mes y el 27 probablemente tu algoritmo funciona bien; pero si la fecha (de inicio) es en el fin de mes, pues sí vas a obtener "valores extraños"....
El impasse lo encontramos cuando iniciemos en el fin de mes (en una fecha correspondiente al último día del mes).
===========================================================

Recuerda: en la codificación no tienes que grabar la "fecha de inicio"; sólo la usas para los cálculos "temporales" como bien dices.

En la codificación que te pasé, las variables tienen los nombre de los datos que necesitas (al menos para entender). Entonces la variable M.dInicial no la grabas.

A continuación te paso el código optimizado, con respecto a usar la función Mes_Palabra_L() :

** Vencimientos.prg

clear

text 
!---------!-------------------------------------------------------
! Cuota # ! Mes !  Período       ! Fecha de inicio ! Fecha final !
!         !     !                ! del Período     ! del Período !
!---------!-------------------------------------------------------
!    1    !  12 ! Diciembre/2018 ! 2018-12-31      ! 2019-01-30  ! 
!    2    !   1 ! Enero/2019     ! 2019-01-31      ! 2019-02-27  ! 
!    3    !   2 ! Febrero/2019   ! 2019-02-28      ! 2019-03-30  ! 
!    4    !   3 ! Marzo/2019     ! 2019-03-31      ! 2019-04-29  !
!---------!-------------------------------------------------------
!    1    !  12 ! Diciembre/2018 ! 2018-12-22      ! 2019-01-21  !
!    2    !   1 ! Enero/2019     ! 2019-01-22      ! 2019-02-21  !
!    3    !   2 ! Febrero/2019   ! 2019-02-22      ! 2019-03-21  !
!    4    !   3 ! Marzo/2019     ! 2019-03-22      ! 2019-04-21  !
!    5    !   4 ! Abril/2019     ! 2019-04-22      ! 2019-05-21  !
!    6    !   5 ! Mayo/2019      ! 2019-05-22      ! 2019-06-21  !
!---------!-------------------------------------------------------
endtext

set date ansi
set century on

local M.dFecPrestamo, M.nNumCuotas, M.I
M.nNumCuotas   = 6                && 4                && ThisForm.txtCuotas.Value
M.dFecPrestamo = date(2018,12,26) && date(2018,12,31) && ThisForm.txtFecha.Value

for M.I=1 to M.nNumCuotas

   **MessageBox('Cuota '+padl(M.I,3)+chr(13);
   **    +'Vence :'+transform(gomonth(M.dFecPrestamo,I)-1) )

   M.dInicial = gomonth(M.dFecPrestamo,I-1)
   M.dFinal   = gomonth(M.dFecPrestamo,I  )-1
   M.cNomMes  = Mes_Palabra_L(M.dInicial)
   
   MessageBox('Cuota '+padl(M.I,3)+chr(13);
       +'Inicial: '+transform(M.dInicial )+chr(13) ;
       +'Final  : '+transform(M.dFinal   )+chr(13) ;
       +'NomMes : '+transform(M.cNomMes  )+chr(13) ;
       +'' ) 
   
next

function Mes_Year_L
    lparameters M.ldFecha
    local array M.laMes(12)
    M.laMes(01) = "Enero"
    M.laMes(02) = "Febrero"
    M.laMes(03) = "Marzo"
    M.laMes(04) = "Abril"
    M.laMes(05) = "Mayo"
    M.laMes(06) = "Junio"
    M.laMes(07) = "Julio"
    M.laMes(08) = "Agosto"
    M.laMes(09) = "Septiembre"
    M.laMes(10) = "Octubre"
    M.laMes(11) = "Noviembre"
    M.laMes(12) = "Diciembre"
    return M.laMes(month(M.ldFecha)) && && +'-'+str(year(M.ldFecha),4)
endfunc

function Mes_Palabra_L
lparameters M.ldFecha
return Mes_Year_L(M.ldFecha)+"-"+str(year(M.ldFecha),4)
endfunc

**

El jue., 18 de abr. de 2019 a la(s) 23:16, Marcelo Barberis escribió:
Estimado amigo, antes que nada gracias por disponer de tu tiempo para responder mi consulta y al mismo tiempo darte gracias por tomarte el trabajo para enviarme codigo de la consulta. 
Bueno amigo, te paso a responder algunas observaciones que me hiciste:
Tú insistes en hablar de una sola fecha, a la que llamas "Fecha Vencimiento". 

1.- Estimado esta variable fechaVenc, yo la declaro debido a que al inicio de proceso esa variable es para iniciar el proceso y para no perderme de donde esta viniendo y al final del proceso esa variable se transforma en una fechaVenc de la cuota o mes o periodo del servicio y esta se aloja en una tabla cuyo campo es fecha_venc, 

2.- revisando lo que tu me enviaste tengo una duda, cual es la logica que tu utilizas para restarle un dia a esta linea de codigo
M.dFinal   = gomonth(M.dFecPrestamo,I  )-1 
Lo demas lo entiendo bien pero esa parte no logro comprender para que restarle un dia a la fecha final del periodo o para mi seria fechaVenc

3.- Segun lo que me enviaste esto seria el resultado

Sin título2.jpg

y lo que yo hice y envie antes que tu me respondieras era esto

 
Sin título1.jpg
es igual pero con una optica diferente pero el resultado es el mismo, yo queria saber si la codificacion estaba bien, para realizar la modificacion en el sistema, ustedes saben que 4 ojos ven mejor que dos, aveces yo en mi caso particular he venido usando una codificacion como tu pudiste ver erronea porque mientras no tocaba febrero todo estaba bien pero cuando toco que debia mostrar febrero el sistema con mi codificacion se saltaba un mes. Bueno otra cosa en el sistema solo usamos el mes literar/año (Diciembre/2018) y la fecha de vencimiento de ese mes no asi la fecha de inicio del periodo y todo este proceso es temporal en ningun lado se esta guardando los meses adeudado, solo guardo la fecha de venc del mes que esta guardando y la cant de cuotas o meses adeudado, solo esos dos parametros, la pantalla donde yo muestro los resultado es esta que te paso, esta pantalla recoge los datos de un cursor temporal que lo paso al grid, por eso con la fecha de venc y la cant de cuotas pend genero los meses pendientes

Sin título.jpg

Marcelo Barberis

unread,
Apr 20, 2019, 1:40:22 AM4/20/19
to publicesvfoxpro
Hola buenas noches, buenos debo dar las gracias al amigo Hernan Cano por colaborarme y poder resolver la consulta de los periodos con vencimiento, tenia algunas dudas pero ya lo pude resolver, y la solucion pues esta en los mensajes antes enviado por si alguien le pasa algo parecido a lo que yo consulte.
Bueno todo resulto paso a cerrar el hilo de mi consulta.
Reply all
Reply to author
Forward
0 new messages