FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Problema con operaciones con fechas
No sé si esto tendría que ir aquí o en el foro de FB porque es sobre una base de datos de este motor. A ver:
Tengo una aplicación en la que se pide al entrar usuario y clave de acceso, que están guardados en sendas tablas, una para los usuarios y otra para las claves porque le tengo puesta fecha de caducidad a las mismas. Una vez que se introduce y valida la clave ejecuto este código para comprobar su validez: Código:
fMenu->Auxiliar->Close(); fMenu->Auxiliar->SQL->Text = "SELECT B.Caduca, B.Caduca - CURRENT_DATE FROM Usuarios A, Claves B WHERE A.Nombre = :Nombre AND A.Nombre = B.Nombre AND B.Clave = :Clave"; fMenu->Auxiliar->ParamByName("Nombre")->AsString = NombreUser; fMenu->Auxiliar->ParamByName("Clave")->AsString = ClaveUser; fMenu->Auxiliar->Open(); if (fMenu->Auxiliar->Fields->FieldByNumber(2)->AsInteger < 11) { cAux = "Su clave caduca el " + fMenu->Auxiliar->FieldByName("Caduca")->AsDateTime.FormatString("ddddd"); if (fMenu->Auxiliar->Fields->FieldByNumber(2)->AsInteger < 1) { Mensaje(3, cAux + ".\nDebe cambiar la clave de acceso al sistema.", "Continuar"); Application->CreateForm(__classid(TfCamCla), &fCamCla); fCamCla->Tag = 1; fCamCla->Nombre->Text = NombreUser; fCamCla->ShowModal(); if (fCamCla->Tag < 0) { TipoInstalacion = fCamCla->Tag; delete fCamCla; Mensaje(1, "No se ha modificado la clave. Sistema desconectado.", "Terminar"); Application->Terminate(); return TipoInstalacion; } delete fCamCla; } else Mensaje(4, cAux, "Continuar"); } Código:
CREATE TABLE Claves (Nombre VARCHAR(15), Clave VARCHAR(12), Fecha DATE, Caduca DATE, CONSTRAINT PK_Claves PRIMARY KEY (Nombre, Clave)) Por poner un ejemplo, con el usuario que está dando error este es el último registro que hay en esa tabla: Cita:
|
#2
|
||||
|
||||
Mira en la configuración de windows, "regional" para ver qué formato de fecha tiene, vaya a ser diferente al resto de equipos.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#3
|
|||
|
|||
¿Has comprobado los valores específicos que devuelve la query en ese ordenador y caso concreto? ¿Qué devuelve?
|
#4
|
|||
|
|||
Será que los registros con el nombre de usuaio y/o contraseña no están en la base de datos ?
La parte del puede fallar si el query no retorna registros. Prueba que otro usuario trate de ingresar en esa máquina.
__________________
Luis Fernando Buelvas T. |
#5
|
||||
|
||||
Gracias por las respuestas.
Cita:
Cita:
Cita:
Hice la prueba el otro día y devolvía valores coherentes. |
#6
|
|||
|
|||
Cuando la cosa está así, no ves qué falla, y tienes que correrlo en casa del cliente, yo recurro al OutputDebugString: le metes entre cada línea de código y la siguiente un ODS diciendo que estás ahí y los valores que importen. Luego en el cliente, corres p.ej. el DebugView de Microsoft (quizás como administrador), y ejecutas tu programa, verificando los valores que aparecen.
Con frecuencia suele ser alguna tontería, que al ver esa "traza" queda clara. |
#7
|
||||
|
||||
Cita:
Si lo corro en mi máquina me da bien los datos (dos fechas y la diferencia entre ambas) pero en esa "maldita" máquina la fecha de caducidad me da una hora (00:00:00) y en la base de datos esa fecha está bien grabada. He estado viendo como me indicó Casimiro la configuración regional y está bien. Cada vez lo entiendo menos porque es el único sitio de los que usan fechas que ocurre esto. No sé si "forzando" a que devuelva una fecha con un CAST se puede solucionar. |
#8
|
||||
|
||||
A ver si tiene un firebird antiguo o uno nuevo con dialect 1 en lugar de 3
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#9
|
||||
|
||||
No seguro. El motor es la versión 2.7; la instalé yo con TeamViewer. Y el dialecto en el arranque fuerzo que sea el 3.
|
#10
|
||||
|
||||
Pues entonces tan sólo te queda asegurarte de los valores que retorna cada apartado.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#11
|
||||
|
||||
He dado un paso más. A la vista de los valores que me devolvía el query lo modifiqué así:
Código PHP:
Código PHP:
Código PHP:
|
#12
|
||||
|
||||
A ver si no devuelven ningún dato o no hay registros con esos valores y devuelve null.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#13
|
||||
|
||||
Registros sí hay; la base de datos ahora mismo es igual la que tengo yo que la del usuario.
|
#14
|
||||
|
||||
Mira "por separado" qué devuelve cada apartado de la consulta y lo comparas con tu equipo y con el del cliente, algo así:
etc...
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#15
|
||||
|
||||
Gracias por la sugerencia. El lunes haré la prueba.
|
#16
|
||||
|
||||
Bueno después de unos cuantos días en que tuve abandonado este tema lo retomé ayer. Lo primero que he hecho es comprobar la configuración del PC donde aparece el problema. Es esta:
Siguiendo vuestras sugerencias he modificado algo el código. Ahora está así: Código:
fMenu->Auxiliar->Close(); fMenu->Auxiliar->SQL->Text = "SELECT CURRENT_DATE FROM RDB$DATABASE"; fMenu->Auxiliar->Open(); TDateTime dFecha = fMenu->Auxiliar->FieldByName("CURRENT_DATE")->AsDateTime; fMenu->Auxiliar->Close(); fMenu->Auxiliar->SQL->Text = "SELECT CAST(B.Caduca AS DATE) Caduca FROM Usuarios A, Claves B WHERE A.Nombre = :Nombre AND A.Nombre = B.Nombre AND B.Clave = :Clave"; fMenu->Auxiliar->ParamByName("Nombre")->AsString = NombreUser; fMenu->Auxiliar->ParamByName("Clave")->AsString = ClaveUser; fMenu->Auxiliar->Open(); int nDias = fMenu->Auxiliar->FieldByName("Caduca")->AsDateTime - dFecha; if (nDias < 11) { cAux = "Su clave caduca el " + fMenu->Auxiliar->FieldByName("Caduca")->AsDateTime.FormatString("ddddd"); if (nDias < 1) { Mensaje(3, cAux + ".\nDebe cambiar la clave de acceso al sistema.", "Continuar"); Application->CreateForm(__classid(TfCamCla), &fCamCla); fCamCla->Tag = 1; fCamCla->Nombre->Text = NombreUser; fCamCla->ShowModal(); if (fCamCla->Tag < 0) { TipoInstalacion = fCamCla->Tag; delete fCamCla; Mensaje(1, "No se ha modificado la clave. Sistema desconectado.", "Terminar"); Application->Terminate(); return TipoInstalacion; } delete fCamCla; } else Mensaje(4, cAux, "Continuar"); } |
#17
|
||||
|
||||
Pero esto estará mal:
AsDateTime.FormatString("ddddd"); Será algo así como "dd-mm-yyyy"
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#18
|
||||
|
||||
Cita:
Cita:
|
#19
|
||||
|
||||
Estaba dándole vueltas al problema y lo de usar el formato dd/mm/yyyy en vez de ddddd afecta únicamente a la presentación y no a los cálculos internos que lleve a cabo la máquina, aunque he de decir que todavía no he podido probar el cambio.
|
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
operaciones con fechas | GustavoCruz | Firebird e Interbase | 12 | 07-04-2009 23:52:35 |
Operaciones con fechas | tifosi_loco | SQL | 2 | 06-12-2007 15:26:08 |
Operaciones con fechas | jandres | Varios | 2 | 07-11-2006 20:16:27 |
Operaciones con fechas | febito | Oracle | 1 | 05-08-2004 04:30:09 |
operaciones con fechas | ing_alsaac | Varios | 2 | 11-05-2003 11:02:57 |
|