Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



Mostrando entradas con la etiqueta sql. Mostrar todas las entradas
Mostrando entradas con la etiqueta sql. Mostrar todas las entradas

martes, 10 de marzo de 2015

Sql: Filtrar datos entre fechas en gambas3

 

Sql: Filtrar datos entre fechas en gambas3


Hoy me ha hecho falta tirar del botón de buscar del foro de gambas-es.org.
Necesitaba que un programa me listara unos registros entre dos fechas, y no había manera. Al final, jguardon en el hilo (ver fuente), lo explica muy bien como hacerlo para no tener problemas con los dichosos formatos de fechas:



"Voy a explicar un par de detalles que 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 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."



Como siempre, las explicaciones de jguardon, muy útiles.



Saludos

Fuente:

http://www.gambas-es.org/viewtopic.php?f=3&t=3563&highlight=buscar+entre+fechas+base+datos

jueves, 12 de febrero de 2015

Gambas3: Ejemplo de autocompletado usando bases de datos


Gambas3: Ejemplo de autocompletado usando bases de datos


Os dejo aqui un pequeño ejemplo de como hacer un autocompletado de datos mientras se esta rellenando los textbox de un formulario. Se basa en que cada vez que escribo en el textbox, se produce un evento _keypress(), que añade la letra pulsado (key.text) al textbox.
Capturando esa tecla y el contenido del texbox, y pasandola a una consulta de la base de datos, extraido los datos "parecidos" (usando la orden like de SQL), del campo "nombre" de la tabla "personas", y los cargo al listbox.

Código fuente: evento _KeyPress() del textbox


Public Sub TextBoxNombre_KeyPress()
'cada vez que se escriba una letra, carga el contenido del listbox

If IsLetter(Key.text)
cargalisbox(TextBoxNombre.text & Key.Text)
Else

If Key.code = 16777219 Then
'pulsado la tecla de suprimir
cargalisbox(Mid$(TextBoxNombre.text, 1, Len(TextBoxNombre.text) - 1))
Endif
Endif

End

Carga de datos en el listbox:

Public Sub cargalisbox(texto As String)

resultado = BaseDAtos.Consulta(texto)

ListBox1.Clear

While resultado.Available

ListBox1.Add(resultado["nombre"])
resultado.MoveNext
Wend

End

Consulta a la base de dato que devuelve un result:

Public Sub Consulta(letras As String) As Result

Dim $Query As String
Dim nombredetabla As String = "personas"
Dim nombreDeCampo As String = "nombre"

$Query = "SELECT * FROM " & nombredetabla & " WHERE " & nombredecampo & " like '%" & letras & "%'"
$result = $Con.Exec($Query)
If Error Then
Message.Error("Problemas al realizar la consulta")
Else
Return $result
Endif

End

  Aqui teneis un video donde explico el procedimiento:




Enlace de descarga del código completo: alojado en google drive

Saludos

Julio

miércoles, 6 de agosto de 2014

SQL: Subconsultas (consultas a otras consultas) y vistas

SQL:

 Subconsultas (consultas a otras consultas)

  y 

Vistas


Pues siguiendo con SQL, dependiendo de la complejidad y numero de tablas que tenga nuestra base de dates, necesitamos de realizar consultas a resultados de otras consultas, y filtrarlas con algún criterio.

¿como hacerlo?
Pues, en la zona de la sentencia donde indicaríamos la tabla  a la que  haríamos la consulta, (detrás de FROM) se le añade entre paréntesis la otra consulta.

Un ejemplo:
Tenemos esta base de datos, organizada en estas tablas

Y hacemos esta consulta:

SELECT * FROM Materia, Profesores, Relaciones WHERE Relaciones.idprofesor=Profesores.idProfesor and Relaciones.idmateria=materia.idmateriales

A  los resultados de esta consulta, nos interesa mostrar solo los registros cuyo dato del campo "Telefono_Prof", tenga como inicio el número 6.

En principio sería asi:

SELECT * FROM tabla Where Telefono_Prof Like '6%'

Sustituirnos "tabla" por la 1º sentencia:

SELECT * FROM (SELECT * FROM Materia, Profesores, Relaciones WHERE Relaciones.idprofesor=Profesores.idProfesor and Relaciones.idmateria=materia.idmateriales) Where Telefono_Prof Like '6%'

Nota: 
En el caso de que haya columnas con el mismo nombre, o necesitamos dar más claridad a la consulta que estemos usando, para poder seguir realizando subconsultas, se puede usar "AS"

Por ejemplo:
SELECT * FROM (SELECT * FROM Materia, Profesores, Relaciones WHERE Relaciones.idprofesor=Profesores.idProfesor and Relaciones.idmateria=materia.idmateriales) As TablaFiltrada Where TablaFiltrada.Telefono_Prof Like '6%'


