Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Ayuda con Update or Insert (https://www.clubdelphi.com/foros/showthread.php?t=73672)

el-mono 09-05-2011 05:43:48

Ayuda con Update or Insert
 
Hola gente necesito de su ayuda.

Resulta estoy haciendo un sistema de liquidación de sueldos al momento de imputar la liquidación (básicamente pasar datos de unas tablas que obtengo de una consulta a mi tabla liquidación - tabla principal para la liquidacion de sueldos) necesito modificar los registros en la tabla liquidación de aquellos conceptos que ya existan o ingresarlos si no fueron cargados todavía y para ello cree un Procedimiento Almacenado que utiliza Update or Insert para este menester.

El problema es que solo me modifica un solo registro y no me inserta los que debe hacerlo.Por ej prepare el siguiente escenario para probar:

La consulta me devuelve 4 registros de los cuales ya tengo cargados dos en la tabla liquidación entonces el procedimiento debería ingresarme los dos registros que no están cargados todavía y modificarme los otros dos, pero solo modifica el ultimo registro que obtiene de la consulta. Algo estoy haciendo mal, pero no lo puedo ver.:cool

Algún iluminado que me ayuda por favor. :D

Aquí pego el código del procedimiento para que vean que estoy haciendo mal.

Begin
ind1 = 0;
ind2 = 0;
ind3 = 0;
ind4 = 0;
ind5 = 0;

for select n.legajo, n.concepto,c.clase, c.periodicidad, n.periodo, n.porcentaje, n.cantidad, n.importe, n.duracion, n.novedad , c.indicador, c.participa, c.tipo, c.acumulador, e.categoria, e.centro_costo from novedades n
left join conceptos c on n.concepto = c.codigo left join empleado e on n.legajo = e.legajo into
:legajo, :concepto, :clase, :periodicidad, :periodo, :porcen, :cantidad, :importe, :duracion, :novedad, :indicador, :participa, :tipo, :acumulador, :categoria, :ccosto
do
begin
if (:indicador = 1) then
ind1 = 1;
else
if (:indicador = 2) then
ind2 = 2;
else
if (:indicador = 3) then
ind3 = 3;
else
if (:indicador = 4) then
ind4 = 4;
else
if (:indicador = 5) then
begin
ind1 = 1;
ind2 = 2;
ind3 = 3;
ind4 = 4;
ind5 = 5;
end

UPDATE or INSERT INTO LIQUIDACION (LEGAJO, CODIGO, CANTIDAD, PORCENTAJE, IMPORTE_UNITARIO, PARTICIPA, DURACION,PERIODICIDAD,VECES, PERIODO_IMPUTADO, NOVEDAD, INDICADOR1, INDICADOR2, INDICADOR3, INDICADOR4, INDICADOR5, TIPO, ACUMULADOR, CENTRO_COSTO, NRO_CATEGORIA, CLASE)
VALUES (:legajo, :concepto, :cantidad, :porcen, :importe, :participa, :duracion, :periodicidad, 0, :periodo, :novedad, :ind1, :ind2, :ind3, :ind4, :ind5, :tipo, :acumulador, :ccosto, :categoria, :clase);
matching(legajo,codigo);
suspend;
end

guillotmarc 09-05-2011 10:26:42

¿ Has utilizado un depurador de Firebird ?.

IBExpert lleva un depurador de procedimientos almacenados, con él podrás seguir la ejecución y comprobar si el bucle genera todos los registros que esperas y asigna las variables tal y como debería.

http://ibexpert.net/ibe/index.php?n=Main.DownloadTrial

NOTA: Tendrás que instalar la Trial de x días, puesto que la versión gratuita de IB-Expert no incorpora este depurador.

Saludos.

el-mono 09-05-2011 20:46:06

Guillo muchas gracias no sabia eso, tengo la version completa asi que pruebo con eso.

Saludos
Mario


La franja horaria es GMT +2. Ahora son las 07:01:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi