Bases de Datos Relacionales


Que tal amigos, en esta sección veremos como podemos realizar un programa que utilice B.D. relacionales ligadas a través de su clave primaria. Por cierto al final pongo a su disposición el código fuente del ejemplo para que lo descarguen y analicen.

Pero antes que nada será necesario explicar los conceptos básicos sobre las B.D. relaciónales, por cierto a todos nos cae bien un recordatorio si es que ya los conocemos.

Conceptos Generales

La finalidad de las bases de datos es almacenar información, algo parecido a los archivos con la ventaja de que la estructuran y la organizan según cierto modelo. Existen muchos escritores que a menudo toman el concepto de B.D. como un conjunto de tablas, y por lo general hay muchas personas que manejan el concepto de B.D. para las tablas cosa que en su totalidad no es cien por ciento correcto pero bueno el objetivo es el mismo.

Tabla . . . Es una colección de elementos de información agrupados en filas y columnas, la cual almacena la información sobre una entidad diferenciada.

Fila . . . También es conocido como registro y representa un ejemplar del objeto que abstrae la tabla, esto es una instancia de la entidad real  de la cual almacenamos datos, esto se refiere a que si en una tabla en la cual almaceno los nombres de mis compañeros y sus datos personales, existirá una fila por cada compañero que capture.

Columna . . . Las columnas de la tabla, comúnmente conocidas como campos describen cada uno de los atributos o características de los objetos que representan los registros de la tabla. Por ejemplo si creara una tabla para construir una agenda mis columnas podrían ser Nombre, Dirección, Teléfono, etc.

Celda . . . Es la intersección de una fila y una columna y representa el valor de un determinado atributo, el representado por la columna a la que pertenece la celda para un registro de la tabla.

Modelo Relacional de Bases de Datos

Se apoya en el calculo relacional desarrollado por E.F. Cood en los años 70´s. En el modelo relacional los vínculos entre las entidades de datos se establecen mediante la abstracción de relaciones entre las distintas tablas, estas relaciones se obtienen  del análisis de la naturaleza intrínseca de los datos.

A continuación explicare las reglas que se deben tomar en cuenta al momento de crear B.D. relacionales.

Clave Primaria . . . Es una columna que contiene valores distintos para todas las filas de la tabla y sirve para identificar a cada registro de forma univoca.

Claves Candidatas . . . Muchas de las veces pueden existir diferentes columnas que podrían ser claves primarias ya que también identifican de forma univoca un registro. Cada una de estas columnas son llamadas Claves Candidatas.

Claves ajenas . . . Es una columna o grupo de columnas en una tabla que contienen valores que casan o enlazan con una clave primaria en otra tabla, es de aquí donde se desprende el Join.

Relaciones entre Tablas

Sistemas Gestores de Bases de Datos

Las bases de datos si se han diseñado a partir de un determinado modelo resultan independientes del modo físico concreto en el que la información que contienen se halla almacenada. Esto significa pues que al menos en teoría se puede acceder mediante cualquier aplicación dicha información siempre y cuando se sigan las convenciones del modelo.

Gestores Cliente / Servidor

Los gestores de B.D. que utilizan esta arquitectura como InterBase, MySQL, etc. separan la aplicación que maneja los datos de las aplicaciones que muestran y actualizan la información para cada usuario. A continuación describo sus principales características:

Abstracción de la Información

Abstracción de datos y de operaciones . . . Consiste en centrarse en aquello que es fundamental, ignorando los detalles y centrándose en el conjunto. La mayoría de los gestores de B.D. aportan abstracción de datos, si bien los sistemas orientados a objetos y por consiguientes los sistemas de gestión de B.D. orientados a objetos aportan abstracción de datos y abstracción de operaciones.

Nivel de Abstraccion . . . Un SGBD debe proporcionar a los usuarios una visión abstracta de los datos, el sistema debe esconder ciertos detalles de como se almacenan y mantienen los datos. A continuación explicare los principales niveles de abstracción.

Un primer nivel seria el que implementan los sistemas orientados a archivos en los que no se dispone de independencia lógica.

