PDF de programación - La potencia de los ClientDataSet

Imágen de pdf La potencia de los ClientDataSet

La potencia de los ClientDataSetgráfica de visualizaciones

Actualizado el 22 de Junio del 2017 (Publicado el 15 de Enero del 2017)
841 visualizaciones desde el 15 de Enero del 2017
212,8 KB
13 paginas
Creado hace 9a (26/08/2010)
La potencia de los ClientDataSet

El mundo de la programación de bases de datos cambia tan rápidamente que casi no nos da
tiempo a asimilar los nuevos protocolos. Comenzamos con DBase, Clipper, FoxPro, .., hasta
hoy en día que tenemos Microsoft SQL Server, Interbase, Firebird, etc.

Luego tenemos el maremagnum de lenguajes de programación donde cada cual se come el
acceso a datos a su manera: Java con sus infinitos frameswork tales como hibernate, struts,
etc., Ruby con el archiconocido Ruby On Rails que utiliza el paradigma MVC (Modelo, Vista,
Controlador), Microsoft a su rollo con ADO y su plataforma Microsoft.NET. Todo eso sin contar
con los potentes lenguajes script que no tienen la atención que merecen como son PHP,
Ruby, Python, TCL/TK, Groovy, etc. Hasta la mismísima CodeGear nos ha sorprendido con su
IDE 3rdRails para programación en Ruby On Rails.

Pero si hay algo que hace que Delphi destaque sobre el resto de entornos de programación
es su acceso a múltiples motores de bases de datos utilizando una misma lógica de negocio
que abstrae al programador de las rutinas a bajo nivel. En la conocida tecnología de acceso a
datos llamada MIDAS.

Las primeras versiones de Delphi contaban con el veterano controlador de bases de datos
BDE (Borland Database Engine) que permitía acceder a las clásicas bases de datos DBASE,
PARADOX, etc. En la versión 5 de Delphi se incluyeron los componentes IBExpres (IBX) que
permitían tener un acceso directo a bases de datos Interbase y Firebird. Fue a partir de
Delphi 6 cuando Borland apostó por la tecnología DBExpress, un sistema rápido mediante
drivers que utilizando un mismo protocolo permitía conectividad con múltiples motores de
bases de datos tales como Interbase, Firebird, Oracle, MySQL, Informix, Microsoft SQL Server,
etc. Incluso en su última versión (DBX4) permite acceder a su nuevo motor de bases de
datos multiplataforma llamado BlackFish programado integramente en .NET y Java
(anteriormente se llamaba JDataStore y estaba programado en Java).

Luego tenemos también otros componentes muy buenos de acceso a datos tales como Zeos,
Interbase Objects (IBO), FIBPlus, etc. Y por supuesto el conocido protocolo de acceso a datos
de Microsoft llamado ADO, siendo su última versión ADO.NET la que tiene bastantes
posibilidades de convertirse en un estandar para todos los entornos Windows.

Pero si hay un componente de acceso a bases de datos en Delphi que destaque sobre todos
los demás ese es el ClientDataSet. Combina la facilidad de acceso a datos a través de la
clase TDataSet y la potencia de controlar automáticamente las transacciones al motor de
bases de datos, las SQL de consulta, actualización y eliminación así como la conexión y
desconexión de las tablas con el servidor haciendo que el programador no tenga que
preocuparse de las particularidades del motor de bases de datos.
El componente de la clase TClientDataSet no conecta directamente sobre una base de
datos en concreto, si no que utiliza el componente DataSetProvider que actua de
intermediario haciendo de puente entre los componentes de bases de datos (IBX,IBO,etc) y
nuestra tabla ClientDataSet. El componente ClientDataSet es algo así como una tabla de
memoria (como la que tienen los componentes RX) que se trae y lleva datos a las tablas de
la base de datos encargándose automáticamente de las transacciones.
LA ESTRUCTURA CORRECTA DE UN PROGRAMA

Para crear una buena aplicación con acceso a bases de datos hay que dividir nuestro
programa en tres partes principales:
Capa de acceso a datos: se encarga de conectar con un motor de bases de datos en
concreto ya sea con componentes IBX, ADO, BDE, etc.
Lógica de negocio: aquí se definen como son nuestras tablas (CLIENTES, ARTICULOS,etc),
los campos que contienen así como el comportamiento al dar de alta registros, modificarlos,

realización de cálculos internos, etc. Todo esto lo haremos con componentes de la clase
TClientDataSet y TDataSetProvider.
Interfaz de usuario: se compone de los formularios, informes y menús de opciones que va
a visualizar el usuario y que estarán internamente conectados con los ClientDataSet.

La interfaz de usuario sólo podrá acceder a la lógica de negocio y esta última sólo a la capa
de acceso a datos. Así, si en un futuro queremos cambiar la interfaz de usuario (por ejemplo
para Windows Vista) o el motor de base de datos no afectaría al resto de las capas del
programa.
Para ello vamos a utilizar los componentes contenedores de la clase TDataModule para
alojar la lógica de negocio y el acceso a datos. En nuestro ejemplo crearemos una base de
datos de clientes definiendo las tres capas.
CREANDO LA BASE DE DATOS

