Las herramientas CASE (Computer-Aided Software Engineering) ayudan en:
Clasificación CASE:
Herramientas CASE populares:
Objetivo: Utilizar una herramienta CASE para modelar una base de datos de biblioteca.
Enunciado:
ENTIDADES PRINCIPALES:
LIBRO (ISBN, título, año, editorial)
AUTOR (id, nombre, nacionalidad)
EJEMPLAR (código, ubicación, estado)
USUARIO (id, nombre, dirección)
PRÉSTAMO (id, fecha_préstamo, fecha_devolución)
RELACIONES:
LIBRO - AUTOR: M:N (un libro tiene varios autores, un autor tiene varios libros)
LIBRO - EJEMPLAR: 1:N (un libro tiene varios ejemplares)
USUARIO - PRÉSTAMO: 1:N (un usuario tiene varios préstamos)
EJEMPLAR - PRÉSTAMO: 1:1 (cada préstamo es de un ejemplar)
-- Tablas principales LIBROS (ISBN*, título, año, editorial, edición) AUTORES (id*, nombre, nacionalidad, fecha_nacimiento) EJEMPLARES (código_barras*, ISBN#, ubicación, estado) USUARIOS (id*, nombre, dirección, teléfono, email) -- Tablas de relación LIBRO_AUTOR (ISBN#, autor_id#, rol) -- Para relación M:N PRÉSTAMOS (id*, usuario_id#, ejemplar_código#, fecha_préstamo, fecha_devolución, estado) -- Notación: -- * = Llave primaria -- # = Llave foránea
-- MySQL Workbench genera este código desde el modelo E-R CREATE SCHEMA IF NOT EXISTS `biblioteca` DEFAULT CHARACTER SET utf8; USE `biblioteca`; -- Tabla 'libros' CREATE TABLE `libros` ( `ISBN` VARCHAR(20) NOT NULL, `titulo` VARCHAR(200) NOT NULL, `año` INT NULL, `editorial` VARCHAR(100) NULL, `edicion` INT NULL, PRIMARY KEY (`ISBN`)); -- Tabla 'autores' CREATE TABLE `autores` ( `id` INT NOT NULL AUTO_INCREMENT, `nombre` VARCHAR(100) NOT NULL, `nacionalidad` VARCHAR(50) NULL, `fecha_nacimiento` DATE NULL, PRIMARY KEY (`id`)); -- Tabla intermedia 'libro_autor' CREATE TABLE `libro_autor` ( `libro_ISBN` VARCHAR(20) NOT NULL, `autor_id` INT NOT NULL, `rol` VARCHAR(50) NULL, PRIMARY KEY (`libro_ISBN`, `autor_id`), CONSTRAINT `fk_libro_autor_libros` FOREIGN KEY (`libro_ISBN`) REFERENCES `libros` (`ISBN`), CONSTRAINT `fk_libro_autor_autores` FOREIGN KEY (`autor_id`) REFERENCES `autores` (`id`)); -- Tabla 'ejemplares' CREATE TABLE `ejemplares` ( `codigo_barras` VARCHAR(50) NOT NULL, `libro_ISBN` VARCHAR(20) NOT NULL, `ubicacion` VARCHAR(50) NULL, `estado` ENUM('disponible', 'prestado', 'reparacion') NULL DEFAULT 'disponible', PRIMARY KEY (`codigo_barras`), CONSTRAINT `fk_ejemplares_libros1` FOREIGN KEY (`libro_ISBN`) REFERENCES `libros` (`ISBN`)); -- Tabla 'usuarios' CREATE TABLE `usuarios` ( `id` INT NOT NULL AUTO_INCREMENT, `nombre` VARCHAR(100) NOT NULL, `direccion` VARCHAR(200) NULL, `telefono` VARCHAR(20) NULL, `email` VARCHAR(100) NULL, PRIMARY KEY (`id`)); -- Tabla 'prestamos' CREATE TABLE `prestamos` ( `id` INT NOT NULL AUTO_INCREMENT, `usuario_id` INT NOT NULL, `ejemplar_codigo` VARCHAR(50) NOT NULL, `fecha_prestamo` DATE NOT NULL, `fecha_devolucion` DATE NULL, `estado` ENUM('activo', 'completado', 'atrasado') NULL DEFAULT 'activo', PRIMARY KEY (`id`), CONSTRAINT `fk_prestamos_usuarios1` FOREIGN KEY (`usuario_id`) REFERENCES `usuarios` (`id`), CONSTRAINT `fk_prestamos_ejemplares1` FOREIGN KEY (`ejemplar_codigo`) REFERENCES `ejemplares` (`codigo_barras`));
/** * MODELO DE DATOS PARA SISTEMA DE BIBLIOTECA * Versión: 1.0 * Autor: Equipo de Desarrollo * Fecha: 2023-11-15 * * Descripción: * Este modelo representa el sistema de gestión de una biblioteca, * incluyendo libros, autores, ejemplares, usuarios y préstamos. * * Notas importantes: * - Un libro puede tener múltiples autores (relación muchos a muchos) * - Cada libro tiene múltiples ejemplares físicos (relación uno a muchos) * - Los préstamos se registran por ejemplar, no por libro * - Se utiliza enumeraciones para estados predefinidos */ -- Comentarios a nivel de tabla (ejemplo para tabla 'libros') ALTER TABLE `libros` COMMENT = 'Contiene información bibliográfica de los libros, independiente de los ejemplares físicos'; -- Comentarios a nivel de columna (ejemplo) ALTER TABLE `usuarios` CHANGE COLUMN `email` `email` VARCHAR(100) NULL COMMENT 'Dirección de correo electrónico válida para notificaciones';
Los lenguajes de 4ta Generación (4GL) se caracterizan por:
Componentes típicos de 4GL:
Nuevas tendencias:
Objetivo: Crear un informe avanzado usando un generador de informes 4GL.
Enunciado:
DATABASE ventas END DATABASE MAIN DEFINE rep_ventas REPORT CONNECT TO "ventas_db" USER "usuario" USING "contraseña" IF STATUS THEN DISPLAY "Error al conectar a la base de datos" EXIT PROGRAM END IF END MAIN
REPORT rep_ventas (venta_id, fecha, cliente_id, producto_id, cantidad, precio_unitario, total) DEFINE grupo_cliente LIKE clientes.cliente_id, subtotal DECIMAL(12,2), gran_total DECIMAL(12,2) INITIAL 0 END DEFINE FORMAT FIRST PAGE HEADER PRINT "Informe de Ventas", AT 40 PRINT "Fecha: ", TODAY AT 80 SKIP 2 LINES END FIRST PAGE HEADER PAGE HEADER PRINT "ID Venta", AT 5, "Fecha", AT 15, "Producto", AT 30, "Cantidad", AT 50, "Precio Unit.", AT 65, "Total", AT 80 SKIP 1 LINE END PAGE HEADER BEFORE GROUP OF cliente_id grupo_cliente = cliente_id PRINT "Cliente: ", cliente_id USING "####", AT 5 subtotal = 0 END BEFORE GROUP AFTER GROUP OF cliente_id PRINT "Subtotal cliente: ", subtotal USING "$##,###,###.00", AT 65 SKIP 1 LINE gran_total = gran_total + subtotal END AFTER GROUP ON LAST ROW SKIP 2 LINES PRINT "TOTAL GENERAL: ", gran_total USING "$##,###,###.00", AT 65 END LAST ROW END FORMAT
FUNCTION generar_informe(fecha_desde DATE, fecha_hasta DATE, cliente_opcional INTEGER) DEFINE sql_query STRING LET sql_query = "SELECT * FROM ventas WHERE fecha BETWEEN ? AND ?" IF cliente_opcional IS NOT NULL THEN LET sql_query = sql_query CLIPPED, " AND cliente_id = ", cliente_opcional USING "####" END IF LET sql_query = sql_query CLIPPED, " ORDER BY cliente_id, fecha" PREPARE stmt FROM sql_query IF fecha_desde IS NULL THEN LET fecha_desde = MDY(1,1,YEAR(TODAY)) END IF IF fecha_hasta IS NULL THEN LET fecha_hasta = TODAY END IF START REPORT rep_ventas TO "ventas_filtrado.rep" DECLARE cur_ventas CURSOR FOR stmt USING fecha_desde, fecha_hasta FOREACH cur_ventas INTO venta_id, fecha, cliente_id, producto_id, cantidad, precio_unitario, total subtotal = subtotal + total OUTPUT TO REPORT rep_ventas(venta_id, fecha, cliente_id, producto_id, cantidad, precio_unitario, total) END FOREACH FINISH REPORT rep_ventas END FUNCTION
FUNCTION exportar_informe(tipo_formato STRING) CASE tipo_formato WHEN "PDF" SYSTEM "rep2pdf ventas.rep -o ventas.pdf" DISPLAY "Informe exportado a PDF: ventas.pdf" WHEN "EXCEL" SYSTEM "rep2excel ventas.rep -o ventas.xlsx" DISPLAY "Informe exportado a Excel: ventas.xlsx" WHEN "HTML" SYSTEM "rep2html ventas.rep -o ventas.html" DISPLAY "Informe exportado a HTML: ventas.html" OTHERWISE DISPLAY "Formato no soportado. Use PDF, EXCEL o HTML" END CASE END FUNCTION
Nota: 4GL permite exportar informes a múltiples formatos mediante herramientas como rep2pdf, rep2excel y rep2html.