Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Me he quedado bloqueado

Estas en el tema de Me he quedado bloqueado en el foro de Oracle en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 13/06/2012, 19:20
 
Fecha de Ingreso: junio-2012
Mensajes: 3
Antigüedad: 12 años, 5 meses
Puntos: 0
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.
  #2 (permalink)  
Antiguo 14/06/2012, 05:58
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 5 meses
Puntos: 43
Respuesta: Me he quedado bloqueado

Y en blanco seguiras.

Aquí no se resuelven ejercicios ni se hace el trabajo de nadie. Expón tus dudas y trataremos de orientarte, pero nada de resolver tus ejercicios.

Si sigues por este camino, no te auguro mucho futuro en esta bendita profesión.
  #3 (permalink)  
Antiguo 14/06/2012, 06:21
 
Fecha de Ingreso: junio-2012
Mensajes: 3
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Me he quedado bloqueado

No buscaba la solución, pero bueno


set serveroutput on;
CREATE OR REPLACE
PROCEDURE nuevopedido(codcliente in CABPED.COD_CLI%TYPE,
fechped in CABPED.FECHA_PED%TYPE DEFAULT sysdate,
codvendedor in CABPED.COD_VENDE%TYPE,
fechenvio in CABPED.FECHA_ENVI%TYPE,
total in CABPED.IMP_TOTAL%TYPE DEFAULT 0,
paga in CABPED.PAGADO%TYPE DEFAULT 'NO',
envio in CABPED.MODO_ENVIO%TYPE DEFAULT 'RENFE')

AS

numeropedido CABPED.NUM_PEDIDO%TYPE default(0);
numfechaenvio cabped.fecha_envi%type;

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
raise vacio1;
end if;

if fechenvio is NULL then
numfechaenvio:= (fechped + 7);
else
numfechaenvio:= fechenvio;
end if;


if codvendedor is NULL then
raise vacio2;
end if;

If fechped < fechenvio THEN
raise ERRORFECH;
end if;

if total < 0 then
raise ERRORIMPORT;
END IF;

IF paga != 'SI' or paga != 'NO'then
raise ERRORpaga;
END IF;



Insert into CABPED Values(numeropedido,codcliente,fechped,codvendedor ,numfechaenvio,total,

paga,envio);

UPDATE infemple SET VENTAS_ACU = VENTAS_ACU + total
WHERE Num_emple = codvendedor;

UPDATE sucursal SET VENTAS_ACU = VENTAS_ACU + total
WHERE num_suc in (select infemple.sucursal from infemple where num_emple = codvendedor);

EXCEPTION

WHEN VACIO1 THEN
dbms_output.put_line('Falta el codigo cliente');

WHEN VACIO2 THEN
dbms_output.put_line('Falta el codigo vendedor');

WHEN ERRORFECH THEN
dbms_output.put_line('La fecha de envio no puede ser anterior a la de pedido');

WHEN ERRORIMPORT THEN
dbms_output.put_line('El importe no puede ser negativo');

WHEN ERRORpaga THEN
dbms_output.put_line('PAGADO SOLO PUEDE SER REGISTRAR DATOS SI O NO');

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;


Ya he arreglado el asunto, el problema es que me peta cuando llamo al proceso.

ejemplo:

execute nuevopedido(2101,15/06/12, 105,16/06/12, 500, 'SI', 'RENFE')


EGIN nuevopedido(2101,15/06/12, 105,16/06/12, 500, 'SI', 'RENFE'); END;

*

ERROR en línea 1:
ORA-06550: línea 1, columna 7:
PLS-00306: número o tipos de argumentos erróneos al llamar a 'NUEVOPEDIDO'
ORA-06550: línea 1, columna 7:
PLS-00306: número o tipos de argumentos erróneos al llamar a 'NUEVOPEDIDO'
ORA-06550: línea 1, columna 7:
PL/SQL: Statement ignored


He estado mirando lo de la columna 7, pero me parece correcto
  #4 (permalink)  
Antiguo 14/06/2012, 08:49
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Me he quedado bloqueado

Cuando llamas el procedure, estas llamando mal las fechas.
A demas es recomendable utilizar la función to_date, ya que la configuración de la BD puede volverse loca con lo primero que lea y no conservar consistencia en los datos que envías.

Código SQL:
Ver original
  1. EXECUTE nuevopedido(2101,to_date('15/06/12','DD/MM/YYYY'), 105,to_date('16/06/12','DD/MM/YYYY'), 500, 'SI', 'RENFE')

Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 14/06/2012, 08:52
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Me he quedado bloqueado

Código SQL:
Ver original
  1. envio IN CABPED.MODO_ENVIO%TYPE DEFAULT 'RENFE'
¿Y qué tipo de dato es MODO_ENVIO en la tabla CABPED?
¿Qué es lo que le estás pasando al ejecutarlo?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 14/06/2012, 15:20
 
Fecha de Ingreso: junio-2012
Mensajes: 3
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Me he quedado bloqueado

Gracias chicos! ya encontré el fallo llamando al procedimiento los datos tipo fecha no los metía entre ' ' por lo que no los pillaba bien, vaya fallo mas tonto xD

gracias
  #7 (permalink)  
Antiguo 14/06/2012, 15:36
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Me he quedado bloqueado

Mira mi post anterior y ten en cuenta la función to_date.

Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Etiquetas: bloqueado, select, tabla, formulario, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:10.