Diferencia entre dos fechas

430 views
Skip to first unread message

Erick Soriano

unread,
Nov 18, 2015, 12:26:03 PM11/18/15
to Mundo Visual FoxPro
Saludos

Necesito comparar dos fechas, inicio y final y ver cual es mayor que la otra, estan en formato caracter separado, dia mes año.
Como hago?


Víctor Hugo Espínola Domínguez

unread,
Nov 18, 2015, 12:39:03 PM11/18/15
to mundovis...@googlegroups.com
Hola Erick

>estan en formato caracter separado, dia mes año.

"2015-11-18"
"2015/11/18"
"18/11/2015"
"18-11-2015"

cA1 = "2015"
cM1 = "11"
cD1 = "18"

En cuál de estos u otro formato?


Saludos,
Víctor.
Lambaré - Paraguay.


--
_______________________________________________________________
Has recibido este mensaje porque estás suscrito al Grupo "Mundo Visual
FoxPro" de Grupos de Google.
 
Para anular la suscripción a este grupo, envía un mensaje a:
mundovisualfox...@googlegroups.com
---
Has recibido este mensaje porque estás suscrito al grupo "Mundo Visual FoxPro" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a mundovisualfox...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Erick Soriano

unread,
Nov 18, 2015, 12:49:17 PM11/18/15
to Mundo Visual FoxPro

Saludos


Estan en el formato

cA1 = "2015"
cM1 = "11"
cD1 = "18"

dia mes año (caracter)

Víctor Hugo Espínola Domínguez

unread,
Nov 18, 2015, 12:58:09 PM11/18/15
to mundovis...@googlegroups.com
lcA1 = "2015"
lcM1 = "10"
lcD1 = "13"

lcA2 = "2015"
lcM2 = "10"
lcD2 = "18"

ldFec1 = EVALUATE("Date(" + lcA1 + "," + lcM1 + "," + lcD1 + ")")
ldFec2 = EVALUATE("Date(" + lcA2 + "," + lcM2 + "," + lcD2 + ")")


Saludos,
Víctor.
Lambaré - Paraguay.


Erick Soriano

unread,
Nov 18, 2015, 1:54:07 PM11/18/15
to Mundo Visual FoxPro
Saludos

Mira esto es lo que estoy haciendo, y no se donde esta el problema

DIAVENCI1=diadef
MESVENCI1=mesdef
ANOVENCI1=anodef
dFechaA = CTOD( DIAVENCI1 + "/"+ MESVENCI1 + "/" + ANOVENCI1 )

DIAVENCI2=g18a
MESVENCI2=g18b
ANOVENCI2=g18c
dFechaB = CTOD( DIAVENCI2 + "/"+ MESVENCI2 + "/" + ANOVENCI2 )

*Diferencia=dfechaA >= dfechaB
select 1
scan
If (dfechaA >= dfechaB)
    errmsg ="La fecha de inicio no puede ser mayor que la fecha final"
    Var2=deptalc
    Var3=munialc
    Var4=folio
    Var7=mes
    Do Cuerpo
Endif


El miércoles, 18 de noviembre de 2015, 11:26:03 (UTC-6), Erick Soriano escribió:

Víctor Hugo Espínola Domínguez

unread,
Nov 18, 2015, 2:07:54 PM11/18/15
to mundovis...@googlegroups.com
Hola Eric

>dFechaA = CTOD( DIAVENCI1 + "/"+ MESVENCI1 + "/" + ANOVENCI1 ) 

Esta forma de obtener una fecha es peligrosa debido a que es dependientes de la configuración de SET DATE, la función DATE es infalible:

dFechaA = DATE(VAL(ANOVENCI1), VAL(MESVENCI1), VAL(DIAVENCI1))


Saludos,
Víctor.
Lambaré - Paraguay.


Erick Soriano

unread,
Nov 18, 2015, 2:16:35 PM11/18/15
to Mundo Visual FoxPro
No funciona.....


