Hola Jousseph
Creo que deberías esforzarte más en llamar a las cosas por su nombre. Hablas de registros cuando te refieres a tablas y otras cosas que sinceramente cuesta mucho entender. Tómate mas tiempo en redactar tus mensajes del foro con explicaciones más elaboradas y que los demás podamos entender. También trata de investigar y leer en otros lugares sobre el problema que tienes. Si buscas en google "buscar entre dos fechas en sql" vas a encontrar un montón de información al respecto, lo que ocurre es que si no tienes una mínima base de conocimiento para comprenderlo, pues te va a resultar difícil. Otra cosa importante es nombrar los controles por lo que realmente van a ser, es decir, si vas a manejar fechas, usa un control para manejar fechas (y no texto) y además dale un nombre significativo como dtcFechaInicio, donde dtc es una abreviatura del tipo de control, en este caso datechooser. Lo que es incomprensible es que un control que se supone que va a manejar fechas se llame
TextBox_codigo_delito_expediente1 y además siendo un textbox lo uses para manejar fechas. Al menos eso es lo que parece al leer tu código...
Bueno, después de este pequeño rapapolvos de año nuevo que venías buscando, voy a explicar un par de detalles que te van a facilitar la vida en
gambas, cuando tratamos con fechas en las bases de datos:
Es muy importante trabajar con controles de
gambas que manejen las fechas nativamente, como datebox o datechooser, cuya propiedad Value recibe o establece su valor como tipo Date (de
gambas). Es decir, vas siempre a manejar una variable de tipo Date para almacenar fechas y NUNCA debes convertirlas a String para trabajar con fechas, de acuerdo?
Cuando vayamos a usar esos valores de tipo date en una consulta sql, vamos a emplear una sintaxis de
gambas que internamente usa Subst() que es una función que sustituye las variables dentro de la cadena sql usando comodines. Ya sea que almacenes una fecha en una variable de tipo Date o directamente uses el valor de un control que maneje fechas, no tendrás que hacer conversiones excepto para representar esa fecha en un control de texto. Un ejemplo vale más que mil palabras:
conexion.hconn.Exec("Select * from delitos where fecha_delito between &1 and &2", fecha_inicio, fecha_fin)
Vamos a explicar ese código:
Lo que vemos es que hemos empleado los caracteres &1 y &2 como comodines para que la función Exec los sustituya posteriormente por los argumentos que van a continuación de la consulta sql. En este caso hemos usado unas variables (que me he inventado) que representan la fecha de inicio y la fecha final sobre la que quieres hacer la consulta. También podrías haber empleado directamente los valores de los controles, como por ejemplo datechooser_inicio.Value y datechooser_final.Value. Esta sintaxis nos asegura que siempre funcione la consulta ya que las conversiones las hace
gambas internamente, evitando que tengas que poner comillas, concatenar, etc... lo cual siempre es bastante confuso.
Lo segundo es conocer un poco de sql para emplear la sintaxis más sencilla o más efectiva, dependiendo de lo que queramos hacer. En este caso he usado el operador BETWEEN que busca entre dos valores máximo y mínimo o viceversa. (
http://www.w3schools.com/sql/sql_between.asp ). También podríamos haber usado la sintaxis propuesta más arriba por shordi, la cual quedaría así:
conexion.hconn.Exec("select * from tabla where fecha_delito >= &1 and fecha_delito <= &2", fecha_inicio, fecha_fin)
En ambos casos, independientemente del motor de bases de datos que uses, esto funcionaría. No hay conversiones, no hay comillas, no hay concatenaciones de cadenas y variables, por lo tanto hay menos posibilidades de cometer errores, el código es mucho más limpio y comprensible y además más sencillo de mantener.
Resumiendo un poco, no hay que preocuparse mucho por las fechas y su formato siempre que usemos controles diseñados para tal fin, porque internamente van a representar un objeto de tipo fecha en el formato de nuestro idioma. Por lo tanto, si no rompemos la cadena, no tendremos problemas. Las bases de datos como mysql, tienen un tipo de campo DATE o DATETIME, que podemos extraer en
gambas como un objeto de tipo date de
gambas, pero si lo hacemos como cadena, empezarán nuestros problemas. En sqlite3 aunque no tiene realmente tipos de datos (todo son strings) si usamos objetos date para guardar y consultar de la manera que he explicado,
gambas hará las conversiones por nosotros y sólo en casos muy concretos tendremos que formatear una fecha para representarla en un control de texto, pero repito, nunca para guardarla en la BD.
Jousseph, espero que este post sea de ayuda y puedas finalmente concluir tu trabajo. Si tienes dudas pregunta, pero recuerda los consejos de arriba y ordena tus ideas antes de preguntar.
Ánimo y saludos
Editado por
jguardon, Sabado, 11 Enero 2014, 19:36: Segundo bloque de código no se mostraba correctamente