jueves, 29 de julio de 2010

Uso de componentes Zeos en Lazarus y Delphi



Los componentes Zeos permiten el acceso a diferentes bases de datos en los compiladores de Delphi, C++ Builder y Lazarus. Estos componentes no visuales facilitan todas las operaciones relacionadas con bases de datos de diversos tipos como Oracle, Postgres, Mysql, FireBird, SQLite, etc. casi que de igual manera. De hecho es posible migrar toda una aplicación de una base de datos a otra con solo unos cuantos cambios en las propiedades de los componentes.

Esta página NO pretende brindar una explicación exhaustiva sobre toda la funcionalidad de Zeos, el objetivo  de este tutorial es que el usuario pueda rápidamente tener conexión y ejecutar operaciones de INSERT, DELETE y UPDATE. Posteriormente el programador podrá explorar mas opciones de dichos componentes.

La página oficial de los componentes: http://zeos.firmos.at/portal.php
La página de descarga: http://sourceforge.net/projects/zeoslib/

Instalación en Lazarus.
  1. Descargue y descomprima el archivo de los componentes Zeos.
  2. Desde Lazarus vaya a la sección "Paquete" y de clic en "Abrir archivo de paquete (*.lpk)".
  3. Abra el archivo "Componentes.lpk" que está ubicado en la ruta "\ZEOSDBO-x.x.x-stable\packages\lazarus".
  4. Clic en "Instalar".
  5. Cuando se le pregunte si desea recompilar Lazarus, haga clic en "si".
  6. Al volver a abrir Lazarus encontrará una nueva pestaña con los componenentes Zeos, como se aprecia en la figura:
Pestaña de componentes Zeos, después de la instalación