En este ejemplo voy a crear una base de datos de clientes utilizando el motor de bases de
datos Firebird 2.0 y con los componentes IBX. Las tablas las voy a crear con el programa
IBExpert (http://www.ibexpert.com) cuya versión personal es gratis y muy potente. La base
de datos se va a llamar BASEDATOS.FDB, pero si haceis las pruebas con Interbase
entonces sería BASEDATOS.GDB. No voy a explicar aquí como funciona el programa
IBExpert o IBConsole ya que hay en la red información abundate sobre ambos programas.

Creamos la tabla de clientes:
CREATE TABLE CLIENTES (
ID INTEGER NOT NULL,
NOMBRE VARCHAR(100),
NIF VARCHAR(15),
DIRECCION VARCHAR(100),
POBLACION VARCHAR(50),
CP VARCHAR(5),
PROVINCIA VARCHAR(50),
IMPORTEPTE DOUBLE PRECISION,
PRIMARY KEY (ID)
)

Como quiero que el ID sea autonumérico voy a crear un generador:
CREATE GENERATOR IDCLIENTE

Y un disparador para que cuando demos de alta el registro rellene automáticamente el ID y
autoincremente el contador del generador:
CREATE TRIGGER CONTADOR_CLIENTES FOR CLIENTES
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
NEW.ID = GEN_ID( IDCLIENTE, 1 );
END

NOTA IMPORTANTE: Hay algunas versiones de Delphi 7 que tienen un error en los
componentes IBExpress (IBX) que hacen que los componentes ClientDataSet no funcionen
correctamente. Recomiendo actualizar los componentes IBX a la versión 7.04 que podeis
encontrarla en:

http://codecentral.borland.com/Item.aspx?id=18893

Ahora comenzaremos a realizar el programa utilizando esta base de datos.

Después de haber creado la base de datos en Firebird 2.0 ya podemos comenzar a crear un
nuevo proyecto que maneje dicha información. El objetivo del proyecto es hacer el siguiente
mantenimiento de clientes:

CREANDO LA CAPA DE ACCESO A DATOS

La capa de acceso a datos encargada de conectar con Firebird va a incorporar los siguientes
componentes:

- Un contenedor DataModule llamado AccesoDatos.
- Un compomente IBDatabase (pestaña Interbase) llamado BaseDatos.
- Un componente IBTransaction (pestaña Interbase) llamado Transaccion.
- Dos componentes IBQuery (pestaña Interbase) llamados LstClientes y Clientes.
Se sopone que la base de datos BASEDATOS.FDB esta al lado de nuestro ejecutable. Vamos
a comenzar a configurar cada uno de estos componentes.
Hacemos doble clic sobre el componente IBDatabase y en el campo User Name le
ponemos SYSDBA. En en password le ponemos masterkey:

Pulsamos OK, y después en la propiedad DefaultTransaction del componente IBDatabase
seleccionamos Transaccion, desactivamos la propiedad LoginPrompt y nos aseguramos
que en SQLDialect ponga un 3.
Para el componente IBTransaction llamado Transaccion seleccionaremos en su propiedad
DefaultDatabase la base de datos BaseDatos.

Como nuestra intención es tener una rejilla que muestre el listado general de clientes y un
formulario para dar de alta clientes, lo que vamos a hacer es crear una tabla IBQuery para
la rejilla llamada LstClientes y otra tabla para el formulario del cliente llamada Clientes.
Sería absurdo utilizar un mismo mantenimiento para ambos casos ya que si tenemos miles
de clientes en la rejilla, el tener cargados en memoria todos los campos del cliente podría
relentizar el programa.
En los componentes LstClientes y Clientes vamos a configurar también:
Database: BaseDatos
Transaction: Transaccion
UniDirectional: True
El motivo de activar el campo UniDirectional es para que el cursor SQL trabaje más rápido
en el servidor ya que los componentes ClientDataSet gestionan en memoria los registros
leidos anteriormente.

Como en la rejilla sólo quiero mostrar los campos ID, NOMBRE y NIF entonces en el
componente LstClientes en su propiedad SQL vamos a definir:
SELECT ID,NOMBRE,NIF FROM CLIENTES
ORDER BY ID DESC

y para el componente Clientes:
SELECT * FROM CLIENTES
WHERE ID=:ID

En la condición WHERE de la SQL hemos añadido el parámetro :ID para que se pueda más
adelante acceder directamente a un registro en concreto a partir de su campo ID.

Una vez definida nuestra capa de acceso a datos ahora nos encargaremos de definir nuestra
lógica de negocio.
Después de crear la base de datos y la capa de acceso a datos dentro del DataModule

vamos a crear la lógica de negocio.

Antes de seguir tenemos que hacer doble clic en los componente IBQuery de la capa de
acceso a datos y pulsar la combinación de teclas CTRL + A para introducir todos los campos
en el módulo de datos. Y en cada una de ellas hay que seleccionar el campo ID y quitar la
propiedad Required ya que el propio motor de bases de datos va a meter el campo ID con
un disparador.

Pero tenemos un problema, y es que no hemos seleccionado donde esta la base de datos.
Para ello hacemos doble clic en el objeto BaseDatos situado módulo de datos
AccesoDatos. Seleccionamos una base de datos Remota (Remote) con IP 127.0.0.1. Y la
base de datos donde la tengamos, por ejemplo:

D:\Desarrollo\Delphi7\ClientDataSet\BaseDatos.fdb

De este modo, al hacer CTRL + A sobre las tablas conectará automáticamente sobre la base
de datos para traerse los campos. No se os olvide luego desconectarla.
CREANDO LA LOGICA DE NEGOCIO

La capa de lógica de negocio también la vamos a implementar dentro de un objeto
Data
  • Links de descarga
http://lwp-l.com/pdf1880

Comentarios de: La potencia de los ClientDataSet (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad