Me he quedado bloqueado Escribir un procedimiento almacenado que reciba todos los datos de un nuevo pedido (salvo el código) y procese la transacción de alta, modificando los campos calculados afectados (ventas acumuladas de empleado y sucursal). El programa debe grabar definitivamente en la base de datos las tres cosas o ninguna. Gestiona los siguientes errores:
El código del pedido será el valor del código máximo de pedido incrementado en 1.
Los campos de la clave son obligatorios. Indica en cada momento cual es el campo no introducido y cancela la operación.
Mostrar un mensaje indicativo y salir de la operación cuando el empleado no exista en la BD.
Mostrar un mensaje indicativo y salir de la operación cuando el cliente no exista en la BD.
Si la fecha del pedido no se informa asumiremos que es la fecha del sistema.
Si la fecha de envío no se informa asumiremos que es una semana después de la fecha del sistema.
La fecha de envío no puede ser anterior a la fecha del pedido.
El valor de campo PAGADO solamente puede ser SI o NO.
El valor del importe total no puede ser negativo.
Escribe un ejemplo de llamada al anterior procedimiento
--------------------------------------------------------------------------------
Estas son las tablas:
CREATE TABLE INFEMPLE
(NUM_EMPLE VARCHAR2(3) NOT NULL ,
NOMBRE VARCHAR2(20) NOT NULL,
EDAD NUMBER(2),
SUCURSAL VARCHAR2(2),
CARGO VARCHAR2(10),
FECHA_CONTRATO DATE,
JEFE VARCHAR2(3),
CUOTA_AÑO NUMBER(8),
VENTAS_ACU NUMBER(8),
CONSTRAINT ip_emple PRIMARY KEY(NUM_EMPLE));
CREATE TABLE SUCURSAL
(NUM_SUC VARCHAR2(2) NOT NULL,
CIUDAD VARCHAR2(20) NOT NULL,
ZONA VARCHAR2(8) NOT NULL,
DIRECTOR VARCHAR2(3) NOT NULL,
OBJETIVO_AÑO NUMBER(8) NOT NULL,
VENTAS_ACU NUMBER(8) ,
CONSTRAINT ip_sucur PRIMARY KEY(NUM_SUC),
--En cada ciudad solo puede haber una sucursal
CONSTRAINT iu_ciu UNIQUE(CIUDAD),
CONSTRAINT ca_emple FOREIGN KEY(DIRECTOR)REFERENCES INFEMPLE (NUM_EMPLE));
ALTER TABLE INFEMPLE ADD CONSTRAINT ca_suc FOREIGN KEY (SUCURSAL) REFERENCES SUCURSAL (NUM_SUC);
ALTER TABLE INFEMPLE ADD CONSTRAINT ca_jefe FOREIGN KEY (JEFE) REFERENCES INFEMPLE (NUM_EMPLE);
CREATE TABLE CLIENTES
(NUM_CLI VARCHAR2(4) NOT NULL,
NOMBRE VARCHAR2(20) NOT NULL,
CIUDAD_CLI VARCHAR2(15),
TELEFONO VARCHAR2(15),
FAX VARCHAR2(15),
TIPO_CLI VARCHAR2(2),
REPRESENT VARCHAR2(3),
LIM_CRE NUMBER(8) ,
CONSTRAINT ip_cli PRIMARY KEY (NUM_CLI),
--No permitimos que haya 2 clientes en la BD que se llamen igual
CONSTRAINT iu_nom UNIQUE (NOMBRE),
CONSTRAINT ca_repre FOREIGN KEY (REPRESENT) REFERENCES INFEMPLE(NUM_EMPLE));
--***********************************************
--***********************************************
CREATE TABLE CABPED
(NUM_PEDIDO VARCHAR2(6) NOT NULL,
COD_CLI VARCHAR2(4),
FECHA_PED DATE NOT NULL,
COD_VENDE VARCHAR2(3),
FECHA_ENVI DATE,
IMP_TOTAL NUMBER(8) NOT NULL,
PAGADO VARCHAR2(2),
MODO_ENVIO VARCHAR2(10),
CONSTRAINT ip_cabped PRIMARY KEY (NUM_PEDIDO),
CONSTRAINT ca_cli FOREIGN KEY (COD_CLI) REFERENCES CLIENTES (NUM_CLI),
CONSTRAINT ca_empleado FOREIGN KEY (COD_VENDE) REFERENCES INFEMPLE(NUM_EMPLE));
CREATE TABLE LINPED
(PEDIDO VARCHAR2(6) NOT NULL,
FABRICA VARCHAR2(3) NOT NULL,
ARTICULO VARCHAR2(8) NOT NULL,
CANTIDAD NUMBER(6) NOT NULL,
PVP NUMBER(10,2),
CONSTRAINT ip_linped PRIMARY KEY (PEDIDO, FABRICA, ARTICULO),
CONSTRAINT ca_pedido FOREIGN KEY (PEDIDO) REFERENCES CABPED (NUM_PEDIDO),
CONSTRAINT ca_arti FOREIGN KEY (FABRICA,ARTICULO) REFERENCES ARTICULO (ID_FABRICA,COD_ARTI));
-----------------------------------------------------------------------------
Y esto es lo que tengo echo respecto al ejercicio, pero me da errores, y aun me falta la parte de modificar los campos afectados de las otras tablas...
CREATE OR REPLACE
PROCEDURE nuevopedido(codcliente in CABPED.COD_CLI%TYPE,fechped in CABPED.FECHA_PED%TYPE DEFAULT (0),codvendedor in CABPED.COD_VENDE%TYPE,fechenvio in CABPED.FECHA_ENVI%TYPE DEFAULT (0),total in CABPED.IMP_TOTAL%TYPE,paga in CABPED.PAGADO%TYPE,envio in CABPED.MODO_ENVIO%TYPE)
AS
numeropedido CABPED.NUM_PEDIDO%TYPE default(0);
VACIO1 EXCEPTION;
VACIO2 EXCEPTION;
ERRORFECH EXCEPTION;
ERRORIMPORT EXCEPTION;
ERRORpaga EXCEPTION;
BEGIN
SELECT MAX(NUM_PEDIDO) INTO numeropedido FROM CABPED;
numeropedido:= numeropedido + 1;
If codcliente is NULL then
dbms_output.put_line('Falta el codigo cliente');
raise vacio1;
end if;
if codvendedor is NULL then
dbms_output.put_line('Falta el codigo vendedor');
raise vacio2;
end if;
If FECHA_PED < fechenvio THEN
dbms_output.put_line('La fecha de envio no puede ser anterior a la de pedido');
raise ERRORFECH;
end if;
if total < 0 then
dbms_output.put_line('El importe no puede ser negativo');
raise ERRORIMPORT;
END IF;
IF paga <> 'SI' or paga = 'NO' then
dbms_output.put_line(' ');
ELSE
dbms_output.put_line('PAGADO SOLO PUEDE SER REGISTRAR DATOS SI O NO');
raise ERRORpaga;
END IF;
Insert into CABPED Values(numeropedido,codcliente,fechped,codvendedor ,fechenvio,total, paga,envio);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
dbms_output.put_line('Clave existente');
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Faltan registros');
WHEN OTHERS THEN
dbms_output.put_line('Error al introducir el registro en la base de datos');
end;
Me urge porque es para mañana.
Un saludo y muchas gracias a todos. |