EL PROCEDIMIENTO QUE TENGO HASTA AHORA ES ASI
Código MySQL:
Ver originalDECLARE 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 . "; OPEN detalle_cur;
FETCH detalle_cur
INTO v_id_cabecera
, v_codigo_cuenta
, v_sucursal
, v_debito
, v_credito
, v_tercero
, v_centro_costo
; SET tmp_continuar
= continuar
; SELECT v_codigo_cuenta
, v_sucursal
, v_debito
, v_credito
, v_tercero
, v_centro_costo
;
loop_interno: LOOP
SELECT codigo
,movimiento
,terceros
,mayor
,centrocosto
FROM 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
; SELECT id
FROM ".$tablaSaldos." WHERE cuenta
= v_codigo_cuenta
and tercero
= v_tercero
and sucursal
= v_sucursal
INTO v_id_saldo
; INSERT INTO ".$tablaSaldos." (cuenta
,tercero
,sucursal
,".$campoDebito.",".$campoCredito.") VALUES(`v_codigo_cuenta`,`v_tercero`,`v_sucursal`,v_debito
,v_credito
); UPDATE ".$tablaSaldos." SET ".$campoDebito." = ".$campoDebito.$signo." v_debito
, ".$campoCredito." = ".$campoCredito.$signo." v_credito
WHERE id
= v_id_saldo
; loop_centro: LOOP
SELECT id_padre
FROM centros_costo
WHERE id_centro_costo
= v_centro_costo
INTO padre_centro_costo
;
SELECT id
FROM ".$tablaSaldos." WHERE cuenta
= v_codigo_cuenta
and tercero
= v_tercero
and sucursal
= v_sucursal
INTO v_id_saldo
; INSERT INTO " . $tablaSaldos . " (cuenta
,tercero
,sucursal
,centroCosto
," . $campoDebito . "," . $campoCredito . ") VALUES(`v_codigo_cuenta`,`v_tercero`,`v_sucursal`, `v_centro_costo`,v_debito
,v_credito
); UPDATE " . $tablaSaldos . " SET " . $campoDebito . " = " . $campoDebito . $signo . " v_debito
, " . $campoCredito . " = " . $campoCredito . $signo . " v_credito
WHERE id
= v_id_saldo
;
SET v_centro_costo
= padre_centro_costo
; LEAVE loop_centro;
SELECT id
FROM ".$tablaSaldos." WHERE cuenta
= v_codigo_cuenta
and tercero
= v_tercero
and sucursal
= v_sucursal
INTO v_id_saldo
; INSERT INTO " . $tablaSaldos . " (cuenta
,tercero
,sucursal
,centroCosto
," . $campoDebito . "," . $campoCredito . ") VALUES(`v_codigo_cuenta`,`v_tercero`,`v_sucursal`, `v_centro_costo`,v_debito
,v_credito
); UPDATE " . $tablaSaldos . " SET " . $campoDebito . " = " . $campoDebito . $signo . " v_debito
, " . $campoCredito . " = " . $campoCredito . $signo . " v_credito
WHERE id
= v_id_saldo
; SET v_codigo_cuenta
= puc_mayor
; LEAVE loop_interno;
SET continuar
= tmp_continuar
; 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 originalloop_centro: LOOP
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 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 UPDATE " . $tablaSaldos . " SET " . $campoDebito . " = " . $campoDebito . $signo . " v_debito
, " . $campoCredito . " = " . $campoCredito . $signo . " v_credito
WHERE id
= v_id_saldo
;
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
SET v_centro_costo
= padre_centro_costo
; //aqui le esta a la variable v_centro_costo asignando
102000 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
LEAVE 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