07-04-1998

Bases de Datos I

El termino base de datos es algo muy común en nuestros días, y todos tenemos un idea básica de lo que es una base de datos, por lo menos a nivel abstracto.

En un ordenador, una base de datos, no es más que un conjunto de ficheros con unas carácteristicas propias que los hacen especiales. Entre estas caracteristicas se puede destacar su facilidad para almacenar datos de diversos formatos en un mismo fichero, y su ordenación (si se desea).

Todas la caracteristicas que hacen maravillosas a las bases de datos, no servirian de mucho si los lenguajes de programación no nos facilitarán las cosas. Hace unos años apareció el Clipper, el cual maravillo a muchos programadores, profesionales y aficionados, de Dos (entre los que me incluyo). Un poco más tarde Windows acabó por irrumpir en nuestros ordenadores, pero no trajo consigo un buen lenguaje que gestionara bases de datos. Por eso muchos programadores seguían generando sus aplicaciones en Dos.

Con todo esto quiero llegar a que si por un aspecto es conocido el Delphi, es por las bases de datos. Hasta la llega de este lenguaje, Windows no había un lenguaje que acabara de manejar bases de datos con la simpleza del Clipper, por lo menos que yo conociera.El secreto del Delphi está en la sencillez. Hasta ahora te habrás dado cuenta que Delphi siempre está dispuesto a hacerte el "trabajo sucio", pues en este tema no ha fallado tampoco.

B.D.E

El manejo de las bases de datos en Delphi es responsabilidad de una parte del Delphi, diseñada esprofesamente para esa función, y es el Motor de Base de Datos de Borland (BDE de ahora en adelante). Lo que se consigue con esto es la independencia casi absoluta del código fuente con el tipo de base de datos que se use. Así da igual que tu programa gestione una base de datos en formato Dbase o que sea Paradox. Tu única preocupación es teclear la orden correspondiente, que BDE se encargará de verselas con el controlador del tipo de base de datos que uses.

Por defecto BDE gestiona tres tipo de bases de datos, la tres de Borland, pero eso no significa que con los controladores adecuados no pueda gestionar otros tipos, incluidos ODBC. Y si esto no es suficiente, hay controles desarrolados por terceros controlan otros tipos de bases de datos. Los tipos de bases de datos que controla BDE por defecto son:

Y todo esto en lo que se refiere al aspecto de aplicaciones mono puesto, pero las versiones más altas de Delphi están preparadas para comunicarse a servidores de datos, como SQL Server.

Alias

Una de las caracteristicas que más me llamó la atención de BDE son los Alias. La verdad es que mi primera impresión es que eran un estorbo, pero hay que reconocer que son utiles. Los alias son eso, alias, motes, "alcumes" (como dicen en mi tierra), pero alias de directorios. Me explico, si tienes una aplicación con una base de datos, la cual está en un directorio con una ruta como esta: c:\base\de\datos, y resulta que por problemas de espacio colocas un disco duro nuevo en tu ordenador, tienes que recompilar tu aplicación para indicar que los datos están en otro lado.

La posible solución seria que tu programa tuviera un fichero de configuración, lo cual no es mala idea, pero si son 100 programas lo que tienen los datos en ese directorio, pues ya sería para pensarselo, incluso con 10 programas (soy un poco vago para hacer tareas repetitivas). La solución está en ponerle un alias al directorio, y que todos los programas se refieran a ese directorio por su alias. Cuando cambies de lugar las bases de datos solo tienes que hacer un cambio, que es en el programa Admistrador de BDE, en el cual le indicas la nueva ruta de ese Alias.

Así, si en una empresa hay 100 puestos, y cambian el servidor de datos, pues solo tienes que hacer un retoque en la ruta del Alias, con lo que en diez minutos listo, y si lo tienes que hacer fuera de horas de trabajo mejor, que mejor, porque solo llegarás tarde 10 minutos a la cita con la novia.

Para añadir, modificar, o borrar un alias, en principio, hay que recurrir al administrador de BDE, el cual encontras en la carpeta donde esta instalado el Delphi, o en el caso del Delphi 3.0 en el panel de control. Hago referencia a carpetas, porque este tema de bases de datos está enfocado al Delphi 2.0 o superior.

Empezando

Después de mucha teoría vamos a hacer un ejemplo, en el cual con unos movimiento de ratón vamos hacer un ojeador de bases de datos. Para ello hay que conocer a unos componentes. Selecciona la pestaña de Data Access, después de haber abierto el Delphi. Coloca el primer control por la derecha, y el segundo sobre un formulario, se llaman DataSourcer y Table respectibamente. Estos controles son del tipo no visuales, como los cuadros de dialogo, y se van a encargar de gestionar la base de datos para nosotros.

