Вы находитесь на странице: 1из 4

Cliente-Servidor: Manejo de Fechas :: PortalFox :: Nada corre como un...

Cliente-Servidor: Manejo de Fechas

http://www.portalfox.com/index.php?name=News&file=article&sid=2...
lecturas 9069

Enviado por esparta en Lunes, 11 Junio, 2007

Cmo manejar las consultas con fechas en servidores de bases de datos (SQL Server, MySQL, PostgreSQL, Firebird) por medio de ODBC.

Por Esparta Palma, Mxico, D.F.

Los servidores de bases de datos tienen, al igual que Visual FoxPro, la capacidad de manejar fechas. VFP tiene la capacidad de conectarse a cualquier DBMS (DataBase Management System), ya sea por medio de ODBC o de ADO, el manejo de fechas no es nada complicado como veremos a continuacin. Primero que nada, debemos tener en cuenta dos puntos importantsimos al respecto. No existe el tipo de datos Date (Fecha) En efecto, los DBMS no tienen un tipo de datos Date, en su lugar, se tiene un tipo de datos DateTime (Fecha-Hora), el cul, al igual que el tipo de dato de DateTime de VFP tiene una precisin de segundos, es decir, un format Dia, Mes, Ao, Hora, y Segundos. En VFP las variables DateTime se pueden definir con la funcin DateTime() o mapearse directamente sobre la asignacin de un campo tipo DateTime: ltFechaInicio = DateTime(lnAnnio, lnMes, lnDia, lnHora, lnSegundos) ltFechaFin = Cursor.tFechaFin

Los tipos de datos DateTime, a diferencia de los Date, se basan en segundos, y no en das, por lo que su aritmtica vara en consecuencia, nuestro compaero Luis Mara Guayn ya he escrito un extenso documento sobre esto aqu en PortalFox: --- Trabajar con fechas y horas en Visual FoxPro --http://www.portalfox.com/article.php?sid=1162

Por lo tanto, debemos tener en cuenta este detalle y acostumbrarse a tal hecho, claro est, dependiendo de tu DBMS podras retornar otro tipo de datos, o en su defecto, sobre el cursor resultante, aplicar la conversin de datos si as fuere necesario. No existen las fechas vacias Los DBMS no entienden el concepto de las fechas vacias que maneja VFP, de hecho, dependiendo del manejador de base de datos, obtendrs resultados inesperados, o un error. Entonces, Cmo debemos manejar las fechas vacias (ldFecha = {}) ?, las fechas vacias, deberan convertirse todas a valores nulos (ldFecha = .null.), y en las consultas SQL, manejar las funciones pertinentes. --- Qu es un valor null entre amigos? --http://www.portalfox.com/article.php?sid=2388

--- NULL (SQL) --http://en.wikipedia.org/wiki/Null_(SQL)

--- Working With Columns That Contain Null Values --http://www.databasejournal.com/features/mssql/article.php/3399931

De este modo, si ests contemplando hacer un upsizing desde tablas DBF a un servidor de base datos, entonces, antes debers cambiarlas a nulos todos aquellos valores que fueran vacios.

UPDATE MiTabla SET dFecha = null WHERE EMPTY(dFecha)

Trabajando con Fechas en los Servidores de Base de Datos Una vez contemplado la anterior, podemos introducirnos al tema, y como comentaba lneas arriba, no es nada difcil, slo debemos usar la Parametrizacin. En el caso de que manejemos SQL Pass Trough (SPT), sabemos que deberamos envar una cadena de texto, es decir, slo la consulta SQL, y claro, podremos olvidarnos de formatearlo para que concuerde con la manera en que tu servidor maneje los datos.

1 de 4

01/08/2012 19:22

Cliente-Servidor: Manejo de Fechas :: PortalFox :: Nada corre como un...

http://www.portalfox.com/index.php?name=News&file=article&sid=2...

