Sie sind auf Seite 1von 34

Documentacion aplicación de Facturacion

Instalar posgresql

1) Entrar a postgresql.org > download version estable 9,5,2


2) Seleccionamos windows y download, el Nos redirige a EDB seleccionamos x64
bits.
BSD: Empresa de certificacion y entrenamiento
3) Instalar postgresql a la derecha.
4) Directorio de datos: donde voy almacenar la data,
5) Nos va solicitar la contraseña y usuario, Usuario administrador es el usuario que
tiene los privilegios totales sobre el sistemas gestor de base datos.
6) Puerto: 5432 por defecto, se puede cambiar.
7) Cuando termina de instalar el nos crea una serie de carpetas
8) archivo config94 quitar numeral a listen_addresses, si quiero que la conexión sea
localhost o muchos servidores *, consultas permanentes max_connections = 100
400 bytes por cada conexión que necesites, si sigue lneto la base datos cambiar
por un mejor servidor.
9) pg_hba.conf “archivo de autenticacion del cliente” permite controlar a que
maquina hacia que base de datos, con que usuario desque q maquinas van a poder
conectarse y con que metodo de autenticacion.

EJEMPLO :

Usuario contabilidad se puede conectar desde la maquina # y se puede conectar de


manera confiable osea no utilice contraseña.

Usuario revisor fiscar puede conectarse desde esta o desta esta otra maquina y siempr3e
se va conectar con la contraseña encryptada md5

TRES TIPOS DE CONEXION

local → maquina local


host → identificar maquinas en una red.
Hostnossl → conexión bajo un certificado

Si no quiero contraseña trust → Config

reiniciar servicios ruedita services.msc → reinicar servicio para que tome los cambios.

TRIGGERS

CREATE TABLE productos(


nombre varchar(20),
cantidad smallint,
precio smallint,
ultima_modificacion timestamp,
ultimo_usuario_bd text
)

SELECT * FROM PRODUCTOS;

-- CREACION DE LA FUNCION
CREATE OR REPLACE FUNCTION valida_productos()
RETURNS TRIGGER AS
$BODY$
BEGIN
IF NEW.nombre IS NULL OR Length(NEW.nombre)=0 THEN
RAISE EXCEPTION 'El nombre debe contener alguna informacion';
END IF;
IF NEW.cantidad < 0 THEN
RAISE EXCEPTION 'La cantidad no puede ser negativa';
END IF;
IF NEW.precio < 0 THEN
RAISE EXCEPTION 'El precio no puede ser negativo';
END IF;
NEW.ultima_modificacion = now();
NEW.ultimo_usuario_bd = user;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

-- CREACION DEL TRIGGER(estandar)


CREATE TRIGGER valida_productos
BEFORE INSERT OR UPDATE
ON productos
FOR EACH ROW EXECUTE PROCEDURE valida_productos();--PARA CADA UNA
DE LAS FILAS
---cuando?

INSERT INTO productos(nombre,cantidad,precio)


VALUES ('papa', 10, 1000);

UPDATE productos SET cantidad = 15 WHERE nombre = 'papa';

-- 1. CREAR TABLA DE AUDITORIA


CREATE TABLE auditoria_productos(
accion varchar(20),
fecha timestamp,
nombre varchar(20),
cantidad smallint,
precio smallint
)

-- 2. CREAR LA FUNCION DE AUDITORIA


CREATE OR REPLACE FUNCTION auditoria_productos()
RETURNS TRIGGER AS
$BODY$
BEGIN
IF TG_OP = 'INSERT' THEN
INSERT INTO auditoria_productos(accion, fecha, nombre, cantidad, precio)
VALUES ('INSERTAR', now(), NEW.nombre, NEW.cantidad, NEW.precio);
RETURN NEW;
ELSIF TG_OP = 'DELETE' THEN
INSERT INTO auditoria_productos(accion, fecha, nombre, cantidad, precio)
VALUES ('BORRAR', now(), OLD.nombre, OLD.cantidad, OLD.precio);
RETURN NULL;
ELSIF TG_OP = 'UPDATE' THEN
INSERT INTO auditoria_productos(accion, fecha, nombre, cantidad, precio)
VALUES ('ANTES ACTUALIZAR', now(), OLD.nombre, OLD.cantidad,
OLD.precio);
INSERT INTO auditoria_productos(accion, fecha, nombre, cantidad, precio)
VALUES ('DESPUES', now(), NEW.nombre, NEW.cantidad, NEW.precio);
RETURN NEW;
END IF;
END;
$BODY$
LANGUAGE plpgsql;

-- 3. CREAR EL TRIGGER
CREATE TRIGGER auditoria_productos
AFTER INSERT OR UPDATE OR DELETE
ON productos
FOR EACH ROW EXECUTE PROCEDURE auditoria_productos();

-- 4. Prueba DEL TRIGGER


SELECT * FROM PRODUCTOS;
SELECT * FROM auditoria_productos;

-- 4.1 INSERTAR
INSERT INTO PRODUCTOS (nombre, cantidad, precio)
VALUES ('melon',5,1990);

INSERT INTO PRODUCTOS (nombre, cantidad, precio)


VALUES ('carne',5,3500);

INSERT INTO PRODUCTOS (nombre, cantidad, precio)


VALUES ('arroz',5,2200);

-- 4.2 BORRAR
DELETE FROM productos WHERE nombre = 'papa';

-- 4.3 ACTUALIZAR
UPDATE productos SET cantidad = 18 WHERE nombre = 'carne';

-- 5 CREAR TRIGGER PARA CONTROLAR LA CANTIDAD DE INVENTARIO


-- 5.1 CREAR UNA TABLA PARA LAS COMPRAS
CREATE TABLE compras(
consecutivo smallserial,
fecha date,
nombre varchar(20),
cantidad smallint,
precio smallint
)
-- 5.2 CREAR UNA TABLA PARA VENTAS
CREATE TABLE ventas(
consecutivo smallserial,
fecha date,
nombre varchar(20),
cantidad smallint,
precio smallint
)

-- 5.3 crear funcion que controle las compras


CREATE OR REPLACE FUNCTION compra_productos()
RETURNS TRIGGER AS
$BODY$
BEGIN
PERFORM nombre FROM productos WHERE nombre = NEW.nombre;
IF FOUND THEN
UPDATE productos
SET cantidad = cantidad + NEW.cantidad ,precio = NEW.precio
WHERE nombre = NEW.nombre;

ELSE
INSERT INTO productos(nombre,cantidad,precio)
VALUES(NEW.nombre,NEW.cantidad,NEW.precio);
END IF;
RETURN NEW;

END;
$BODY$
LANGUAGE plpgsql;

-- 5.4 CREAR LA FUNCION DE VENTAS

CREATE OR REPLACE FUNCTION venta_productos()


RETURNS TRIGGER AS
$BODY$
DECLARE
producto productos%ROWTYPE;
BEGIN
SELECT * INTO producto FROM productos WHERE nombre = NEW.nombre;
IF FOUND THEN
IF producto.cantidad >= NEW.cantidad THEN
UPDATE PRODUCTOS
SET cantidad= cantidad - NEW.cantidad
WHERE nombre = NEW.nombre;
ELSE
RAISE EXCEPTION 'No hay suficiente cantidad para la venta: %',
producto.cantidad;
END IF;
RETURN NEW;
ELSE
RAISE EXCEPTION 'No existe el producto a vender: %', NEW.nombre;
END IF;
END;
$BODY$
LANGUAGE plpgsql;

-- 5.5 CREAR LOS TRIGGER de compras


CREATE TRIGGER compra_productos
AFTER INSERT
ON COMPRAS
FOR EACH ROW EXECUTE PROCEDURE compra_productos();

-- 5.6 CREAR LOS TRIGGER de ventas


CREATE TRIGGER venta_productos
BEFORE INSERT
ON ventas
FOR EACH ROW EXECUTE PROCEDURE venta_productos();

-- 5.7 Prueba funcionamiento


SELECT * FROM productos;
SELECT * FROM auditoria_productos;
SELECT * FROM compras;
SELECT * FROM VENTAS;

-- 5.7.1 COMPRANDO UN PRODUCTO EXISTENTE


INSERT INTO compras (fecha, nombre, cantidad, precio)
VALUES (now(), 'YUCA',2, 2000);

-- 5.7.3 VENDIENDO UN PRODUCTO QUE NO EXISTE


INSERT INTO VENTAS (fecha, nombre, cantidad, precio)
VALUES (now(), 'MORA', 5, 200);

-- 5.7.4 VENDIENDO UN PRODUCTO EXISTENTE PERO SIN LA SUFICIENTE


CANTIDAD
INSERT INTO VENTAS (fecha, nombre, cantidad, precio)
VALUES (now(), 'YUCA', 8, 200);

-- 5.7.5 VENDIENDO UN PRODUCTO EXISTENTE CON SUFICIENTE


CANTIDAD
INSERT INTO VENTAS (fecha, nombre, cantidad, precio)
VALUES (now(), 'arroz', 2, 200);
PROYECTO DE FACTURACION

1)Superusuario
2) Crear usuario
CREATE USER escueladigital PASSWORD 'escueladigital';
3)Crear tablespace
CREATE TABLESPACE ts_escuela LOCATION 'C:\escueladigital';
4)Crear base de datos
CREATE DATABASE escueladigital OWNER = escueladigital TABLESPACE =
ts_escuela;

5) new conection → nombre de la base datos y password.


6) Creacion de la tabla de perfiles.

-- CREACION DE LA TABLA DE PERFILES


CREATE TABLE perfiles(
id_perfil smallserial,
perfil varchar(20) not null,
CONSTRAINT pk_perfiles PRIMARY KEY (id_perfil),
CONSTRAINT uk_perfiles UNIQUE(perfil)
);

CREATE TABLE usuarios(


id_usuario smallserial,
usuario varchar(20) not null,
nombre varchar(100) not null,
clave varchar(32) not null,
id_perfil smallint,
CONSTRAINT pk_usuarios PRIMARY KEY (id_usuario),
CONSTRAINT uk_usuarios UNIQUE(usuario),
CONSTRAINT fk_usuarios_perfiles FOREIGN KEY (id_perfil)
REFERENCES perfiles (id_perfil) ON UPDATE RESTRICT ON DELETE
RESTRICT
);
– **CREAR LA TABLA DE TERCEROS

CREATE TABLE terceros(


id_tercero smallserial,
identificacion varchar(20) NOT NULL,
nombre varchar(100) NOT NULL,
direccion varchar(100) NOT NULL,
telefono varchar(20) NOT NULL,
CONSTRAINT pk_terceros PRIMARY KEY (id_tercero),
CONSTRAINT uk_terceros UNIQUE (identificacion)
);

- - CREACION DE LA TABLA DE PRODUCTOS

CREATE TABLE productos(


id_producto smallserial,
nombre varchar(20) NOT NULL,
cantidad smallint,
precio smallint,
id_usuario smallint,
CONSTRAINT pk_productos PRIMARY KEY (id_producto),
CONSTRAINT uk_productos UNIQUE (nombre),
CONSTRAINT fk_productos_usuarios FOREIGN KEY (id_usuario)
REFERENCES usuarios (id_usuario) ON UPDATE RESTRICT ON
DELETE RESTRICT,
CONSTRAINT ck_cantidad CHECK( cantidad > 0),
CONSTRAINT ck_precio CHECK( precio > 0),

);
• unique nombre “unico nombre”
• cantidad positiva
• precio positivo
** CREACION DE LA TABLA DE COMPRAS
CREATE TABLE compras(
id_compra smallserial,
fecha date DEFAULT now() NOT NULL,
id_tercero smallint NOT NULL,
id_producto smallint NOT NULL,
cantidad smallint NOT NULL,
valor smallint NOT NULL,
id_usuario smallint NOT NULL,
CONSTRAINT pk_compras PRIMARY KEY(id_compra),
CONSTRAINT fk_compras_terceros FOREIGN KEY (id_tercero)
REFERENCES productos (id_producto) ON UPDATE RESTRICT ON
DELETE RESTRICT,
CONSTRAINT ck_compras_cantidad CHECK (cantidad > 0),
CONSTRAINT ck_compras_valor CHECK (valor > 0),
CONSTRAINT fk_compras_usuarios FOREIGN KEY (id_usuario)
REFERENCES usuarios (id_usuario) ON UPDATE RESTRICT ON
DELETE RESTRICT
);
** CREACION DE LA TABLA DE VENTAS
CREATE TABLE ventas(
id_venta smallserial,
fecha date DEFAULT now() NOT NULL,
id_tercero smallint NOT NULL,
id_producto smallint NOT NULL,
cantidad smallint NOT NULL,
valor smallint NOT NULL,
id_usuario smallint NOT NULL,
CONSTRAINT pk_ventas PRIMARY KEY(id_venta),
CONSTRAINT fk_ventas_terceros FOREIGN KEY (id_tercero)
REFERENCES terceros (id_tercero) ON UPDATE RESTRICT ON
DELETE RESTRICT,
CONSTRAINT fk_ventas_productos FOREIGN KEY (id_producto)
REFERENCES usuarios (id_usuario) ON UPDATE RESTRICT ON
DELETE RESTRICT,
CONSTRAINT ck_ventas_cantidad CHECK (cantidad > 0),
CONSTRAINT ck_ventas_valor CHECK (valor > 0),
CONSTRAINT fk_ventas_usuario FOREIGN KEY (id_usuario)
REFRENCES usuarios (id_usuario) ON UPDATE RESTRICT ON
DELETE RESTRICT
);

** CREACION DE LA TABLA DE AUDITORIA


CREATE TABLE auditoria(
id_auditoria smallserial,
fecha timestamp NOT NULL DEFAULT now(),
id_usuario smallint NOT NULL,
accion varchar(20) NOT NULL,
tabla varchar(20) NOT NULL,
anterior json NOT NULL,
nuevo json,
CONSTRAINT pk_auditoria PRIMARY KEY(id_auditoria),
CONSTRAINT fk_auditoria_usuarios FOREIGN KEY (id_usuario)
REFERENCES usuarios (id_usuario) ON DELETE RESTRICT ON UPDATE
RESTRICT
);
-- INSERCION DE DATOS BASICOS

-- PERFILES
INSERT INTO perfiles (perfil)
VALUES ('ADMINISTRADOR'), ('CAJERO);

-- consultar perfiles
select * from perfiles;

-- USUARIOS
INSERT INTO usuarios (usuario, nombre, clave, id_perfil)
VALUES ('alozada', 'ALEXYS LOZADA', md5('Clave123+'), 1),
('vendedor', 'PEDRO PEREZ', md5('Clave123+'), 2);

-- consulta usuarios
select * from usuarios

-- TERCEROS
INSERT INTO terceros(identificacion, nombre, direccion, telefono)
VALUES ('123456789', 'PROVETODO LTDA', 'CRA 1 # 2 - 3', '2114477 EXT 123'),
('987654321', 'COMPRATODO S.A.S.', 'AV BUSQUELA CRA ENCUENTRELA',
'4857965'),
('741852963','CLIENTE FRECUENTE', 'EL VECINO', '5478414');

-- PRODUCTOS
INSERT INTO productos (nombre, cantidad, precio, id_usuario)
VALUES ('NEVERA', 5, 12000, 1),
('LAVADORA',1,8900, 2),
('SECADORA', 3, 7400, 1),
('CALENTADOR'), 1, 3200, 2);
-- FUNCION DE CONSULTA DE TERCEROS
CREATE OR REPLACE FUNCTION consulta_terceros()
RETURNS SETOF terceros AS
$BODY$
BEGIN
RETURN QUERY SELECT id_tercero, nombre FROM TERCEROS ORDER BY
nombre;
END;
$BODY$
LANGUAGE plpgsql;
ALTER FUNCTION consulta_terceros() OWNER TO escueladigital;

SET OF -- terceros conjunto de terceros

-- FUNCION DE CONSULTA DE PRODUCTOS


CREATE OR REPLACE FUNCTION consulta_productos()
RETURNS SETOF productos AS
$BODY$
BEGIN
RETURN QUERY SELECT id_producto, nombre, cantidad, precio, id_usuario
FROM productos ORDER BY nombre;
END;
$BODY$
LANGUAGE plpgsql;
ALTER FUNCTION consulta_terceros() OWNER TO escueladigital;
-- FUNCION DE AUTENTICACION
CREATE OR REPLACE FUNCTION autenticacion(_usuario character varying, _clave
character varying)
RETURNS TABLE(id_usuario smallint, nombre character varying, id_perfil smallint,
perfil character varying)
AS
$BODY$
BEGIN
RETURN QUERY SELECT a.id_usuario, a.nombre, b.id_perfil, b.perfil
FROM usuarios as a NATURAL JOIN perfiles as b
WHERE a.usuario = _usuario AND a.clave = md5(_clave);
IF NOT FOUND THEN
RAISE EXCEPTION 'El usuario o la contraseña no coinciden';
END IF;
END;
$BODY$
LANGUAGE plpgsql

- - LLAMADO DE LA FUNCION DESDE UN BACKEND


select id_usuario, nombre, id_perfil, perfil from autenticacion('alozada', 'Clave123+');

** FUNCION TRIGGER PARA AUDITORIA DE PRODUCTOS


CREATE OR REPLACE FUNCTION tg_productos_auditoria( )
RETURNS TRIGGER AS
$BODY$
BEGIN
IF TG_OP = 'UPDATE' THEN
INSERT INTO auditoria (id_usuario, accion, tabla, anterior, nuevo)
SELECT NEW.id_usuario, 'ACTUALIZAR', 'PRODUCTO',
ROW_TO_JSON(OLD.*), row_to_json(NEW.*);

END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

** ROW TO JSON → CONVERTIR A JSON


** TRIGGER AUDITORIA PRODUCTOS

CREATE TRIGGER tg_productos_auditoria


AFTER UPDATE ON productos
FOR EACH ROW EXECUTE PROCEDURE tg_productos_auditoria();

** FUNCION TRIGGER PARA AUDITORIA DE COMPRAS


CREATE OR REPLACE FUNCTION tg_compras_auditoria()
RETURNS TRIGGER AS
$BODY$
BEGIN
IF TG_OP = 'INSERT' THEN
INSERT INTO auditoria (id_usuario, accion, tabla, anterior, nuevo)
SELECT NEW.id_usuario, 'INSERTAR', 'COMPRAS', ROW_TO_JSON(NEW.*),
null;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

** TRIGGER DE AUDITORIA DE COMPRAS

CREATE TRIGGER tg_compras_auditoria


AFTER INSERT ON compras
FOR EACH ROW EXECUTE PROCEDURE tg_compras_auditoria();

** Revisar quienes estuvieron conectados y cual fue la ultima sentencia sql que hicieron
SELECT * FROM pg_stat_activity
** FUNCION DE COMPRAR
CREATE OR REPLACE FUNCTION comprar(
_proveedor smallint,
_producto smallint,
_cantidad smallint,
_valor smallint,
_usuario smallint
) RETURNS smallint AS
$BODY$
DECLARE
_idfactura smallint;
BEGIN
-- SE INSERTA EL REGISTRO DE COMPRAS
INSERT INTO compras (id_tercero, id_producto, cantidad, valor, id_usuario)
VALUES (_proveedor, _producto, _cantidad, _valor , _usuario)
RETURNING id_compra INTO _idfactura;
IF FOUND THEN
-- SE ACTUALIZA EL STOCK DEL PRODUCTO
UPDATE productos
SET cantidad = cantidad + _cantidad,
precio = _valor,
id_usuario = _usuario
WHERE id_producto = _producto;
ELSE
RAISE EXCEPTION 'No fue posible insertar el registro de compras';

END IF;

RETURN _idfactura;
END;
$BODY$
LANGUAGE plpgsql;
** FUNCION TRIGGER PARA AUDITORIA DE VENTAS

CREATE OR REPLACE FUNCTION tg_ventas_auditoria( )


RETURNS TRIGGER AS
$BODY$
BEGIN
IF TG_OP = 'INSERT' THEN
INSERT INTO auditoria (id_usuario, accion, tabla, anterior, nuevo)
SELECT NEW.id_usuario, 'INSERTAR', 'VENTAS', row_to_json(NEW.*), null;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

** TRIGGER DE AUDITORIA DE VENTAS

CREATE TRIGGER tg_ventas_auditoria


AFTER INSERT ON ventas
FOR EACH ROW EXECUTE PROCEDURE tg_ventas_auditoria( );
** FUNCION DE VENTAS

CREATE OR REPLACE FUNCTION vender(


_cliente smallint,
_producto smallint,
_cantidad smallint,
_usuario smallint
) RETURNS smallint AS
$BODY$
DECLARE
_valor smallint;
_existencia smallint;
_idfactura smallint;
BEGIN
-- SE BUSCA EL PRECIO DE VENTA Y SE VALIDA SI HAY STOCK DE
VENTAS
SELECT CAST(precio * 1.3 AS smallint), cantidad
INTO STRICT _valor, _existencia
FROM productos
WHERE id_producto = _producto;

-- SI HAY SUFICIENTE STOCK, SE VENDE


IF _existencia >= _cantidad THEN
-- SE INSERTA EL REGISTRO DE VENTAS
INSERT INTO ventas (id_tercero, id_producto, cantidad, valor, id_usuario)
VALUES (_cliente, _producto, _cantidad, _valor, _usuario)
RETURNING id_venta INTO _idfactura;
IF FOUND THEN
-- SE ACTUALIZA EL STOCK DEL PRODUCTO
UPDATE productos
SET cantidad = cantidad - _cantidad, id_usuario = _usuario
WHERE id_producto = _producto;
ELSE
RAISE EXCEPTION 'No fue posible insertar el registro ventas';
END IF;
ELSE
RAISE EXCEPTION 'No existe suficiente cantidad para la venta %',
_existencia;
END IF;
RETURN _idfactura;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE EXCEPTION 'No se encontro el producto a vender';
END;
$BODY$
LANGUAGE plpgsql;

** FUNCIONES DE CONSULTA DE LISTADO

** CONSULTA VENTAS

CREATE OR REPLACE FUNCTION consulta_ventas(_limite smallint, _pagina


smallint)
RETURNS TABLE (id_venta smallint, fecha date, cliente character varying,
producto character varying, cantidad smallint, valor smallint)
AS
$BODY$
DECLARE
_inicio smallint;
BEGIN
_inicio = _limite * _pagina - _limite;

RETURN QUERY SELECT v.id_venta, v.fecha, t.nombre as proveedor,


p.nombre as producto, v.cantidad, v.valor
FROM ventas as v INNER JOIN terceros as t
ON v.id_tercero = t.id_tercero
INNER JOIN productos as p
ON v.id_producto = p.id_producto
LIMIT _limite
OFFSET _inicio;
END;
$BODY$
LANGUAGE plpgsql;
** CONSULTA COMPRAS

CREATE OR REPLACE FUNCTION consulta_compras(_limite smallint, _pagina


smallint)
RETURNS TABLE (id_compra smallint, fecha date, cliente character varying,
producto character varying, cantidad smallint, valor smallint)
AS
$BODY$
DECLARE
_inicio smallint;
BEGIN
_inicio = _limite * _pagina - _limite;

RETURN QUERY SELECT c.id_compra, c.fecha, t.nombre as cliente,


p.nombre as producto, c.cantidad, c.valor
FROM compras as c INNER JOIN terceros as t
ON c.id_tercero = t.id_tercero
INNER JOIN productos as p
ON c.id_producto = p.id_producto
LIMIT _limite
OFFSET _inicio;
END;
$BODY$
LANGUAGE plpgsql;
** CONSULTA INVENTARIO ACTUAL

CREATE OR REPLACE FUNCTION consulta_inventario(_limite smallint, _pagina


smallint)
RETURNS SETOF productos AS
$BODY$
DECLARE
_inicio smallint;
BEGIN
_inicio = _limite * _pagina - _limite;
RETURN QUERY SELECT id_producto, nombre, cantidad, precio,
id_usuario
FROM productos
ORDER BY id_producto
LIMIT _limite
OFFSET _inicio;
END;
$BODY$
LANGUAGE plpgsql;

** PRUEBA DE LAS FUNCIONES

select * from ventas


select * from compras
select * from productos
select * from auditoria

sin asterisco porque me devuelve un dato


::smallint es un casteo a smallint sino saca error
SELECT comprar(2::smallint, 2::smallint, 1::smallint, 13500::smallint, 2::smallint);
SELECT vender(1::smallint, 1::smallint, 2::smallint, 1::smallint);
Consumir backed en JAVA – CONSUMIR LOGICA,

1) añadir jar postgresqlsql.com en librerias 9,4-1200,jdbc41.jar


2) y en carpeta web-inf/lib del proyecto de java

ALTER TABLE terceros


ALTER COLUMN identificacion TYPE character varying(100);

modificar tamaño de una tabla

Documentacion codigo java

package com.escueladigital.dao;

import com.escueladigital.excepciones.ExcepcionGeneral;
import com.escueladigital.modelos.Compra;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.List;

public class CompraDAO {

private static final Logger LOG = Logger.getLogger(CompraDAO.class.getName());


private static final String INSERTAR = "SELECT comprar(?,?,?,?,?)";
private static final String CONSULTA = "SELECT id_compra, fecha, cliente,
producto, cantidad, valor FROM consulta_compras(?,?)";

public short comprar(short proveedor,


short producto,
short cantidad,
short valor,
short usuario) throws ExcepcionGeneral{
short id_compra = 0;
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = DAO.conectar();
ps = con.prepareStatement(INSERTAR);
ps.setShort(1, proveedor);// envia parametros a la consulta
ps.setShort(2, producto);
ps.setShort(3, cantidad);
ps.setShort(4, valor);
ps.setShort(5, usuario);
rs = ps.executeQuery();//ejecuta la funcion
if (rs.next()) {//pregunta si hay algo en la tabla comprar
id_compra = rs.getShort(1);//devuelvame la primera columna de la funcion y
guardemela en el id compra
}
} catch (SQLException sqle) {
LOG.log(Level.SEVERE, "Error en CompraDAO.comprar: {0}",
sqle.getMessage());//captura errores
throw new ExcepcionGeneral(sqle.getMessage());
} finally {
DAO.cerrar(con, ps, rs);//cierra la conexion
}
return id_compra;//returna el id de compra
}

public List<Compra> listar(short limite, short pagina) throws ExcepcionGeneral {


List<Compra> listado = new ArrayList<>();//listado de compras
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = DAO.conectar();//conexion a la base de datos
ps = con.prepareStatement(CONSULTA);//reliza consulta
ps.setShort(1, limite);//envia parametros limte
ps.setShort(2, pagina);//y la pagina donde voy
rs = ps.executeQuery();//ejecuta consulta
while (rs.next()) {
listado.add(convertir(rs));//si rettorna la consulta añade listado a la consulta
}
} catch (SQLException sqle) {
LOG.log(Level.SEVERE, "Error en CompraDAO.listar: {0}",
sqle.getMessage());//genera excepcion
throw new ExcepcionGeneral(sqle.getMessage());
} finally {
DAO.cerrar(con, ps, rs);//cierra conexion
}
return listado;//retorna listado con compras
}

private Compra convertir (ResultSet rs) throws SQLException {


Compra compra = new Compra();
compra.id_compra = rs.getShort("id_compra");//atributo compra
compra.fecha = Calendar.getInstance();//atributo fecha
compra.fecha.setTime(rs.getDate("fecha"));//atributo fecha
compra.cliente = rs.getString("cliente");
compra.producto = rs.getString("producto");
compra.cantidad = rs.getShort("cantidad");
compra.valor = rs.getShort("valor");
return compra;// retorna una compras
}
}
Documentacion front:

Pagina Index:

<%@page contentType="text/html" pageEncoding="UTF-8"%>


<%
String mensaje = ""; // crea variable mensaje de tipo string
if (request.getAttribute("mensaje") != null) {//si viene un mensaje que no sea nulo
mensaje = (String) request.getAttribute("mensaje");//a la variable mensaje
coloquele el valor q venga en el atributo mensaje
}
%>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-
scale=1.0, minimun-scale=1.0"/>
<link rel="stylesheet" href="css/estilos.css"/>
<link href="https://file.myfontastic.com/gVhWFfTbY55yVaY7oxJaF3/icons.css"
rel="stylesheet"/>
<title>Sistema de facturación - Escuela Digital</title>// titulo
</head>
<body class="inicio">//body
<header class="main-header">
<div class="ed-container">
<div class="ed-item"><img src="img/logo.png" class="logo"/></div>
</div>
</header>
<main class="ed-container">
<div class="ed-item">
<h1>Ingresar</h1>
<form class="login-form ed-container web-40" action="Autenticar"
method="post">
<div class="ed-item form-item">
<label for="username">Usuario</label>
<input type="text" name="usuario" id="usuario" class="input" autofocus
autocomplete="off"/>
</div>
<div class="ed-item form-item">
<label for="password">Contraseña</label>
<input type="password" name="clave" id="clave" class="input"/>
</div>
<div class="ed-item form-item">
<input type="submit" value="Ingresar"/>
</div>
</form>
<div class="web-40"><%=mensaje%></div>//muestre el mensaje
</div>
</main>
<footer class="main-footer">
<div class="ed-container">
<div class="ed-item">
<p>Curso Bases de Datos Desde Cero - Alexys Lozada</p>
</div>
</div>
</footer>
<script src="js/efectos.js"></script>
</body>
</html>
JSP Compras:

