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

Procedimiento Almacenado con llamado desde Trigger

Estas en el tema de Procedimiento Almacenado con llamado desde Trigger en el foro de Mysql en Foros del Web. Buenas quisiera por favor me den luz... les comento estoy desarrollando un sistema de nomina y pretendo automatizar la amortización de los prestamos de cada ...
  #1 (permalink)  
Antiguo 05/07/2011, 01:59
Avatar de SIW
SIW
 
Fecha de Ingreso: octubre-2009
Mensajes: 9
Antigüedad: 14 años, 6 meses
Puntos: 0
Procedimiento Almacenado con llamado desde Trigger

Buenas quisiera por favor me den luz... les comento estoy desarrollando un sistema de nomina y pretendo automatizar la amortización de los prestamos de cada uno de los empleados de la empresa donde trabajo. Programo en PHP Bajo MySQL. (Humildemente digo que no me siento tan novato en PHP ni MySQL, pero pues estoy aquí necesitando ayuda, la que me puedan brindar). Estoy muy agradecido por los colaboradores que han venido despejando dudas con sus conocimientos a aquellas personas que lo han necesitado, Yo hace tiempos vengo aprendiendo a través de estos foros, y a partir de hoy participo pidiendo sus conocimientos, es mi primera vez, pero espero solucionar mi problema.

Bueno les comento tengo una tabla prestamos donde capturo los siguientes campos:

Código MySQL:
Ver original
  1. Campo               Tipo              Cotejamiento      Atributos   Nulo        Predeterminado    Extra
  2. count               int(11)                             UNSIGNED    No        None              AUTO_INCREMENT                         
  3. tip_prestamo        varchar(5)      utf8_general_ci                 No        None                             
  4. cod_prestamo        varchar(25)     utf8_general_ci                 No        None                             
  5. id_usuario        int(11)                               UNSIGNED      No          None                             
  6. cod_banco           varchar(5)      utf8_general_ci                 No        None                             
  7. fecha_inicial       date                                              No          0000-00-00                               
  8. fecha_final       date                                              No        0000-00-00                               
  9. no_credito        varchar(30)       utf8_general_ci                 No        None                             
  10. plazo_meses       int(11)                               UNSIGNED      No          0                            
  11. valor_prestamo    int(11)                               UNSIGNED      No          0                            
  12. valor_cuota_bco   int(11)                               UNSIGNED      No          0                            
  13. valor_cuota_1       int(11)                             UNSIGNED      No          0                            
  14. valor_cuota_2       int(11)                             UNSIGNED      No          0                            
  15. saldo               int(11)                             UNSIGNED      Sí          0                            
  16. estado            tinyint(2)                          UNSIGNED    No          None                             
  17. observaciones       blob                                  BINARY        Sí        NULL                             
  18. usr_up            int(11)                               UNSIGNED      Sí          NULL                             
  19. fec_up            datetime                                      Sí        0000-00-00 00:00:00                              
  20. usr_reg           int(11)                               UNSIGNED      No          None                             
  21. fec_reg           timestamp                                         No                              CURRENT_TIMESTAMP

como se pueden dar cuenta la empresa paga en dos períodos quincenales.
Necesito por favor me aclaren de como debo hacer un procedimiento almacenado donde se registre el valor del pago efectuado y que este a su vez debe ir acorde con las cuotas programadas, que se generará una vez ingresado el crédito al sistema nomina para ello tengo otra tabla plan_pagos con los siguientes campos:


Código MySQL:
Ver original
  1. Campo               Tipo          Cotejamiento      Atributos   Nulo    Predeterminado  Extra
  2. count               int(11)                                     No    None            AUTO_INCREMENT                           
  3. id_usuario        int(11)                                       No    None                             
  4. tip_prestamo        varchar(5)  utf8_general_ci               No      None                             
  5. cod_prestamo        varchar(25) utf8_general_ci               No      None                             
  6. no_credito        varchar(30)   utf8_general_ci               No      None                             
  7. cons_cuota        int(11)                                       No    None                             
  8. fecha_pago        date                                        No      None                             
  9. valor_cuota       int(11)                                       No    None                             
  10. fecha1_pago_cta   date                                        No      None                             
  11. valor1_pago_cta   int(11)                                       No    None                             
  12. fecha2_pago_cta   date                                        No      None                             
  13. valor2_pago_cta   int(11)                                       No    None                             
  14. saldo_cuota       int(11)                                       No    None                             
  15. flag_pago           bit(1)                                      No    None                             
  16. fec_reg           timestamp                      on update CURRENT_TIMESTAMP    No  CURRENT_TIMESTAMP   ON UPDATE CURRENT_TIMESTAMP                        
  17. usr_reg           int(11)                                       No  None

fecha1_pago_cta // fecha de pago en la primera quincena
valor1_pago_cta // valor pagado en la primera quincena
fecha2_pago_cta // fecha de pago en la segunda quincena
valor2_pago_cta // valor pagado en la segunda quincena
saldo_cuota // este valor debería ser cero después de la segunda quincena
flag_pago // campo tipo bit con valor cero si esta pagada la cuota y valor uno si esta pendiente de pago o tiene saldo

Requiero que para pago el procedimiento almacenado buscará en la tabla plan_pagos donde el número del crédito = ncredito y flag_pago = 1 ordenado por fecha propuesta de pago.

La idea sería algo así:

// Fecha y pago de la quincena 1uno:

Si diafecha>=1 y diafecha=<15 entonces
Leerregistro
Modificar fecha1_pago_cta = fecha
Modificar valor1_pago_cta = pago
Modificar saldo_cuota = Valor de la cuota-pago
Si saldo_cuota = 0 entonces
Modificar flag_pago = 0
finsi
finsi

// Fecha y pago de la quincena dos:

Si diafecha>15 y diafecha<31 entonces
Leerregistro
Modificar fecha2_pago_cta = fecha
Modificar valor2_pago_cta = pago
Modificar saldo_cuota = Valor de la cuota-pago
Si saldo_cuota = 0 entonces
Modificar flag_pago = 0
finsi
finsi


Y esto es apenas lo que llevo del procedmiento almacenado:
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_pagos`(INOUT pagador_actual INT, INOUT numero_credito INT)
  4. DECLARE pago_actual_1 INT DEFAULT 0;
  5. DECLARE suma INT;
  6. DECLARE ultimo_dia_mes INT;
  7. DECLARE mitad_dia_mes INT;
  8. DECLARE existe BOOL;
  9. SET @ultimo := LAST_INSERT_ID();
  10. SELECT IFNULL(sum(prestamos.valor_cuota_1),0) AS total_cuotas_1,  
  11. IFNULL(sum(prestamos.valor_cuota_2),0) AS total_cuotas_2
  12. INTO suma
  13. FROM usuarios
  14. INNER JOIN prestamos
  15. ON usuarios.id_usuario = prestamos.id_usuario
  16. WHERE usuarios.estado = 1
  17. AND usuarios.per_nomina = 'S';
  18. SET pago_actual_1 = pago_actual_1 + (suma);
  19.  
  20. SELECT COUNT(0) = 0 INTO existe FROM prestamos
  21. WHERE usuarios.no_credito = numero_credito AND usuarios.id_usuario = pagador_actual;
  22.  
  23. IF existe THEN
  24.  
  25. UPDATE plan_pagos SET saldo_cuota = saldo_cuota + pago_actual_1
  26. WHERE usuarios.no_credito = numero_credito AND usuarios.id_usuario = pagador_actual;
  27. INSERT INTO plan_pagos (no_credito, plan_pagos.id_usuario, saldo_cuota) VALUES (plan_pagos.numero_credito, pagador_actual, valor1_pago_cta);


Sé que me falta para que me cálcule las fechas fecha1_pago_cta y fecha2_pago_cta y además terminarlo y es aquí donde les pido los conocimientos necesarios para ayudarmen con esta rutina,
La verdad es que siento que me estoy complicando la vida, pero quisiera realizar poder realizar esto con ayuda de ustedes utilizando un solo procedimiento almacenado con llamado desde un trigger que podría ser algo así:

Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP TRIGGER `nomina`.`trigger_pagos`$$
  3. CREATE TRIGGER `nomina`.`trigger_pagos` AFTER INSERT on `nomina`.`prestamos`
  4. CALL sp_pagos(pagador_actual, numero_credito);
  5. END$$
  6. DELIMITER ;

Esto es todo, de una manera atenta espero ayuda de ustedes.
Prometo participar en lo que esté a mi alcance. Gracias desde ya señores.
  #2 (permalink)  
Antiguo 05/07/2011, 05:10
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, 5 meses
Puntos: 2658
Respuesta: Procedimiento Almacenado con llamado desde Trigger

Veo problemático que puedas hacer lo que deseas, porque hay algunas restricciones en los TRIGGERs, entre las cuales está usar un stored proedure.
Según el manual de referencia (MySQL 5.0 Reference Manual :: 20 Disparadores (triggers) :: 20.3 Utilización de disparadores):
Cita:
El disparador no puede invocar procedimientos almacenados utilizando la sentencia CALL. (Esto significa, por ejemplo, que no se puede utilizar un procedimiento almacenado para eludir la prohibición de referirse a tablas por su nombre).
Por lo demás, el TRIGGER tiene un errror de sintaxis y es que en el contexto del mismo, pagador_actual y numero_credito no existen, ya que no se puede referir a un campo entrante o previo por su nombre sin usar las pseudovariables NEW (UPDATE e INSERT) u OLD (sólo UPDATE).
Hay algunos detalles más, pero de todos modos con eso alcanza.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 05/07/2011 a las 05:16
  #3 (permalink)  
Antiguo 05/07/2011, 09:47
Avatar de SIW
SIW
 
Fecha de Ingreso: octubre-2009
Mensajes: 9
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Procedimiento Almacenado con llamado desde Trigger

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Veo problemático que puedas hacer lo que deseas, porque hay algunas restricciones en los TRIGGERs, entre las cuales está usar un stored proedure.
Según el manual de referencia ([URL="http://dev.mysql.com/doc/refman/5.0/es/using-triggers.html"]MySQL 5.0 Reference Manual :: 20 Disparadores (triggers) :: 20.3 Utilización de disparadores[/URL]):
Por lo demás, el TRIGGER tiene un errror de sintaxis y es que en el contexto del mismo, pagador_actual y numero_credito no existen, ya que no se puede referir a un campo entrante o previo por su nombre sin usar las pseudovariables NEW (UPDATE e INSERT) u OLD (sólo UPDATE).
Hay algunos detalles más, pero de todos modos con eso alcanza.
Gracias, por atender mi problema, solo necesito desarrollar la rutina del procedimiento almacenado, y en cuanto al utilizar INOUT utilizare IN en el store procedure.

Por favor creo que debe haber una forma de hacerlo como lo requiero, no es necedad solo quiero desarrollar esta parte ya sea con funciones, store procedures, triggers en vez de crear varios UPDATE de tabla prestamos a la tabla plan_pagos.

debe haber algun modo.....

gracias

Última edición por SIW; 05/07/2011 a las 10:09
  #4 (permalink)  
Antiguo 05/07/2011, 10:17
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, 5 meses
Puntos: 2658
Respuesta: Procedimiento Almacenado con llamado desde Trigger

¿Has entendido que la restricción no es opcional?
MySQL no permite usar llamadas a procedimientos almacenados desde un TRIGGER. No puedes. No hay modo, porque si lo intentas tendrás un error de sintaxis.
Esa restricción no es de lógica, sino de programación; está puesta en el código mismo de MySQL...

Ahora bien, yendo al núcleo de tu problema, tengo la impresión de que el modelo de datos es lo que realmente te está causando problemas, porque estás usando un diseño sin normalización, lo que te lleva a generar procesos innecesariamente complicados.
Mi pregunta: ¿El diseño de la base es tuyo o te lo han impuesto?.
En caso de ser tuyo, y fuera modificable, sería muy posible hacer un SP que maneje la cosa de un modo más simple...
__________________
¿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 05/07/2011, 10:22
Avatar de SIW
SIW
 
Fecha de Ingreso: octubre-2009
Mensajes: 9
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Procedimiento Almacenado con llamado desde Trigger

pues el llamado al store procedure desde trigger pues lo haria claro esta con php.

y en cuanto a lo otro todo el desarrollo de la nomina lo he desarrollado solo y todo hasta ahora

espero agradecidamente el modo mas simple del SP, gracias gnzsoloyo.

necesito la ayuda de todos, los que quieran colaborarmen con este post.

Última edición por SIW; 05/07/2011 a las 14:00 Razón: solucionar definitivamente este asunto
  #6 (permalink)  
Antiguo 05/07/2011, 15:22
Avatar de SIW
SIW
 
Fecha de Ingreso: octubre-2009
Mensajes: 9
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Procedimiento Almacenado con llamado desde Trigger

Cita:
Iniciado por SIW Ver Mensaje
pues el llamado al store procedure desde trigger pues lo haria claro esta con php.

y en cuanto a lo otro todo el desarrollo de la nomina lo he desarrollado solo y todo hasta ahora

espero agradecidamente el modo mas simple del SP, gracias gnzsoloyo.

Por favor ayudenmen.....
  #7 (permalink)  
Antiguo 05/07/2011, 18:26
Avatar de SIW
SIW
 
Fecha de Ingreso: octubre-2009
Mensajes: 9
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Procedimiento Almacenado con llamado desde Trigger

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Has entendido que la restricción no es opcional?
MySQL no permite usar llamadas a procedimientos almacenados desde un TRIGGER. No puedes. No hay modo, porque si lo intentas tendrás un error de sintaxis.
Esa restricción no es de lógica, sino de programación; está puesta en el código mismo de MySQL...

Ahora bien, yendo al núcleo de tu problema, tengo la impresión de que el modelo de datos es lo que realmente te está causando problemas, porque estás usando un diseño sin normalización, lo que te lleva a generar procesos innecesariamente complicados.
Mi pregunta: ¿El diseño de la base es tuyo o te lo han impuesto?.
En caso de ser tuyo, y fuera modificable, sería muy posible hacer un SP que maneje la cosa de un modo más simple...
amigo la base de datos esta normalizada y si me puede ayudar le agradezco
  #8 (permalink)  
Antiguo 07/07/2011, 15:53
Avatar de SIW
SIW
 
Fecha de Ingreso: octubre-2009
Mensajes: 9
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Procedimiento Almacenado con llamado desde Trigger

--------------------

Última edición por SIW; 08/07/2011 a las 14:26
  #9 (permalink)  
Antiguo 10/07/2011, 17:59
Avatar de SIW
SIW
 
Fecha de Ingreso: octubre-2009
Mensajes: 9
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Procedimiento Almacenado con llamado desde Trigger

Gracias de todos modos, pense que iba a recibir ayuda de ustedes....

Etiquetas: trigger
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 01:58.