Problemas con la ejecucion de un cursor
Publicado por Carolina (1 intervención) el 23/03/2007 22:39:58
Hola a todos tengo el siguiente problema con este query:
Use rendicdw_paso
DECLARE @ORDEN BIGINT
DECLARE @PLU BIGINT
DECLARE @Q_PED FLOAT
DECLARE @FEC_ped SMALLDATETIME
DECLARE @Q_REC FLOAT
DECLARE @cto_REC FLOAT
DECLARE @FEC_rec SMALLDATETIME
declare @Q_out float
declare @Cto_out float
declare @Q_in float
declare @Cto_in float
declare @Cto_ped float
declare @Q_exc float
declare @Cto_exc float
declare @Count bigint
declare @Cond int
DECLARE cursor1 CURSOR FOR
SELECT
h.odrnor,H.odrplu, H.odrcpe,H.odrfen,H.odrccope
FROM PASO_HEC_NIVELSERVICIO_PRUEBA2 H
ORDER BY h.odrnor,H.odrplu
FOR UPDATE;
OPEN cursor1;
FETCH NEXT FROM cursor1 INTO @ORDEN,@PLU,@Q_PED,@FEC_PED,@Cto_ped
set @Count=0
WHILE (@@FETCH_STATUS =0)
BEGIN
DECLARE cursor2 CURSOR FOR
SELECT
odrffo,odrcre,odrcco
FROM dbo.paso_compras_pedidos
where
odrnor=@ORDEN
and odrplu=@PLU
ORDER BY odrffo,odrfol;
open cursor2;
FETCH NEXT FROM cursor2 INTO @FEC_rec,@Q_REC,@cto_REC;
set @Q_out = 0;
set @Cto_out = 0;
set @Q_in = 0;
set @Cto_in = 0;
set @Q_exc = 0;
set @Cto_exc = 0;
set @Q_REC=isnull(@Q_REC,0);
set @cto_REC=isnull(@cto_REC,0)
WHILE (@@FETCH_STATUS =0)
begin
if @FEC_rec > @FEC_ped
begin
set @Cond=2;
set @Q_out = @Q_out + @Q_REC;
set @Cto_out = @Cto_out + @Q_REC*@cto_REC;
end
else
begin
set @Cond=1;
set @Q_in = @Q_in + @Q_REC;
set @Cto_in = @Cto_in + @cto_REC*@Q_REC;
end;
if (@Q_in + @Q_out - @Q_PED) > 0
begin
set @Cond= @Cond*10;
set @Q_exc = @Q_in + @Q_out - @Q_PED;
set @Cto_exc = @Cto_in + @Cto_out - @Cto_ped;
end;
set @Count= @Count + 1;
print N'Contador :=' + rtrim(@Count) + ',@Q_PED='+ rtrim(@Q_PED) + ',@Cond='+ rtrim(@Cond) + ',@Q_REC='+isnull(rtrim(@Q_REC),'null')+',@Q_in='+isnull(rtrim(@Q_in),'null')+',@Q_out='+isnull(rtrim(@Q_out),'null')+',@Q_exc='+isnull(rtrim(@Q_exc),'null');
FETCH NEXT FROM cursor2 INTO @FEC_rec,@Q_REC,@cto_REC
end
CLOSE CURSOR2;
DEALLOCATE cursor2;
begin transaction
UPDATE PASO_HEC_NIVELSERVICIO_PRUEBA2 SET
odrqre_out =@Q_out
,odrcre_out =@Cto_out
,odrqre_in =@Q_in
,odrcre_in =@Cto_in
,odrqre_in_exc =@Q_exc
,odrcre_in_exc =@Cto_exc
,procesado = @Count
WHERE CURRENT OF cursor1;
commit transaction
FETCH NEXT FROM cursor1 INTO @ORDEN,@PLU,@Q_PED,@FEC_ped,@Cto_ped;
END;
CLOSE cursor1;
DEALLOCATE cursor1;
____________________________________________________________________
Si lo ejecuto me dice The cursor is Read Only
y al sacar la parte donde hace el update me muestra los valores que quiero actualizar...he leido bastante acerca de los cursores...pero no se que esta mal???? si alguien me puede ayudar lo agradeceria mucho....
Saludos.....
Use rendicdw_paso
DECLARE @ORDEN BIGINT
DECLARE @PLU BIGINT
DECLARE @Q_PED FLOAT
DECLARE @FEC_ped SMALLDATETIME
DECLARE @Q_REC FLOAT
DECLARE @cto_REC FLOAT
DECLARE @FEC_rec SMALLDATETIME
declare @Q_out float
declare @Cto_out float
declare @Q_in float
declare @Cto_in float
declare @Cto_ped float
declare @Q_exc float
declare @Cto_exc float
declare @Count bigint
declare @Cond int
DECLARE cursor1 CURSOR FOR
SELECT
h.odrnor,H.odrplu, H.odrcpe,H.odrfen,H.odrccope
FROM PASO_HEC_NIVELSERVICIO_PRUEBA2 H
ORDER BY h.odrnor,H.odrplu
FOR UPDATE;
OPEN cursor1;
FETCH NEXT FROM cursor1 INTO @ORDEN,@PLU,@Q_PED,@FEC_PED,@Cto_ped
set @Count=0
WHILE (@@FETCH_STATUS =0)
BEGIN
DECLARE cursor2 CURSOR FOR
SELECT
odrffo,odrcre,odrcco
FROM dbo.paso_compras_pedidos
where
odrnor=@ORDEN
and odrplu=@PLU
ORDER BY odrffo,odrfol;
open cursor2;
FETCH NEXT FROM cursor2 INTO @FEC_rec,@Q_REC,@cto_REC;
set @Q_out = 0;
set @Cto_out = 0;
set @Q_in = 0;
set @Cto_in = 0;
set @Q_exc = 0;
set @Cto_exc = 0;
set @Q_REC=isnull(@Q_REC,0);
set @cto_REC=isnull(@cto_REC,0)
WHILE (@@FETCH_STATUS =0)
begin
if @FEC_rec > @FEC_ped
begin
set @Cond=2;
set @Q_out = @Q_out + @Q_REC;
set @Cto_out = @Cto_out + @Q_REC*@cto_REC;
end
else
begin
set @Cond=1;
set @Q_in = @Q_in + @Q_REC;
set @Cto_in = @Cto_in + @cto_REC*@Q_REC;
end;
if (@Q_in + @Q_out - @Q_PED) > 0
begin
set @Cond= @Cond*10;
set @Q_exc = @Q_in + @Q_out - @Q_PED;
set @Cto_exc = @Cto_in + @Cto_out - @Cto_ped;
end;
set @Count= @Count + 1;
print N'Contador :=' + rtrim(@Count) + ',@Q_PED='+ rtrim(@Q_PED) + ',@Cond='+ rtrim(@Cond) + ',@Q_REC='+isnull(rtrim(@Q_REC),'null')+',@Q_in='+isnull(rtrim(@Q_in),'null')+',@Q_out='+isnull(rtrim(@Q_out),'null')+',@Q_exc='+isnull(rtrim(@Q_exc),'null');
FETCH NEXT FROM cursor2 INTO @FEC_rec,@Q_REC,@cto_REC
end
CLOSE CURSOR2;
DEALLOCATE cursor2;
begin transaction
UPDATE PASO_HEC_NIVELSERVICIO_PRUEBA2 SET
odrqre_out =@Q_out
,odrcre_out =@Cto_out
,odrqre_in =@Q_in
,odrcre_in =@Cto_in
,odrqre_in_exc =@Q_exc
,odrcre_in_exc =@Cto_exc
,procesado = @Count
WHERE CURRENT OF cursor1;
commit transaction
FETCH NEXT FROM cursor1 INTO @ORDEN,@PLU,@Q_PED,@FEC_ped,@Cto_ped;
END;
CLOSE cursor1;
DEALLOCATE cursor1;
____________________________________________________________________
Si lo ejecuto me dice The cursor is Read Only
y al sacar la parte donde hace el update me muestra los valores que quiero actualizar...he leido bastante acerca de los cursores...pero no se que esta mal???? si alguien me puede ayudar lo agradeceria mucho....
Saludos.....
Valora esta pregunta


0