Sei sulla pagina 1di 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3

Uso de SQLite2 en Gambas2 Creacin de un programa paso a paso


Autor: Daniel Calleja Amaro Con el aporte de Razaaztk Pasado a texto: Julio Sanchez Berro

ndice
Un nuevo proyecto...............................................................................................................................3 Tabla y datos.........................................................................................................................................5 El formulario principal.........................................................................................................................7 El sql.....................................................................................................................................................8 Comenzemos a codificar......................................................................................................................8 Continuando con los datos .................................................................................................................11 Agregar, editar, borrar........................................................................................................................13 La rutina de bsqueda.........................................................................................................................16 Archivo fuente y unos pequeos cambios..........................................................................................19 Anexo 1: Enlaces para aprender SQL................................................................................................19 Anexo 2: Agradecimientos.................................................................................................................19

Pgina 1 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3

Un nuevo proyecto
Vamos a comenzar un nuevo proyecto, esta vez de bases de datos Empezaremos con algo sencillo, una miniagenda telfonica para anotar los telfonos de nuestros amigos. Usaremos una base de datos local (o sea en nuestro Pc), ya que se trata de una base de pequeo tamao y el formato de datos ser sqlite2. La idea es almacenar en ella nombre, apellido, telfonos fijo y mvil , adems de la fecha del cumpleaos. Luego crearemos las funciones para agregar y borrar datos, buscar y ordenar. El cdigo fuente estar disponible recin al finalizar, ya que voy subiendo el proyecto a medida que lo realizamos. Primero que nada, abrimos Gambas y creamos un nuevo proyecto. al que le pondremos el nombre que queramos. Luego vamos a las propiedades del proyecto y marcamos los componentes gb.db , gb.db.sqlite2 y gb.db.form.

Luego abrimos el gestor de bases de datos, nos abrir un formulario donde poner la contrasea, elegimos una sencilla y presionamos continuar. ATENCIN! El formulario aparece minimizado en la barra de tareas, debes clickear en l para que se abra. A continuacin nos aparece esta ventana donde con el botn derecho sobre servidor,elegimos nuevo.

Pgina 2 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3

En la siguiente elegimos de la lista desplegable sqlite2 y en la posteriornos pide elegir una ruta, presionando el botn elegir navegamos a la carpeta donde guardamos nuestro proyecto y damos ok.

Hasta aqu tenemos creada la conexin, ahora botn derecho sobre el servidor creado y elegimos crear base, nos va a pedir un nombre, es este caso, mibase1.

Pgina 3 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3

Tenemos entonces el servidor de bases de datos y una base. En el prximo post vamos a crear una primera tabla y agregarle algunos datos.

Tabla y datos
Pinchamos sobre la base recin creada con el botn derecho del ratn y en el men contextual elegimos crear tabla. Nuevamente nos va a pedir un nombre , la llamaremos mitabla.

Damos ok y listo. Ahora nos aparece una nueva ventana a la derecha de la anterior.

Pgina 4 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3

Como vemos tiene tres pestaas: Campos, ndices y datos. En campos vamos a crear los que necesitemos para nuestra base. Vemos que ya aparece uno; id y cuyo tipo es integer. Esta va a ser la clave principal de nuestra base de datos y va a ser un nmero que no debe repetirse. Para ir agregando campos simplemente pinchamos en el cono de la hoja en blanco que vemos antes de la papelera y agregamos uno a uno los nombres de los campos junto con su tipo. Este es el aspecto de la tabla luego de hacerlo.

Los nombres de campo no llevan tildes ni espacios y tampoco aceptan la letra . Tres son del tipo string (cadena) y tres integer(Entero). Click en el icono guardar para que no se pierdan los cambios. Pinchemos ahora en la pestaa datos y agreguemos algunos para tener algo que mostrar al inicializar la aplicacin. Aqu el guardar es el que est enseguida de la pestaa, no debemos olvidarnos de hacerlo. Vea la siguiente imagen.

Pgina 5 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3

Ahora ya tenemos creada nuestra base de datos y una tabla para guardar los datos, en el prximo apartado crearemos la interfase para interactuar con sta.

El formulario principal
Podemos minimizar ahora el gestor de base de datos y dirigirnos a fmain donde colocaremos- por el sistema ya conocido de arrastrar y dibujar sobre el mismo-un columview y dos botones a los que colocaremos el texto nuevo y salir respectivamente.(Propiedad text).Podemos, si as lo deseamos agregar un cono a cada botn mediante su propiedad picture. Al columview lo llamaremos sencillamente tabla(Propiedad name) pues se asemeja mucho a cualquier tabla y estamos tratando de mantener este primer proyecto de base de datos lo ms sencillo posible. Los botones ; btnnuevo y btnsalir. Al botn salir le asignamos el cdigo para cerrar el formulario, PUBLIC SUB Btnsalir_Click() ME.Close END Al ser ste el formulario principal tambin nos cierra la aplicacin. Si presionamos f5 esto es lo que vemos. Pgina 6 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3

Nada alentador ,verdad? Pronto aprenderemos a llenarlo con los datos y definir sus propiedades, pero primero debemos dar una vuelta para conocer el lenguaje que nos permite trabajar con los datos , realizar bsquedas y otras funciones. Es el mismo lenguaje que utilizan las bases de datos ms populares y canto ms sepamos de l mejor podremos aprovechar su versatilidad y potencia.. Estamos hablando del Lenguaje Estandarizado de Consultas o SQL por sus siglas en ingls (Standar Query Languaje), del cual daremos apenas una breve resea.

El sql
Trat de hacer un resumen de SQL, pero como tengo poco tiempo por estos das os dejo un enlace a la wikipedia que os recomiendo leer . Est muy bueno. SQL en wikipedia

Comenzemos a codificar
Vamos a comenzar a poner algo de cdigo a nuestro programa, y lo iremos comentando. Lo primero en una base de datos es la conexin a la misma. Gambas nos provee para esto del objeto Connection. Veamos el cdigo.

Pgina 7 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3 PRIVATE hconn AS Connection PRIVATE FUNCTION ConectarBase() AS Boolean IF hconn <> NULL THEN RETURN FALSE hconn = NEW Connection hconn.Host = /home/daniel/bases hconn.name = mibase1 hconn.type = sqlite2 TRY hconn.Open() IF ERROR THEN hconn = NULL Message.Error(error al conectar con la base) RETURN TRUE ENDIF RETURN FALSE END Como siempre, declaramos primero las variables hconn y conectarbase. Aqu vemos que la segunda es una variable de tipo boolean, cuyos nicos valores son true(verdadero) o false(Falso). Primero vemos que la conexin no est abierta, luego la inicializamos con el mtodo new y ponemos los paramtros host, que nos indica la ruta a nuestra base de datos, el name(nombre) de la base, en este caso mibase1 y el type(tipo), sqlite2(o puede ser mysql, postgresql, etc). Tratamos de abrir la conexin con hconn.open,si no lo conseguimos enviamos un mensaje de error y le damos el valor null a la conexin. Uno de los errores ms comunes se da al indicar el path o ruta a la base de datos, ya que a veces podemos moverla por error, es importante prestar atencin a escribirla correctamente. Veamos como cerrar la conexin. PUBLIC SUB cerrarconexion() IF hconn = NULL THEN RETURN hconn.Close() hconn = NULL END Primero vemos que ya no este cerrada, si no es as la cerramos con .close. Y ahora vamos a visualizar los datos en el columview,en el evento open de fmain. PUBLIC SUB Form_Open() DIM hresul AS Result DIM Clave AS String DIM filtro AS String tabla.Clear IF ConectarBase() THEN RETURN Pgina 8 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3 tabla.Columns.Count = 6 tabla.Columns[0].text = id tabla.Columns[0].Width = 20 tabla.Columns[0].Alignment =Align.Center tabla.Columns[1].text = Nombre tabla.Columns[1].Alignment = Align.Center tabla.Columns[1].Width = 120 tabla.Columns[2].text = Apellido tabla.Columns[2].Alignment = Align.Center tabla.Columns[2].Width = 120 tabla.Columns[3].text = telefono tabla.Columns[3].Alignment = Align.Center tabla.Columns[3].Width = 120 tabla.Columns[4].text = movil tabla.Columns[4].Width = 120 tabla.Columns[4].Alignment = Align.Center tabla.Columns[5].text = cumple tabla.Columns[5].Width = 120 tabla.Columns[5].Alignment = Align.Center hresul = hconn.Exec(Select * from mitabla) DO WHILE hresul.Available Clave = hresul["id"] tabla.Add(Clave, Clave) tabla[Clave][1] = hresul["nombre"] tabla[Clave][2] = hresul["apellido"] tabla[Clave][3] = hresul["telefono_fijo"] tabla[Clave][4] = hresul["telefono_movil"] tabla[Clave][5] = hresul["cumple"] hresul.MoveNext() LOOP cerrarconexion() END Primero declaramos las variables y limpiamos el columview(tabla). Luego definimos las propiedades del mismo. El .count nos dice la cantidad de columnas,.text el ttulo de la columna, .Width el ancho de la columna en pxeles, y .Alignment nos define como se alinearn los datos dentro de la columna. hresul = hconn.Exec(Select * from mitabla)

Pgina 9 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3 Con esta sentencia elegimos los datos a mostrar mediante la instruccin sql select* from, como queremos mostrar todos los datos no ponemos ninguna condicin o filtro. Ms adelante veremos como hacerlo. El resto del cdigo va colocando los datos en su lugar correspondiente del columview. En el prximo apartado lo explico con ms detalle. Veamos nuestra tabla ahora

Continuando con los datos 1/2


Bien, habamos quedado en explicar como se rellenan los datos. hresul = hconn.Exec(Select * from mitabla) Esta instruccin busca en la base de datos, si encuentra datos hace que que la variable hresul sea verdadera y por tanto est disponible (Available) y mientras esto sea as recorrer la tabla con un bucle do while, basndose en la clave(id) e ir rellenando la tabla con los datos. La pocisin de los mismos est dada por el nmero entre parntesis. Es de hacer notar que los nmeros entre parntesis rectos mencionan la posicin de los datos en la tabla, o sea a que columna pertenecen y entre parntesis rectos junto a hresul est el campo equivalente en la base de datos. hresul.MoveNext() Pgina 10 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3 LOOP La primera instruccin hace avanzar la bsqueda al siguiente dato, el LOOP vuelve a ejecutar las instrucciones dentro del bucle hasta que no haya ms datos para mostrar. Luego cierra la conexin. Vamos a crear ahora un nuevo formulario para agregar y/o editar los datos de la tabla,algo fundamental para interactuar con la misma. En el rbol de la izquierda, botn derecho, nuevo formulario y le ponemos como nombre fdata y le agregamos 6 lael, 6 textbox y dos botones.Este es el aspecto del mismo.

Llamaremos a los textbox txtid, txtnombre, txtapellido, txttelefono, txtmovil y txtcumple y a los botones btnaceptar y btncancelar. Como siempre podemos agregar una imagen a los botones mediante su propiedad picture. Este formulario recibir una referencia a un objeto del tipo conection, en nuestro caso hconn por tanto al principio de nuestro formulario fdata colocaremos el siguiente cdigo: PRIVATE hconn as connection Pgina 11 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3 Usar adems el mtodo runnew qu ser llamado desde el formulario principal. la sintaxis es la siguiente: PUBLIC SUB runnew(Data as connection) hconn=data ME.showmodal() END El Me.showmodal nos obliga a interactuar con el formulario antes de cerrarlo, esto se entender mejor cuando veamos como llamamos a este formulario desde el principal.

Agregar, editar, borrar