Estos dos componentes trabajan en estrecha relación, así en la propiedad DataSet del componente DataSourcer contiene la lista de los componentes Table, que hay el formulario. Entonces despliega esta propiedad y verás que aparece Table1, que es el nombre del otro componente, seleccionalo y tendrás a los dos componente "trabajando codo con codo" para ti.

Ahora echale a una mirada al componente Table, tiene un montón de eventos. Si sabes un poco de inglés caeras en la cuenta rapidamente que esos eventos se producen antes (before), después (After) y, algunos, durante (On) las operaciones que se pueden hacer con una base de datos. Por cierto que Delphi las llama Tablas (Table), y de ahora en adelante me voy a referir así a las bases de datos.

En el aspecto de las propiedades hay tres que destacan, son: Active, DataBaseName, y TableName. Active, nos permite abrir y cerrar la tabla. Por otra parte las dos restantes estan relacionadas entre sí.

DataBaseName, almacena el alias que vamos a usar, y TableName, el nombre de la base de datos. Entretente toqueteando con estas dos propiedades.

Yo comenté que ibamos a hacer un ojeador de bases de datos, lo que indica que vamos a poder abrir una tabla en cualquier directorio, pero si DataBaseName contiene el nombre de un alias tenemos un problemilla. Bueno esto es verdad hasta cierto punto, ya que no comente que esta propiedad también puede contener ruta a una tabla. Así si quiero acceder a una tabla que se llama datos y está en el directorio c:\jorge\cosas, en la propiedad DataBaseName en lugar de desplegar los alias disponibles teclearía la ruta, así:

Propiedad

Valor

DataBaseName c:\jorge\cosas
TableName datos

Para poder visualizar una tabla de una manera rápida lo mejor es un DbGrid, esto es un control marvilloso, no te voy a desvelar nada, es mejor que lo veas tu. Selecciona la pestaña Data Controls, y coloca sobre el formulario el primer control por la izquierda que se llama Dbgrid, coloca sus propiedades como indica esta tabla.

Propiedad

Valor

Align AlClient
DataSourcer DataSourcer1

Si quieres ver en funcionamiento este maravilloso control, coloca un alias, y una tabla en el control Table, pon en true la propiedad Active del control Table que estamos usando.

Fijate que Delphi de nuevo lo ha conseguido, ya que en tiempo diseño podemos tener presente el contenido de la tabla con la que estamos trabajando.

Lo interesante de todo sería poner unos botones para navegar por la tabla (avanzar registros, retroceder, borrar añadir, etc), pues solo tienes que seleccionar el segundo control por la izquierda en la pestaña Data Controls, y colocarlo sobre el formulario, para que quede más bonito colocalo alineado arriba de todo (Align = Altop), y su de nuevo usa la propiedad DataSourcer de este control para conectarlo a la base de datos.

Vamos a colocar un menú y cuadro Abrir Ficheros (OpenDialog), al menú principal llamalo archivo, y dentro de él coloca dos submenús llamados Abrir, y Salir. En el cuadro de dialog coloca en su propiedad Filter, los siguiente filtros:

Nombre del Filtro

Filtro

Dabases de Datos *.db;*.dbf
Todos los archivos *.*

El resto de las propiedades las dejos como están si deseas mejorar el cuadro de dialogo pues a tu libre decisión.

En el evento OnClick del menú Abrir (como siempre) coloca estas líneas de código:

Creo que las líneas se comentan por si solas, solo decir que uso dos funciones muy utiles (por lo menos yo las usos mucho) que son ExtractFilePath y ExtractFileName. La primera devuelve la ruta sin el nombre del archivo, y la segunda devuelve el nombre del archivo. Ten en cuenta que la propiedad FileName del cuadro de dialogo (opendialog1) contiene la ruta completa del archivo seleccionado, ejemplo: c:\jorge\cosas\prueba.db

Bueno en próximos capítulos trataré más ampliamente los controles que he usado hoy así como otros.

Aqui debajo os pongo el código fuente del ejemplo para que que le echeis un vistazo, de todos modos puedes bajar los ficheros de proyecto de hoy en la sección de Descarga, como siempre.

Saludos.


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, Grids, DBGrids, ExtCtrls, DBCtrls, Db, DBTables;

type
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    Table1: TTable;
    DBNavigator1: TDBNavigator;
    DBGrid1: TDBGrid;
    OpenDialog1: TOpenDialog;
    MainMenu1: TMainMenu;
    Archivo1: TMenuItem;
    Abrir1: TMenuItem;
    Salir1: TMenuItem;
    procedure Abrir1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Abrir1Click(Sender: TObject);
begin
       If OpenDialog1.Execute Then
         Begin
         Table1.Close;
         Table1.DatabaseName := ExtractFilePath (OpenDialog1.Filename);
         Table1.TableName := ExtractFileName (OpenDialog1.Filename);
         Table1.Active := True;
         End;
end;

end.
procedure TForm1.Salir1Click(Sender: TObject);
begin
     Close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
      Table1.Active := False;

end;