para que concuerde con la manera en que tu servidor maneje los datos. Durante mucho tiempo se ha debatido en los foros de discusin, que las fechas deberan ser mandadas con formato estndar ANSI: AAAAMMDD.HHSS (20070506.1320), la verdad que eso no es tan cierto, por lo menos en VFP, lo que debemos hacer es hacer uso de la parametrizacin. Como muestra, un pequeo cdigo que podramos utilizar para mandar una consulta a un servidor de Base de Datos SQL Server (cualquier versin): WITH Thisform ltFechaInicio = .txtFechaInicio.Value ltFechaFin = .txtFechaFin.Value ENDWITH

TEXT TO lcConsulta NOSHOW SELECT iID, cIDFactura, tFecha, yImporte, nCantidad FROM DetalleFactura WHERE Fecha BETWEEN ?ltFechaInicio AND ?ltFechaFin ENDTEXT

IF SQLExec(lnHandle, lcConsulta, lcCursor) > 0 *** Hacer algo ELSE IF AERROR(laError) > 0 Messagebox("Error en la consulta:"+laError[2]) ENDIF ENDIF

Sencillo? Si, la magia se realiza justo en el driver ODBC, VFP se encarga de comunicarle que es un tipo de datos DateTime y har la conversin pertinente. Tan fcil como eso. Retomando el caso de los valores nulos Como mencionabamos anteriormente, los servidores de Bases de Datos no manejan el concepto de fechas vacias, por lo que a la hora de mandar ese dato, debemos "convertir" las variables a null, y as mandarlas al servidor. WITH Thisform iProductoID = .txtProductoID.Value nCantidad = .txtCantidad.Value yPrecioVenta = .txtPrecio.Value IF EMPTY(.txtFecha.value) tFechaVenta = .null. ENDIF ENDWITH TEXT TO lcSQL NOSHOW INSERT INTO DetalledeVenta (iProductoID,nCantidad, yPreciodeVenta, tFechaVenta) VALUES (?iProductoID, ?nCantidad, ?yPrecioVenta, ?tFechaVenta) ENDTEXT Notas adicionales Como nota al margen, debemos tambin tomar en cuenta que al basarse en tipo de datos DateTime, se debe hacer especial nfasis en que los inicios y fines del da.

2 de 4

01/08/2012 19:22

Cliente-Servidor: Manejo de Fechas :: PortalFox :: Nada corre como un...

http://www.portalfox.com/index.php?name=News&file=article&sid=2...

DateTime, se debe hacer especial nfasis en que los inicios y fines del da. Como un ejemplo, supongamos que quisieramos obtener los movimientos realizados nicamente en la fecha 11 de Junio de 2007, entonces, al mandar la consulta: lcTabla = "DetalledeVenta" ldFechaInicial = DATE(2007,06,11) ldFechaFinal = ldFechaInicial+1

TEXT TO lcSQL NOSHOW TEXTMERGE SELECT idMovimiento, iProductoID, nCantidad, yPrecioVenta FROM <<lcTabla>> WHERE tFechaVenta BETWEEN ?ldFechaInicial AND ?ldFechaFinal ENDTEXT

IF SQLExec(lnHandle,lcSQL,lcCursor) > 0 ** Hacer el trabajo con el cursor resultante SELECT (lcCursor) ***SCAN ***ENDSCAN ELSE IF AERROR(laError) > 0 Messagebox("Error en la consulta:"+laError[2]) ELSE Messagebox("Error inesperado en la aplicacion") ENDIF ENDIF Cuando usamos la parametrizacin debemos revisar que los tipos de datos de las variables de VFP correspondan a los tipos de datos de la base de datos SQL, es decir, si tu tipo de datos en tu formulario es numrico y en la base de datos es caracter, entonces antes deberas cambiar la variable a enviar a tipo caracter (STR(lnNum, 5)?), como caso especial los tipos de datos Date en VFP son compatibles con los tipos DateTime del controlador ODBC, con la nica salvedad de que estas fechas sern contemplados con la hora inicial del da. Espero que les sea de utilidad.

3 de 4

01/08/2012 19:22

Cliente-Servidor: Manejo de Fechas :: PortalFox :: Nada corre como un...

http://www.portalfox.com/index.php?name=News&file=article&sid=2...

4 de 4

01/08/2012 19:22

Вам также может понравиться