Después nos encontraríamos con un modelos mas evolucionado, de dos niveles en el que los archivos se ven como tipos abstractos de datos a portando de este modo una independencia física de los datos.

Posteriormente se consigue la independencia lógica  e independencia física y finalmente la organización de estándares (ISO) la cual propuso un esquema de cuatro niveles donde el nivel conceptual se divide en dos partes: El esquema propiamente conceptual que posee las características infologicas, es decir, del mundo real y el esquema de la base de datos que posee las características tecnológicas.

Independencia de Datos

Los datos deben ser independientes, esto significa que el modelo que construyamos debe permitir que las aplicaciones y sus programas no se vean afectados por los cambios en los datos o esquemas utilizados.

Independencia Física . . . El objetivo es definir el modelo cumpliendo la premisa de que los datos sean físicamente independientes, esta basado en la necesidad de proteger a nuestros datos de la eventualidad de que cambios en el nivel interno afecten a los niveles superiores.

Independencia lógica . . . Por otra parte , también debemos procurar que los cambios en el esquema conceptual no afecten al esquema externo. Esta protección se consigue mediante la independencia lógica.

Modelos de Datos

Como se ha comentado al principio de este apartado un modelo de datos es una colección de herramientas conceptuales para describir información y como está relacionada  internamente. A continuación describo algunos modelos.

Modelos Lógicos Basados en Objetos . . . Su objetivo es permitir describir los niveles externo y conceptual descritos anteriormente, dicho de otra forma podremos describir la B.D. sin fijarnos en su implementación y las diferentes vistas que los usuarios pueden utilizar de esta. Existen dos modelos los cuales son los mas conocidos dentro de esta calificación:

Modelos Lógicos Basados en Registros . . . Su objetivo es describir tanto el nivel conceptual como interno. El modelo ha de permitirnos representar e implementar la B.D. al tiempo que nos facilitara considerar los mecanismos a utilizar para que el acceso a la información resulte eficiente.  A continuación describo  algunos modelos de este tipo:

Modelos Físicos de Datos . . . Su objetivo es describir el nivel interno, dicho de otra forma el almacenamiento de los datos desde el punto de vista físico.

Delphi utiliza un intermediario para conectar con la base de datos: se llama BDE (Borland Database Engine). Puede conectar con diversos tipos de bases de datos de forma directa (Interbase, Paradox, Informix, ...) o bien a través de ODBC. Así pues, es el BDE el que realiza el trabajo duro de "hablar" con el servidor de base de datos, quedándonos a nosotros una tarea mucho más sencilla: poder olvidarnos de cómo es la estructura interna (a nivel de estructura de ficheros) de la base de datos, centrándonos en las tablas como idea y en el diseño de las consultas.


Muy bien una vez explicada un poco la teoría pasaremos a realizar un ejemplo de como podemos utilizar múltiples tablas utilizando claves ajenas.

En Delphi es realmente censillo hacer relaciones entre tablas, puesto que en el manual de Delphi que puesto en este sitio se ve lo básico algunas cosas las daré por entendidas.

A continuación explicare dos propiedades importantes del componente TTable por medio del cual estableceremos las relaciones.

MasterDataSource . . . Esta propiedad nos permite indicarle al componente TTable cual será su DataSorce  maestro del cual dependerá la relación, es decir supongamos que tengo dos tablas y la segunda tabla depende de la primera entonces en la propiedad MasterDataSource de la segunda tabla pondría DataSource1 que por cierto el DataSource1 va ligado a la tabla1.

MasterField . . . Esta propiedad me permite indicarle a la tabla cual será la clave ajena o el campo que utilizare para llevar acabo la relación. y al darle click sobre esta propiedad nos presentara la siguiente ventana.

Como podemos ver en Available Indexes indicamos el tipo de índice por medio del cual aremos la relación tomando en cuenta que existen índices primarios y secundarios, recordemos que una clave ajena puede ser cualquiera de estos dos.

En DetailField aparecen todos los campos que tengan el tipo de  clave que se haya elegido, en este caso solo aparece N_Cuenta, por cierto los campos que aparecen aquí pertenecen a la tabla que se esta relacionando.

MAsterField contiene todos los campos de la tabla maestra con la cual se quiere relacionar, por lo tanto es solo cuestión de elegir los campos por medio de los cuales haremos la relación y dar click en donde dice Add y después Ok. y listo. Podemos ver que en nuestro caso los campos elegidos son N.Cuenta para las dos tablas. Ojo los nombres de los campos no requieren que sean idénticos pero si iguales en su tipo de dato.

Con estas dos propiedades que he explicado podemos relacionar tablas, pero creo que para que quede mas explicado no hay como hacer un sistemita de ejemplo.

El sistema de ejemplo es muy censillo, será un sistema bancario en el cual se registraran los clientes, sus saldos y sus transacciones. Utilizaremos tres tablas en donde las ultimas dos estarán ligadas a la primera.

Así es que arranca Delphi, ve al DataBase Desktop y haz las siguientes tablas y guárdalas en un directorio de nombre Banco.

Tabla 1:

Nombre: Principal.db   Tipo Tabla: Paradox 7

Field Name Type Size Key
N cuenta N   *
Cliente A 40  
Domicilio A 40  
Telefono A 15  

 Tabla 2:

Nombre: Saldos.db   Tipo Tabla: Paradox 7

Field Name Type Size Key
N cuenta N   *
Saldos $    

Tabla 3:

Nombre: Historial.db    Tipo Tabla: Paradox 7

Field Name Type Size Key
N cuenta N   *
Hisorial M 240  
Historial2 M 240  

Observemos que la relación entre las tablas la aremos a través del campo  "N Cuenta", el cual esta declarado del mismo tipo de datos en las tres tablas.

Muy bien ahora crea una nueva aplicación en Delphi, sobre el formulario pon los siguientes componentes;

         Bueno el diseño del formulario seria el siguiente:

Pese a que todavía no hemos creado los demás forms, de todos modos les daré el código que ira en cada uno de esos botones.

Registro Saldos Consulta Salir
Form2.ShowModal; Form2.Table1.Edit;
Form2.Table3.Edit;
Form2.Table2.Edit;
Form4.ShowModal;
Form2.Table1.Edit;
Form2.Table2.Edit;
Form2.Table3.Edit;
Form5.ShowModal;
Application.Terminate;

Bueno ahora crea un segundo formulario en New Form.

Coloca sobre el form un Label y en su Caption "Control de Clientes" y centralo en la parte superior del Form.

Coloca tres componentes TTable y tres componentes TDataSource.  Liga cada DataSource con su correspondiente Tabla.

A las tres tablas en su propiedad DataBaseName ponles C:\Banco , esta es la ruta en donde guardaste las tablas.A la Tabla uno  en su propiedad TableName ponle Principal.db, a la dos Historial.db y a la tres Saldos.db. A las tres tablas en su propiedad IndexFieldNames Ponles "N cuenta" que es la clave primaria de las tres tablas.

Muy bien ahora aremos las relaciones entre ellas. A la tabla dos y tres en su propiedad MasterDataSource Ponles DataSource1, es aquí en donde indicamos que estará ligada a la tabla uno, solo nos falta decirle a través de cual campo.

Lo siguiente lo aras para la tabla dos y tres. Dale Click en su propiedad  MasterField para que te aparezca la ventana que anteriormente se explico, por si acaso te la volveré a mostrar ya que es la misma que te saldrá a ti debido a que la tome precisamente de este ejemplo que desarrollo.

Tendrás que seleccionar de los dos lados el campo N cuenta y dar en el botón Add para que te agregue la relación, después dar sobre el botón Ok. y con esto ha quedado la relación. Recuerda que lo tienes que hacer para la tabla dos y tres.

Por ultimo pon la propiedad Active a True para las tres tablas.

 

 

 

Coloca un componente GroupBox y extiendelo sobre el form. Borrale el contenido de la propiedad Caption. Sobre el pon cuatro Labels y en orden pondrás en su propiedad Caption:  N.Cuenta, Nombre, Domiclio, Telefono.

En frente y para cada Label pondrás un componente DBEdit y en su propiedad DataSource les pondrás DataSource1. Ahora en su propiedad DataField pondrás el nombre del campo alusivo a el Label que representa.

Por ultimo fuera del GroupBox y en la parte inferior del Form coloca cinco BitBtn´s. En orden pon en su Caption lo siguiente: Insertar, Borrar, Guardar, Buscar, Cerrar.

Ahora te daré el código de cada uno de los botones.

Insertar:

Table1.Insert;

{Automáticamente inserta un registro en blanco en las tablas que están ligadas a ella.}

Borrar:

if Application.MessageBox('QUIERES BORRAR ESTE CLIENTE ?','BORRAR',MB_OKCANCEL+MB_ICONQUESTION)=IDOK then
begin
Table3.Delete;
Table2.Delete;
Table1.Delete;
end;

{Aquí es necesario mencionar que es preciso borrar primeramente el registro de las tablas ligadas antes de borrar el de la tabla principal, y si no se borra el registro de las tablas ligadas que son la 2 y 3, cuando se capture en la principal un cliente con ese mismo numero pues le saldrá la información contenida en las otras tablas.}
 

Guardar:

try
Table1.Post;
Table2.Edit;
Table3.Edit;
Table2.Post;
Table3.Post;
except
ShowMessage('El Cliente ya esta registrado');
end;
Table1.Edit;

 

{Note que en este caso hacemos un post en la tabla principal y después en las tablas 2 y 3, esto para que quede grabada la información, de lo contrario la información no quedaría grabada en las tablas a menos que se salieran del sistema o hicieran otro movimiento, por lo tanto si no se hicieran esto es seguro que les marcaría un error el programa al momento de ejecutar el código del botón Borrar.}

Buscar:

Form3.Show;

Cerrar:

Close;

Bueno con esto hemos terminado el formulario 2 pero aun nos faltan mas. Así es que crea un nuevo formulario, en su Caption pondrás Búsquedas.

Coloca sobre el formulario un GroupBox y borrale el contenido de su Caption. Dentro del GroupBox coloca un Label y en su Caption pon Clave, después dentro del GroupBox coloca un Edit en frente del Labe, Borra el contenido de su propiedad Text, ahora coloca dos BitBtn´s  a uno ponle Buscar y al otro ponle Cancelar en su Caption.

Como puedes darte cuenta este es el formulario de búsquedas y su diseño quedaría como sigue:

Muy bien poco a poco hemos ido avanzando por favor no te desesperes. A continuación te doy el código de los botones:

 

 

 

Buscar:

Form2.Table1.IndexFieldNames := 'N cuenta';
if Form2.Table1.FindKey([Edit1.Text]) = False then
ShowMessage('Cliente no encontrado');
Close;
Form2.Table1.Edit;
Form2.Table3.Edit;
Form2.Table2.Edit;

 

Cancelar:

Edit1.Text := '';
Close;

 

Muy bien ahora crea un nuevo formulario y en su Caption le pones  Saldos de Clientes.

Sobre el formulario Coloca un GroupBox y en su Caption ponle Cliente, sobre el GroupBox coloca dos Labels y ponles en su caption N.Cuenta, Cliente, enfrente y para cada una de ellas coloca un DBEdit y en su propiedad DataSource ponles Form2.DataSource1, en su propiedad DataField  ponles N cuenta y Cliente respectivamente. La propiedad ReadOnly de los DBEdit ponla en True;

Coloca un Panel sobre el formulario, borra el contenido de su propiedad Caption, la propiedad BevelOuter ponla en bvLowered, dentro de este panel coloca un Label que diga Saldo Actual, enfrente de ella coloca un DBEdit y en su propiedad DataSource ponle Form2.DataSource3, en DataField elige Saldos y su propiedad ReadOnly Pon en True.

Ahora dentro del panel coloca un GroupBox, borra en contenido de su propiedad Caption, dentro de este GroupBox coloca un Label que diga Cantidad, después coloca un Edit y borra el contenido de su propiedad Text.

Finalmente coloca Cuatro BitBtn´s sobre el panel,  a los cuales en orden les pondrás en su Caption: Buscar, Agregar, Retirar, Cancelar.

El diseño quedaría como sigue:

Como puedes ver en caso de que quieras ponerle alguna imagen al botón pues puedes hacerlo, eso le dará vista a tu aplicación.

A continuación te mostrare el código de cada uno de los botones.

 

 

 

 

 

Buscar:   Form3.Show;

Agregar:

var datos : String;
begin
Form2.Table1.Edit;
Form2.Table3.Edit;
Form2.Table3.FieldByName('Saldos').AsFloat := Form2.Table3.FieldByName('Saldos').AsFloat + StrToFloat(Edit1.Text);
Form2.Table1.Post;
Form2.Table1.Edit;
Form2.Table3.Edit;
Form2.Table2.Edit;
Form2.Table2.Edit;
datos := DateToStr(Date) + ' ' + TimeToStr(Time) + '$' + Edit1.Text;
Form5.DbMemo2.Lines.Add(datos);
Form2.Table2.Post;
Form2.Table2.Edit;
ShowMessage('Saldo Agregado');
Edit1.Text:= '';


{ Nota que aquí he declarado una variable datos de tipo String, misma que utilizo para almacenar una cadena formada por la fecha, hora y cantidad que deposito el cliente en un DBMemo que se encuentra en el formulario 5, como el DBMemo esta ligado directamente a la tabla automáticamente se graba.}

Retirar:

var datos : String;
begin
if StrToInt(Edit1.Text) > Form2.Table3.FieldByName('Saldos').AsFloat then
begin
ShowMessage('La Cantidad a Retirar es Superior al saldo actual');
Edit1.Text := '';
Edit1.SetFocus;
end
else
begin
Form2.Table1.Edit;
Form2.Table3.Edit;
Form2.Table3.FieldByName('Saldos').AsFloat := Form2.Table3.FieldByName('Saldos').AsFloat - StrToFloat(Edit1.Text);
Form2.Table1.Post;
Form2.Table1.Edit;
Form2.Table3.Edit;
Form2.Table2.Edit;
datos := DateToStr(Date) + ' ' + TimeToStr(Time) + '$' + Edit1.Text;
Form5.DbMemo1.Lines.Add(datos);
Form2.Table2.Post;
Form2.Table2.Edit;
ShowMessage('Cantidad Retirada');
Edit1.Text:= '';
end;
 

{Este código es similar al anterior, solo que aquí valido que la cantidad a retirar no sea mayor a la cantidad que el cliente tiene.}

Cancelar:  Close;

Muy bien, este formulario ha quedado terminado, pero no  el sistema.

Crea un nuevo formulario y en su Caption ponle Referencias. Sobre el formulario Coloca un GroupBox y en su Caption ponle Cliente, sobre el GroupBox coloca dos Labels y ponles en su caption N.Cuenta, Cliente, enfrente y para cada una de ellas coloca un DBEdit y en su propiedad DataSource ponles Form2.DataSource1, en su propiedad DataField  ponles N cuenta y Cliente respectivamente. La propiedad ReadOnly de los DBEdit ponla en True;

Coloca un Label sobre el formulario, en su Caption ponle Depósitos, debajo de ese Label coloca un DBMemo y en su propiedad DataSource ponle Form2.DataSource2, en su propiedad DataField ponle Historial.

Ahora coloca un Label sobre el formulario, en su Caption ponle Retiros, debajo de ese Label coloca un DBMemo y en su propiedad DataSource ponle Form2.DataSource2, en su propiedad DataField ponle Historial2.

Por ultimo coloca dos BitBtn´s en su Caption pon Buscar y Cancelar respectivamente. A continuación muestro el diseño del Form.

Muy bien, ahora te mostrare el código que va en cada uno de los botones.

Buscar: Form3.Show;

Cancelar: Close;

Finalmente hemos acabado de diseñar el sistema, ahora viene la prueba mas difícil, correrlo, así es que.... que esperas correlo y analiza su funcionamiento.

Bueno..... Mira si tienes problemas con el sistema al correrlo no te preocupes pues he puesto el código fuente de este programa así es que si quieres descargarlo pues adelante.

Suerte Amigo.

CÓDIGO FUENTE DEL EJEMPLO BANCARIO

 

 

Si tienes algún comentario o deseas compartir alguna información da Click Aquí.....