Por su parte el botn de cancelacin simplemente cierra el formulario, sin actuar sobre los datos. PUBLIC SUB btncancelar_click() Me.close End Insertamos los datos mediante el siguiente cdigo en el evento click de btnaceptar: TRY hconn.EXEC (insert into mitabla values (&1,&2,&3,&4,&5.&6), txtid,txtnombre,txtapellido,txttelefono,txtmovil,txtcumple) ME.close CATCH message.error(Imposible introducir los datos solicitados) END Le pedimos al objeto connection que inserte los datos en la tabla,mediante la instruccin insert intro nombre_de_la_tabla values,el &1 indica que toma el primer valor a continuacin que es txid.text, el &2 el siguiente(txtnombre.text) y as sucesivamente. Si todo va bien el formulario se cierra, si hay un error se captura con catch y nos muestra el mensaje de error. Volvamos ahora al formulario principal y en el evento click de btnnuevo colocamos el siguiente cdigo; PUBLIC SUB Btnnuevo_Click() IF ConectarBase() THEN RETURN fdata.runnew(hconn) cerrarconexion() Pgina 12 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3 Form_Open() END Primeros tratamos de conectarnos a nuestra base de datos, si no lo conseguimos nos salimos. Conseguida la conexin llamamos al mtodo runnewde fdata. Como este formulario se muestra en forma modal, el presente cdigo queda a la espera de que ingresemos datos en fdata o simolemente lo cerremos. A continuacin cierra la conexin y llama al metodo form_open que se encarga de recargar los datos para mostrar los cambios realizados. Continuando con el formulario principal, vamos a codificar el mtodo para borrar registros presionando la tecla suprimir. PUBLIC SUB tabla_KeyRelease() IF Key.Code = Key.Delete THEN IF tabla.current = NULL THEN RETURN IF tabla.Current.Selected = FALSE THEN RETURN IF ConectarBase() THEN RETURN TRY hconn.exec(delete from mitabla where id=&1, tabla.Current.Key) IF ERROR THEN Message.Error(Imposible borrar el registro) ELSE tabla.Current.Delete() ENDIF ENDIF END Vemos primero si hay algn elemento en la tabla y si hay algo seleccionado, si no es as salimos del mtodo. Si hay alguno seleccionado tratamos de abrir la coneccin y tras lograrlo, borramos de la base los datos del registro cuya clave coincida con la del registro seleccionado. Si hay un error sale el mensaje informativo, es caso contrario se borra el registro tambin en nuestro colunmview para reflejar el cambio en la base. Aqu vemos que la instruccin sql usada es condicional y la palabra marcada en negrita where antecede a la condicin; TRY hconn.exec(delete from mitabla where id=&1, tabla.Current.Key) Ahora vamos a ver como hacemos para modificar un registro, por ejemplo si un amigo cambia el mvil, basta con editar ese campo. Vamos a aprovechar el evento activite de nuestro control colunmview(tabla) para agregar esta funcionalidad . Dicho evento se dispara al hacer doble click sobre alguna columna de la tabla. PUBLIC SUB tabla_Activate() DIM hresul AS Result Pgina 13 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3 IF tabla.Current = NULL THEN RETURN IF ConectarBase() THEN RETURN hresul = hconn.Edit(mitabla, id=&1, tabla.Current.Key) fdata.runedit(hresul) tabla.Current[0] = hresul["id"] tabla.Current[1] = hresul["nombre"] tabla.Current[2] = hresul["apellido"] tabla.Current[3] = hresul["telefono_fijo"] tabla.Current[4] = hresul["telefono_movil"] tabla.Current[5] = hresul["cumple"] cerrarconexion() END La lnea en negrita es la que llama al mtodo runedit de fdata. Como an no hemos creado este mtodo si tratamos de ejecutarlo ahora no funcionar. Volvamos por tanto a fdata y coloquemos las siguientes variables al principio del formulario para que sean accesibles desde todo el formulario. PRIVATE hconn AS Connection PRIVATE hresul AS Result PRIVATE editando AS Boolean y agregamos el mtodo runedit cuyo cdigo es el siguiente: PUBLIC SUB runedit(data AS Result) hresul = data editando = TRUE txtid.text = hresul["id"] txtnombre.text = hresul["nombre"] txtapellido.text = hresul["apellido"] Txttelefono.text = hresul["telefono_fijo"] txtmovil.text = hresul["telefono_movil"] txtcumple.text = hresul["cumple"] ME.ShowModal END Esto nos muestra fdata con los datos del registro seleccionado de modo que podamos editarlo.Y nos pone la variable editando con el valor true. Esto es necesario para que mediante una instruccin condicional al hacer click en btnaceptar distinga entre altas y modificaciones. El nuevo cdigo de btnaceptar es el siguiente. PUBLIC SUB btnaceptar_Click() IF editando THEN Pgina 14 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3 TRY hresul["id"] = txtid.text TRY hresul["nombre"] = txtnombre.text TRY hresul["apellido"] = txtapellido.text TRY hresul["telefono_fijo"] = Txttelefono.text TRY hresul["telefono_movil"] = txtmovil.text TRY hresul["cumple"] = txtcumple.text TRY hresul.Update ELSE TRY hconn.EXEC(insert into mitabla values (&1,&2,&3,&4,&5,&6), txtid.text, txtnombre.text, txtapellido.text, Txttelefono.text, txtmovil.text, txtcumple.text) ENDIF ME.Close() CATCH Message.Error(Imposible introducir los datos solicitados) END Si hay una modificacin sita el valor de cada caja de texto con TRY y actualiza la base de datos con hresul.update, si hay un error lo captura con CATCH y muestra el mensaje de error. Si editando es false contina con las intrucciones despes de else que no es ms que la instruccin insert into ya vista en agregar registros.

La rutina de bsqueda
Esta parte ha sido la que ms trabajo me ha dado de realizar, no encontraba informacin clara y tuve que ir tanteando hasta lograrlo, pero vali la pena. Agregemos a fmain un botn btnbuscar y un textbox txtbuscar. Este es el nuevo aspecto de fmain.

Pgina 15 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3

