Advertisement
Guest User

Untitled

a guest
Mar 11th, 2011
2,341
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 6.97 KB | None | 0 0
  1. --ejercicio 1
  2. CREATE OR REPLACE PROCEDURE p_genRecibos(fac facturas.nfactura%TYPE, cli facturas.cCodCliente%TYPE, fechaE facturas.fecha%TYPE, fPago facturas.cCodFPago%TYPE, importe NUMBER)
  3. IS
  4.   numRecibos fpagos.nRecibos%TYPE;
  5.   daBancarios clientes_cuentas%ROWTYPE;
  6.   fechaPago DATE;
  7.   imp NUMBER;
  8.   id_cuenta clientes.idcuenta%TYPE;
  9. BEGIN
  10.      SELECT nRecibos INTO numRecibos FROM fpagos WHERE cCodFpago = fPago;
  11.      SELECT idcuenta INTO id_cuenta FROM clientes WHERE cCodCliente = cli;
  12.      SELECT * INTO daBancarios FROM clientes_cuentas WHERE cCodCliente || idcuenta = cli || id_cuenta;
  13.      imp := importe/numRecibos;
  14.      LOOP
  15.           EXIT WHEN numRecibos = 0;
  16.           fechaPago := LAST_DAY(ADD_MONTHS(fechaE,numRecibos));
  17.           INSERT INTO recibos VALUES (fac, numRecibos, fechaE, fechaPago, imp, 'N', cli, daBancarios.cCodBanco, daBancarios.sucursal, daBancarios.CodControl, daBancarios.numCuenta);
  18.           numRecibos := numRecibos - 1;
  19.      END LOOP;
  20. END;
  21.  
  22.  
  23. ----------------------------
  24. --ejercicio 1
  25. CREATE OR REPLACE TRIGGER ins_Factura
  26. before INSERT
  27. ON facturas
  28. FOR each ROW
  29.     DECLARE
  30.        imptMayCero EXCEPTION;
  31.        noPagada    EXCEPTION;
  32.        descFPago   fPagos.descripcion%TYPE;
  33.     BEGIN
  34.          IF :NEW.importe < 0 THEN RAISE imptMayCero; END IF;
  35.          IF UPPER(:NEW.abono) = 'N' THEN
  36.             --Compruebo la forma de pago
  37.             SELECT descripcion INTO descfPAgo FROM fPAgos WHERE cCodFpago = :NEW.cCodFPago;
  38.             IF descfPago = 'PAGO AL CONTADO' OR :NEW.cCodCliente = 'C001' THEN
  39.                IF UPPER(:NEW.pagada) = 'N' THEN RAISE noPagada; END IF;
  40.                INSERT INTO recibos VALUES (:NEW.nfactura, 1, :NEW.fecha, :NEW.fecha, :NEW.importe, 'S', :NEW.cCodCliente, ' ',' ',' ', ' ');           
  41.             ELSE
  42.                 p_genRecibos(:NEW.nfactura, :NEW.cCodCliente, :NEW.fecha, :NEW.cCodFPago, :NEW.importe);
  43.             END IF;
  44.          END IF;
  45.     EXCEPTION
  46.              WHEN imptMayCero THEN raise_application_error(-20001,'El importe ha de ser siempre mayor a cero');
  47.              WHEN noPagada THEN raise_application_error(-20002,'La factura para PAGO AL CONTADO ha de estar pagada');
  48.     END;
  49.    
  50.    
  51.    
  52.    
  53.     -------------------------------------
  54. --ejercicio 2
  55. CREATE OR REPLACE TRIGGER up_recibos
  56. before UPDATE
  57. ON recibos
  58. FOR each ROW
  59. DECLARE
  60.        FacPagada facturas.pagada%TYPE;
  61.        descFPago fPagos.descripcion%TYPE;
  62.        fPago     fPagos.cCodFPago%TYPE;
  63.        CURSOR c_dBancarios IS SELECT ccodBanco, sucursal, codControl, numCuenta FROM clientes_cuentas WHERE cCodCliente = :old.cCodCliente;
  64.        xBancarios c_dBancarios%ROWTYPE;
  65.        errorDBancarios BOOLEAN;
  66.        datosBancarios  VARCHAR2(50);
  67.        isPagada        EXCEPTION;
  68.        excepcionBancos EXCEPTION;
  69.        errorFechas     EXCEPTION;
  70.        imporMuyAlto    EXCEPTION;
  71.        modPK           EXCEPTION;
  72. BEGIN
  73.      SELECT pagada INTO FacPagada FROM facturas WHERE nFactura = :old.nFactura;
  74.      SELECT cCodFPago INTO fPago FROM facturas WHERE nFactura = :old.nFactura;
  75.      SELECT descripcion INTO descfPAgo FROM fPAgos WHERE cCodFpago = fpago;
  76.      --Compurebo que esta pagadas
  77.      IF UPPER(:old.pagado) = 'S' OR descfPago = 'PAGO AL CONTADO' OR FacPagada = 'S' THEN RAISE isPagada; END IF;
  78.      --Compriobacion de datos bancarios
  79.      IF :old.cCodBanco != :NEW.cCodBanco OR :old.sucursal != :NEW.sucursal OR :old.codControl != :NEW.codControl OR :old.NumCuenta != :NEW.NumCuenta THEN
  80.         datosBancarios := :NEW.cCodBanco || :NEW.sucursal || :NEW.CodControl || :NEW.numCuenta;
  81.         OPEN c_dBancarios;
  82.              LOOP
  83.                  FETCH c_dBancarios INTO xBancarios;
  84.                  EXIT WHEN c_dBancarios%notfound;
  85.                  IF datosBancarios = xBancarios.cCodBanco || xBancarios.sucursal || xBancarios.CodControl || xBancarios.numCuenta THEN
  86.                     errorDBancarios := FALSE;
  87.                     EXIT;
  88.                  ELSE
  89.                      RAISE excepcionBancos;
  90.                  END IF;
  91.              END LOOP;
  92.         CLOSE c_dBancarios;
  93.      
  94.      END IF;
  95.      
  96.      --Comprobacion fecha emision
  97.      IF :NEW.fechaPago < :NEW.fechaEmis THEN RAISE errorFechas; END IF;
  98.      
  99.      -- si se cambia ele importe ha de ser 10% mayot
  100.      IF (:NEW.importe != :old.importe) AND (:NEW.importe > :old.importe*1.1) THEN RAISE imporMuyAlto; END IF;
  101.      -- Nmo se pueden modificar las claves primarias
  102.      IF (:NEW.nfactura != :old.nFactura ) OR (:NEW.nRecibo != :old.nreCibo) THEN RAISE modPK; END IF;
  103.     EXCEPTION
  104.             WHEN isPagada        THEN raise_application_error(-20003,'El recibo no se puede modificar, esta pagado');
  105.             WHEN excepcionBancos THEN raise_application_error(-20004, 'Los datos bancarios no existen para ese cliente');
  106.             WHEN errorFechas     THEN raise_application_error(-20005, 'La fecha de emision es mayor que la de pago');
  107.             WHEN imporMuyAlto    THEN raise_application_error(-20006, 'El impoerte nuevo es mayor que el 10% del anterior');
  108.             WHEN modPK           THEN raise_application_error(-20007, 'No se pude modificar numFac o numRec');
  109. END;
  110.  
  111.  
  112.  
  113.  
  114.  
  115. -----------------------------------
  116.  
  117. --ejercicio 3
  118. CREATE OR REPLACE PROCEDURE sp_Lis_FacxCli (xCodCli clientes.cCodCliente%TYPE, xSumRecNoPag OUT NUMBER, xSumRecPag OUT NUMBER)
  119. IS
  120.   CURSOR c_cliente(xCodCli clientes.cCodCliente%TYPE)
  121.   IS
  122.      SELECT nombre, direccion, codPostal, poblacion, provincia, pais FROM clientes WHERE cCodCliente = xCodCli;
  123.   xDatosCli c_cliente%ROWTYPE;
  124.  
  125.   CURSOR c_CliFact(xCodCli clientes.cCodCliente%TYPE)
  126.   IS
  127.     SELECT * FROM facturas WHERE cCodCliente = xCodCli;
  128.   xDatosFact c_CliFact%ROWTYPE;
  129.   descFPago fpagos.descripcion%TYPE;
  130.   numRecibos NUMBER;
  131.   tipo VARCHAR2(15);
  132. BEGIN
  133.      OPEN c_cliente(xCodCli);
  134.           FETCH c_cliente INTO xDatosCli;
  135.           DBMS_OUTPUT.put_line(LPAD('Cliente: ', 60, ' ') || '   ' || xDatosCli.nombre);
  136.           DBMS_OUTPUT.put_line(LPAD(xDatosCli.direccion, 66, ' '));
  137.           DBMS_OUTPUT.put_line(LPAD(xDatosCli.CodPostal, 67, ' ') || '   ' || xDatosCli.poblacion);
  138.           DBMS_OUTPUT.put_line(LPAD(xDatosCli.provincia, 67, ' ') || '   ' || xDatosCli.pais);
  139.           DBMS_OUTPUT.put_line('Tipo     Numero     Fecha     F.Pago                      Importe     Pagada    NRecibos    Re.Paga    Rec.No Pagados');
  140.           OPEN c_CliFact(xCodCli);
  141.           LOOP
  142.               FETCH c_CliFact INTO xDatosFact;
  143.               EXIT WHEN c_CliFact%notfound;
  144.               IF xDatosFact.abono = 'N' THEN tipo := 'Factura';
  145.               ELSE tipo := 'Abono'; END IF;
  146.               --Cuento los recibos de la factura
  147.               SELECT COUNT(*) INTO numRecibos FROM recibos WHERE cCodCliente = xCodCli;
  148.               SELECT SUM(DECODE(pagado, 'S', importe)) INTO xSumRecPag FROM recibos WHERE cCodCliente = xCodCli;
  149.               SELECT SUM(DECODE(pagado, 'N', importe)) INTO xSumRecNoPag FROM recibos WHERE cCodCliente = xCodCli;
  150.               SELECT descripcion INTO descfPAgo FROM fPAgos WHERE cCodFpago = xDatosFact.cCodFPago;
  151.               DBMS_OUTPUT.put_line(RPAD(tipo, 10 ,' ') || RPAD(xDatosFact.nFactura, 10, ' ')
  152.               || RPAD(xDatosFact.fecha, 10, ' ') || RPAD(xDatosFact.cCodFPago, 10, ' ')
  153.               || RPAD(descfPAgo, 20, ' ')|| RPAD(xDatosFact.importe, 13, ' ') || RPAD(xDatosFact.pagada, 11, ' ')
  154.               || RPAD(numRecibos, 20, ' ')|| RPAD(xSumRecPag, 20, ' ')|| RPAD(xSumRecNoPag, 20, ' '));
  155.           END LOOP;
  156.           CLOSE c_CliFact;
  157.      CLOSE c_cliente;
  158. END;
  159.  
  160. SET serveroutput ON;
  161. DECLARE
  162. xSumRecNoPag NUMBER;
  163. xSumRecPag NUMBER;
  164. BEGIN
  165. sp_Lis_FacxCli('C002', xSumRecNoPag,xSumRecPag);
  166. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement