Características principales:
Flujo típico de desarrollo:
Herramientas modernas:
Objetivo: Crear un formulario de entrada de pedidos usando un generador 4GL.
Enunciado:
-- Archivo .fmb (Oracle Forms Builder) FORM pedidos TITLE "Entrada de Pedidos" WIDTH 800 HEIGHT 600 -- Bloque maestro (pedido) BLOCK pedido BLOCK DATABASE_ITEM "pedidos.pedido_id" DATABASE_ITEM "pedidos.fecha" DEFAULT SYSDATE DATABASE_ITEM "pedidos.cliente_id" DATABASE_ITEM "pedidos.estado" DEFAULT "PENDIENTE" -- Campos visuales TEXT_ITEM cliente_nombre DISPLAY_ONLY WIDTH 200 BUTTON buscar_cliente LABEL "Buscar..." -- Bloque detalle (ítems) BLOCK items SUBTYPE "GRID" DATABASE_ITEM "items.producto_id" DATABASE_ITEM "items.cantidad" DATABASE_ITEM "items.precio_unitario" DATABASE_ITEM "items.total" CALCULATED "cantidad * precio_unitario" TEXT_ITEM producto_nombre DISPLAY_ONLY BUTTON buscar_producto LABEL "Buscar..." END BLOCK -- Botones de acción BUTTON guardar LABEL "Guardar Pedido" BUTTON cancelar LABEL "Cancelar" END BLOCK END FORM
-- Validación en el bloque de ítems TRIGGER WHEN-VALIDATE-ITEM BEGIN -- Validar cantidad positiva IF :items.cantidad <= 0 THEN MESSAGE('La cantidad debe ser mayor que cero'); RAISE FORM_TRIGGER_FAILURE; END IF; -- Validar existencia de producto DECLARE v_existe NUMBER; BEGIN SELECT COUNT(*) INTO v_existe FROM productos WHERE producto_id = :items.producto_id; IF v_existe = 0 THEN MESSAGE('Producto no existe'); RAISE FORM_TRIGGER_FAILURE; END IF; END; END; -- Validación al guardar TRIGGER PRE-INSERT BEGIN -- Requerir al menos un ítem IF :SYSTEM.LAST_RECORD = 'TRUE' THEN MESSAGE('Debe agregar al menos un producto al pedido'); RAISE FORM_TRIGGER_FAILURE; END IF; END;
-- Configuración de conexión TRIGGER WHEN-NEW-FORM-INSTANCE BEGIN -- Establecer conexión LOGON('usuario', 'contraseña', 'ORCL'); -- Configurar bloque maestro SET_BLOCK_PROPERTY('pedido', DEFAULT_WHERE, 'pedido_id = -1'); GO_BLOCK('pedido'); EXECUTE_QUERY; -- Configurar bloque detalle SET_BLOCK_PROPERTY('items', INSERT_ALLOWED, PROPERTY_TRUE); SET_BLOCK_PROPERTY('items', UPDATE_ALLOWED, PROPERTY_TRUE); SET_BLOCK_PROPERTY('items', DELETE_ALLOWED, PROPERTY_TRUE); END; -- Guardar datos TRIGGER WHEN-BUTTON-PRESSED (guardar) BEGIN COMMIT_FORM; MESSAGE('Pedido guardado correctamente'); END;
-- Lógica para buscar cliente TRIGGER WHEN-BUTTON-PRESSED (buscar_cliente) DECLARE v_id NUMBER; v_nombre VARCHAR2(100); BEGIN -- Llamar a LOV (List of Values) predefinido v_id := SHOW_LOV('clientes_lov'); -- Si se seleccionó un cliente IF NOT FORM_SUCCESS THEN :pedido.cliente_id := v_id; -- Obtener nombre del cliente SELECT nombre INTO v_nombre FROM clientes WHERE cliente_id = v_id; :pedido.cliente_nombre := v_nombre; END IF; END; -- LOV para clientes LOV clientes_lov TITLE "Buscar Cliente" WIDTH 400 HEIGHT 300 SQL "SELECT cliente_id, nombre, direccion FROM clientes ORDER BY nombre" DISPLAY_COLUMN "nombre" WIDTH 200 RETURN_COLUMN "cliente_id" END LOV -- Similar para productos (omitiendo por brevedad)
Nota: Oracle Forms permite crear formularios complejos con relativamente poco código, generando automáticamente la interfaz y manejo de datos.
Evolución moderna de los entornos 4GL:
Componentes clave:
Plataformas destacadas:
Objetivo: Crear una aplicación de gestión de proyectos usando una plataforma low-code.
Enunciado:
-- Archivo .fmb (Oracle Forms Builder) FORM pedidos TITLE "Entrada de Pedidos" WIDTH 800 HEIGHT 600 -- Bloque maestro (pedido) BLOCK pedido BLOCK DATABASE_ITEM "pedidos.pedido_id" DATABASE_ITEM "pedidos.fecha" DEFAULT SYSDATE DATABASE_ITEM "pedidos.cliente_id" DATABASE_ITEM "pedidos.estado" DEFAULT "PENDIENTE" -- Campos visuales TEXT_ITEM cliente_nombre DISPLAY_ONLY WIDTH 200 BUTTON buscar_cliente LABEL "Buscar..." -- Bloque detalle (ítems) BLOCK items SUBTYPE "GRID" DATABASE_ITEM "items.producto_id" DATABASE_ITEM "items.cantidad" DATABASE_ITEM "items.precio_unitario" DATABASE_ITEM "items.total" CALCULATED "cantidad * precio_unitario" TEXT_ITEM producto_nombre DISPLAY_ONLY BUTTON buscar_producto LABEL "Buscar..." END BLOCK -- Botones de acción BUTTON guardar LABEL "Guardar Pedido" BUTTON cancelar LABEL "Cancelar" END BLOCK END FORM
-- Validación en el bloque de ítems TRIGGER WHEN-VALIDATE-ITEM BEGIN -- Validar cantidad positiva IF :items.cantidad <= 0 THEN MESSAGE('La cantidad debe ser mayor que cero'); RAISE FORM_TRIGGER_FAILURE; END IF; -- Validar existencia de producto DECLARE v_existe NUMBER; BEGIN SELECT COUNT(*) INTO v_existe FROM productos WHERE producto_id = :items.producto_id; IF v_existe = 0 THEN MESSAGE('Producto no existe'); RAISE FORM_TRIGGER_FAILURE; END IF; END; END; -- Validación al guardar TRIGGER PRE-INSERT BEGIN -- Requerir al menos un ítem IF :SYSTEM.LAST_RECORD = 'TRUE' THEN MESSAGE('Debe agregar al menos un producto al pedido'); RAISE FORM_TRIGGER_FAILURE; END IF; END;
-- Configuración de conexión TRIGGER WHEN-NEW-FORM-INSTANCE BEGIN -- Establecer conexión LOGON('usuario', 'contraseña', 'ORCL'); -- Configurar bloque maestro SET_BLOCK_PROPERTY('pedido', DEFAULT_WHERE, 'pedido_id = -1'); GO_BLOCK('pedido'); EXECUTE_QUERY; -- Configurar bloque detalle SET_BLOCK_PROPERTY('items', INSERT_ALLOWED, PROPERTY_TRUE); SET_BLOCK_PROPERTY('items', UPDATE_ALLOWED, PROPERTY_TRUE); SET_BLOCK_PROPERTY('items', DELETE_ALLOWED, PROPERTY_TRUE); END; -- Guardar datos TRIGGER WHEN-BUTTON-PRESSED (guardar) BEGIN COMMIT_FORM; MESSAGE('Pedido guardado correctamente'); END;
-- Lógica para buscar cliente TRIGGER WHEN-BUTTON-PRESSED (buscar_cliente) DECLARE v_id NUMBER; v_nombre VARCHAR2(100); BEGIN -- Llamar a LOV (List of Values) predefinido v_id := SHOW_LOV('clientes_lov'); -- Si se seleccionó un cliente IF NOT FORM_SUCCESS THEN :pedido.cliente_id := v_id; -- Obtener nombre del cliente SELECT nombre INTO v_nombre FROM clientes WHERE cliente_id = v_id; :pedido.cliente_nombre := v_nombre; END IF; END; -- LOV para clientes LOV clientes_lov TITLE "Buscar Cliente" WIDTH 400 HEIGHT 300 SQL "SELECT cliente_id, nombre, direccion FROM clientes ORDER BY nombre" DISPLAY_COLUMN "nombre" WIDTH 200 RETURN_COLUMN "cliente_id" END LOV -- Similar para productos (omitiendo por brevedad)
Nota: Oracle Forms permite crear formularios complejos con relativamente poco código, generando automáticamente la interfaz y manejo de datos.
Para documentación técnica:
Tipos de documentación generable:
Herramientas especializadas:
Objetivo: Automatizar la generación de documentación técnica para un sistema.
Enunciado:
Connection String: jdbc:mysql://localhost:3306/biblioteca Username: usuario Password: ******** Driver: com.mysql.jdbc.Driver
<database name="biblioteca"> <table name="libros"> <description>Contiene información bibliográfica de los libros</description> <column name="ISBN" type="VARCHAR(20)" primaryKey="true"> <description>Identificador único internacional del libro</description> </column> <column name="titulo" type="VARCHAR(200)" notnull="true"> <description>Título completo del libro</description> </column> <!-- más columnas... --> </table> <!-- más tablas... --> </database>
El sistema debe permitir registrar préstamos de libros prestamos ejemplares usuarios
Formato | Procedimiento | Uso recomendado |
---|---|---|
Generate Documentation → PDF Template | Documentación formal | |
HTML | Publish → HTML | Documentación en línea |
Word | Generate Documentation → RTF Template | Edición posterior |
Excel | Report → Matrix → Export CSV | Análisis de datos |
XML | Project → Export XML | Intercambio con otras herramientas |
Nota: Enterprise Architect permite personalizar completamente las plantillas de documentación para adaptarse a estándares organizacionales.