Ver Mensaje Individual
  #10 (permalink)  
Antiguo 29/06/2015, 14:21
Avatar de JeMaGa
JeMaGa
 
Fecha de Ingreso: julio-2011
Ubicación: Bogota
Mensajes: 430
Antigüedad: 13 años, 4 meses
Puntos: 4
procedimiento almacenado con loop

EL PROCEDIMIENTO QUE TENGO HASTA AHORA ES ASI

Código MySQL:
Ver original
  1. DROP PROCEDURE IF EXISTS " . $nombreProc . ";
  2. CREATE DEFINER=`root`@`localhost` PROCEDURE `" . $nombreProc . "`() DETERMINISTIC NO SQL SQL SECURITY DEFINER
  3. DECLARE v_tercero VARCHAR (20);
  4. DECLARE puc_cuenta VARCHAR(20);
  5. DECLARE puc_terceros INT DEFAULT 0;
  6. DECLARE puc_movimiento INT DEFAULT 0;
  7. DECLARE puc_mayor VARCHAR(20);
  8. DECLARE puc_centro_costo INT DEFAULT 0;
  9. DECLARE v_id_cabecera INT DEFAULT 0;
  10. DECLARE v_id_saldo INT DEFAULT 0;
  11. DECLARE v_codigo_cuenta VARCHAR(20);
  12. DECLARE v_sucursal VARCHAR(4);
  13. DECLARE v_debito DOUBLE(15,2);
  14. DECLARE v_credito DOUBLE(15,2);
  15. DECLARE v_centro_costo VARCHAR(6);
  16. DECLARE padre_centro_costo VARCHAR(6);
  17. DECLARE tmp_continuar INT DEFAULT 0;
  18. DECLARE detalle_cur CURSOR FOR SELECT detalle.id_cabecera, detalle.codigo_cuenta, detalle.sucursal, detalle.debito, detalle.credito, detalle.tercero, detalle.centrocosto FROM " . $tablaMes . " as detalle HAVING detalle.id_cabecera = " . $idComprobante . ";
  19. DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET continuar = false;
  20. OPEN detalle_cur;
  21.     FETCH  detalle_cur INTO v_id_cabecera, v_codigo_cuenta, v_sucursal, v_debito, v_credito, v_tercero, v_centro_costo;
  22.     SET tmp_continuar = continuar;
  23.     SELECT v_codigo_cuenta, v_sucursal, v_debito, v_credito, v_tercero, v_centro_costo;
  24.    
  25.     IF v_codigo_cuenta IS NOT NULL THEN
  26.         loop_interno: LOOP
  27.            SELECT codigo,movimiento,terceros,mayor,centrocosto FROM puc WHERE codigo = v_codigo_cuenta
  28.            INTO puc_cuenta, puc_movimiento, puc_terceros, puc_mayor, puc_centro_costo;
  29.            SELECT puc_cuenta, puc_movimiento, puc_terceros, puc_mayor, puc_centro_costo;
  30.               IF puc_movimiento=1 THEN
  31.                     IF puc_terceros=1 THEN
  32.                         SET v_id_saldo=0;
  33.                         SELECT id FROM ".$tablaSaldos." WHERE cuenta = v_codigo_cuenta and tercero = v_tercero and sucursal = v_sucursal INTO v_id_saldo;
  34.                         IF  v_id_saldo = 0 THEN
  35.                             INSERT INTO ".$tablaSaldos." (cuenta,tercero,sucursal,".$campoDebito.",".$campoCredito.") VALUES(`v_codigo_cuenta`,`v_tercero`,`v_sucursal`,v_debito,v_credito);
  36.                         ELSE
  37.                             UPDATE ".$tablaSaldos." SET ".$campoDebito." = ".$campoDebito.$signo." v_debito, ".$campoCredito." = ".$campoCredito.$signo." v_credito WHERE id = v_id_saldo;
  38.                         END IF;
  39.                     END IF;
  40.               END IF;
  41.                 IF puc_centro_costo = 1 THEN
  42.                     loop_centro: LOOP
  43.                        
  44.                        SELECT id_padre FROM centros_costo WHERE id_centro_costo = v_centro_costo INTO padre_centro_costo;
  45.                        SELECT padre_centro_costo;
  46.  
  47.                         SET v_id_saldo=0;
  48.                         SELECT id FROM ".$tablaSaldos." WHERE cuenta = v_codigo_cuenta and tercero = v_tercero and sucursal = v_sucursal INTO v_id_saldo;
  49.                         IF  v_id_saldo = 0 THEN
  50.                             INSERT INTO " . $tablaSaldos . " (cuenta,tercero,sucursal,centroCosto," . $campoDebito . "," . $campoCredito . ") VALUES(`v_codigo_cuenta`,`v_tercero`,`v_sucursal`, `v_centro_costo`,v_debito,v_credito);
  51.                         ELSE
  52.                             UPDATE " . $tablaSaldos . " SET " . $campoDebito . " = " . $campoDebito . $signo . " v_debito, " . $campoCredito . " = " . $campoCredito . $signo . " v_credito WHERE id = v_id_saldo;
  53.                         END IF;  
  54.                        
  55.                        SET v_centro_costo = padre_centro_costo;
  56.                        IF  v_centro_costo IS NULL THEN        
  57.                           LEAVE loop_centro;    
  58.                        END IF;
  59.                        
  60.                     END LOOP loop_centro;
  61.                 END IF;
  62.                            
  63.                 SET v_id_saldo=0;
  64.                 SELECT id FROM ".$tablaSaldos." WHERE cuenta = v_codigo_cuenta and tercero = v_tercero and sucursal = v_sucursal INTO v_id_saldo;
  65.                 IF  v_id_saldo = 0 THEN
  66.                     INSERT INTO " . $tablaSaldos . " (cuenta,tercero,sucursal,centroCosto," . $campoDebito . "," . $campoCredito . ") VALUES(`v_codigo_cuenta`,`v_tercero`,`v_sucursal`, `v_centro_costo`,v_debito,v_credito);
  67.                 ELSE
  68.                     UPDATE " . $tablaSaldos . " SET " . $campoDebito . " = " . $campoDebito . $signo . " v_debito, " . $campoCredito . " = " . $campoCredito . $signo . " v_credito WHERE id = v_id_saldo;
  69.                 END IF;
  70.            SET v_codigo_cuenta = puc_mayor;
  71.            IF  v_codigo_cuenta IS NULL THEN
  72.               LEAVE loop_interno;  
  73.            END IF;
  74.         END LOOP loop_interno;
  75.     END IF;
  76.     SET continuar= tmp_continuar;
  77. UNTIL NOT continuar END REPEAT;
  78. CLOSE detalle_cur;

El diseñador de la base de datos crea una tabla que se encarga de guardar la mayorización de proceso contable por año, por eso lo del procedimiento que crea tablas diferentes nombres estructura igual.
La idea del procedimiento es que si yo ingreso una cuenta con un centro de costo

11050502 con un centro de costo 102030
11100503 sin centro de costo

en mi base de datos en mi tabla me debe guardar el padre de la cuenta y del centro de costo, pero si mi cuenta no tiene centro de costo solo ingrese el padre de la cuenta con el centro de costo null

Lo que debe hacer...........

CUENTA CENTRO_COSTO

11100503 NULL
111005 NULL
1110 NULL
11 NULL
1 NULL
11050502 102030
11050502 102000
11050502 100000
11050502

110505 102030
110505 102000
110505 100000
110505

1105 102030
1105 102000
1105 100000
1105

11 102030
11 102000
11 100000
11

1 102030
1 102000
1 100000
1

eso es lo que me debe hacer el procedimiento, pero el procedimiento que hasta el momento tengo solo me guarda

Lo que hace .............

CUENTA CENTRO COSTO

11100503 NULL
111005 NULL
1110 NULL
11 NULL
1 NULL
11050502 102030
11050502 102000
11050502 100000
11050502

el procedimiento solo se ejecuta en una unica tabla, llamada saldos_contables_[año actual] la estructura de esta tabla es

id int(10)
cuenta varchar(20)
sucursal varchar(4)
tercero varchar(20)
centroCosto varchar(6)
db_06 double(15,2)
cr_06 double(15,2)

siempre va ser la misma, lo que varia son los codigos de cuenta y los centros de costo

SELECT codigo, movimiento, terceros,mayor, centrocosto ROM puc WHERE codigo =v_codigo_cuenta INTO puc_cuenta, puc_movimiento, puc_terceros, puc_mayor, puc_centro_costo;
SELECT puc_cuenta, puc_movimiento, puc_terceros, puc_mayor, puc_centro_costo;

esta consulta lo unico que hace es consultarme el codigo contable mayor al que esta en ese momento cargada es decir esa consulta me muestra el mayor de 11050502, y solo se ejecuta en una parte que es al principio.

El problema que yo se que es y que veo es que en el procedimiento tengo 2 loop
uno para el codigo_contable (loop_interno) muestra el mayor

11050502
110505
1105 ..

pero dentro de ese loo_interno hay otro que se encargar de mostrar el padre del centro de costo (loop_centro)

102030
102000
100000

el problema es que cuando llega a ejecutar el loop_centro funciona la primera vez

Código MySQL:
Ver original
  1. loop_centro: LOOP        
  2.   SET v_id_saldo=0;
  3.   SELECT id FROM ".$tablaSaldos." WHERE cuenta = v_codigo_cuenta and tercero = v_tercero and centroCosto = v_centro_costo INTO v_id_saldo; //en este momento me trae el codigo 11050502 y el centro_costo =102030  
  4.   IF  v_id_saldo = 0 THEN
  5.      INSERT INTO " . $tablaSaldos . " (cuenta,tercero,sucursal,centroCosto," . $campoDebito . "," . $campoCredito . ") VALUES(`v_codigo_cuenta`,`v_tercero`,`v_sucursal`, `v_centro_costo`, v_debito, v_credito); // inserta en la tabla saldos_contables_2015 ese registro 11050502 102030
  6.   ELSE
  7.      UPDATE " . $tablaSaldos . " SET " . $campoDebito . " = " . $campoDebito . $signo . " v_debito, " . $campoCredito . " = " . $campoCredito . $signo . " v_credito WHERE id = v_id_saldo;
  8.   END IF;  
  9.  
  10.   SELECT id_padre FROM centros_costo WHERE id_centro_costo = v_centro_costo INTO padre_centro_costo; // consulta el padre del centro de costo 102030
  11.   SELECT padre_centro_costo;
  12.  
  13.    SET v_centro_costo = padre_centro_costo; //aqui le esta a la variable v_centro_costo asignando 102000
  14.    IF  v_centro_costo IS NULL THEN    // como el valor de  v_centro_costo no es NULL  no se me sale del loop y lo sigue ejecutando
  15.       LEAVE loop_centro;    
  16.    END IF;                
  17. END LOOP loop_centro;

como en el ultimo centro de costo es 100000 y el padre es NULL ahi cierra el loop_centro y lo saca y ahi detiene todo el proceso algo que no deberia hacer, por que cuando me salga de ese loop_centro deberia seguir ejecutando el loop_interno para que me siga ejecutando la cuenta

o por lo menos eso es lo que deberia estar haciendo. que cuando termina de ejecutar loop_centro debe continuar la ejecucion de loop_interno hasta que este tambien se cierre

Última edición por gnzsoloyo; 29/06/2015 a las 14:52