18-04-1998

Bases de Datos II

Voy a seguir profundizando en el mundo de las bases de datos y Delphi. Para ello voy a continuar contandos las caracteristicas de los controles que hemos visto hasta ahora.

Cuando se trabaja con una base de datos, el principal responsable de prácticamente todo es el componente Table. Este componente es el encargado de leer, escribir, actualizar, etc la base de datos a la cual esta conectado, y forma un "tanden" muy util con el componente Datasourcer, el cual es el encargado de conectar al componente table con los controles usados para visualizar los datos. Así el componente Table tiene una larga lista de eventos, que se pueden dividir en tres grupos, los eventos que se producen antes de un operación (apertura, cierre, lectura, etc) los cuales empiezan por la palabra Before (en inglés significa antes de); luego están los eventos que se producen en el momento cuyo nombre empieza por On (recuerda que el evento que se producia cuando se pulsaba un botón se llama Onclick); y por ultimo los eventos que se producen después, cuyo nombre empieza por After (del inglés: después).

Antes de poner una tabla con los principales eventos os voy a comentar las principales operaciones de una tabla, estas son:

Open Se abre la tabla
Close Se cierra la tabla
Edit Para editar el campo actual
Insert Añade datos a la tabla
Post Graba los datos
Cancel Cancela la operación actual

Así pues los principales eventos son los siguientes:

AfterDelete Se produce despues de el borrado de un registro
AfterEdit Después de editar un registro
AfterInsert Después de Insertar
After Post Después de grabar los datos
BeforeCancel Antes de cancelar la operación
BeforeClose Antes de que se cierra la tabla
BeforeDelete Antes de borrar
BeforeEdit Antes de editar el registro actual
BeforeInsert Antes de insertar un registro
BeforeOpen Antes de abrir la tabla
BeforePost Antes de guardar los datos
OnCalcFields Se produce cuando se va a calcular el valor de un campo
OnDeleteError Cuando se produce un error al borrar un registro
OnEditError Cuando hay un error al editar un registro
OnFilterRecord Cuando se activa el filtrado
OnNewRecord Cuando se añade un registro
OnPostError Cuando hay un error durante el grabado de datos

Una cosilla es que por ahora he hablado de principales eventos, principales acciones, etc, y todo es principal, el motivo es que puede haber más operaciones, o eventos, dependiendo si se trabaja en red con servidores de datos, pero como comenté en el capítulo anterior solo voy a hablar de bases de datos locales.

Un ejercicio interesante es abrir una tabla y colocar en algunos eventos unas líneas de código que nos muestren un mensaje diciendonos en que eventos estamos cuando realicemos alguna operación. Un ejemplo seria como estas líneas:
procedure TForm1.Table1AfterOpen(DataSet: TDataSet);
begin
ShowMessage ('Acabo de abrir la tabla');
end;

Hay más aspectos sobre este componente, pero los iremos viendo según surjan.

Otro componente que usamos el capítulo anterior era la barra de navegación (dbNavigator), que también tiene caracteristicas interesantes. De sus propiedades especificas se pueden resaltar algunas. Una es la propiedad VisibleButtons la cual contiene la relación de los botones que son visibles.Por defecto los botones visibles son todos, y como quizas hayas descubierto cada uno tiene una función, de derecha a izquierda los botones que se muestran son:

nbFirst Desplaza la tabla al primer registro
nbPrior Se desplaza al registro anterior
nbNext Avanza un registro
nbLast Se coloca en el último registro
nbInsert Inserta un registro en la tabla
ndDelete Borra el registro actual
nbEdit Pone la tabla en modo edición
nbPost Guarda los datos (post)
ndCancel Cancela la operación actual
nbRefresh Refresca los datos

Otra propiedad es ShowHint, la cual si su valor es true muestra una breve descripción de cada botón, pero inglés. Aunque hay otra propiedad llamada Hints, del tipo TString donde podemos escribir las descripciones que queramos para cada botón. Teniendo en cuenta que la primera línea contrendrá la descripción del primer botón. Y ojo porque si un botón o más no estan visibles debes colocar, igualmente, la descripción del mismo. Así que un pequeño truco que yo uso es, que lo primero que hago es colocar las descripciones de todos los botones, y luego desactivo los botones que me no interesan.

Otra propiedad que es interesante tener en mente es la propiedad ConfirmDelete, la cual si esta en True mostrará un mensaje (en inglés) pidiendo conformidad para borrar el registro actual. Si quieres colocar tu propio cuadro de dialogo, debes colocar esta propiedad en false, y controlar el evento BeforeDelete de la tabla. Un ejemplo podria ser así:

procedure TForm1.Table1BeforeDelete(DataSet: TDataSet);
begin
 If Application.MessageBox ('Estas seguro que deseas borrar este registro',
                             'Borrar un registro',mb_YesNo+MB_IconStop) = ID_No Then
   Abort;
end;

Son interesantes los eventos BeforeAction y OnClick de la barra de navegación, ya en ellos se puede consultar que botón ha sido pulsado de la barra, por medio de la variable button, contendrá el nombre del botón pulsado. Ten en cuenta que hay una diferencia entre estos dos eventos, y es que si pulsas sobre un botón primero es llamado el evento BeforeAction, y luego es llamado el evento Onclick.

Quizas a alguien le interse crearse una barra de herramientas en su aplicación y usar botones convencionales en sustitución de la barra de navegación, o simplemente ha decido poner un menú en su aplicación que haga las misma funciones que la barra de navegación. Pues la solución es colocar en el evento Onclick de lo menus la orden correspondiente a la acción que queremos hacer, pero esta vez hay que indicarselo a la tabla, y no a la barra de navegación.

Los métodos que hay que llamar son:

First Para llevar la tabla al principio
Prior Para retroceder un registro
Next Para avanzar un registro
Last Para ir al último registro
Edit Para editar el registro actual
Insert Para inserta un registro
Delete Borra el registro actual
Edit Coloca la tabla en modo edición
Post Guarda los datos
Cancel Cancela la operación (inserción)
Refresh Refresca los datos de la tabla

Solo comentaros que el método Refresh se usa cuando se quiere refrescar el contenido de la tabla tras un cambio, así los componentes asociados a ellas reflejan el cambio, esto es común cuando la tabla es compartida, está en un servidor.

Al ejemplo del capítulo anterior le ha añadido un menú que hace las mismas operaciones que la barra de navegación, además de mostrar un mensaje personalizado cuando se va a borrar un registro.Podeis descargar el código fuente con las modificaciones en el area de descarga.