Java Cliente Servidor
Java Cliente Servidor
INSTITUTO DE INVESTIGACIÓN
JAVA
CLIENTE - SERVIDOR
UNI - FIIS
Agosto - 2018
Programa: JAVA PROFESSIONAL DEVELOPER
PRESENTACI0N
Las aplicaciones de escritorio son quizás las más utilizadas por las empresas, también se
les llama Aplicaciones Cliente-Servidor.
Este tipo de aplicaciones se instalan en la computadora del usuario que la va a utilizar y se
conecta a una base de datos utilizando JDBC a través de la red de la empresa.
También se pueden conectar con servidores de bases de datos remotas utilizando Internet,
una técnica muy utilizada es utilizar redes VPN.
La tecnología JDBC permite ejecutar sentencias SQL, procedimientos almacenados y
manejar transacciones de manera muy eficiente y segura.
JDBC proporciona los siguientes objetos para programar los componentes de persistencia:
▪ Connection: Para establecer la conexión con la fuente de datos y manejar las
transacciones.
▪ Statement: Para ejecutar sentencias sin parámetros.
▪ PreparedStatement: Para ejecutar sentencias con parámetros.
▪ CallableStatement: Para ejecutar procedimientos almacenados.
▪ ResultSet: para procesar conjunto de resultados.
▪ SQLException: Para la gestión de errores.
Para la creación de reporte se utiliza iReport, esta aplicación permite el diseño de reportes
muy versátiles y para su ejecución se utiliza la librería Jasper Report.
INDICE
JDBC .................................................................................................................................................. 48
TIPOS DE DRIVER ................................................................................................................................ 49
Tipo 1: JDBC-ODBC bridge driver .................................................................................................... 49
Tipo 2: Native API/Partly Java Driver ............................................................................................. 49
Tipo 3: Pure Java Driver ................................................................................................................. 50
Tipo 4: Native Protocol Java Driver ................................................................................................ 50
COMPONENTES PRINCIPALES............................................................................................................. 51
Objeto: Connection ........................................................................................................................ 51
Objeto: Statement ......................................................................................................................... 51
INTRODUCCIÓN ................................................................................................................................. 64
LEER UN ARCHIVO EXCEL .................................................................................................................... 65
CREAR UN ARCHIVO EXCEL ................................................................................................................. 67
INTRODUCCIÓN ................................................................................................................................. 72
Requerimientos de JasperReports .................................................................................................. 72
FUNCIONAMIENTO DE JASPERREPORTS ............................................................................................. 72
Compilación, exportación de reportes de JasperReports ................................................................ 74
IREPORT ............................................................................................................................................. 75
Funcionamiento de iReport ............................................................................................................ 75
Configuración de la conexión a una base de datos. ........................................................................ 76
Creación del Reporte...................................................................................................................... 77
Secciones de un Reporte en iReport. .............................................................................................. 78
Diseño del Reporte......................................................................................................................... 80
Compilación y Ejecución del Reporte .............................................................................................. 83
CREACIÓN DE GRÁFICOS EN IREPORT ................................................................................................. 87
PRACTICA 01 ...................................................................................................................................... 95
Objetivo ......................................................................................................................................... 95
Actividades Previas ........................................................................................................................ 95
Creación del Esquema SCOTT ......................................................................................................... 95
Creación del Esquema EUREKA ...................................................................................................... 95
PRACTICA 02 ...................................................................................................................................... 96
Objetivo ......................................................................................................................................... 96
Proyecto 1 ..................................................................................................................................... 96
Proyecto 2 ..................................................................................................................................... 96
PRACTICA 03 ...................................................................................................................................... 97
Objetivo ......................................................................................................................................... 97
Proyecto ........................................................................................................................................ 97
PROYECTO 04 ..................................................................................................................................... 98
Objetivo ......................................................................................................................................... 98
Proyecto ........................................................................................................................................ 98
PRACTICA 05 .................................................................................................................................... 100
Objetivo ....................................................................................................................................... 100
Proyecto ...................................................................................................................................... 100
PROYECTO 06 ................................................................................................................................... 101
Objetivo ....................................................................................................................................... 101
Proyecto ...................................................................................................................................... 101
PROYECTO 07 ................................................................................................................................... 102
Objetivo ....................................................................................................................................... 102
Proyecto ...................................................................................................................................... 102
Capítulo 1
Introducción a Git y GitHub
OBTENER EL SOFTWARE
Te recomiendo que instales GIT FOR WINDOWS, la ruta es la siguiente:
https://git-for-windows.github.io/
Git-2.6.1-64-bit.exe
Es posible que en este momento que estás leyendo este documento ya exista una nueva
versión.
PROCESO DE INSTALACIÓN
Durante el proceso de instalación debes integrarlo con la consola de Windows.
1. Ventana de bienvenida, solo debes hacer click en el botón Next.
2. Ventana de licencia del software, solo debes hacer click en el botón Next.
COMANDOS INICIALES
Todos los comandos se deben ejecutar en la consola de Windows. Personalmente, tengo
una carpeta GitHub donde tengo todos mis repositorios que mantengo en GitHub.
E:\GitHub>git
usage: git [--version] [--help] [-C <path>] [-c name=value]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]
E:\GitHub>git --version
git version 2.6.1.windows.1
Registra tu nombre
Es muy importante que registres tu nombre para saber quién o quienes estan registrando
cambios en el repositorio.
La sintaxis es la siguiente:
EDITAR REPOSITORIO
Crea un archivo
En la carpeta demo del repositorio procede a crear un archivo nuevo de nombre info.txt,
y registra información sobre información que registraras en tu repositorio.
La siguiente imagen muestra lo que podría ser el archivo info.txt.
git status
E:\GitHub\demo>git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: .gitignore
Untracked files:
(use "git add <file>..." to include in what will be committed)
info.txt
no changes added to commit (use "git add" and/or "git commit -a")
E:\GitHub\demo>git add .
Para confirmar la lista de archivos preparada con git add, se debe utilizar el comando
git commit.
E:\GitHub\demo>git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
En este caso indica que el repositorio esta adelantado 1 commit con respecto a repositorio
origen, y se debe utilizar git push para subir los cambios.
Cuando ejecutas este comando te solicita tu cuenta de usuario y clave, salvo que ya se
encuentre configurado, como es mi caso.
E:\GitHub\demo>git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
E:\GitHub\demo>type info.txt
Este repositorio es demostrativo.
Sirve para ilustrar el uso de Git y GitHub.
Esto ha sido una introducción a Git y GitHub, suficiente para utilizarlo como repositorio en
los cursos de programación, pero si lo que necesitas es usarlo para control de versiones te
recomiendo que consultes el material oficial de Git.
Capítulo 2
ARQUITECTURA DE UNA
BA S E D E DAT O S O R A C L E
ESQUEMA GENERAL
La instancia representa la base de datos, pero en memoria.
USUARIOS ADMINISTRADORES
Se deben utilizar para hacer tareas administrativas.
SYS
Es el propietario del esquema SYS y del diccionario de datos.
SYSTEM
Tiene el rol DBA y se recomienda su uso para hacer tareas administrativas.
SYSDBA
Se utiliza para realizar la conexión como usuario SYS.
Sintaxis usando SQL*Plus:
SYSOPER
Se utiliza para realizar la conexión como usuario PUBLIC.
Tiene menos privilegios que SYSDBA.
Sintaxis usando SQL*Plus:
F:\app\Administrador\product\11.1.0\db_1\RDBMS\ADMIN
Para ejecutar un archivo .sql se debe utilizar el comando RUN o @, a continuación se ilustra
la ejecución del archivo scott.sql que se encarga de crear el esquema SCOTT.
Capítulo 3
CREACION
DE UN NUEVO ESQUEMA
sql>
En caso de no lograr conectarte debes utilizar la contraseña del usuario SYS, por lo general
es oracle:
sql>
sql>
CREAR EL USUARIO
Crearemos el usuario demo con contraseña admin:
Tabla creada.
También se creará una secuencia para los datos de la columna id, este objeto
proporcionará valores únicos iniciando en el valor 1, luego 2, 3, 4 y así sucesivamente:
Secuencia creada.
INGRESO DE DATOS
Probaremos ingresar datos a la tabla mensaje:
1 fila creada.
SQL> edit
Escrito file afiedt.buf
1 fila creada.
ID DE PARA TEXTO
---- --------------- --------------- ------------------------------
1 profesor estudiantes Hola a todos
2 profesor estudiantes Que les parece Oracle?
SQL> commit;
Confirmación terminada.
Capítulo 4
ORACLE SQL DEVELOPER
Cuando intentamos ejecutar SQL Developer, solo la primera vez, solicita la ruta del archivo
java.exe:
F:\app\Administrador\product\11.1.0\db_1\jdk\bin
Haciendo click en el botón Browse se debe llegar a la carpeta bin y seleccionar el archivo
java.exe.
Si intentas la conexión con otro servidor, por ejemplo el 172.17.2.163, es posible que
obtenga el siguiente mensaje de error:
El problema es el Firewall, el puerto de Oracle Database es por defecto el 1521, por lo tanto
se debe abrir en el servidor 172.17.2.163:
CONNECT <usuario>/<clave>@<equipo>:1521/servicio
Capítulo 5
CREACIÓN DEL
ESQUEMA EUREKA
DIAGRAMA E-R
Parametro Usuario
chr_paracodigo: CHAR(3) NOT NULL chr_emplcodigo: CHAR(4) NOT NULL (FK)
vch_paradescripcion: VARCHAR(50) NOT NULL vch_emplusuario: VARCHAR(15) NOT NULL
vch_paravalor: VARCHAR(70) NOT NULL vch_emplclave: VARCHAR(15) NOT NULL
vch_paraestado: VARCHAR(15) NOT NULL
Contador Asignado
Empleado Sucursal
chr_emplcodigo: CHAR(4) NOT NULL chr_sucucodigo: CHAR(3) NOT NULL
vch_emplpaterno: VARCHAR(25) NOT NULL vch_sucunombre: VARCHAR(50) NOT NULL
vch_emplmaterno: VARCHAR(25) NOT NULL vch_sucuciudad: VARCHAR(30) NOT NULL
vch_emplnombre: VARCHAR(30) NOT NULL vch_sucudireccion: VARCHAR(50) NOT NULL
vch_emplciudad: VARCHAR(30) NOT NULL int_sucucontcuenta: NUMBER(5,0) NOT NULL
vch_empldireccion: VARCHAR(50) NOT NULL
vch_emplusuario: VARCHAR(15) NOT NULL
vch_emplclave: VARCHAR(15) NOT NULL Cuenta
chr_cuencodigo: CHAR(8) NOT NULL
Movimiento chr_monecodigo: CHAR(2) NOT NULL (FK)
chr_cuencodigo: CHAR(8) NOT NULL (FK) chr_sucucodigo: CHAR(3) NOT NULL (FK)
int_movinumero: NUMBER(6,0) NOT NULL chr_emplcreacuenta: CHAR(4) NOT NULL (FK)
chr_cliecodigo: CHAR(5) NOT NULL (FK)
dtt_movifecha: DATE NOT NULL dec_cuensaldo: NUMBER(12,2) NOT NULL
chr_emplcodigo: CHAR(4) NOT NULL (FK) dtt_cuenfechacreacion: DATE NOT NULL
chr_tipocodigo: CHAR(3) NOT NULL (FK) vch_cuenestado: VARCHAR(15) NOT NULL
dec_moviimporte: NUMBER(12,2) NOT NULL int_cuencontmov: NUMBER(6,0) NOT NULL
chr_cuenreferencia: CHAR(8) NULL chr_cuenclave: CHAR(6) NOT NULL
TipoMovimiento Cliente
chr_tipocodigo: CHAR(3) NOT NULL chr_cliecodigo: CHAR(5) NOT NULL
vch_tipodescripcion: VARCHAR(40) NOT NULL vch_cliepaterno: VARCHAR(25) NOT NULL
vch_tipoaccion: VARCHAR(10) NOT NULL vch_cliematerno: VARCHAR(25) NOT NULL
vch_tipoestado: VARCHAR(15) NOT NULL vch_clienombre: VARCHAR(30) NOT NULL
chr_cliedni: CHAR(8) NOT NULL
vch_clieciudad: VARCHAR(30) NOT NULL
Moneda vch_cliedireccion: VARCHAR(50) NOT NULL
chr_monecodigo: CHAR(2) NOT NULL vch_clietelefono: VARCHAR(20) NULL
vch_clieemail: VARCHAR(50) NULL
vch_monedescripcion: VARCHAR(20) NOT NULL
CostoMovimiento
CargoMantenimiento
chr_monecodigo: CHAR(2) NOT NULL (FK)
chr_monecodigo: CHAR(2) NOT NULL (FK)
dec_costimporte: NUMBER(12,2) NOT NULL
dec_cargMontoMaximo: NUMBER(12,2) NOT NULL
dec_cargImporte: NUMBER(12,2) NOT NULL
InteresMensual
chr_monecodigo: CHAR(2) NOT NULL (FK)
dec_inteimporte: NUMBER(12,2) NOT NULL
OBTENER EL SCRIPT
El script lo puedes tener del siguiente repositorio GIT:
https://github.com/gcoronelc/databases
SQL> @C:\EGCC\databases\EurekaBank\Oracle\Modelo\Crea_BD.sql
SQL> @C:\EGCC\databases\EurekaBank\Oracle\Modelo\Carga_Datos.sql
Puedes ver el siguiente video, donde se explica la creación del esquema EUREKA:
https://www.youtube.com/watch?v=qOW90RXepUs
CONSULTANDO EL CATALOGO
A continuación tenemos la consulta del catálogo:
TABLE_NAME TABLE_TYPE
------------------------------ -----------
CONTADOR TABLE
CARGOMANTENIMIENTO TABLE
COSTOMOVIMIENTO TABLE
INTERESMENSUAL TABLE
PARAMETRO TABLE
MOVIMIENTO TABLE
CUENTA TABLE
MONEDA TABLE
CLIENTE TABLE
TIPOMOVIMIENTO TABLE
ASIGNADO TABLE
SUCURSAL TABLE
EMPLEADO TABLE
13 filas seleccionadas.
Luego de configurar la conexión, ya puede utilizarla para ejecutar sentencias SQL contra el
esquema EUREKA.
Database
Database es una herramienta que provee NetBeans para trabajar con bases de datos desde
el mismo IDE, sin tener la necesidad de utilizar otras herramientas externas al IDE.
Esta herramienta se encuentra en la ventana Service, tal como se muestra en la siguiente
figura:
Esta herramienta ya trae algunos drivers JDBC, específicamente para Oracle no trae ningún
driver. Así que el proceso para trabajar con Oracle es:
1. Registrar el driver.
2. Registrar la conexión. Se pueden registrar varias conexiones.
3. Utilizar la conexión para ejecutar sentencias SQL.
Registrar Driver
Puede descargar el driver de la siguiente dirección web:
http://www.oracle.com/technetwork/apps-tech/jdbc-112010-090769.html
Registrar la Conexión
Después de haber registrado correctamente el driver, debe proceder a registrar la conexión,
tal como se muestra en la siguiente imagen:
Capítulo 6
APLICACIONES
CLIENTE – SERVIDOR
ACLARANDO CONCEPTOS
Cliente-Servidor
Es un modelo basado en la cooperación e interacción de dos partes conocidas como
servidor o back-end y cliente o front-end.
Aplicación Servidor
Es la aplicación que provee servicios, por ejemplo, los servidores de base de datos ofrecen
servicios de persistencia de datos, podríamos mencionar a SQL Server, Oracle, MySQL, etc,
Aplicación Cliente
Es la aplicación que hace uso o consume los servicios de la Aplicación Servidor; por
ejemplo, las aplicaciones comerciales como los sistemas de ventas y compras necesitan
que sus datos persistan en el tiempo, para lo cual se recurren a los servidores de base de
datos que ofrecen estos servicios.
ARQUITECTURA CLIENTE-SERVIDOR
Modelo Clásico
El cliente se encuentra del lado del usuario y se define como un proceso consumidor de
servicios, mientras que el servidor provee los servicios requeridos y se encuentra de manera
remota al usuario y es transparente al cliente.
Modelo en Internet
Los clientes deben estar en la red de la empresa, estas pueden ser redes locales, pero
también es posible tener clientes remotos a través por ejemplo de una red VPN.
Capítulo 7
API JDBC
JDBC
Recomiendo que visiten el siguiente enlace:
http://gcoronelc.blogspot.pe/2013/06/resumen-seminario-java-cliente-servidor.html
Básicamente una aplicación que usa JDBC realiza los siguientes pasos:
1. Establece una conexión con la base de datos.
2. Crea y envía una sentencia SQL a la base de datos.
3. Procesa el resultado.
4. Cierra la conexión.
TIPOS DE DRIVER
Tenemos cuatro tipos de driver:
▪ Tipo 1: JDBC-ODBC bridge driver
▪ Tipo 2: Native API/Partly Java Driver
▪ Tipo 3: Pure Java Driver
▪ Tipo 4: Native Protocol Java Driver
COMPONENTES PRINCIPALES
Objeto: Connection
Establece la conexión con la base de datos y maneja las transacciones.
Objeto: Statement
Se utiliza para ejecutar sentencias sin parámetros.
Objeto: PreparedStatement
Se utiliza para ejecutar sentencias con parámetros.
Objeto: CallableStatement
Se utiliza para ejecutar procedimientos almacenados.
Objeto ResultSet
Se utiliza para procesar resultados.
Objeto: SQLException
Se utiliza para el manejo de error de base de datos.
CONSULTAR DATOS
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
*
* @author Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public final class AccesoDB {
Mapeo de Tablas
Cuando se trata de trabajar con datos de una tabla, se recomienda mapear la tabla en una
clase, a continuación tenemos la clase ClienteBean para trabajar con la tabla de clientes:
/**
*
* @author Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class ClienteBean {
public ClienteBean() {
}
Consultar un Registro
El siguiente script, permite consultar los datos de un registro, en este caso los datos de un
cliente, lo que retorna el método es un objeto de tipo ClienteBean o NULL.
/**
*
* @author Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public ClienteBean consultarPorCodigo(String codigo) {
ClienteBean clienteBean = null;
Connection cn = null;
try {
cn = AccesoDB.getConnection();
String sql = "select chr_cliecodigo, vch_cliepaterno, vch_cliematerno, "
+ "vch_clienombre, chr_cliedni, vch_clieciudad, "
+ "vch_cliedireccion, vch_clietelefono, vch_clieemail "
+ "from cliente "
+ "where chr_cliecodigo = ?";
PreparedStatement pstm = cn.prepareStatement(sql);
pstm.setString(1, codigo);
ResultSet rs = pstm.executeQuery();
if (rs.next()) {
clienteBean = new ClienteBean();
clienteBean.setCodigo(rs.getString("chr_cliecodigo"));
clienteBean.setPaterno(rs.getString("vch_cliepaterno"));
clienteBean.setMaterno(rs.getString("vch_cliematerno"));
clienteBean.setNombre(rs.getString("vch_clienombre"));
clienteBean.setDni(rs.getString("chr_cliedni"));
clienteBean.setCiudad(rs.getString("vch_clieciudad"));
clienteBean.setDireccion(rs.getString("vch_cliedireccion"));
clienteBean.setTelefono(rs.getString("vch_clietelefono"));
clienteBean.setEmail(rs.getString("vch_clieemail"));
}
rs.close();
pstm.close();
} catch (SQLException e) {
throw new RuntimeException(e.getMessage());
} catch (Exception e) {
throw new RuntimeException("Error de acceso a la tabla Cliente.");
} finally {
try {
cn.close();
} catch (Exception e) {
}
}
return clienteBean;
}
/**
*
* @author Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public List<ClienteBean> consultarPorNombre(String nombre) {
List<ClienteBean> lista = new ArrayList<ClienteBean>();
Connection cn = null;
try {
cn = AccesoDB.getConnection();
String sql = "select chr_cliecodigo, vch_cliepaterno, vch_cliematerno, "
+ "vch_clienombre, chr_cliedni, vch_clieciudad, "
+ "vch_cliedireccion, vch_clietelefono, vch_clieemail "
+ "from cliente "
+ "where lower(vch_cliepaterno) like ? "
+ "or lower(vch_cliematerno) like ? "
+ "or lower(vch_clienombre) like ?";
PreparedStatement pstm = cn.prepareStatement(sql);
nombre = nombre.toLowerCase() + "%";
pstm.setString(1, nombre);
pstm.setString(2, nombre);
pstm.setString(3, nombre);
ResultSet rs = pstm.executeQuery();
while (rs.next()) {
clienteBean = new ClienteBean();
clienteBean.setCodigo(rs.getString("chr_cliecodigo"));
clienteBean.setPaterno(rs.getString("vch_cliepaterno"));
clienteBean.setMaterno(rs.getString("vch_cliematerno"));
clienteBean.setNombre(rs.getString("vch_clienombre"));
clienteBean.setDni(rs.getString("chr_cliedni"));
clienteBean.setCiudad(rs.getString("vch_clieciudad"));
clienteBean.setDireccion(rs.getString("vch_cliedireccion"));
clienteBean.setTelefono(rs.getString("vch_clietelefono"));
clienteBean.setEmail(rs.getString("vch_clieemail"));
lista.add(bean);
}
rs.close();
pstm.close();
} catch (SQLException e) {
throw new RuntimeException(e.getMessage());
} catch (Exception e) {
throw new RuntimeException("Error de acceso a la tabla Cliente.");
} finally {
try {
cn.close();
} catch (Exception e) {
}
}
return lista;
}
PROGRAMANDO TRANSACCIONES
/**
*
* @author Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public void insertar(ClienteBean clienteBean) {
Connection cn = null;
try {
// Variables
String sql, codigo;
ResultSet rs;
PreparedStatement pstm;
Statement stm;
int cont, longitud;
// Inicio de tx
cn = AccesoDB.getConnection();
cn.setAutoCommit(false); // Inicia la Tx
// Obtener contador de sucursal
sql = "select int_contitem, int_contlongitud from contador "
+ "where vch_conttabla = 'Cliente' for update";
stm = cn.createStatement();
rs = stm.executeQuery(sql);
rs.next();
cont = rs.getInt("int_contitem") + 1;
longitud = rs.getInt("int_contlongitud");
rs.close();
// Crear codigo
String formato = "";
for (int i = 1; i <= longitud; i++) {
formato += "0";
}
DecimalFormat df = new DecimalFormat(formato);
codigo = df.format(cont);
// Insertar cliente
sql = "insert into cliente(chr_cliecodigo,vch_cliepaterno,vch_cliematerno,"
+ "vch_clienombre,chr_cliedni,vch_clieciudad,vch_cliedireccion,"
+ "vch_clietelefono,vch_clieemail) values(?,?,?,?,?,?,?,?,?)";
pstm = cn.prepareStatement(sql);
pstm.setString(1, codigo);
pstm.setString(2, clienteBean.getPaterno());
pstm.setString(3, clienteBean.getMaterno());
pstm.setString(4, clienteBean.getNombre());
pstm.setString(5, clienteBean.getDni());
pstm.setString(6, clienteBean.getCiudad());
pstm.setString(7, clienteBean.getDireccion());
pstm.setString(8, clienteBean.getTelefono());
pstm.setString(9, clienteBean.getEmail());
pstm.executeUpdate();
pstm.close();
// Actualizar contador
sql = "update contador set int_contitem = int_contitem + 1 "
+ "where vch_conttabla='Cliente'";
stm.executeUpdate(sql);
stm.close();
cn.commit(); // Confirma Tx
clienteBean.setCodigo(codigo);
} catch (SQLException e) {
try {
cn.rollback();
} catch (Exception e1) {
}
throw new RuntimeException(e.getMessage());
} catch (Exception e) {
try {
cn.rollback();
} catch (Exception e1) {
}
throw new RuntimeException("Error en proceso de creación de cuenta.");
} finally {
try {
cn.close();
} catch (Exception e) {
}
}
/**
*
* @author Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
create or replace procedure usp_egcc_retiro
( p_cuenta varchar2, p_importe number,
p_empleado varchar2, p_clave varchar2 )
as
v_msg varchar2(1000);
v_saldo number(12,2);
v_moneda char(2);
v_cont number(5,0);
v_estado varchar2(15);
v_costoMov number(12,2);
v_clave varchar2(10);
v_excep1 Exception;
begin
select
dec_cuensaldo, chr_monecodigo, int_cuencontmov,
vch_cuenestado, chr_cuenclave
into v_saldo, v_moneda, v_cont, v_estado, v_clave
from cuenta
where chr_cuencodigo = p_cuenta;
if v_estado != 'ACTIVO' then
raise_application_error(-20001,'Cuenta no está activa.');
end if;
if v_clave != p_clave then
--raise_application_error(-20001,'Datos incorrectos.');
raise v_excep1;
end if;
select dec_costimporte
into v_costoMov
from costomovimiento
where chr_monecodigo = v_moneda;
v_saldo := v_saldo - p_importe - v_costoMov;
if v_saldo < 0.0 then
raise_application_error(-20001,'Saldo insuficiente.');
end if;
-- Actualiza la cuenta
update cuenta
set dec_cuensaldo = v_saldo,
int_cuencontmov = int_cuencontmov + 2
where chr_cuencodigo = p_cuenta;
-- Movimiento de retiro
v_cont := v_cont + 1;
insert into movimiento(chr_cuencodigo,int_movinumero,dtt_movifecha,
chr_emplcodigo,chr_tipocodigo,dec_moviimporte,chr_cuenreferencia)
values(p_cuenta,v_cont,sysdate,p_empleado,'004',p_importe,null);
-- Novimiento Costo
v_cont := v_cont + 1;
insert into movimiento(chr_cuencodigo,int_movinumero,dtt_movifecha,
chr_emplcodigo,chr_tipocodigo,dec_moviimporte,chr_cuenreferencia)
values(p_cuenta,v_cont,sysdate,p_empleado,'010',v_costoMov,null);
-- Confirmar la Tx
commit;
exception
when v_excep1 then
rollback; -- cancelar transacción
raise_application_error(-20001,'Clave incorrecta.');
when others then
v_msg := sqlerrm; -- capturar mensaje de error
rollback; -- cancelar transacción
raise_application_error(-20001,v_msg);
end;
/
/**
*
* @author Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
Capítulo 8
Apache POI
INTRODUCCIÓN
Apache POI es una librería Java que se utiliza para poder interactuar con hojas de cálculos
de Microsoft, en sus distintos formatos.
Es importante tener en cuenta que cada archivo de Excel representa un LIBRO, dentro de
cada libro tenemos HOJAS, dentro de cada HOJA tenemos FILAS, y, finalmente, en cada
FILA tenemos CELDAS. Entender esto nos ayudará a ver cómo se organiza la información
en el archivo.
Es necesario que descargues la librería y la agregues a tu proyecto. La ruta de descarga es
la siguiente:
https://poi.apache.org/download.html
import java.io.FileInputStream;
import java.util.Iterator;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
/**
*
* @author Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class LeerExcel {
/**
* Este método se utiliza para leer la data un archivo Excel.
*
* @param fileName - Ruta y nombre del archivo Excel.
*/
private void leerExcel(String fileName) {
try {
/**
* Crea una instancia de la clase FileInputStream.
*/
FileInputStream fileInputStream = new FileInputStream(fileName);
/**
* Crea una instancia de la clase POIFSFileSystem.
*/
POIFSFileSystem fsFileSystem = new POIFSFileSystem(fileInputStream);
/*
* Crea una instancia de la clase HSSFWorkBook.
*/
HSSFWorkbook workBook = new HSSFWorkbook(fsFileSystem);
/*
* Se accede a la prima hoja del archivo Excel.
*/
HSSFSheet hssfSheet = workBook.getSheetAt(0);
/**
* Se leen todos los datos, fila x fila, celda x celda.
*/
Iterator rowIterator = hssfSheet.rowIterator();
while (rowIterator.hasNext()) {
HSSFRow hssfRow = (HSSFRow) rowIterator.next();
Iterator iterator = hssfRow.cellIterator();
while (iterator.hasNext()) {
HSSFCell hssfCell = (HSSFCell) iterator.next();
String stringCellValue = hssfCell.toString();
stringCellValue = String.format("%1$-30s", stringCellValue);
System.out.print(stringCellValue);
}
System.out.println("\n");
}
} catch (Exception e) {
e.printStackTrace();
}
run:
NOMBRE APELLIDO TELEFONO CORREO SITIO WEB
ERIC GUSTAVO CORONEL CASTILLO 996664457 [email protected] WWW.DESARROLLASOFTWARE.COM
RICARDO WALTER MARCELO VILLALOBOS 992222565 [email protected] WWW.RICARDOMARCELOV.COM
CESAR AUGUSTO BUSTAMANTE GUTIERREZ 996677334 [email protected] WWW.CESARBUSTAMANTE.COM
SERGIO MATSUKAWA MAEDA 995698457 [email protected] WWW.SERGIOMATSUKAWA.COM
// Crear la hoja
HSSFSheet hoja1 = objWB.createSheet("hoja 1");
// Crear la fila.
HSSFRow fila = hoja1.createRow((short)1);
Note que el valor que se envía al método encargado de crear las filas es de tipo short, el
mismo que indica el número correspondiente a la fila que debemos trabajar. El índice de las
filas empieza en "0", aunque ello no nos impide trabajar directamente con otras filas.
setUnderline, entre otros, que nos permitirán aplicarle otros estilos y efectos al valor que
ocupe nuestra celda.
La segunda, es la clase que, finalmente, nos ayudará a aplicar el estilo a la celda. Podemos
acomodar y alinear el texto mediante los métodos setWrapText, setAlignment y
setVerticalAlignment; aplicar la fuente trabajada, con el método setFont; configurar
los bordes mediante los métodos: setBorderBottom, setBorderLeft,
setBorderRight, setBorderTop, para el tipo; y, setBottomBorderColor,
setLeftBorderColor, setRightBorderColor, setTopBorderColor para establecer
el color de los bordes; y, establecer el sombreado de las celdas mediante los métodos
setFillForegroundColor, setFillBackgroundColor y setFillPattern.
Aunque, es un poco engorroso trabajar estos estilos, celda por celda, de esta forma, lo
mejor es encapsular todo este proceso en métodos que nos permitan ahorrar líneas de
código, preestableciendo, los estilos que se emplearán.
Según la versión de la librería que se esté empleando, podremos contar o no, con algunas
constantes para la configuración del color y el establecimiento de los sombreados.
Finalmente, volcamos nuestro libro a un archivo de la siguiente forma:
import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
*
* @author Eric Gustavo Coronel Castillo
* @blog www.desarrollasoftware.com
* @email [email protected]
*/
public class CrearExcel {
try {
// Procesar la información y generar el xls
HSSFWorkbook objLibro = new HSSFWorkbook();
// Crea la hoja
HSSFSheet hoja1 = objLibro.createSheet("hoja 1");
System.out.println("Todo ok.");
} catch (Exception e) {
e.printStackTrace();
}
Capítulo 9
IREPORT & JASPERREPORT
INTRODUCCIÓN
JasperReports es la mejor herramienta de código libre en Java para generar reportes.
Puede entregar ricas presentaciones o diseños en la pantalla, para la impresora o para
archivos en formato PDF, HTML, RTF, XLS, CSV y XML.
Está completamente escrita en Java y se puede utilizar en una gran variedad de
aplicaciones de Java, incluyendo JEE o aplicaciones Web, para generar contenido dinámico.
Requerimientos de JasperReports
Las siguientes librerías junto con la de JasperReports deben incluirse en el proyecto en que
se desee incluir esta herramienta para generar reportes.
▪ Jakarta Commons Digester Componentr
▪ Jakarta Commons BeanUtils Component
▪ Jakarta Commons Collections Component
▪ Jakarta Commons Logging Component
▪ Generador de PDF – iText
▪ XLS Jakarta POI
FUNCIONAMIENTO DE JASPERREPORTS
JasperReports trabaja en forma similar a un compilador y a un intérprete. El usuario diseña
el reporte codificándolo en XML de acuerdo a las etiquetas y atributos definidos en un
archivo llamado jasperreports.dtd (parte de JasperReports). Usando XML el usuario define
completamente el reporte, describiendo donde colocar texto, imágenes, líneas, rectángulos,
cómo adquirir los datos, como realizar ciertos cálculos para mostrar totales, etc.
Este archivo fuente XML debe ser compilado para obtener un reporte real. La versión
compilada del fuente es nombrada "archivo jasper" (este termina con .jasper). Un Archivo
jasper es el compilado de un código fuente. Cuando tenemos un archivo jasper,
necesitamos otra cosa para producir un reporte: necesitamos datos. Esto no siempre es
cierto. En algunos casos querríamos generar un reporte que no mostrara datos dinámicos,
solo texto estático por ejemplo, pero esto puede simplificarse a un reporte que tiene
solamente un registro vacío. Para proporcionar estos registros al “jasper engine”
necesitamos presentarlos usando una interfaz especial específica llamada JRDataSource.
Un “archivo print” puede exportarse en muchos formatos como PDF, HTML, RTF, XML, XLS,
CVS, etc. La exportación se puede realizar utilizando clases especiales para implementar
exportadores específicos.
IREPORT
iReport es un diseñador visual de código libre para JasperReports escrito en Java. Es un
programa que ayuda a los usuarios y desarrolladores que usan la librería JasperReports
para diseñar reportes visualmente. A través de una interfaz rica y simple de usar, iReport
provee las funciones más importantes para crear reportes amenos en poco tiempo.
iReport puede ayudar a la gente que no conoce la sintaxis XML para generar reportes de
JasperReports.
Funcionamiento de iReport
iReport provee a los usuarios de JasperReports una interfaz visual para construir reportes,
generar archivos “jasper” y “print” de prueba. iReport nació como una herramienta de
desarrollo, pero puede utilizarse como una herramienta de oficina para adquirir datos
almacenados en una base de datos, sin pasar a través de alguna otra aplicación.
iReport puede leer y modificar ambos tipos de archivo, XML y jasper. A través de
JasperReports, es capaz de compilar XML a archivos jasper y “ejecutar reportes” para
llenarlos usando varios tipos de fuentes de datos (JRDataSource) y exportar el resultado a
PDF, HTML, XLS, CSV,…
Procedemos a configurar iReport para establecer la conexión con la base de datos, para ello debe ir a
menú->Fuente de datos->Conexiones/Fuente de datos. En la pantalla Connections/Datasources
oprima el botón new para agregar una conexión.
La pantalla de conexión debe llenarse tal como se muestra a continuación:
A continuación oprima el botón Test para probar la conexión. Si la conexión fue exitosa,
oprima finalmente el botón Save para guardar esta conexión.
▪ title. El título de nuestro reporte debe escribirse en esta sección. Solo se mostrará en la
primera página del reporte.
▪ pageHeader. Aparece en la parte superior de cada página. Puede contener información
adicional del reporte, descripciones, etc.
▪ columnHeader. En esta sección se muestran los nombres de los campos que se van a
presentar
▪ detail. En esta sección se despliegan los valores correspondientes a los nombres de los
campos definidos en la sección anterior. Estos datos pueden obtenerse mediante
consultas SQL a una base de datos por ejemplo.
▪ columnFooter. Puede presentar información de totales para algunos de los campos de
la sección detail. Por ejemplo “Total de Empleados: 220”
▪ pageFooter. Aparece en la parte inferior de cada página. Este parte puede presentar, la
fecha, número de página del reporte.
▪ summary. Esta sección puede presentar totales de campos de la sección detail. Si se
desea incluir algún gráfico en el reporte, debe hacerse en esta sección.
En el diseño de su reporte pueden omitirse algunas de las secciones o bandas
mencionadas, en nuestro caso solo usaremos las secciones title, PageHeader,
ColumHeader, detail, y Pagefooter. Para omitir las secciones del reporte que no se usaran,
debe oprimir el botón bands de la barra de herramientas, o bien haciendo click con el botón
secundario del ratón sobre el diseño del reporte y seleccionando la opción band properties
del menú contextual. En la pantalla de propiedades de las bandas, debe seleccionar las
bandas no deseadas y colocar su propiedad band height igual a cero como se muestra en la
siguiente figura.
Agreguemos en primer lugar el título de nuestro reporte, para ello seleccione de la barra de
herramientas el objeto Static text tool y dibuje una caja sobre la banda title. Haciendo doble
click sobre la caja dibujada se mostrará la pantalla de propiedades de la caja de texto
estático. Aquí puede configurar el tamaño, ubicación de la caja de texto, tipo de letra para el
texto, entre otros; seleccionando la pestaña Static Text puede ingresar el título que desee
para el reporte, el resultado debe ser parecido al de la siguiente figura:
En el encabezado de página, pageHeader, podemos colocar una descripción del reporte
utilizando también el objeto Static Text tool.
Ahora se agregarán los nombres de los campos que pretendemos mostrar en el reporte, en
este caso se recuerda que se configuró una conexión con una base de datos Access a
través de un driver u origen de datos con nombre DSN.
Para cuestiones de prueba he agregado las siguientes tablas con los siguientes campos a la
base de datos:
Ahora solo resta colocar en la sección detail, los campos que se mostrarán en el reporte.
Para esto se usará el objeto Text Field, las cajas se pintarán de manera similar a las cajas
de texto estático realizadas en la banda columHeader, sin embargo cada campo debe
configurarse de acuerdo al tipo de dato que se quiere mostrar.
A continuación se mostrará la manera de configurar un Text Field. Una vez colocado un
campo en la sección detail, haga doble click sobre este para abrir su ventana de
propiedades y sitúese en la pestaña Text Field. Vaya enseguida al menú Ver y seleccione el
item Campos de informe, esto desplegará la pantalla values con los campos de nuestro
reporte, los cuales se generaron al establecer la consulta SQL. Esta pantalla muestra
adicionalmente los parámetros y variables del reporte, cada uno se distinguirá con la
siguiente notación: Campos: $F{Campo} Variables: $V{valor} Parámetros: $P{Parámetro}
Utilice esta pantalla para auxiliarse al configurar un Text Field.
Antes que nada, seleccione la vista para el Reporte, vaya al menú Construir y seleccione el
item vista previa en JRViewer (Vista previa en el Viewer de Jasper). En este menú, puede
seleccionar la vista previa para distintos formatos de archivo, siempre y cuando haya
configurado los programas externos como se explicó en la primera parte del artículo.
Compile el reporte, el resultado de la compilación aparecerá en la parte inferior de la
pantalla. Los errores más frecuentes de compilación se relacionan con los tipos de los
campos que pretenden mostrarse. Si la compilación resultó sin errores, esta listo para ver su
reporte, es recomendable probarlo primero sin usar una conexión a una base de datos.
Finalmente, ejecute el reporte ocupando la conexión a la base de datos que se configuró. El
resultado dependiendo de sus datos en las tablas debe ser parecido al siguiente:
El tipo de parámetro se estableció como String aún cuando se sabe de las tablas que
debería ser entero, en realidad esto funciona bien, pasando desde la aplicación java al
reporte un String. El tipo de parámetro del reporte debe ser del mismo tipo al que se vaya a
pasar desde sus aplicaciones en Java, de lo contrario obtendrá errores que le darán
muchosdolores de cabeza. Recompile el proyecto, si se muestra un mensaje de error de
compilación mencionando la ausencia del parámetro, vuelva a agregarlo y abra la ventana
Report query para asegurarse que se muestran los campos de la consulta. Por alguna
razón, la aplicación algunas veces no detecta el nuevo parámetro. El siguiente hilo es capaz
de llenar y exportar el reporte realizado, solo ha de proporcionarse una conexión a la base
de datos y la ruta del archivo jasper.
cConnection conexion;
/**
* Método del hilo */
public void run(){
try {
//Ruta de Archivo Jasper
String fileName="C:\\proyecto\\Reporte1.jasper";
//Obtner una conexión a la base de datos
conexion = new cConnection();
Connection con = conexion.mkConection();
//Pasamos parametros al reporte Jasper.
Map parameters = new HashMap();
parameters.put("P_Clv_Area_ads",Clv_area);
//Preparacion del reporte (en esta etapa llena el diseño de reporte)
//Reporte diseñado y compilado con iReport
JasperPrint jasperPrint =
JasperFillManager.fillReport(fileName,parameters,con);
//Se lanza el Viewer de Jasper, no termina aplicación al salir
JasperViewer jviewer = new JasperViewer(jasperPrint,false);
jviewer.show();
} catch (Exception j) {
System.out.println("Mensaje de Error:"+j.getMessage());
} finally{
conexion.closeConecction();
}
}
La finalidad del hilo, en mi caso particular, fue para liberar de carga al evento de un botón en
una aplicación Swing, dado que la obtención de la conexión y el llenado del reporte puede
ser tardado. El hilo debe lanzarse de la siguiente manera:
Hasta esta fecha, han salido bastantes versiones de JasperReports e iReport, si utiliza
versiones diferentes a las aquí utilizadas, asegúrese que coincidan las librerías de Jasper
tanto en iReport como en su proyecto java con el que pretende llenar el reporte.
Las tablas anteriores muestran las actividades realizadas en una empresa. Cada una de las
actividades se relaciona con un solo servicio. Cada actividad pertenece a un trabajador, que
por simplicidad este campo no se muestra en este diseño de tablas.
Supongamos que se desea saber cuantas actividades se realizaron por servicio en un
determinado rango de fechas, digamos en un mes. Se debe proceder a crear la consulta
SQL correspondiente para obtener estos datos, más aún, podemos reflejarlos gráficamente,
la consulta sería como la siguiente:
La consulta anterior agrupará las actividades realizadas por tipo de Servicio que se
realizaron del 1 de mayo al 25 de mayo del 2005.
Para insertar un gráfico en un reporte de iReport, seleccione el objeto Chart tool de la barra
de herramientas de iReport y dibuje el gráfico sobre la sección summary del reporte:
En la pestaña Chart properties de esta pantalla, se encuentran las propiedades que pueden
modificarse para el gráfico en turno, como el nombre del gráfico, las fuentes, leyendas, ect.
Puede dejar las propiedades actuales por ahora y modificarlas posteriormente. Ahora
centraremos la atención en la manera de configurar los datos para el gráfico.
Debe situarse en la pestaña Chart data de la pantalla anterior y enseguida en la pestaña
Details. En el apartado Key expression, coloque el campo $F{Tipo_Servicio} y en el
apartado Value expresión coloque el campo $F{Total}. Estos campos son precisamente los
que se obtienen de la consulta que se estableció anteriormente, estos a su vez se mostrarán
en la sección detail del reporte.
Listo se han configurado los datos que necesita el gráfico. Al compilar y ejecutar el reporte
con iReport el resultado puede ser parecido al siguiente:
Si se desea mostrar el gráfico anterior en tiempo de ejecución desde una aplicación Java, se
procede de manera semejante a como se muestran otros reportes. En este caso deben
determinarse los parámetros que se pasarán desde la aplicación java al reporte, por lo que
la consulta se modifica como se muestra a continuación:
Lo que se pretende con la consulta anterior, es pasar como parámetros las fechas para las
que se desea obtener el total de actividades agrupadas por servicio.
Para la versión 0.5.1 de iReport, solo debe compilarse el reporte para obtener el archivo
Jasper que será llenado por la aplicación. En versiones anteriores o quizá recientes, es
posible que se necesite incluir un scriplet para colectar los datos del gráfico.
Contando con el archivo Jasper del reporte, la manera en que se manda llenar desde una
aplicación Java es la misma que para otros reportes, como se muestra en el siguiente
fragmento de código:
Capítulo 10
P R A C T I C A S D E L A B O R AT O R I O
PRACTICA 01
Objetivo
1. Creación del esquema SCOTT.
2. Creación del esquema EUREKA.
Actividades Previas
1. Verifique que Oracle Database se encuentre instalado.
2. De no estar instalado, proceda a su instalación. Le recomiendo que revise el
siguiente enlace:
http://gcoronelc.blogspot.pe/2012/03/instalacion-de-oracle-11g-r2.html
PRACTICA 02
Objetivo
Aplicar JDBC con bases de datos Oracle para desarrollar consultas básicas.
Proyecto 1
Haciendo uso del esquema SCOTT de la base de datos Oracle desarrolle una aplicación
que permita consultar empleado en base a su nombre.
A continuación tenemos la interfaz que debe desarrollar.
Proyecto 2
Haciendo uso de la base de datos EurekaBank, desarrolle una aplicación que permita a los
empleados consultar los movimientos de una cuenta.
El empleado debe previamente iniciar sesión.
PRACTICA 03
Objetivo
Desarrollar el mantenimiento de una tabla.
Proyecto
Desarrolle el mantenimiento de la tabla CLIENTE del esquema EUREKA.
A continuación se le sugiere una interfaz de usuario:
PROYECTO 04
Objetivo
Programar procesos de negocio.
Proyecto
Haciendo uso del esquema EUREKA, desarrolle una aplicación que permita crear una nueva
cuenta.
El empleado que crea la cuenta debe ingresar su nombre de usuario y luego la aplicación
debe solicitar su clave antes de realizar la transacción.
Paso 1: Ingreso de Datos
En esta interfaz se ingresan los datos de la nueva cuenta.
PRACTICA 05
Objetivo
▪ Aplicar CallableStatement para ejecutar procedimientos almacenados.
▪ Programar transacciones de base de datos.
Proyecto
Haciendo uso del esquema EUREKA, desarrolle una aplicación que permita:
▪ Registrar un depósito
▪ Registrar un retiro
▪ Consultar los movimientos de una cuenta
El empleado debe primero iniciar sesión.
Todos los procesos se deben desarrollar utilizando procedimientos almacenados.
PROYECTO 06
Objetivo
Aplicar la librería JasperReport para construir reportes.
Proyecto
Desarrollar una aplicación que permita obtener los siguientes reportes:
1. Reporte de cuentas por sucursal o todas las cuentas.
El usuario debe poder elegir la sucursal o todas las sucursales.
De cada cuenta debe mostrarse los siguientes datos:
➢ Número de cuenta
➢ Nombre del cliente
➢ Moneda
➢ Saldo
➢ Fecha de último movimiento
2. Reporte de movimientos de una cuenta
En la cabecera del reporte debe mostrar los siguientes datos:
➢ Número de cuenta
➢ Nombre del cliente
➢ Moneda
➢ Saldo
➢ Fecha de último movimiento
En el detalle del reporte debe mostrar los siguientes datos de cada movimiento:
➢ Número de movimiento
➢ Empleado que registró el movimiento
➢ Fecha de movimiento
➢ Tipo de movimiento
➢ Importe del movimiento
PROYECTO 07
Objetivo
Integración de todas las partes de una solución.
Proyecto
En esta oportunidad debe integrar todas las partes desarrolladas de la solución y desarrollar
las que aún no se han implementado.
Debe aplicar la programación en capas, patrones de software, principios SOLID, DRY, etc.
La solución debe contemplar los siguientes procesos:
▪ Inicio de sesión
La solución debe tener una ventana de inicio de sesión, a través de esta interfaz se
debe identificar mediante su usuario y contraseña el empleado que quiera utilizar el
sistema.
▪ Mantenimiento de tablas
El sistema debe permitir darle mantenimiento a las principales tablas del sistema:
CLIENTE, SUCURSAL, MONEDA, PARAMETROS, etc.
▪ Procesos de negocio
El sistema debe implementar los principales procesos de negocio, como son:
➢ Creación de cuenta
➢ Registrar depósito
➢ Registrar retiro
➢ Registrar transferencia
➢ Cierre de cuenta
▪ Consultas y reportes
El sistema debe implementar las principales consultas y reportes que sean útiles a la
para la buena gestión de la empresa.
▪ Procesos adicionales
Adicionalmente de permitir que el empleado pueda cambiar su contraseña.