El miércoles, 18 de noviembre de 2015, 11:26:03 (UTC-6), Erick Soriano escribió:

Víctor Hugo Espínola Domínguez

unread,
Nov 18, 2015, 2:17:40 PM11/18/15
to mundovis...@googlegroups.com
Debería...

Muestra el código


Saludos,
Víctor.
Lambaré - Paraguay.


Erick Soriano

unread,
Nov 18, 2015, 2:20:58 PM11/18/15
to Mundo Visual FoxPro
LOCAL dFechaA,dFechaB

SET SAFETY OFF
Close all
SELECT 1
USE prueba in 0 alias "causa1" exclusive 
GO TOP
Index on xxx to xxxx
set order to xxxx
GO TOP

select 2
USE reporte in 0 alias "reporte" exclusive 
Index on mesx+depto+muni+foliox to dmp
zap
GO TOP

SET SAFETY ON
**********************************

select 1

DIAVENCI1=diadef
MESVENCI1=mesdef
ANOVENCI1=anodef
*dFechaA = CTOD( DIAVENCI1 + "/"+ MESVENCI1 + "/" + ANOVENCI1 )
dFechaA = DATE(VAL(ANOVENCI1), VAL(MESVENCI1), VAL(DIAVENCI1))


DIAVENCI2=g18a
MESVENCI2=g18b
ANOVENCI2=g18c
*dFechaB = CTOD( DIAVENCI2 + "/"+ MESVENCI2 + "/" + ANOVENCI2 )
dFechaB = DATE(VAL(ANOVENCI2), VAL(MESVENCI2), VAL(DIAVENCI2))


*Diferencia=dfechaA >= dfechaB
select 1
scan
If (dfechaA >= dfechaB)
    errmsg ="La fecha de inicio no puede ser mayor que la fecha final"
    Var2=deptalc
    Var3=munialc
    Var4=folio
    Var7=mes
    Do Cuerpo
Endif
endscan

clos all
use reporte
Index on mesx+depto+muni+foliox to dmp
brow

Procedure Cuerpo
select 2
append blank
replace depto        with Var2
replace muni        with Var3
replace foliox        with Var4
replace mesx        with Var7
replace texto        with Errmsg
Select 1
SKIP
If Eof()
   Go Bottom
Endif


El miércoles, 18 de noviembre de 2015, 11:26:03 (UTC-6), Erick Soriano escribió:

Víctor Hugo Espínola Domínguez

unread,
Nov 18, 2015, 2:23:24 PM11/18/15
to mundovis...@googlegroups.com
Si no funciona es porque los datos no representan una fecha válida, para controlar eso puedes usar la estructura TRY/CATCH