Construyendo una aplicación básica.
    En este ejemplo vamos a hacer una aplicación muy sencilla donde se tendrán las siguientes características:
    • Motor de la BD: SQLite
    • La base de datos tendrá una sola tabla que se llamará "personas".
    • Los datos a ingresar son: Nombre (VarChar[30]) y Edad (Integer).


    Nota: Si no conoce SQLite le recomiendo leer primero el post de SQLite.

    Primero vamos a comenzar un nuevo proyecto con lazarus: Archivo>>Nuevo>>Aplicación



    A continuación le pondremos de nombre al formulario el nombre "PruebaZeos", para esto usamos la propiedad "Name" del formulario.


     Posteriormente guardamos el proyecto en alguna ubicación de nuestro PC, Archivo>>Guardar Todo


    Una vez hecho esto, agregamos los siguientes componentes y le cambiamos el nombre por el texto que aparezca dentro del paréntesis:

    Pestaña "Zeos Access "
    • TZconnection (Conexion)
    • TZquery (Query)
    • Ztable (Tabla)

    Pestaña "Data  Access"
    • Datasource (Datos)

    Pestaña "Data Controls"
    • TDBGrid (Grid)
    • TDBNavigator (Navegador)


    En este momento debes tener un formulario similar al de la figura:


    Acto seguido debemos modificar las opciones de los componentes, para que estos se "entiendan" entre si, para ello cambie las propiedades de acuerdo a las siguientes líneas:

    Conexion.Protocol=SQLite3
    Conexion.Database=C:\\prueba.sqlite
    Query.Connection=Conexion
    Tabla.Connection=Conexion
    Datos.Dataset=Tabla
    Navegador.DataSource=Datos
    Grid.DataSource=Datos
    Tabla.Tablename=personas

    Con lo anterior, ya la aplicación está en capacidad de cargar la base de datos "prueba" y mostrarla en el DBGrid, se preguntarán ¿Como va a cargar una BD que no existe?, pues bien con SQLite la BD es creada si es que no existe.
    Vamos a usar el potencial de estos componentes para cargar la BD en tiempo de diseño, para esto vamos al componente "Conexion" y cambiamos la propiedad "Connected" a TRUE.

    ¿QUE PASÓ? .... Obtuvimos el siguiente mensaje.......


    Tranquilos, todo está en orden. Lo que sucede es que SQLite es una base de datos que trabaja con una dll que se llama "sqlite3.dll" y si no encuentra dicha dll genera el mensaje de error. Para solucionar esto descargamos la dll de este enlace: http://www.4shared.com/file/N_5uBn3r/sqlite3.html aunque también la puede conseguir en la pagina oficial de SQLITE: http://www.sqlite.org/index.html y agregamos la dll a la carpeta del ejecutable y también la copiamos a la carpeta "C:\\Windows\System32" 


    Hecho lo anterior intentamos conectarnos nuevamente, si hicimos todo correctamente ya no aparecerá la ventana de error, pero tampoco sucede nada en el formulario. Pues bien aun no se han creado tablas, ni registros ni nada, por eso aun no vemos cambios, sin embargo si vamos a nuestro disco duro "C" veremos que el archivo "C:\\prueba.sqlite" ya ha sido creado!


    Vamos por buen camino... ya tenemos conectividad con la base de datos, ahora vamos a agregar algo de código en el evento "OnCreate" del formulario:

    procedure TForm1.FormCreate(Sender: TObject);
    var Cadena_SQL:string; //Cadena del comando SQL a ejecutar
    begin


    Conexion.Connect; //me conecto a la BD 
    Cadena_SQL:='CREATE  TABLE  IF NOT EXISTS "main"."personas" ("nombre" VARCHAR(30), "edad" INTEGER)';    
    Query.SQL.Clear; //se limpia la cadena SQL existente 
    Query.SQL.Text:=Cadena_SQL; //cargo el comando SQL a ejecutar 
    Query.ExecSQL; //Ejecuto el comando
     

    //En este punto la tabla ya esta creada por lo tanto ya se puede abrir
    //el componente de TABLA 
    Tabla.Open;

    //Ajustamos el ancho de las columnas para que se vean mejor
    Grid.Columns[0].Width:=80;
    Grid.Columns[1].Width:=80;
    end;  




    En seguida ejecutamos el programa, y si todo los hemos hecho correctamente podremos hacer lo que el siguiente video nos muestra:


    Nuestra aplicación ya está conectada a la BD y funcionando!

    Ahora le recomiendo que use el "DBNavigator" (La barrita con botones que está debajo del grid) para agregar, editar y eliminar registros y de esta forma examine las posibilidades de manejar de esta forma una BD sencilla.

    Ahora vamos a hacer algo un poco mas complejo, vamos a usar nuestros propios controles para la manipulación de la BD. Para esto volvemos a Lazarus y de la pestaña "Adittional" arrastramos 2 controles "TlabeledEdit". Nuestro formulario debe quedar así:

    Formulario con 2 controles "Tlabelededit" añadidos

    Al control "TlabeledEdit1" le modificamos las siguientes propiedades:

    "Name"=TextoNombre
    "EditLabel.Caption"=Nombre


    Al control "TlabeledEdit2" le modificamos las siguientes propiedades:

    "Name"=TextoEdad
    "EditLabel.Caption"=Edad

    Ahora vamos a la pestaña "Standard" y agregamos 3 componentes "Tbutton"
    Al control "Tbutton1" le modificamos las siguientes propiedades:

    "Name"=BotonAgregar
    "Caption"=Agregar

    Al control "Tbutton2" le modificamos las siguientes propiedades:

    "Name"=BotonEditar
    "Caption"=Editar

     Al control "Tbutton3" le modificamos las siguientes propiedades:

    "Name"=BotonEliminar
    "Caption"=Eliminar

    Con todos estos cambios, nuestro formulario debe quedar así: 


    Ahora vamos al evento "Onclic" del boton AGREGAR, lo cual se puede hacer haciendo doble clic sobre el boton en tiempo de diseño; y agregamos el código como se muestra a continuación:

    procedure TPruebaZeos.BotonAgregarClick(Sender: TObject);
    begin
      Tabla.Insert; //Se pone la tabla en modo de inserccion
      Tabla.FieldByName('nombre').Text:=TextoNombre.Text; //se carga el valor del nombre
      Tabla.FieldByName('edad').Value:=StrToInt(TextoEdad.Text); //se carga el valor de la edad
      Tabla.Post;  //se ejecuta la inserccion
    end;

    Ejecutamos el programa y probamos la insercción de registros:


    Muy bien, ahora vamos a la parte de la edición, esto va a funcionar de la siguiente manera: Se selecciona un registro a editar haciendo clic directamente sobre el "Grid", posteriormente ingresamos los nuevos datos en los controles de "Nombre" y "Edad" y en ese momento si presionamos el botón de "edición" cuyo código es el siguiente:

    procedure TPruebaZeos.BotonEditarClick(Sender: TObject);
    begin
      Tabla.Edit; //Se pone la tabla en modo de edicion
      Tabla.FieldByName('nombre').Text:=TextoNombre.Text; //se carga el valor del nombre
      Tabla.FieldByName('edad').Value:=StrToInt(TextoEdad.Text); //se carga el valor de la edad
      Tabla.Post;  //se ejecuta la edición
    end; 

    Notese que la única diferencia con respecto al código del boton de "agregar" es que la tabla se ponde en modo de edición en vez de insercción.


    Para eliminar un registro, primero lo seleccionamos en el "Grid" y luego damos clic en el botón "Eliminar". A continuación tenemos el código de dicho botón:

    procedure TPruebaZeos.BotonEliminarClick(Sender: TObject);
    begin
      Tabla.Delete; //Se borra el registro actualmente seleccionado en el grid
    end;