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

Compo Finalizo este stored procedure con CASE Y WHEN???

Estas en el tema de Compo Finalizo este stored procedure con CASE Y WHEN??? en el foro de Mysql en Foros del Web. hola amigos les cuento, tengo este procedimiento almacenado con clausulas CASE y WHEN, lo termine de hacer pero no se como finalizarlo, ya q en ...
  #1 (permalink)  
Antiguo 03/09/2012, 13:03
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Compo Finalizo este stored procedure con CASE Y WHEN???

hola amigos les cuento, tengo este procedimiento almacenado con clausulas CASE y WHEN, lo termine de hacer pero no se como finalizarlo, ya q en el END $$ me manda error de sintaxis y no me deja finalizarlo correctamente para ya comenzar a utilizarlo en mi BD, el soted procedure en cuestion es :

Código:
DELIMITER $$
DROP PROCEDURE IF EXISTS descontar_feriados $$
CREATE PROCEDURE descontar_feriados (funCodigo VARCHAR (11), diasPedidos INT) 

begin


declare feriado1, feriado2, resultado_fer1, resultado_fer2, resultado_intermedio INT;
set feriado1=0;

SELECT fer_1, fer_2 INTO feriado1, feriado2 FROM datos WHERE Fun_Codigo = funCodigo;

	#feriado1 mayor q dias pedidos

	CASE 1 WHEN feriado1>diasPedidos THEN 

		SET resultado_fer1= feriado1 - diasPedidos;
	
		UPDATE datos SET fer_1 = resultado_fer1 WHERE Fun_Codigo= funCodigo;



			#feriado1 igual q dias pedidos
			CASE 2 WHEN feriado1 = diasPedidos THEN

			SET resultado_fer1= feriado1 - diasPedidos;
	
		UPDATE datos SET fer_1 = resultado_fer1 WHERE Fun_Codigo= funCodigo;


			#feriado1 menor q dias pedidos
			CASE 3 WHEN feriado1<diasPedidos THEN 

			SET resultado_fer1 = diasPedidos- feriado1 ;

			SET resultado_intermedio = feriado2 - resultado_fer1;

			UPDATE datos SET fer_ = 0 WHERE Fun_Codigo= funCodigo;

			UPDATE datos SET fer_2 = resultado_intermedio WHERE Fun_Codigo= funCodigo;



				#feriado2 mayor q dias pedidos
				CASE 4 WHEN feriado1 = 0 and feriado2> diasPedidos THEN

				SET resultado_fer2 = feriado2 - diasPedidos;

				UPDATE datos SET fer_2 = resultado_fer2 WHERE Fun_Codigo= funCodigo;

				
					#feriado2 igual q dias pedidos
					CASE 5 WHEN feriado2 = diasPedidos THEN 
		
					SET resultado_fer2 = feriado2 - diasPedidos;

					UPDATE datos SET fer_2 = resultado_fer2 WHERE Fun_Codigo= funCodigo;

					CASE 6 WHEN feriado1<=0 and feriado2 <= 0 then

					UPDATE datos SET fer_1 = 0, fer_2 = 0 WHERE Fun_Codigo= funCodigo;

END case;


END $$
como debo finalizar el stored procedure para q me funcione bien?? el delimitador q estoy usando es $$, atento a sus contestaciones y de antemano muchas gracias.... bye
  #2 (permalink)  
Antiguo 03/09/2012, 13:08
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Compo Finalizo este stored procedure con CASE Y WHEN???

Dependiendo de con cuál interfase lo estés creando, el fin de sentencia indicado en el DELIMITER va en el END del BEGIN, por lo que está bien.
¿Qué problema te causa?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 03/09/2012, 13:15
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Compo Finalizo este stored procedure con CASE Y WHEN???

me da syntax error en el end del begin este es el error q me da y el end del begin me aparece subrayado con rojo ... el que me da textual es:

syntax error, unexpected END_OF_INPUT, expecting CASE_SYM,

en q estoy fallando??? q tengo de mal en la sintaxis?? juro q he revisado todo y no encuentro el pq del error porfavor si puedenm guiarme lo agradeceria mucho.... antento a sus contestaciones de antemanao gracias... bye
  #4 (permalink)  
Antiguo 03/09/2012, 14:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Compo Finalizo este stored procedure con CASE Y WHEN???

El mensaje da toda la impresión de tener que ver con la interfaz que estás usando para cargarlo, de la que te pregunté y no me has contestado...

¿Qué front-end estás usando para cargar este SP?
¿Navicat, phpMyadmin, Workbench? ¿Cuál?

Por otro lado, es posible que faltase la condición ELSE del CASE. El hecho de que no la consideres, no implica que el parser ignore que debe ir...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 03/09/2012, 14:37
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Compo Finalizo este stored procedure con CASE Y WHEN???

gnzsoloyo, estoy con workbench y le puse el else como me comentaste pero me sigue dando el mismo problema... q puede ser???
  #6 (permalink)  
Antiguo 03/09/2012, 14:51
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Compo Finalizo este stored procedure con CASE Y WHEN???

decidi hacerlo con else if pero ahora tengo otro problema, cuando el segundo periodo de vacaciones el campo fer_2 es cero y le sigo restando me muestra numeros negativos posteo mi nuevo procedimiento q lo cambie de case a elseif lo posteo een este mismo hilo o en un hilo nuevo?? gracias de antemano atento a las contestaciones... bye
  #7 (permalink)  
Antiguo 03/09/2012, 19:43
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Compo Finalizo este stored procedure con CASE Y WHEN???

Finalmente cuando llegué a casa pude revisar con más tranquilidad el problema y el tema es que estás confundiendo la sintaxis de CASE en MySQL con alguna otra:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS descontar_feriados $$
  3. CREATE PROCEDURE descontar_feriados (funCodigo VARCHAR (11), diasPedidos INT)
  4.  
  5.  
  6.     DECLARE feriado1, feriado2, resultado_fer1, resultado_fer2, resultado_intermedio INT;
  7.     SET feriado1=0;
  8.  
  9.     SELECT fer_1, fer_2 INTO feriado1, feriado2 FROM datos WHERE Fun_Codigo = funCodigo;
  10.     CASE
  11.         #feriado1 mayor q dias pedidos
  12.         WHEN feriado1>diasPedidos THEN
  13.             SET resultado_fer1= feriado1 - diasPedidos;
  14.             UPDATE datos SET fer_1 = resultado_fer1 WHERE Fun_Codigo= funCodigo;
  15.         #feriado1 igual q dias pedidos
  16.         WHEN feriado1 = diasPedidos THEN
  17.             SET resultado_fer1= feriado1 - diasPedidos;
  18.             UPDATE datos SET fer_1 = resultado_fer1 WHERE Fun_Codigo= funCodigo;
  19.         #feriado1 menor q dias pedidos
  20.         WHEN feriado1<diasPedidos THEN
  21.             SET resultado_fer1 = diasPedidos- feriado1 ;
  22.             SET resultado_intermedio = feriado2 - resultado_fer1;
  23.             UPDATE datos SET fer_ = 0 WHERE Fun_Codigo= funCodigo;
  24.             UPDATE datos SET fer_2 = resultado_intermedio WHERE Fun_Codigo= funCodigo;
  25.         #feriado2 mayor q dias pedidos
  26.         WHEN feriado1 = 0 and feriado2> diasPedidos THEN
  27.             SET resultado_fer2 = feriado2 - diasPedidos;
  28.             UPDATE datos SET fer_2 = resultado_fer2 WHERE Fun_Codigo= funCodigo;
  29.         #feriado2 igual q dias pedidos
  30.         WHEN feriado2 = diasPedidos THEN
  31.             SET resultado_fer2 = feriado2 - diasPedidos;
  32.             UPDATE datos SET fer_2 = resultado_fer2 WHERE Fun_Codigo= funCodigo;
  33.         WHEN feriado1<=0 and feriado2 <= 0 then
  34.             UPDATE datos SET fer_1 = 0, fer_2 = 0 WHERE Fun_Codigo= funCodigo;
  35.     END CASE;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 04/09/2012, 05:54
 
Fecha de Ingreso: diciembre-2007
Mensajes: 385
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Compo Finalizo este stored procedure con CASE Y WHEN???

Muchas gracias estimado gnzsoloyo lo implemente y en cuanto a la sintaxis funciona bien, pero sabes aprovecho de hacerte una consulta, ya q te explico mi procedure hace lo siguiente:

lo q haces es ir descontando los dias de feriados pedidos por el usuario, pasa q el usuario/trabajador puede acumular vacaciones de los dos ultimos años (el anterior y el presente) si el trabajador tiene feriados pendiente del año pasado entonces los dias de feriados q pida se les descontaran de los dias disponibles de feriado del año anterior, si los dias de feriados pedidos son mayor a la cantidad de dias q dispone del año anterior entonces los feriados del año anterior quedan en cero y se le descuentan los años q tenga disponible de feriado del año en curso, la cosa es q logro hacer estos descuentos (restar feriados del año anterior hasta q queden en cero seguir descontando los dias feriados del año presente), pero mi problema se presenta ahi, cuando el feriado del año presente queda en cero si sigo pidiendo feriados el feriado del año presente si esta en cero y le sigo pidiendo va dandome numeros negativos, este es mi problema, porfavor te pegare el codigo de mi procedure q hace esto

Código PHP:
    DELIMITER $$
    
DROP PROCEDURE IF EXISTS descontar_feriados $$
    
CREATE PROCEDURE descontar_feriados (funCodigo VARCHAR (11), diasPedidos INT)
     
    
BEGIN
     
        
DECLARE feriado1feriado2resultado_fer1resultado_fer2resultado_intermedio INT;
        
SET feriado1=0;
     
        
SELECT fer_1fer_2 INTO feriado1feriado2 FROM datos WHERE Fun_Codigo funCodigo;
        CASE
            
#feriado1 mayor q dias pedidos
            
WHEN feriado1>diasPedidos THEN
                SET resultado_fer1
feriado1 diasPedidos;
                
UPDATE datos SET fer_1 resultado_fer1 WHERE Fun_CodigofunCodigo;
            
#feriado1 igual q dias pedidos
            
WHEN feriado1 diasPedidos THEN
                SET resultado_fer1
feriado1 diasPedidos;
                
UPDATE datos SET fer_1 resultado_fer1 WHERE Fun_CodigofunCodigo;
            
#feriado1 menor q dias pedidos
            
WHEN feriado1<diasPedidos THEN
                SET resultado_fer1 
diasPedidosferiado1 ;
                
SET resultado_intermedio feriado2 resultado_fer1;
                
UPDATE datos SET fer_1 0 WHERE Fun_CodigofunCodigo;
                
UPDATE datos SET fer_2 resultado_intermedio WHERE Fun_CodigofunCodigo;
            
#feriado2 mayor q dias pedidos
            
WHEN feriado1 AND feriado2diasPedidos THEN
                SET resultado_fer2 
feriado2 diasPedidos;
                
UPDATE datos SET fer_2 resultado_fer2 WHERE Fun_CodigofunCodigo;
            
#feriado2 igual q dias pedidos
            
WHEN feriado2 diasPedidos THEN
                SET resultado_fer2 
feriado2 diasPedidos;
                
UPDATE datos SET fer_2 resultado_fer2 WHERE Fun_CodigofunCodigo;
            
            
#Esta es la parte del when q no me esta tomando...
            
WHEN resultado_fer2 0 THEN
                UPDATE datos SET fer_2 
0 WHERE Fun_CodigofunCodigo;
        
END CASE;
    
END 
donde mi tabla tiene esta estructura (dondde fer_1 son los dias disponibles de feriado del año anterior y fer_2 del presente año)

cod_trabajador| fer_1 | fer_2

desde ya muy agradecido, quedo atento a las contestaciones slds!!

Etiquetas: case, procedure, select, stored
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 17:08.