FECHAS

SQL, mySQL, postgreSQL y otros motores
Responder
mbelgon
Novato
Mensajes: 10
Registrado: Vie Abr 08, 2011 11:36 pm
Contactar:

FECHAS

Mensaje por mbelgon » Sab Abr 09, 2011 10:25 pm

Cómo se trabaja con las fechas con clarion - sql ??
Yo estoy desarrollando una app que tengo el dct en clarion el que lo sincronicé y generé la base de datos sql.
El problema que tengo es cuando trabajo con fechas, tengo una variable clarion de formato date, y quiero actualizar el archivo con esa variable, y me pone cualquier basura. Yo por lo que veo es un error de formato, alguien ha tenido alguna experiencia ?
Gracias !!


Avatar de Usuario
Mauricio
Desarrollador de Clarion
Mensajes: 1125
Registrado: Dom Feb 06, 2011 9:34 am
Ubicación: España
Contactar:

Re: FECHAS

Mensaje por Mauricio » Dom Abr 10, 2011 8:27 pm

Si el campo en SQL es datetime, entonces lo que te conviene es lo siguiente: en el diccionario de Clarion definís una campo, llamémoslo FechaNacimiento (es un ejemplo) como string(8). Debajo de este definís un grupo, FechaNacimientoGrupo, con el over sobre FechaNacimiento (está en el segundo tab de las propiedades del campo). Luego, dentro del grupo, dos campos, FechaNacimientoDate (como Date) y FechaNacimientoTime (como time).
Resumiendo:

FechaNacimiento string(8)
FechaNacimientoGrupo Grupo (over FechaNacimiento)
FechaNacimientoDate date
FechaNacimientoTime time

Cualquier duda, seguí preguntando.
Mauricio, básicamente usando Clarion 6.3
www.tdcsoftware.com y www.clarioneros.com/blog

mbelgon
Novato
Mensajes: 10
Registrado: Vie Abr 08, 2011 11:36 pm
Contactar:

Re: FECHAS

Mensaje por mbelgon » Lun Abr 11, 2011 6:51 pm

Pero como las trabajas ??
Yo tengo una variable global, que es la que tiene el valor a grabar en el archivo. La igualo simplemente al campo FechaNacimiento = VariableDate. La variable tendría que definirla como un group también ?
Disculpame, pero recien me estoy metiendo en el tema, y no tengo la menor idea, como te darás cuenta ....
Qué es lo que hace el definir over en el dct ??
Gracias !

LeoPalomares
Ayudante de Santa
Mensajes: 53
Registrado: Lun Feb 07, 2011 10:50 pm
Contactar:

Re: FECHAS

Mensaje por LeoPalomares » Lun Abr 11, 2011 8:45 pm

Si sólo te interesa la fecha podés definir un campo tipo DATE y lo mapeas directamente contra el campo DATE o DATETIME del motor y listo.

Ahora si te interesa la hora o la fecha y hora entonces no te queda otra que hacer lo que dice Mauricio, un string y un grupo over el string. Desde tu código SIEMPRE hacés referencia a los campos date y time del grupo y NO al campo string.
En tu caso FechaNacimientoDate = VariableDate

Puntos importantes, los campos dentro del grupo DEBEN ser DATE y TIME y en ese orden (no pueden ser LONG) y el campo STRING sobre el que se define el grupo debe ser siempre de 8 bytes y su nombre debe corresponder al nombre del campo DateTime de la tabla en la base de datos.

El porque del over sobre el string?
Los motores utilizan internamente dos variables enteras (4 bytes cada una) para almacenar un número para la fecha y otro para la hora (similar a como hace Clarion con el standard date y el standard time que cada uno corresponde a un long).
Clarion es capaz, mediante el driver de acceso a datos, de interpretar el formato correcto de cada tipo de dato y "traducirlo" al formato propio si se usa el tipo de dato "compatible" es decir DATE para las fechas y TIME para las horas.
Si en el motor se define un campo tipo DATE y un campo tipo TIME no hay problema, en la definición de la tabla del dct se los define como dos campos separados con el tipo de dato que corresponda y a otra cosa.
Ahora bien, como los motores tienen un tipo de dato compuesto de 8 bytes en donde en los primeros 4 se almacena la fecha y los últimos 4 la hora sería necesario o bien tener un tipo de dato compatible o, si no, poder acceder a ese tipo de dato por trozos pero esto no lo podemos hacer desde la declaración de una tabla en el dct o por lo menos no directamente. Acá es en donde entra en juego el grupo y el string.
El campo string es el que mapea directamente al tipo de dato en el motor (el campo DateTime). Al definir una variable OVER otra variable lo que se hace es crear un "alias" a la primer variable, la segunda variable realmente no existe como tal sino que es un nombre diferente a la misma dirección de memoria en que se define la primera. Por lo tanto, en el caso del grupo con los campos date y time over el string lo que se consigue es que el primer campo del grupo acceda a los primeros 4 bytes del campo DateTime del motor y el segundo campo del grupo a la segunda parte de dicho campo DateTime.

Esta técnica de definir una variable OVER otra tiene muchas utilidades prácticas, sólo hace falta un poco de imaginación.
Saludos!!!

Leo Palomares

mbelgon
Novato
Mensajes: 10
Registrado: Vie Abr 08, 2011 11:36 pm
Contactar:

Re: FECHAS

Mensaje por mbelgon » Lun Abr 11, 2011 11:27 pm

Gracias Leo, muchas gracias por tu respuesta y muy claro.
Te hago otra consulta, cómo me conviene trabajar cuando actualizo los archivos con PROP:SQL o con el código de clarion ?
Yo lo estoy trabajando con PROP:SQL y ahi es donde nose como hacer la asignación de la variable fecha al campo del archivo. Porque yo en mi base de datos tengo el campo FECHA, y en el dct tengo el grupo FECHADATE, pero si hago referencia a FECHA del sql me graba cualquier fecha y si hago referencia a FECHADATE me da error 90 ! que no existe en la base de datos ... y tiene razón !!! Que me aconsejas, cómo trabajar ?? .

LeoPalomares
Ayudante de Santa
Mensajes: 53
Registrado: Lun Feb 07, 2011 10:50 pm
Contactar:

Re: FECHAS

Mensaje por LeoPalomares » Mar Abr 12, 2011 5:47 am

Opss, este montaje no funciona con sentencias sql "directas" via prop:sql.
Para usar esta técnica siempre tenés que usar sintaxis Clarion (get, put, add, etc)
En el caso de que quieras usar prop:sql y la fecha a asignar sea la fecha del día es fácil porque usás la función propia del motor y listo (dependiendo del motor: GetDate(), SysDate(), etc) pero para otros casos la solución pasa por crear una función en el motor que reciba la fecha en formato Clarion y retorne la fecha en el formato del motor.

Saludos!!!

Leo Palomares
Saludos!!!

Leo Palomares

mbelgon
Novato
Mensajes: 10
Registrado: Vie Abr 08, 2011 11:36 pm
Contactar:

Re: FECHAS

Mensaje por mbelgon » Mar Abr 12, 2011 6:43 pm

Leo:

Perdonda tanta insistencia, pero no doy con la tecla, te explico como yo lo tengo definido a ver si me entendes y me ayudas a encontrar el error:
Este es el código con el que actualizo la fecha de alta laboral con el valor de la variable GLO:FECALAB

CER:IDCERT = glo:idcert !!!
GET(CERTIFICADO,CER:PK_CERT_ID)
CER:FECALABGROUP.FECALABDATE = GLO:FECALAB
CER:FECALABGROUP.FECALABTIME = CLOCK()
PUT(CERTIFICADO)

No me da ni cinco de bollilas, tengo definido por otra parte,como me dijiste el campo FECALAB en el dct de un string de 8 y en la base de datos sql el campo FECALAB es del tipo datetime.
El campo date que se define en el dct de clarion, tiene que ser de algún formato en especial ???
Bueno, espero que me entiendas y a ver si me podes ayudar .... nose más que hacer .... pruebo y pruebo cosas y nada ....

Avatar de Usuario
Mauricio
Desarrollador de Clarion
Mensajes: 1125
Registrado: Dom Feb 06, 2011 9:34 am
Ubicación: España
Contactar:

Re: FECHAS

Mensaje por Mauricio » Mar Abr 12, 2011 8:00 pm

No, el campo date solo tiene que ser date.
El grupo está con el over sobre el campo string?
No te actualiza solo ese campo o no te actualiza ningún otro campo?
En tu código no estás chequeando si el GET fue exitoso o no, qué pasa si no encuentra el valor?
Mauricio, básicamente usando Clarion 6.3
www.tdcsoftware.com y www.clarioneros.com/blog

mbelgon
Novato
Mensajes: 10
Registrado: Vie Abr 08, 2011 11:36 pm
Contactar:

Re: FECHAS

Mensaje por mbelgon » Mar Abr 12, 2011 8:48 pm

Ni el get y el put me dan errores.
Te explico que es lo que estoy queriendo hacer. Yo tengo un archivo de certificados médicos, y uno de detalle de atención por cada certificado médico. En el momento que me ingresa una atención, yo entre otros datos le pido el de alta laboral que se la graba en una variable, y a esa variable es la que quiero grabar en el archivo certificado.
Actualizo el archivo certificado pero con el prop:sql en ese lugar también, y no tengo problema. tendrá algo que ver ??

mbelgon
Novato
Mensajes: 10
Registrado: Vie Abr 08, 2011 11:36 pm
Contactar:

Re: FECHAS

Mensaje por mbelgon » Mar Abr 12, 2011 9:05 pm

Leo:
Te cuento que anduvo !!! nose que era, de tanto que toquetee anduvo.
Muchas gracias por tu ayuda !!!
Cómo haces la refrescada de los browses ?? Yo tengo en una misma ventana el browse de certificado y de atenciones, y cuando cargo una atención quiero que se me refresquen los datos en el browse de certificados ...


Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 13 invitados