USANDO Vistas

A diferencia de las tablas ordinarias no forma parte del esquema físico. Se trata de una tabla dinámica de los datos en la base de datos.

"Tabla Dinámica": Esto quiere decir que si cambiamos (modificar, borrar o añadir) algún dato de alguna tabla, automáticamente, la vista ya nos mostraría los resultados actualizados.

Ejemplo de creación de una vista:

CREATE VIEW TablaTelefono6 AS SELECT * FROM (SELECT * FROM Materia, Profesores, Relaciones WHERE Relaciones.idprofesor=Profesores.idProfesor and Relaciones.idmateria=materia.idmaterialesAs TablaFiltrada Where TablaFiltrada.Telefono_Prof Like '6%'

Ejemplo de uso:

SELECT idmateriales, idprofesor FROM TablaTelefono6

Puede ser muy útil, por ejemplo una vez creada la base de datos con sus tablas y sabiendo que consultas y subconsultas típicas que vamos a realizar en nuestro programa, crear esas vistas y así tenerlas ya preparadas para usarlas, con el considerable ahorro de tiempo.



Para más información:
http://www.tutorialspoint.com/sqlite/sqlite_alias_syntax.htm
http://www.tutorialspoint.com/sqlite/sqlite_views.htm




martes, 5 de agosto de 2014

SQL: consulta de multiples tablas.

SQL: consulta de múltiples tablas


Bueno, otra consulta que se ha planteado en el foro de www.gambas-es.org.

El problema es como almacenar y realizar consultas de los siguientes datos:

Tenemos varios profesores y varias materias de las que imparten  clase. Se relacionan de la siguiente forma:
   Pepe imparte las asignaturas de Matemáticas y Lengua
   Luis imparte las asignaturas de Matemáticas y Contabilidad
   Benito imparte la asignatura de Inglés

Sería un esquema como el que sigue:


Crearíamos un típico esquema de 3 tablas, donde la primera contiene los datos de los profesores, la segunda los datos de las materias y la tercera, la información entre las relaciones entre profesores-materias:


¿como podíamos realizar un consulta donde se muestre que asignatura que imparte el profesor "Luis"?

SELECT Nombre_Materia FROM Materias, Profesores,Relaciones WHERE Relaciones.idProfesor=Profesores.idProfesor and Relaciones.idMateria=Materias.idMateria and Nombre_Prof="Luis"

¿y  si queremos que nos muestre todos los datos? Sustituimos "Nombre_Materia" por "*":
SELECT * FROM Materias, Profesores,Relaciones WHERE Relaciones.idProfesor=Profesores.idProfesor and Relaciones.idMateria=Materias.idMateria and Nombre_Prof="Luis"


¿como mostrar todas la relaciones, con los datos de los profesores y de las materias?:
SELECT * FROM Materia, Profesores, Relaciones WHERE Relaciones.idprofesor=Profesores.idProfesor and Relaciones.idmateria=materia.idmateriales


Nota:
Las sentencias no están optimizadas, se pueden mejorar usando JOIN. (vease enlaces de fuentes)


Saludos


Fuentes Para saber más:
http://oscarsotorrio.com/post/2010/09/11/Consultas-SQL-sobre-multiples-tablas.aspx

SQL: Like y upper para búsquedas de registros


SQL: 

Like y upper para búsquedas de registros


Bueno, pues contestando a un compañero del foro de gambas-es.org, sobre búsquedas en consultas SQL, he encontrado un ejemplo que esta muy bien, y puede ser muy útil para aplicarlo a nuestras aplicaciones.

El caso es que necesitaba una consulta que buscara en el campo "nombre" de la una tabla llamada "Profesores"

Se plantea los siguientes problemas:
1) Muchas veces el usuario no sabe el nombre completo del profesor.
2) Introducir el nombre que busca, lo pone o todo en minúsculas o todo en mayúsculas o la primera en mayúsculas  y el resto en minúsculas (que es lo más habitual).

Si el usuario escribe en el campo de búsqueda "Juan" y no se acuerda se era "Juan Julian", o "Juan Antonio" o "Juan Felipe"¿como hacemos una consulta que nos devuelva los resultados más aproximados?

De la siguiente manera:

Select * from Profesores where upper(nombre) like upper('%Juan%')

Con like y  '%Juan%' estamos buscando en los registros, los que tengan contenido "Juan"

Y con upper, lo que hacemos es poner tanto en mayúsculas el campo "nombre" como "Juan", para así comparar "en igualdad de condiciones" (todo en mayúsculas) el contenido del campo nombre del registro con la palabra buscada (Juan)

Saludos


Fuentes:
http://www.clubdelphi.com/foros/showthread.php?t=20601