La ubicacin es a gusto de cada uno, lo que si el textbox de bsqueda debe estar al lado del botn buscar. A continuacin el cdigo: PUBLIC SUB btnbuscar_Click() DIM hresul AS Result DIM Clave AS String DIM filtro AS String tabla.Clear IF ConectarBase() THEN RETURN tabla.Columns.Count = 6 tabla.Columns[0].text = id tabla.Columns[0].Width = 20 tabla.Columns[0].Alignment = Align.Center tabla.Columns[1].text = Nombre tabla.Columns[1].Alignment = Align.Center tabla.Columns[1].Width = 120 tabla.Columns[2].text = Apellido tabla.Columns[2].Alignment = Align.Center tabla.Columns[2].Width = 120 tabla.Columns[3].text = telefono tabla.Columns[3].Alignment = Align.Center tabla.Columns[3].Width = 120 tabla.Columns[4].text = movil tabla.Columns[4].Width = 120 tabla.Columns[4].Alignment = Align.Center tabla.Columns[5].text = cumple tabla.Columns[5].Width = 120 tabla.Columns[5].Alignment = Align.Center filtro = Txtbuscar.Text hresul = hconn.Exec(Select * from mitabla where nombre like & filtro & ) DO WHILE hresul.Available Clave = hresul["id"] tabla.Add(Clave, Clave) tabla[Clave][1] = hresul["nombre"] tabla[Clave][2] = hresul["apellido"] tabla[Clave][3] = hresul["telefono_fijo"] tabla[Clave][4] = hresul["telefono_movil"] tabla[Clave][5] = hresul["cumple"] hresul.MoveNext() Pgina 16 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3 LOOP cerrarconexion() END Es prcticamente el mismo cdigo que carga el columview, en realidad es lo que hace , pero a diferencia del evento Form_open utiliza un filtro que condiciona la bsqueda de datos en la siguiente lnea: filtro = Txtbuscar.Text hresul = hconn.Exec(Select * from mitabla where nombre like & filtro & ) Asignamos a la variable filtro el valor de txt buscar y a su vez filtro lo ponemos como condicin de la bsqueda. Nos muestra todos los campos que coincidan con el criterio utilizado. Pero;Qu pasa si no hay datos que coincidan? Vamos a incluir una sentencia if-then -else en nuestra rutina. filtro = Txtbuscar.Text hresul = hconn.Exec(Select * from mitabla where nombre like & filtro & ) IF hresul.Available = FALSE THEN Message.Info(No hay datos que coincidan con su bsqueda) form_open ELSE DO WHILE hresul.Available Clave = hresul["id"] tabla.Add(Clave, Clave) tabla[Clave][1] = hresul["nombre"] tabla[Clave][2] = hresul["apellido"] tabla[Clave][3] = hresul["telefono_fijo"] tabla[Clave][4] = hresul["telefono_movil"] tabla[Clave][5] = hresul["cumple"] hresul.MoveNext() LOOP cerrarconexion() ENDIF END Lo que se agrega est en negrita. vemos si hresul.available es false, si es as mostramos el mensaje de error y con form_open recargamos los datos en el formulario.Si en cambio es true, seguimos con la rutina anterior para mostrar los datos filtrados. Pgina 17 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3

Archivo fuente y unos pequeos cambios.


Gracias al aporte de un compaero del foro de gambas-es (AZTK) presento aqu el cdigo fuente del visor mini agenda de contactos que hemos venido desarrollando. Uno de los cambios es en el host, donde usamos User.home (nuestra carpeta de usuario) y la carpeta visor que si no exista ser creada y la base copiada all. hconn.Host = User.Home &/ .visor El siguiente fragmento va en el evento open de fmain IF NOT Exist(User.Home &/ .visor/mibase1) TRY MKDIR User.Home &/ .visor COPY base/mibase1 TO User.Home &/ .visor/mibase1 ENDIF Primero comprueba si existe la base, si no es as crea el directorio en la carpeta de usuario y copia all la base includa en el cdigo fuente. Cdigo fuente

Anexo 1: Enlaces para aprender SQL


http://www.desarrolloweb.com/manuales/9/ http://www.asptutor.com/zip/sql.pdf http://www.programatium.com/sql.htm http://www.devjoker.com/gru/Tutorial-SQL/CSQL/TutorialSQL.aspx

Anexo 2: Agradecimientos
A mi familia por la paciencia y el tiempo robado A todos los compaeros del foro de Gambas-es, especialmente a los mencionados al comienzo A Campos y Redrejo por su excelente libro.

Pgina 18 De 19

Programando en Gambas2: Programa Agenda Paso a Paso, usando SQL3

El presente documento se distribuye bajo licencia Creative Commons, usted es libre de copiarlo, modificarlo y distribuirlo siempre y cuando mencione el/los autores y respete sus derechos. Si crea obras derivadas de la misma deber usar esta misma licencia.

Si desea saber ms sobre esta licencia visite"http://creativecommons.org/licenses/by-nc-sa/3.0"

Pgina 19 De 19

Potrebbero piacerti anche