[CODE][HIGHLIGHT="MySQL"]HOla a todos tengo un sp en donde hago una serie de consultas, operaciones, update e insert a varias tablas a la vez, el asunto es el siguiente que en el siguiente sp que les mostraré tenía un problema incialmente de un error 1329 cuando le agregue la cláusula para corregirlo del "handler 1329" me dejo solucionó lo del fetch vacío pero ahora me salió el problema del error 1452 que dice que no puedo ni agregar ni actualizar una fila hija, cosa que no es cierta porque siempre lo termina haciendo en la tabla respectiva "control_situalab"
Lo que no comprendo porque me da ese error de violación de llave ya que el error literalmente que me tira es este:
------------------------------------------------------------------------------------------------------
Query: CALL aplicar_incapacidad_medica(@fec1,@fec2,2,31,@aplic a)
Error Code: 1452
Cannot add or update a child row: a foreign key constraint fails (`saerp`.`control_situalab`, CONSTRAINT `FK_controlSituaLab_empleados` FOREIGN KEY (`idempleado`) REFERENCES `empleados` (`idempleado`))
----------------------------------------------------------------------------------------------------
Me dice eso pero al revisar la tabla si hizo el insert que lleva el sp.
El codigo de mi sp es este:
Código MySQL:
Ver original
#Obtenemos porcentaje de incapacidad y dias maximos de incapacidad con responsabilidad patronal
SELECT porc_pago_incap
, dias_max_pago_incap
, modalidad_planilla
INTO porc_tblconfig
, dias_tblconfig
, modpln_tblconfig
#Obtenemos planilla de sueldos activa
#Abrimos Result set
OPEN rg_accpers;
#Leemos e iteramos la colección abierta
leer_bucle:LOOP
#Revisamos si hay filas que recorrer, sino lo hay salimos del bucle
#Da el pase para salir del flujo del Result Set una vez finalizada sus iteraciones o simplemente el cursor venia vacío
LEAVE leer_bucle;
#Este IF funciona con LOOP ... END ó REPEAT ... END REPEAT
#Controlamos el recorrido del flujo para ver si nos salimos
#Extraemos valores del Result set
FETCH rg_accpers
INTO idemp
, porc
, dura
, pago_incap_maxdias
, codsolic
, rgcont
, fecha_in
, fecha_fn
, dura_cub
;
#Este módulo de cálculos solo aplica para planillas mensuales
#Modalidad de pago de la planilla
#Màximo de dias a pagar por incapacidad. Incapacidades solo se pagaran en el corte de planilla de fin de mes
#Sueldo siempre se dividirá entre 30 días no importando la modalidad de la planilla
#Ningun dia de incapacidad pagado
SET dura_cub_real
= dura_cub
; #Se decide si la empresa pagará la incapacidad
IF dura_real
> dias_tblconfig
THEN #Incapacidad 25% IF porc
> 0 THEN #La empresa le pagará la incapacidad IF dura_real
> vp_dias_maxpag
THEN SET vp_dias_res
= dura
- vp_dias_maxpag
; SET vp_dias_pag
= dura
- vp_dias_res
; SET dura
= vp_dias_pag
; #Dias a pagar en planilla SET dura_cub
= vp_dias_pag
; #Dias cubiertos del total de dias de incapacidad ELSE #La empresa no le pagará la incapacidad ELSE #Incapacidad 3 dias max IF pago_incap_maxdias
THEN #La empresa le pagara la incapacidad IF dura_real
> vp_dias_maxpag
THEN SET vp_dias_res
= dura
- vp_dias_maxpag
; SET vp_dias_pag
= dura
- vp_dias_res
; SET dura
= vp_dias_pag
; #Dias a pagar en planilla SET dura_cub
= vp_dias_pag
; #Dias cubiertos del total de dias de incapacidad ELSE #La empresa no le pagara la incapacidad
#No se han pagado todos los dias de incapacidad, hay pendientes
IF dura_cub_real
> 0 AND dura_real
!= dura_cub_real
AND !vp_calcIncap
THEN SET vp_dias_res
= dura
- dura_cub
; IF vp_dias_res
> vp_dias_maxpag
THEN SET vp_dias_res
= dura
- vp_dias_maxpag
; SET vp_dias_pag
= dura
- vp_dias_res
; SET dura
= vp_dias_pag
; #Dias a pagar en planilla SET dura_cub
= vp_dias_pag
; #Dias cubiertos del total de dias de incapacidad SET dura_cub
= vp_dias_res
;
#Obtenemos cálculos respectivos a la incapacidad
IF dura_real
> dias_tblconfig
THEN #Incapacidad de 25% IF porc
> 0 THEN #Empresa decidió pagar el 25% correspondiente a los dias de incapacidad SET monto_incap
= dura
* ( (sueldo
* factor_sueldo
) / dias_lab
); SET pago_incap
= monto_incap
* (porc
/ 100); ELSE #Empresa decidió no pagarlos ELSE #Incapacidad de 3 dias max IF pago_incap_maxdias
THEN #Pagará inncapacidad SET monto_incap
= dura
* ( (sueldo
* factor_sueldo
) / dias_lab
); SET pago_incap
= monto_incap
; ELSE #No pagará incapacidad
#Actualizamos el detalle de la planilla en tabla deta_planilla_docus
INSERT INTO deta_planilla_docus
(codplnsuel
, codaccpers
, idempleado
, tipo_doc
) VALUES (plnsuel
, codsolic
, idemp
, 'PLNSUEL'); #Obtenemos algunos datos
SET incmed_dias_detaplnsuel
= (SELECT duracion
FROM deta_planilla_docus
WHERE numero
= id_deta_pln_docus
AND codplnsuel
= plnsuel
AND codaccpers
= codsolic
AND idempleado
= idemp
); SET incmed_monto_detaplnsuel
= (SELECT monto
FROM deta_planilla_docus
WHERE numero
= id_deta_pln_docus
AND codplnsuel
= plnsuel
AND codaccpers
= codsolic
AND idempleado
= idemp
); #Actualizamos los dias incapacitados en tabla deta_plnsueldos. Si aplica
duracion
= IF(dura
> 0, incmed_dias_detaplnsuel
+ dura_cub
, 0), monto
= IF(pago_incap
> 0, incmed_monto_detaplnsuel
+ pago_incap
, 0) WHERE numero
= id_deta_pln_docus
AND codplnsuel
= plnsuel
AND codaccpers
= codsolic
AND idempleado
= idemp
;
#Actualizamos los dias incapacitados cubiertos en tabla accpers_deta. Si aplica
duracion_cub = dura_cub_real + dura_cub
WHERE idempleado
= idemp
AND codaccpers
= codsolic
;
#Hacemos bitácora de la situación laboral del empleado
INSERT INTO control_situalab
(idempleado
, fecha1
, fecha2
, codsitualab
, codplnsuel
, tipodoc
) VALUES (idemp
, fecha_in
, fecha_fn
, 3, plnsuel
, 'PLNSUEL');
#Dias de incapacidad pagados en su totalidad o simplemente accpers aplicada porque empresa no quiso pagar incapacidad
IF (dura_real
= (dura_cub_real
+ dura_cub
) && pago_incap
>0) THEN ELSEIF
(!pago_incap_maxdias
&& pago_incap
=0) THEN ELSEIF
(porc
> 0 && pago_incap
=0) THEN
#Contamos las iteraciones
SET contador
= contador
+ 1; #Tamaño del Result set coincide con las iteraciones hechas
#Si el Result set filtrado es igual a la cantidad de UPDATE hechas
SET aplicada
= contador
; #1; #Indicar al usuario que se efectuo la operación correctamente #SET @aplicada_INCMED = 1;
#Cerramos la colección Result set
CLOSE rg_accpers;
#Inicializamos el controlador utilizado
#No encontró registros
#Indicar al usuario que no se llevo a cabo la operacion porque no arrojo nada la consulta
SET aplicada
= 0; #Parametro de salida para SP local