Curso de C++ Builder


Acceso a Bases de Datos

Componentes de acceso a Bases de Datos



Los componentes de la VCL para el acceso a bases de datos se dividen en categorías siguiendo una variante del modelo MVC (Model-View-Controller) conocida como MVP [Model-View-Presenter]:

El asistente

Aunque podemos crear nuestras aplicaciones de bases de datos directamente a partir de los componentes de bases de datos, C++ Builder nos ofrece un "potente" asistente para generar formularios sencillos que accedan a bases de datos. Para utilizar el asistente hay que seguir los siguientes pasos:

  1. Llamar al asistente como si fuésemos a añadir a nuestro proyecto un formulario más (con "File/New..."), seleccionando "Database Form Wizard" de la pestaña "Business":

    New... Database Form Wizard

    También se puede llamar al asistente directamente desde la opción Form Wizard del menú Database.

  2. Seleccionar el tipo de formulario que deseemos (simple o maestro/detalle) y cómo queremos generarlo (mediante tablas o consultas). Para comenzar, optaremos por un formulario simple construido con una tabla (TTable):

    Type of form

  3. Seleccionamos la tabla a la cual deseamos acceder. En este caso, seleccionamos la base de datos de demostración que aparece bajo el alias de BCDEMOS y, dentro de ella, la tabla BIOLIFE.DB:

    Table

  4. Una vez seleccionada la tabla, hemos de indicar qué campos incluiremos en nuestro formulario. Seleccionamos todos (>>) menos la longitud en pulgadas, LENGTH_IN (<):

    Fields

  5. Ahora podemos escoger la disposición de los controles en el formulario: horizontal, vertical o en una rejilla. Probaremos inicialmente con la disposición horizontal de los controles en el formulario.

    Layout

  6. Finalmente, le indicamos al asistente que cree un formulario acompañado por un módulo de datos independiente (para separar los objetos que modelizan los conjuntos de datos de los controles que constituyen la vista de esos conjuntos de datos):

    Finish

  7. El resultado obtenido es el siguiente:

    Form

    El formulario de la imagen está bien aunque aún necesita algunos retoques. Por ejemplo, los campos de tipo MEMO (textos) o BLOB (imagen en el ejemplo) no deben mostrarse en una simple caja de edición. Por desgracia, al indicarle al asistente que pusiese los campos horizontalmente, ha puesto todos los campos de la tabla como si se pudiesen editar con un simple TDBEdit.

Disposición vertical de los controles

  1. Para evitar el error que se producía anteriormente (el uso indiscriminado de cajas de edición incluso para las imágenes), podemos optar por disponer los campos verticalmente (tal como se hace desde tiempos del dBase):

    Layout

  2. Hemos de indicar, además, si queremos que las etiquetas que indican los nombres de los campos aparezcan a la izquierda o encima de los controles que nos permiten editarlos. Seleccionamos la primera de las opciones:

    Layout

  3. Como en el ejemplo anterior, le indicamos al asistente que cree un formulario acompañado por un módulo de datos independiente:

    Finish

  4. ... y el resultado que obtenemos es el siguiente:

    Form

    Este formulario está algo mejor que el inicial y, para que se vea correctamente la imagen, sólo hemos de poner a true la propiedad Stretch del control que nos la muestra (el único TDBImage del formulario) y ajustar un poco el tamaño de los distintos controles.

Formularios maestro/detalle

Utilicemos ahora el asistente para algo un poco más complejo:

  1. Creamos ahora un formulario maestro/detalle (master/detail) con objetos de tipo TTable para modelizar los conjuntos de datos:

    Master/Detail Form

  2. Seleccionamos la tabla CLIENTS.DBF de la base de datos BCDEMOS como tabla maestra del formulario, una tabla que contiene información acerca de los clientes de una empresa:

    Master Table

  3. Escogemos los campos que nos interese mostrar y los ordenamos utilizando los botones que aparecen debajo de la lista de campos seleccionados:

    Master Fields

  4. Indicamos que los campo de la tabla maestro los dispondremos verticalmente (para evitar que nos pase lo de antes con las imágenes y los textos):

    Master Layout

    Master Layout

  5. Seleccionamos la tabla detalle, que será la tabla HOLDINGS.DBF de la base de datos BCDEMOS (tabla que contiene las inversiones en bolsa de nuestros clientes):

    Detail Table

  6. Escogemos todos sus campos:

    Detail Fields

  7. Y seleccionamos una rejilla para visualizarlos ya que, usualmente, las tablas detalle siempre se muestran en rejillas:

    Detail Layout

  8. Para completar nuestro formulario maestro/detalle hemos de especificar cómo se reliza la reunión entre las tablas CLIENTS.DBF y HOLDINGS.DBF, a través del índice existente sobre la columna ACCT_NBR:

    Join

    Join

  9. Como siempre, le indicamos al asistente que cree un formulario acompañado por un módulo de datos independiente:

    Finish

  10. Voilà! Ya tenemos listo un formulario maestro/detalle y, con unos cuantos retoques, la presentación será la adecuada para incluirlo en alguna de nuestras aplicaciones:

    Master/Detail Form

Ejercicios prácticos
  • Tipo del Formulario: maestro/detalle con objetos TTable.
  • Tabla maestra: Alias BCDEMOS, tabla customer.db.
  • Campos de la tabla maestra: CustNo, Company, Addr1, City, State, Country, Phone (en ese orden).
  • Disposición de los campos de la tabla maestra: Horizontally.
  • Tabla detalle: Alias BCDEMOS, tabla orders.db.
  • Campos de la tabla detalle: CustNo, OrderNo, SaleDate, TaxRate, ItemsTotal (en ese orden).
  • Disposición de los campos de la tabla detalle: In a Grid.
  • Definir la reunión (join) seleccionando el índice CustNo: join CustNo -> CustNo.
  • Tipo del Formulario: maestro/detalle con objetos TTable.
  • Tabla maestra: Alias BCDEMOS, tabla employee.db.
  • Tabla detalle: Alias BCDEMOS, tabla orders.db.
  • Tipo del Formulario: maestro/detalle con objetos TTable.
  • Tabla maestra: Alias BCDEMOS, tabla orders.db.
  • Tabla detalle: Alias BCDEMOS, tabla items.db.
  • Tipo del Formulario: maestro/detalle con objetos TTable.
  • Tabla maestra: Alias BCDEMOS, tabla vendors.db.
  • Tabla detalle: Alias BCDEMOS, tabla parts.db.
  • Tipo del Formulario: maestro/detalle con objetos TTable.
  • Tabla maestra: Alias BCDEMOS, tabla event.db.
  • Tabla detalle: Alias BCDEMOS, tabla reservat.db.
  • Tipo del Formulario: maestro/detalle con objetos TTable.
  • Tabla maestra: Alias BCDEMOS, tabla industry.db.
  • Tabla detalle: Alias BCDEMOS, tabla master.db.
  • Tipo del Formulario: maestro/detalle con objetos TTable.
  • Tabla maestra: Alias BCDEMOS, tabla master.db.
  • Tabla detalle: Alias BCDEMOS, tabla holdings.db.

Limitaciones del asistente

Como hemos visto, el asistente nos permite crear rápidamente formularios que nos permiten gestionar conjuntos de datos. No obstante, cualquier aplicación real requerirá formularios más complejos que los vistos hasta ahora y tendremos que olvidarnos del asistente y crearlos nosotros mismos.

Ejercicios para los cuales el asistente se queda corto
Mostrar la relación entre los lugares en que se celebran actividades (venues.db) y los clientes que acuden a cada recinto (custoly.db). Cada evento (event.db) tiene un lugar de celebración (venues.db) y una serie de reservas (reservat.db) realizadas por clientes (custoly.db).
Mostrar los pedidos de cada cliente (orders.db como detalle de customer.db) indicando los detalles de los pedidos (items.db) y el proveedor de cada pìeza (relación entre items.db y parts.db, que además está relacionada con vendors.db).
Mostrar las inversiones de los clientes (relación entre holdings.dbf y clients.dbf) indicando el nombre de las empresas en las que se invierte (almacenado en master.dbf), no sólo su símbolo.
Mostrar el total de inversiones (holdings.dbf) de cada cliente (clients.dbf) o el importe total de lo que ha ganado cada proveedor (vendors.db) con los pedidos realizados hasta el momento (orders.db).

Índice de la sección