Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --ejercicio 1
- CREATE OR REPLACE PROCEDURE p_genRecibos(fac facturas.nfactura%TYPE, cli facturas.cCodCliente%TYPE, fechaE facturas.fecha%TYPE, fPago facturas.cCodFPago%TYPE, importe NUMBER)
- IS
- numRecibos fpagos.nRecibos%TYPE;
- daBancarios clientes_cuentas%ROWTYPE;
- fechaPago DATE;
- imp NUMBER;
- id_cuenta clientes.idcuenta%TYPE;
- BEGIN
- SELECT nRecibos INTO numRecibos FROM fpagos WHERE cCodFpago = fPago;
- SELECT idcuenta INTO id_cuenta FROM clientes WHERE cCodCliente = cli;
- SELECT * INTO daBancarios FROM clientes_cuentas WHERE cCodCliente || idcuenta = cli || id_cuenta;
- imp := importe/numRecibos;
- LOOP
- EXIT WHEN numRecibos = 0;
- fechaPago := LAST_DAY(ADD_MONTHS(fechaE,numRecibos));
- INSERT INTO recibos VALUES (fac, numRecibos, fechaE, fechaPago, imp, 'N', cli, daBancarios.cCodBanco, daBancarios.sucursal, daBancarios.CodControl, daBancarios.numCuenta);
- numRecibos := numRecibos - 1;
- END LOOP;
- END;
- ----------------------------
- --ejercicio 1
- CREATE OR REPLACE TRIGGER ins_Factura
- before INSERT
- ON facturas
- FOR each ROW
- DECLARE
- imptMayCero EXCEPTION;
- noPagada EXCEPTION;
- descFPago fPagos.descripcion%TYPE;
- BEGIN
- IF :NEW.importe < 0 THEN RAISE imptMayCero; END IF;
- IF UPPER(:NEW.abono) = 'N' THEN
- --Compruebo la forma de pago
- SELECT descripcion INTO descfPAgo FROM fPAgos WHERE cCodFpago = :NEW.cCodFPago;
- IF descfPago = 'PAGO AL CONTADO' OR :NEW.cCodCliente = 'C001' THEN
- IF UPPER(:NEW.pagada) = 'N' THEN RAISE noPagada; END IF;
- INSERT INTO recibos VALUES (:NEW.nfactura, 1, :NEW.fecha, :NEW.fecha, :NEW.importe, 'S', :NEW.cCodCliente, ' ',' ',' ', ' ');
- ELSE
- p_genRecibos(:NEW.nfactura, :NEW.cCodCliente, :NEW.fecha, :NEW.cCodFPago, :NEW.importe);
- END IF;
- END IF;
- EXCEPTION
- WHEN imptMayCero THEN raise_application_error(-20001,'El importe ha de ser siempre mayor a cero');
- WHEN noPagada THEN raise_application_error(-20002,'La factura para PAGO AL CONTADO ha de estar pagada');
- END;
- -------------------------------------
- --ejercicio 2
- CREATE OR REPLACE TRIGGER up_recibos
- before UPDATE
- ON recibos
- FOR each ROW
- DECLARE
- FacPagada facturas.pagada%TYPE;
- descFPago fPagos.descripcion%TYPE;
- fPago fPagos.cCodFPago%TYPE;
- CURSOR c_dBancarios IS SELECT ccodBanco, sucursal, codControl, numCuenta FROM clientes_cuentas WHERE cCodCliente = :old.cCodCliente;
- xBancarios c_dBancarios%ROWTYPE;
- errorDBancarios BOOLEAN;
- datosBancarios VARCHAR2(50);
- isPagada EXCEPTION;
- excepcionBancos EXCEPTION;
- errorFechas EXCEPTION;
- imporMuyAlto EXCEPTION;
- modPK EXCEPTION;
- BEGIN
- SELECT pagada INTO FacPagada FROM facturas WHERE nFactura = :old.nFactura;
- SELECT cCodFPago INTO fPago FROM facturas WHERE nFactura = :old.nFactura;
- SELECT descripcion INTO descfPAgo FROM fPAgos WHERE cCodFpago = fpago;
- --Compurebo que esta pagadas
- IF UPPER(:old.pagado) = 'S' OR descfPago = 'PAGO AL CONTADO' OR FacPagada = 'S' THEN RAISE isPagada; END IF;
- --Compriobacion de datos bancarios
- IF :old.cCodBanco != :NEW.cCodBanco OR :old.sucursal != :NEW.sucursal OR :old.codControl != :NEW.codControl OR :old.NumCuenta != :NEW.NumCuenta THEN
- datosBancarios := :NEW.cCodBanco || :NEW.sucursal || :NEW.CodControl || :NEW.numCuenta;
- OPEN c_dBancarios;
- LOOP
- FETCH c_dBancarios INTO xBancarios;
- EXIT WHEN c_dBancarios%notfound;
- IF datosBancarios = xBancarios.cCodBanco || xBancarios.sucursal || xBancarios.CodControl || xBancarios.numCuenta THEN
- errorDBancarios := FALSE;
- EXIT;
- ELSE
- RAISE excepcionBancos;
- END IF;
- END LOOP;
- CLOSE c_dBancarios;
- END IF;
- --Comprobacion fecha emision
- IF :NEW.fechaPago < :NEW.fechaEmis THEN RAISE errorFechas; END IF;
- -- si se cambia ele importe ha de ser 10% mayot
- IF (:NEW.importe != :old.importe) AND (:NEW.importe > :old.importe*1.1) THEN RAISE imporMuyAlto; END IF;
- -- Nmo se pueden modificar las claves primarias
- IF (:NEW.nfactura != :old.nFactura ) OR (:NEW.nRecibo != :old.nreCibo) THEN RAISE modPK; END IF;
- EXCEPTION
- WHEN isPagada THEN raise_application_error(-20003,'El recibo no se puede modificar, esta pagado');
- WHEN excepcionBancos THEN raise_application_error(-20004, 'Los datos bancarios no existen para ese cliente');
- WHEN errorFechas THEN raise_application_error(-20005, 'La fecha de emision es mayor que la de pago');
- WHEN imporMuyAlto THEN raise_application_error(-20006, 'El impoerte nuevo es mayor que el 10% del anterior');
- WHEN modPK THEN raise_application_error(-20007, 'No se pude modificar numFac o numRec');
- END;
- -----------------------------------
- --ejercicio 3
- CREATE OR REPLACE PROCEDURE sp_Lis_FacxCli (xCodCli clientes.cCodCliente%TYPE, xSumRecNoPag OUT NUMBER, xSumRecPag OUT NUMBER)
- IS
- CURSOR c_cliente(xCodCli clientes.cCodCliente%TYPE)
- IS
- SELECT nombre, direccion, codPostal, poblacion, provincia, pais FROM clientes WHERE cCodCliente = xCodCli;
- xDatosCli c_cliente%ROWTYPE;
- CURSOR c_CliFact(xCodCli clientes.cCodCliente%TYPE)
- IS
- SELECT * FROM facturas WHERE cCodCliente = xCodCli;
- xDatosFact c_CliFact%ROWTYPE;
- descFPago fpagos.descripcion%TYPE;
- numRecibos NUMBER;
- tipo VARCHAR2(15);
- BEGIN
- OPEN c_cliente(xCodCli);
- FETCH c_cliente INTO xDatosCli;
- DBMS_OUTPUT.put_line(LPAD('Cliente: ', 60, ' ') || ' ' || xDatosCli.nombre);
- DBMS_OUTPUT.put_line(LPAD(xDatosCli.direccion, 66, ' '));
- DBMS_OUTPUT.put_line(LPAD(xDatosCli.CodPostal, 67, ' ') || ' ' || xDatosCli.poblacion);
- DBMS_OUTPUT.put_line(LPAD(xDatosCli.provincia, 67, ' ') || ' ' || xDatosCli.pais);
- DBMS_OUTPUT.put_line('Tipo Numero Fecha F.Pago Importe Pagada NRecibos Re.Paga Rec.No Pagados');
- OPEN c_CliFact(xCodCli);
- LOOP
- FETCH c_CliFact INTO xDatosFact;
- EXIT WHEN c_CliFact%notfound;
- IF xDatosFact.abono = 'N' THEN tipo := 'Factura';
- ELSE tipo := 'Abono'; END IF;
- --Cuento los recibos de la factura
- SELECT COUNT(*) INTO numRecibos FROM recibos WHERE cCodCliente = xCodCli;
- SELECT SUM(DECODE(pagado, 'S', importe)) INTO xSumRecPag FROM recibos WHERE cCodCliente = xCodCli;
- SELECT SUM(DECODE(pagado, 'N', importe)) INTO xSumRecNoPag FROM recibos WHERE cCodCliente = xCodCli;
- SELECT descripcion INTO descfPAgo FROM fPAgos WHERE cCodFpago = xDatosFact.cCodFPago;
- DBMS_OUTPUT.put_line(RPAD(tipo, 10 ,' ') || RPAD(xDatosFact.nFactura, 10, ' ')
- || RPAD(xDatosFact.fecha, 10, ' ') || RPAD(xDatosFact.cCodFPago, 10, ' ')
- || RPAD(descfPAgo, 20, ' ')|| RPAD(xDatosFact.importe, 13, ' ') || RPAD(xDatosFact.pagada, 11, ' ')
- || RPAD(numRecibos, 20, ' ')|| RPAD(xSumRecPag, 20, ' ')|| RPAD(xSumRecNoPag, 20, ' '));
- END LOOP;
- CLOSE c_CliFact;
- CLOSE c_cliente;
- END;
- SET serveroutput ON;
- DECLARE
- xSumRecNoPag NUMBER;
- xSumRecPag NUMBER;
- BEGIN
- sp_Lis_FacxCli('C002', xSumRecNoPag,xSumRecPag);
- END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement