"Cosa" de Negro
abril 03, 2005
 
Nuevos tipos de datos en xHarbour
Hace un tiempo hubo unos comentarios acerca de que los usuarios de xHarbour no tenían posibilidad de discutir u opinar sobre nuevas sintáxis agregadas al lenguaje.

Asi que aquí tienen la oportunidad de hacerlo.

Clipper tiene el tipo de dato DATE, pero no tiene TIME o DATETIME.
Además para cargar un valor DATE fijo por programa hay que hacerlo mediante una llamada a una función, no existe una constante de tipo DATE.

Esta es la propuesta de constante de tipo DATE, TIME y DATETIME.

DATE : {^2005/04/03}
TIME : {^13:02:03.04} y también {^01:02:03.04PM}
DATETIME : {^2005/04/03 01:02:03:04}

El modificador AM/PM es opcional tanto para TIME como para DATETIME y es válido para horas de entre 1 y 12.

Espero sus opiniones sobre la sintáxis y sobre los tipos de datos a implementar.

- DATE y DATETIME.
- DATE, TIME y DATETIME
Comments:
El espacio ocupado por una variable DATETIME sería el mismo que una variable DATE o NUMERICA.
Respecto del espacio físico real ocupado es del doble para un dato DATETIME que para un DATE, aunque es el mismo espacio que ocupa un número en punto flotante.

La inicialización en blanco no hay problema en hacerla de esa forma, se puede optimizar en tiempo de compilación y generar una constante DATE vacía.
Pero en los casos de fechas específicas, el caso es que se debe escribir un texto, este se parsea en tiempo de ejecución dentro de la funcion ctod() o stod() para luego convertirse en la fecha indicada.
Para peor, ctod() depende del
SET DATE, por lo que el parseo es más complejo que usar stod().

Teniendo una constante, la conversión se hace en tiempo de compilación.
 
Felicidades walter, excelente idea, de echo me esta haciendo falta ahora mismo pues tengo que capturar datos de herramientas microsoft y vienen algunos en formato datetime y claro en xharbour no puedo capturarlos.
 
Walter,

por supuesto estoy completamente de acuerdo en añadir los tipos de datos TIME y DATETIME. Aunque pensándolo bien, quizás sea suficiente con DATETIME solamente.

Lo que no me gusta es la sintaxis que has propuesto. Por un lado, no distingues entre DATE, TIME y DATETIME. ¿Cómo inicializas una variable con una fecha en blanco, una hora en blanco o una fecha/hora en blanco? Y me refiero a que esté vacía pero que tenga ya el tipo de dato definido, es decir, como hacíamos con CTOD("").

Por otro lado, no estoy de acuerdo en que no se puedan usar funciones como CTOD() y que sea el propio compilador quien haga la conversión. Es cierto que el problema del formato de fecha existe, y si el compilador encuentra la fecha 01/02/05 no es fácil distinguir entre 1-feb-2005 y 2-ene-2005; quizás la solución pase por escribir las constantes de fecha siempre en formato ansi, p.ej. 2005.04.05

En fin, en mi opinión, las constantes de fecha podrían ser como he comentado, en ansi. P.ej.:
dDate1 := 2005.04.05

Y las constantes de DATETIME algo así:
dtHora := 2005.04.05 10:30:00
dtHora := 2005.04.05 10:30:00am
dtHora := 2005.04.05@10:30:00am

Si esa sintaxis es complicada para el parser, se podrían usar pseudo-funciones que se resuelvan en tiempo de compilación:
dDate := Date( 2005.04.05 )
dtHora := DateTime( 2005.04.05, 10:30:00 )


Un saludo.
 
Jose:

En ningún momento he dicho que la sintáxis anule las funciones.
La sintáxis propuesta complementa a las funciones.
Lo único que comenté es que ctod("") es automáticamente convertida a una constante DATE nula, pero SOLO para este caso.

Algo que olvidé comentar, es que esta sintáxis es compatible con la sintáxis Strict Date de Visual FoxPro.

Cómo que no se distingue entre DATE, TIME y DATETIME ?

DATE : {^2005/04/03}
TIME : {^13:02:03.04} y también {^01:02:03.04PM}
DATETIME : {^2005/04/03 01:02:03.04}

Creo que es bastante clara la diferencia, no encuentro ambigüedades.

Para una fecha en blanco se puede usar ctod("")ó stod(""), el compilador se encargará de generar una constante de fecha nula.

Las operaciones entre los diferentes tipos es posible y generan conversiones automáticas de tipo, y en cualquier lugar donde hoy se use un tipo DATE, será posible usar un tipo DATETIME sin problemas, será transparente.

DATE + TIME = DATETIME

Lo atractivo del tipo TIME sería el soporte para cálculo de horas más allá de las 24hs.
Por ejemplo:
DATETIME - DATE = TIME
 
Walter a mi me esta haciendo falta el datetime para poder leer datos de herramientas microsoft, no tienes nada suelto que pueda enlazar y utilizarlo para leer y grabar estos datos ?
 
Dichas variables o tipos serian mas utiles se se pudieran formatear según informe el sisteme en que se encuentre tal y como va en otros lenguajes. Como en la configuración regional del panel de control.

Que para eso esta. Nada de formatos nuevos.

y que existiera la posibilidad de formatear dichos datos como el datetime tal y como lo requiere SQL para que en un futuro nos sea util.

Member Constant Description
GeneralDate vbGeneralDate For real numbers, displays a date and time. If the number has no fractional part, displays only a date. If the number has no integer part, displays time only. Date and time display is determined by your computer's regional settings.
LongDate vbLongDate Displays a date using the long-date format specified in your computer's regional settings.
ShortDate vbShortDate Displays a date using the short-date format specified in your computer's regional settings.
LongTime vbLongTime Displays a time using the long-time format specified in your computer's regional settings.
ShortTime vbShortTime


Gracias.
 
me falto el nombre perdon

Saludos de nuevo
 
Miguel Angel:

Los tipos de datos no deben estar atados a su forma de mostrarse y menos tratandose de un sistema multiplataforma.
Los números en punto flotante tienen la representación interna igual en cualquier lugar del mundo, independientemente de que escriban punto decimal o coma decimal.

Lo mismo se aplica para las fechas y cualquier otro tipo de dato que pueda representarse de diferentes formas.

Con el tema de las fechas, para eso existe el SET DATE y para las horas existirá un SET TIME o similar.
 
Hola Walter:

Y como se usa el tipo de dato DATETIME? tengo necesidad de usarlo y estoy viendo tu mensaje con gran felicidad. Hay alguna librería que se tenga que linkar? algún ejemplo por ahi que pueda ver?

Gracias.
 
Fernando:

Actualmente no está disponible.
En este post estoy mostrando mi propuesta de codificación para relevar opiniones.
Pero debido a falta de concenso por distintas opiniones acerca de la sintáxis a usar, sumado a la inconsulta y, a mi gusto, horrible sintáxis hecha en Harbour para el tipo DATE, es que no se implementó todavía en xHarbour.
Lamentablemente no es cuestión de una librería, porque requiere cambios en el compilador, en la máquina virtual, en funciones de conversión y otras.
 
Walter;

La idea es formidable. Al pesar la utilidad y flexibilidad que añade tener disponibles estos nuevos tipos de datos; ¿que importa el sintaxis? Por Dios, el sintaxis que propones es perfecto. No puedo ver como alguien puede opinar ninguna otra cosa que: !adelante!
 
Publicar un comentario

<< Home

Powered by Blogger