Try
dFechaA = Date(Val(ANOVENCI1), Val(MESVENCI1), Val(DIAVENCI1))
Catch
dFechaA = {//}
Messagebox(DIAVENCI1 + "/" + MESVENCI1 + "/" + ANOVENCI1 + Chr(13) + "NO es una fecha válida!")
Endtry


Saludos,
Víctor.
Lambaré - Paraguay.


El 18 de noviembre de 2015, 3:16 p. m., Erick Soriano<erick...@gmail.com> escribió:

Erick Soriano

unread,
Nov 18, 2015, 2:33:48 PM11/18/15
to Mundo Visual FoxPro
ok lo probare y luego comento.


El miércoles, 18 de noviembre de 2015, 11:26:03 (UTC-6), Erick Soriano escribió:

Víctor Hugo Espínola Domínguez

unread,
Nov 18, 2015, 2:43:49 PM11/18/15
to mundovis...@googlegroups.com
DIAVENCI1=diadef
MESVENCI1=mesdef
ANOVENCI1=anodef
*dFechaA = CTOD( DIAVENCI1 + "/"+ MESVENCI1 + "/" + ANOVENCI1 ) 
dFechaA = DATE(VAL(ANOVENCI1), VAL(MESVENCI1), VAL(DIAVENCI1))


DIAVENCI2=g18a
MESVENCI2=g18b
ANOVENCI2=g18c
*dFechaB = CTOD( DIAVENCI2 + "/"+ MESVENCI2 + "/" + ANOVENCI2 ) 
dFechaB = DATE(VAL(ANOVENCI2), VAL(MESVENCI2), VAL(DIAVENCI2))

Los datos ???def son variables o campos de causa1, misma pregunta para los datos g18?

scan
If (dfechaA >= dfechaB)
    errmsg ="La fecha de inicio no puede ser mayor que la fecha final"
    Var2=deptalc
    Var3=munialc
    Var4=folio
    Var7=mes
    Do Cuerpo
Endif 
endscan

Si dfechaA es menor que dfechaB se lee toda la tabla sin hacer nada y NO se genera la tabla "Reporte"!!!

Select 1
SKIP
If Eof() 
   Go Bottom 
Endif

Cuando hace SKIP se pierde un registro que no es procesado, el SCAN hace el SKIP en forma automática!
El Select 1 también lo hace de forma automática.

Esas cinco líneas deben desaparecer.

La comparación entre fechas la debe hacer por cada registro o solo al inicio?


Saludos,
Víctor.
Lambaré - Paraguay.


Erick Soriano

unread,
Nov 18, 2015, 3:47:46 PM11/18/15
to Mundo Visual FoxPro
Bien, con tus recomendaciones el programa lo he dejado asi, y (error) lo que hace es practicamente copiar de la tabla origen a la destino.
todos los registros.


SET SAFETY OFF
Close all
SELECT 1
USE prueba
GO TOP

select 2
USE reporte
zap
GO TOP

SET SAFETY ON
**********************************

select 1

DIAVENCI1=diadef
MESVENCI1=mesdef
ANOVENCI1=anodef
*dFechaA = CTOD( DIAVENCI1 + "/"+ MESVENCI1 + "/" + ANOVENCI1 )
dFechaA = DATE(VAL(ANOVENCI1), VAL(MESVENCI1), VAL(DIAVENCI1))

DIAVENCI2=g18a
MESVENCI2=g18b
ANOVENCI2=g18c
*dFechaB = CTOD( DIAVENCI2 + "/"+ MESVENCI2 + "/" + ANOVENCI2 )
dFechaB = DATE(VAL(ANOVENCI2), VAL(MESVENCI2), VAL(DIAVENCI2))

*Diferencia=dfechaA >= dfechaB
select 1
scan
If (dfechaA > dfechaB)

    errmsg ="La fecha de inicio no puede ser mayor que la fecha final"
    Var2=deptalc
    Var3=munialc
    Var4=folio
    Var7=mes
    Do Cuerpo
Endif
endscan

clos all
use reporte
Index on mesx+depto+muni+foliox to dmp
brow

Procedure Cuerpo
select 2
append blank
replace depto        with Var2
replace muni        with Var3
replace foliox        with Var4
replace mesx        with Var7
replace texto        with Errmsg


El miércoles, 18 de noviembre de 2015, 11:26:03 (UTC-6), Erick Soriano escribió:

Federico Losco

unread,
Nov 18, 2015, 3:54:26 PM11/18/15
to mundovis...@googlegroups.com

Hola... me parece que te falta un select 1 antes del endscan.
Saludos

Federico L. Losco
Lic. en Sistemas
Desarrollo de Sistemas - Servicio Técnico Informático
Skype: fed...@hotmail.com
Facebook: https://www.facebook.com/LoscoSistemas
C. Veiga 571 - Concordia - Tel.: 0345-155202486

Víctor Hugo Espínola Domínguez

unread,
Nov 18, 2015, 3:55:51 PM11/18/15
to mundovis...@googlegroups.com
Eso es automático, no es necesario ponerlo.


Saludos,
Víctor.
Lambaré - Paraguay.


Víctor Hugo Espínola Domínguez

unread,
Nov 18, 2015, 4:00:14 PM11/18/15
to mundovis...@googlegroups.com
Puedes decirnos cuales son los campos de la tabla prueba y en qué caso se debe copiar a la tabla reporte?


Saludos,
Víctor.
Lambaré - Paraguay.


Erick Soriano

unread,
Nov 18, 2015, 4:07:48 PM11/18/15
to Mundo Visual FoxPro
Campos de prueba

Inicio
diadef=01
mesdef=02
anodef=2014

Final
g18a=01         dia
g18b=01         mes
g18c=2013      año

todos los campos son caracter





El miércoles, 18 de noviembre de 2015, 11:26:03 (UTC-6), Erick Soriano escribió:

Erick Soriano

unread,
Nov 18, 2015, 4:08:51 PM11/18/15
to Mundo Visual FoxPro
si la fecha de inicio es mayor que la fecha final errrroorrrrr
y eso es lo que copiara a la tabla reporte, solo los errores


El miércoles, 18 de noviembre de 2015, 11:26:03 (UTC-6), Erick Soriano escribió:

Víctor Hugo Espínola Domínguez

unread,
Nov 18, 2015, 4:45:20 PM11/18/15
to mundovis...@googlegroups.com
Local lcErrMsg, ldFechaA, ldFechaB

Set Safety Off
Close All

Use Prueba  In 0
Use Reporte In 0

Set Safety On

Select Prueba
Scan
ldFechaA = Date(Val(Prueba.AnoDef), Val(Prueba.MesDef), Val(Prueba.DiaDef))
ldFechaB = Date(Val(Prueba.g18c), Val(Prueba.g18b), Val(Prueba.b18a))
If (dFechaA > dFechaB)
lcErrMsg = "La fecha de inicio no puede ser mayor que la fecha final"
Insert Into Reporte ;
(Depto, Muni, FolioX, MesX, Texto) ;
Values (Prueba.DeptAlc, Prueba.MuniAlc, Prueba.Folio, Prueba.Mes, m.lcErrMsg)
Endif
Endscan

Clos All
Use Reporte
Index On MesX + Depto + Muni + FolioX To dmp
Brow


Saludos,
Víctor.
Lambaré - Paraguay.


Erick Soriano

unread,
Nov 19, 2015, 8:45:20 AM11/19/15
to Mundo Visual FoxPro
Ok, en el transcurso del dia lo pruebo y te informo como me fue, bendiciones y gracias por tu ayuda.


El miércoles, 18 de noviembre de 2015, 11:26:03 (UTC-6), Erick Soriano escribió:

Cesar Yamunaque

unread,
Nov 19, 2015, 11:53:02 AM11/19/15
to mundovis...@googlegroups.com

DIAVENCI1=VAL(diadef)
MESVENCI1=VAL(mesdef)
ANOVENCI1=VAL(anodef)
dFechaA = DATE(ANOVENCI1,MESVENCI1,DIAVENCI1)

DIAVENCI2=VAL(g18a)
MESVENCI2=VAL(g18b)
ANOVENCI2=VAL(g18c)
dFechaB = DATE(ANOVENCI2,MESVENCI2,DIAVENCI2)

IF dFechaA>dfechaB
    messagebox("ERROR EN FECHAS"
ENDIF

Erick Soriano

unread,
Nov 24, 2015, 2:10:22 PM11/24/15
to Mundo Visual FoxPro
Saludos Victor

Acabo de probar tu programa y funciona perfectamente, ha sido muy util tu ayuda.
Gracias y bendiciones. Hasta luego.


El miércoles, 18 de noviembre de 2015, 11:26:03 (UTC-6), Erick Soriano escribió:
Reply all
Reply to author
Forward
0 new messages