<%@page import="com.escueladigital.modelos.Tercero"%>// import de las clases


<%@page import="com.escueladigital.dao.TerceroDAO"%>
<%@page import="com.escueladigital.dao.ProductoDAO"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.escueladigital.modelos.Producto"%>
<%@page import="com.escueladigital.modelos.Usuario"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%
Usuario usuario = null;
if (session.getAttribute("usuario") != null) {//pregunto si el usuario esta autenticado
osea si hay informacion en la sesion
usuario = (Usuario) session.getAttribute("usuario");//obtiene informacion de la
sesion para decirle bienvenido
} else {// sino lo devuelve a index.jsp
response.sendRedirect("index.jsp");
}

String mensaje__error = null, mensaje__exito = null;

//captura mensaje de error de éxito o error en caso de éxito o fracaso y lo tengo listo para
mostrarlo mas abajo

if (request.getAttribute("mensaje__error") != null) {
mensaje__error = (String) request.getAttribute("mensaje__error");
}

if (request.getAttribute("mensaje__exito") != null) {
mensaje__exito = (String) request.getAttribute("mensaje__exito");
}

ProductoDAO productoDAO = new ProductoDAO(); //creo el dao


List<Producto> productos = new ArrayList<Producto>(); // creo la lista de productos
productos = productoDAO.listar(); // lleno la lista con los productos de la base de
datos
TerceroDAO terceroDAO = new TerceroDAO();// creo un DAO de proveedores
List<Tercero> terceros = new ArrayList<Tercero>(); //creo lista de terceros
terceros = terceroDAO.listar(); // lleno el combo de proveedores desde la base de
datos
%>

//html
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-
scale=1.0, minimun-scale=1.0"/>
<link rel="stylesheet" href="css/estilos.css"/>
<link href="https://file.myfontastic.com/gVhWFfTbY55yVaY7oxJaF3/icons.css"
rel="stylesheet"/>
<title>Compras</title>
</head>
<body class="compras">
<div class="main-container">
<aside class="main-aside"><a href="/"><img src="img/logo.png"
class="logo"/></a>

// creo un menu en el cual puedo navegar por la lista


<ul class="menu ed-menu">
<li class="menu__item"><a href="compras.jsp" class="menu__link icon-
compras">Compras</a></li>
<li class="menu__item"><a href="ventas.jsp" class="menu__link icon-
ventas">Ventas</a></li>
<li class="menu__item"><a href="lista-compras.jsp" class="menu__link
icon-lista-compras">Lista de compras</a></li>
<li class="menu__item"><a href="lista-ventas.jsp" class="menu__link
icon-lista-ventas">Lista de ventas</a></li>
<li class="menu__item"><a href="lista-productos.jsp" class="menu__link
icon-lista-productos">Lista de productos</a></li>
</ul>
</aside>
<main class="main-content">
<div class="usuario__sistema">Bienvenido
<%
if (usuario != null) {
// si existe un usuario le dice bienvenido y le muestra el usuario de la persona

out.print(usuario.nombre);
}
%>
</div>
<h1>Compras</h1>
<form action="Comprar" method="post">
<div class="form-item ed-container">
<div class="ed-item base-30">
<label for="proveedor">Proveedor</label>
</div>
<div class="ed-item base-70">
<select name="proveedor" id="proveedor">//combo de proveedores
<%
for (Tercero tercero : terceros) {//lleno el combo de terceros
out.println("<option value=\"" + tercero.id_tercero + "\">" +
tercero.nombre + "</option>");
}
%>
</select>
</div>
</div>
<div class="form-item ed-container">
<div class="ed-item base-30">
<label for="producto">Producto</label>
</div>
<div class="ed-item base-70">
<select name="producto" id="producto">// combo de seleccion
<%
for (Producto producto : productos) {//poblar el combo con
productos
out.println("<option value=\"" + producto.id_producto + "\">"
+ producto.nombre + "</option>");
}
%>
</select>
</div>
</div>
<div class="form-item ed-container">
<div class="ed-item base-30">
<label for="cantidad">Cantidad</label> //se registra la cantidad que se
digita
</div>
<div class="ed-item base-70">
<input type="number" id="cantidad" name="cantidad"/>
</div>
</div>
<div class="form-item ed-container">
<div class="ed-item base-30">
<label for="valor">Valor</label> luego el valor que tambien se digita
</div>
<div class="ed-item base-70">
<input type="number" id="valor" name="valor"/>
</div>
</div>
<div class="ed-container">
<div class="ed-item">
<input type="submit" value="comprar"/> // boton de comprar
</div>
</div>
<div class="ed-container">
<div clas="ed-item">
<%
if (mensaje__error != null) { //si hay unerro me lo va a mostrar en un
cuadro
out.println("<div
class=\"mensaje__error\">"+mensaje__error+"</div>");
}
if (mensaje__exito != null) { // si todo esta bien nos muestra un
mensaje de exito
out.println("<div
class=\"mensaje__exito\">"+mensaje__exito+"</div>");
}
%>
</div>
</div>
</form>
</main>
</div>
<script src="js/efectos.js"></script>
</body>
</html>

Front de compras:

<%@page import="com.escueladigital.modelos.Compra"%>
<%@page import="com.escueladigital.dao.CompraDAO"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.escueladigital.modelos.Usuario"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%
Usuario usuario = null;// persona tiene q estar logueada si no lo envia al index
if (session.getAttribute("usuario") != null) {
usuario = (Usuario) session.getAttribute("usuario");
} else {
response.sendRedirect("index.jsp");
}

short sumaCantidad = 0;
int sumaTotal = 0;
short limite = 5;
short pagina = 1;
if (request.getParameter("limite") != null) {//si la persona ya a enviado un valor de
limite
limite = Short.parseShort((String) request.getParameter("limite"));//entonces el
limite es el valor q ha enviado en el formulario
}
if (request.getParameter("pagina") != null) {// si la persona envio un valor de pagina
ese es el valor del formulario
pagina = Short.parseShort((String) request.getParameter("pagina"));//capturamos el
elemento del formulario siempre como de tipo string, lo pasamos a short y lo guardamo
en pagina
}

CompraDAO compraDAO = new CompraDAO();//crea un dao de compra


List<Compra> compras = new ArrayList<Compra>();//crea lista de compras
compras = compraDAO.listar(limite, pagina);// lista las compras desde4 base de datos
y la almacena en la lista compras
%>
html-->>

<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-
scale=1.0, minimun-scale=1.0"/>
<link rel="stylesheet" href="css/estilos.css"/>
<link href="https://file.myfontastic.com/gVhWFfTbY55yVaY7oxJaF3/icons.css"
rel="stylesheet"/>
<title>Lista de compras</title>
</head>
<body class="Listado de compras">
<div class="main-container">
<aside class="main-aside"><a href="/"><img src="img/logo.png"
class="logo"/></a>
// menu para navegar -->
<ul class="menu ed-menu">
<li class="menu__item"><a href="compras.jsp" class="menu__link icon-
compras">Compras</a></li>
<li class="menu__item"><a href="ventas.jsp" class="menu__link icon-
ventas">Ventas</a></li>
<li class="menu__item"><a href="lista-compras.jsp" class="menu__link icon-
lista-compras">Lista de compras</a></li>
<li class="menu__item"><a href="lista-ventas.jsp" class="menu__link icon-lista-
ventas">Lista de ventas</a></li>
<li class="menu__item"><a href="lista-productos.jsp" class="menu__link icon-
lista-productos">Lista de productos</a></li>
</ul>
</aside>
<main class="main-content">
<h1> Listado de compras</h1>
<table class="listado"> // tabla para listar la informacion
<thead>
<tr>
<th>ID</th>
<th>Fecha</th>
<th>Proveedor</th>
<th>Producto</th>
<th>Cantidad</th>
<th>Valor</th>
</tr>
</thead>
<tbody>
<%
for (Compra compra : compras) {
out.println("<tr>");//fila
out.println("<td>");//campo
out.println(compra.id_compra);
out.println("</td>");
out.println("<td>");
out.println(compra.getFecha());
out.println("</td>");
out.println("<td>");
out.println(compra.cliente);
out.println("</td>");
out.println("<td>");
out.println(compra.producto);
out.println("</td>");
out.println("<td>");
out.println(compra.cantidad);
out.println("</td>");
out.println("<td>");
out.println(compra.valor);
out.println("</td>");
out.println("</tr>");
sumaCantidad += compra.cantidad;
sumaTotal += compra.valor;
}
%>
</tbody>
<tfoot>//pie de pagina de la tabla
<tr>
<td colspan="4" class="suma-label">Total</td>
<td class="suma"><%=sumaCantidad%></td>//suma cantidad
<td class="suma"><%=sumaTotal%></td> //sumatotal
</tr>
</tfoot>
</table>
<form action="lista-compras.jsp" method="post"> //formularuio que nos permite
paginar
<div class="ed-container">
<div class="ed-item web-20">
<label for="registros">Registros:</label>
</div>
<div class="ed-item web-20">
<select id="registros" name="limite">
<option value="1">1</option>// escoje el limite
<option value="3">3</option>
<option value="5">5</option>
<option value="10">10</option>
</select>
</div>
<div class="ed-item web-20">
<label for="pagina">Página:</label>
</div>
<div class="ed-item web-20">
<input type="number" id="pagina" name="pagina" min="1" value="1"/>
</div>
<div class="ed-item web-15">
<input type="submit" value="Listar"/>
</div>
</div>
</form>
</main>
</div>
</body>
</html>