Procedimiento sin retorno de recordset?

06/09/2004 - 16:00 por AC | Informe spam
Buenos días.

En SQL 2000, es posible impedir el retorno de los recordset de SELECT en un
procedimiento? Se trata de un PR de cálculo y este retorno no tiene nínguna
utilidad. Es más, me crea problemas en el control de los recordsets
retornados cuando este procedimiento está anidado con otros de los que sí se
necesita controlar el retorno de datos.

Saludos y muchas gracias de antemano.

AC

Preguntas similare

Leer las respuestas

#1 qwalgrande
06/09/2004 - 16:27 | Informe spam
Hola.

Por lo que comentas, los recordset no los precisas para cálculos
posteriores, por lo que sólo los querrás para saber si hay o no datos (o algo
similar). Tienes la función exists (significa "si hay registros en esta
consulta"):

...

if exists(select * from sysobjects)
begin
...
end

Este anterior está muy bien, además ganas (un pelín) de rendimiento, al no
tener que estar enviando datos de un sitio a otro y en cuanto encuentra un
registro, el motor deja de buscar. También puedes meter cada campo de esos
recordset que no deseas retornar en variables que no uses más que para esto
(devuelve un solo campo, tardarás menos en escribirlo).

Hay otros métodos.

qwalgrande

"AC" wrote:

Buenos días.

En SQL 2000, es posible impedir el retorno de los recordset de SELECT en un
procedimiento? Se trata de un PR de cálculo y este retorno no tiene nínguna
utilidad. Es más, me crea problemas en el control de los recordsets
retornados cuando este procedimiento está anidado con otros de los que sí se
necesita controlar el retorno de datos.

Saludos y muchas gracias de antemano.

AC




Respuesta Responder a este mensaje
#2 AC
06/09/2004 - 17:04 | Informe spam
Gracias por la respuesta.

Creo que no me he explicado demasiado bien. El problema está en determinar
el/los recordset de datos que son devueltos por el procedimiento.

Tengo un procedimiento 'A' que efectúa unos cálculos a partir de unos
parámetros de entrada, y que devuelve el estado final del cálculo mediante
un código de retorno. A los que llaman a este procedimiento ( que
normalmente serán otros procedimientos ) sólo les interesa recibir este
código de retorno para conocer si durante el proceso se ha producido alguna
incidencia.

Pues bien, todos los recordset procesados por el procedimiento 'A' no
interesan en absoluto que sean devueltos al que le llama. Entonces la
pregunta general es: ¿ Cómo, si se puede, evitar que un SELECT dentro de un
procedimiento sea devuelto como un recordset de datos?

Otra forma de verlo sería: ¿ Puedo escoger cuáles de los SELECT's de un
procedimiento forman parte del retorno de datos ? Y si es así, ¿ cómo puedo
seleccionarlos ?

Espero haberme explicado mejor. Saludos.

Ac





"qwalgrande" <qwalgrande*nospam*@yahoo.es> escribió en el mensaje
news:
Hola.

Por lo que comentas, los recordset no los precisas para cálculos
posteriores, por lo que sólo los querrás para saber si hay o no datos (o


algo
similar). Tienes la función exists (significa "si hay registros en esta
consulta"):

...

if exists(select * from sysobjects)
begin
...
end

Este anterior está muy bien, además ganas (un pelín) de rendimiento, al no
tener que estar enviando datos de un sitio a otro y en cuanto encuentra un
registro, el motor deja de buscar. También puedes meter cada campo de esos
recordset que no deseas retornar en variables que no uses más que para


esto
(devuelve un solo campo, tardarás menos en escribirlo).

Hay otros métodos.

qwalgrande

"AC" wrote:

> Buenos días.
>
> En SQL 2000, es posible impedir el retorno de los recordset de SELECT en


un
> procedimiento? Se trata de un PR de cálculo y este retorno no tiene


nínguna
> utilidad. Es más, me crea problemas en el control de los recordsets
> retornados cuando este procedimiento está anidado con otros de los que


sí se
> necesita controlar el retorno de datos.
>
> Saludos y muchas gracias de antemano.
>
> AC
>
>
>
>
Respuesta Responder a este mensaje
#3 AC
06/09/2004 - 19:12 | Informe spam
Gracias por el ofrecimiento. Lo paso a continuación. Le he eliminado algunas
páginas intermedias que no afectan a la estructura. Para cualquier
comentario a tu disposición.






CREATE PROCEDURE PR_FACTU_ALB_VALORAR
@desde_albaran char(10) = NULL,
@hasta_albaran char(10) = NULL,
@desde_cliente int = 0,
@hasta_cliente int = 999999999,
@calculo_incondicional char (2) = 'si'

AS

begin

SET NOCOUNT ON

SET LOCK_TIMEOUT 100

declare
@num_albaran char(10),
@control int,
@err int,
@rec int,
@tipo_iva char(8),
@imp_bruto_alb dec(10,2),
@imp_dto1_alb dec(10,2),
@imp_dto2_alb dec(10,2),
@imp_dto3_alb dec(10,2),
@imp_neto dec(10,2),
@imp_dto_espec dec(10,2),
@imp_dto_pp dec(10,2),
@imp_gtos_financ dec(10,2),
@base_irpf dec(10,2),
@imp_irpf dec(10,2),
@total_alb dec(10,2),
@imp_portes dec (10,2),
@imp_embalajes dec (10,2),
@imp_seguros dec(10,2),
@imp_varios dec(10,2),
@total_iva dec(10,2),
@dto_especial dec(5,2),
@dto_p_p dec(5,2),
@gtos_financ dec(5,2),
@codigo_iva tinyint,
@iva_aplicar tinyint,
@irpf dec(5,2),
@tipo_iva_portes char(8),
@tipo_iva_seguros char(8),
@tipo_iva_embalajes char(8),
@tipo_iva_varios char(8),
@gtos_fin_baseiva bit,
@hay_transaccion bit

set @hay_transaccion = 0
if @@TRANCOUNT > 0 set @hay_transaccion = 1
if @hay_transaccion = 0 BEGIN TRAN Mi_Transaccion


if @desde_albaran IS NULL set @desde_albaran = ''
if @hasta_albaran IS NULL set @hasta_albaran = REPLICATE (CHAR(255),10)

if @desde_cliente IS NULL set @desde_cliente = 0
if @hasta_cliente IS NULL set @hasta_cliente = 999999999

if ISNUMERIC (@desde_cliente) = 0 set @desde_cliente = 0
if ISNUMERIC (@hasta_cliente) = 0 set @hasta_cliente = 999999999

if @calculo_incondicional IS NULL set @calculo_incondicional = 'si'
set @calculo_incondicional = LOWER(@calculo_incondicional)
if @calculo_incondicional not in ('si','no') set @calculo_incondicional 'si'

SELECT TOP 1
@tipo_iva_portes = TIPO_IVA_PORTES,
@tipo_iva_seguros = TIPO_IVA_SEGUROS,
@tipo_iva_embalajes = TIPO_IVA_EMBALAJES,
@tipo_iva_varios = TIPO_IVA_VARIOS,
@gtos_fin_baseiva = GTOS_FIN_BASEIVA
FROM Tb_DATOS_GENERALES
SELECT @err = @@error, @rec = @@ROWCOUNT
if @@error <> 0 begin set @err = @@error goto MAL end

if @gtos_fin_baseiva IS NULL set @gtos_fin_baseiva = 0

if @calculo_incondicional = 'no'
begin
SELECT NUM_ALBARAN
FROM Tb_FACTU_ALBARANES WITH (ROWLOCK HOLDLOCK)
WHERE NUM_ALBARAN IN
(SELECT A.NUM_ALBARAN
FROM Tb_FACTU_ALBARANES AS A INNER JOIN Tb_FACTU_ALB_STATUS
ON (A.NUM_ALBARAN = Tb_FACTU_ALB_STATUS.NUM_ALBARAN
AND A.NUM_ALBARAN >= @desde_albaran
AND A.NUM_ALBARAN <= @hasta_albaran
AND A.COD_CLIENTE >= @desde_cliente
AND A.COD_CLIENTE <= @hasta_cliente
AND Tb_FACTU_ALB_STATUS.CALCULADO <> 1))
if @@error <> 0 begin set @err = @@error goto MAL end
end
else
begin
SELECT NUM_ALBARAN
FROM Tb_FACTU_ALBARANES WITH (ROWLOCK HOLDLOCK)
WHERE (NUM_ALBARAN >= @desde_albaran
AND NUM_ALBARAN <= @hasta_albaran
AND COD_CLIENTE >= @desde_cliente
AND COD_CLIENTE <= @hasta_cliente)
if @@error <> 0 begin set @err = @@error goto MAL end
end
-

if @calculo_incondicional = 'no' -- albaranes no calculados
begin
DECLARE albaranes CURSOR
LOCAL FAST_FORWARD READ_ONLY
FOR
SELECT A.NUM_ALBARAN, A.DTO_ESPECIAL, A.DTO_P_P, A.GTOS_FINANC,
A.CODIGO_IVA, A.IVA_APLICAR, A.IRPF,
A.IMP_PORTES, A.IMP_EMBALAJES, A.IMP_SEGUROS, A.IMP_VARIOS
FROM Tb_FACTU_ALBARANES AS A INNER JOIN Tb_FACTU_ALB_STATUS
ON (A.NUM_ALBARAN = Tb_FACTU_ALB_STATUS.NUM_ALBARAN
AND A.NUM_ALBARAN >= @desde_albaran
AND A.NUM_ALBARAN <= @hasta_albaran
AND A.COD_CLIENTE >= @desde_cliente
AND A.COD_CLIENTE <= @hasta_cliente
AND Tb_FACTU_ALB_STATUS.CALCULADO <> 1)
if @@error <> 0 begin set @err = @@error goto MAL end
end
else
begin
DECLARE albaranes CURSOR -- todos los albaranes entre límites
LOCAL FAST_FORWARD READ_ONLY
FOR
SELECT NUM_ALBARAN, DTO_ESPECIAL, DTO_P_P, GTOS_FINANC,
CODIGO_IVA, IVA_APLICAR, IRPF,
IMP_PORTES, IMP_EMBALAJES, IMP_SEGUROS, IMP_VARIOS
FROM Tb_FACTU_ALBARANES
WHERE (NUM_ALBARAN >= @desde_albaran
AND NUM_ALBARAN <= @hasta_albaran
AND COD_CLIENTE >= @desde_cliente
AND COD_CLIENTE <= @hasta_cliente)
if @@error <> 0 begin set @err = @@error goto MAL end
end

OPEN albaranes

FETCH NEXT FROM albaranes
INTO @num_albaran, @dto_especial, @dto_p_p, @gtos_financ,
@codigo_iva, @iva_aplicar, @irpf,
@imp_portes, @imp_embalajes, @imp_seguros, @imp_varios

set @control = @@FETCH_STATUS

WHILE @control = 0
begin

INSERT INTO Tb_FACTU_ALBLIN_VAL
SELECT NUM_ALBARAN, ID_ALBLIN, 0, 0, 0, 0
FROM Tb_FACTU_ALBLIN
WHERE NUM_ALBARAN = @num_albaran AND
NOT EXISTS
(SELECT NUM_ALBARAN, ID_ALBLIN
FROM Tb_FACTU_ALBLIN_VAL
WHERE Tb_FACTU_ALBLIN_VAL.NUM_ALBARAN Tb_FACTU_ALBLIN.NUM_ALBARAN AND
Tb_FACTU_ALBLIN_VAL.ID_ALBLIN Tb_FACTU_ALBLIN.ID_ALBLIN)
if @@error <> 0 begin set @err = @@error goto MAL end

UPDATE Tb_FACTU_ALBLIN_VAL
set
IMPORTE_BRUTO = ROUND (((CANTIDAD_FACTUR /
ISNULL(Tb_ARTICULOS.UNID_VTA,1))* PRECIO), 2)
FROM (SELECT * FROM Tb_FACTU_ALBLIN WHERE NUM_ALBARAN = @num_albaran) AS
X
LEFT JOIN Tb_ARTICULOS
ON (X.COD_ARTICULO = Tb_ARTICULOS.COD_ARTICULO)
WHERE Tb_FACTU_ALBLIN_VAL.NUM_ALBARAN = X.NUM_ALBARAN
AND Tb_FACTU_ALBLIN_VAL.ID_ALBLIN = X.ID_ALBLIN
if @@error <> 0 begin set @err = @@error goto MAL end

UPDATE Tb_FACTU_ALBLIN_VAL
set
IMPORTE_DTO1 = ROUND ( IMPORTE_BRUTO * (DTO_1/100),2),
IMPORTE_DTO2 = ROUND ((IMPORTE_BRUTO - ROUND ( IMPORTE_BRUTO *
(DTO_1/100) ,2) ) * (DTO_2/100),2),
IMPORTE_DTO3 = ROUND ( (IMPORTE_BRUTO -
ROUND ( IMPORTE_BRUTO * (DTO_1/100),2) - ROUND ((IMPORTE_BRUTO - ROUND
( IMPORTE_BRUTO * (DTO_1/100) ,2) ) * (DTO_2/100),2)) * (DTO_3/100), 2)
FROM (SELECT * FROM Tb_FACTU_ALBLIN WHERE NUM_ALBARAN = @num_albaran) AS
X
WHERE Tb_FACTU_ALBLIN_VAL.NUM_ALBARAN = X.NUM_ALBARAN
AND Tb_FACTU_ALBLIN_VAL.ID_ALBLIN = X.ID_ALBLIN
if @@error <> 0 begin set @err = @@error goto MAL end

SELECT
@imp_bruto_alb = ISNULL (SUM (IMPORTE_BRUTO), 0),
@imp_dto1_alb = ISNULL (SUM (IMPORTE_DTO1), 0),
@imp_dto2_alb = ISNULL (SUM (IMPORTE_DTO2), 0),
@imp_dto3_alb = ISNULL (SUM (IMPORTE_DTO3), 0)
FROM Tb_FACTU_ALBLIN_VAL WHERE NUM_ALBARAN = @num_albaran
if @@error <> 0 begin set @err = @@error goto MAL end

set @imp_neto = ISNULL((@imp_bruto_alb - @imp_dto1_alb - @imp_dto2_alb -
@imp_dto3_alb),0)
set @imp_dto_espec = ISNULL(ROUND ((@imp_neto / 100) * @dto_especial, 2),0)
set @imp_dto_pp = ISNULL(ROUND (((@imp_neto - @imp_dto_espec) / 100) *
@dto_p_p, 2),0)
set @imp_gtos_financ = ISNULL(ROUND (((@imp_neto - @imp_dto_espec -
@imp_dto_pp) / 100) * @gtos_financ, 2),0)
set @base_irpf = ISNULL((@imp_neto - @imp_dto_espec - @imp_dto_pp),0)
set @imp_irpf = ISNULL(ROUND ((@base_irpf / 100) * @irpf, 2),0)


DELETE FROM Tb_FACTU_ALB_IVA
WHERE NUM_ALBARAN = @num_albaran
if @@error <> 0 begin set @err = @@error goto MAL end

INSERT INTO Tb_FACTU_ALB_IVA -- Se insertan todos los TIPO_IVA del albarán.
(NUM_ALBARAN, TIPO_IVA, BASE_IVA, TPC_IVA, TPC_REC_EQUIV)
SELECT DISTINCT @num_albaran, TIPO_IVA, 0, 0, 0
FROM Tb_FACTU_ALBLIN WHERE NUM_ALBARAN = @num_albaran
if @@error <> 0 begin set @err = @@error goto MAL end

if @tipo_iva_portes IS NOT NULL AND @imp_portes <> 0 -- IVA portes
begin
if NOT EXISTS ( SELECT NUM_ALBARAN FROM Tb_FACTU_ALB_IVA
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA @tipo_iva_portes)
INSERT INTO Tb_FACTU_ALB_IVA
(NUM_ALBARAN, TIPO_IVA, BASE_IVA, TPC_IVA, TPC_REC_EQUIV)
VALUES (@num_albaran, @tipo_iva_portes, @imp_portes, 0, 0)
else
UPDATE Tb_FACTU_ALB_IVA
set BASE_IVA = BASE_IVA + @imp_portes
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA = @tipo_iva_portes
end

if @tipo_iva_seguros IS NOT NULL AND @imp_seguros <> 0 -- IVA seguros
begin
if NOT EXISTS ( SELECT NUM_ALBARAN FROM Tb_FACTU_ALB_IVA
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA @tipo_iva_seguros)
INSERT INTO Tb_FACTU_ALB_IVA
(NUM_ALBARAN, TIPO_IVA, BASE_IVA, TPC_IVA, TPC_REC_EQUIV)
VALUES (@num_albaran, @tipo_iva_seguros, @imp_seguros, 0, 0)
else
UPDATE Tb_FACTU_ALB_IVA
set BASE_IVA = BASE_IVA + @imp_seguros
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA = @tipo_iva_seguros
end

if @tipo_iva_embalajes IS NOT NULL AND @imp_embalajes <> 0 -- IVA embalajes
begin
if NOT EXISTS ( SELECT NUM_ALBARAN FROM Tb_FACTU_ALB_IVA
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA @tipo_iva_embalajes)
INSERT INTO Tb_FACTU_ALB_IVA
(NUM_ALBARAN, TIPO_IVA, BASE_IVA, TPC_IVA, TPC_REC_EQUIV)
VALUES (@num_albaran, @tipo_iva_embalajes, @imp_embalajes, 0, 0)
else
UPDATE Tb_FACTU_ALB_IVA
set BASE_IVA = BASE_IVA + @imp_embalajes
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA = @tipo_iva_embalajes
end

if @tipo_iva_varios IS NOT NULL AND @imp_varios <> 0 -- IVA varios
begin
if NOT EXISTS ( SELECT NUM_ALBARAN FROM Tb_FACTU_ALB_IVA
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA @tipo_iva_varios)
INSERT INTO Tb_FACTU_ALB_IVA
(NUM_ALBARAN, TIPO_IVA, BASE_IVA, TPC_IVA, TPC_REC_EQUIV)
VALUES (@num_albaran, @tipo_iva_varios, @imp_varios, 0, 0)
else
UPDATE Tb_FACTU_ALB_IVA
set BASE_IVA = BASE_IVA + @imp_varios
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA = @tipo_iva_varios
end

if @gtos_fin_baseiva = 0
begin
UPDATE Tb_FACTU_ALB_IVA
set BASE_IVA BASE_IVA +
IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial, 2)
- ROUND ( (IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial, 2))*
@dto_p_p, 2)
FROM
(SELECT ISNULL(SUM (IMPORTE_NETO),0) AS IMPORTE, TIPO_IVA
FROM Tb_FACTU_ALBLIN, Tb_FACTU_ALBLIN_VAL
WHERE Tb_FACTU_ALBLIN.NUM_ALBARAN = @num_albaran AND
Tb_FACTU_ALBLIN.NUM_ALBARAN = Tb_FACTU_ALBLIN_VAL.NUM_ALBARAN AND
Tb_FACTU_ALBLIN.ID_ALBLIN = Tb_FACTU_ALBLIN_VAL.ID_ALBLIN
GROUP BY TIPO_IVA) AS X
WHERE Tb_FACTU_ALB_IVA.NUM_ALBARAN = @num_albaran AND
Tb_FACTU_ALB_IVA.TIPO_IVA = X.TIPO_IVA
if @@error <> 0 begin set @err = @@error goto MAL end
end
else
begin
UPDATE Tb_FACTU_ALB_IVA
set BASE_IVA BASE_IVA +
IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial, 2)
- ROUND ( ((IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial,
2))/100)* @dto_p_p, 2)
+ ROUND (
((IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial, 2)
- ROUND ( ((IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial,
2))/100)* @dto_p_p, 2))
/100) * @gtos_financ, 2)
FROM
(SELECT ISNULL(SUM (IMPORTE_NETO),0) AS IMPORTE, TIPO_IVA
FROM Tb_FACTU_ALBLIN, Tb_FACTU_ALBLIN_VAL
WHERE Tb_FACTU_ALBLIN.NUM_ALBARAN = @num_albaran AND
Tb_FACTU_ALBLIN.NUM_ALBARAN = Tb_FACTU_ALBLIN_VAL.NUM_ALBARAN AND
Tb_FACTU_ALBLIN.ID_ALBLIN = Tb_FACTU_ALBLIN_VAL.ID_ALBLIN
GROUP BY TIPO_IVA) AS X
WHERE Tb_FACTU_ALB_IVA.NUM_ALBARAN = @num_albaran AND
Tb_FACTU_ALB_IVA.TIPO_IVA = X.TIPO_IVA
if @@error <> 0 begin set @err = @@error goto MAL end
end

DELETE FROM Tb_FACTU_ALB_IVA
WHERE NUM_ALBARAN = @num_albaran AND
BASE_IVA = 0 AND IMPORTE_IVA = 0 AND
IMPORTE_REC_EQUIV = 0
if @@error <> 0 begin set @err = @@error goto MAL end

importes)
UPDATE Tb_FACTU_ALB_IVA
set
TPC_IVA = Tb_TIPOS_IVA.TPC_IVA,
TPC_REC_EQUIV = Tb_TIPOS_IVA.TPC_REC_EQUIV
FROM Tb_TIPOS_IVA
WHERE Tb_FACTU_ALB_IVA.NUM_ALBARAN = @num_albaran AND
Tb_FACTU_ALB_IVA.TIPO_IVA = Tb_TIPOS_IVA.TIPO_IVA
if @@error <> 0 begin set @err = @@error goto MAL end

SELECT
@total_iva = ISNULL(SUM (IMPORTE_IVA + IMPORTE_REC_EQUIV),0)
FROM Tb_FACTU_ALB_IVA
WHERE NUM_ALBARAN = @num_albaran
if @@error <> 0 begin set @err = @@error goto MAL end

set @total_alb = ISNULL ((@imp_neto
- @imp_dto_espec
- @imp_dto_pp
+ @imp_gtos_financ
+ @imp_portes
+ @imp_embalajes
+ @imp_seguros
+ @imp_varios
+ @total_iva
- @imp_irpf),0)

A2:
UPDATE Tb_FACTU_ALB_VAL
set
IMPORTE_BRUTO = @imp_bruto_alb,
IMPORTE_DTO1 = @imp_dto1_alb,
IMPORTE_DTO2 = @imp_dto2_alb,
IMPORTE_DTO3 = @imp_dto3_alb,
IMPORTE_NETO = @imp_neto,
IMPORTE_DTO_ESPEC = @imp_dto_espec,
IMPORTE_DTO_PP = @imp_dto_pp,
IMPORTE_GTOS_FINANC = @imp_gtos_financ,
BASE_IRPF = @base_irpf,
IMPORTE_IRPF = @imp_irpf,
TOTAL_ALB = @total_alb
WHERE NUM_ALBARAN = @num_albaran
select @rec = @@ROWCOUNT, @err = @@error
if @err <> 0 goto SALIR
if @rec = 0
begin
INSERT INTO Tb_FACTU_ALB_VAL
VALUES (@num_albaran, 0,0,0,0,0,0,0,0,0,0,0)
goto A2
end

/* PONER STATUS DE CALCULADO */
IF EXISTS (SELECT NUM_ALBARAN FROM Tb_FACTU_ALB_STATUS
WHERE NUM_ALBARAN = @num_albaran)
begin
UPDATE Tb_FACTU_ALB_STATUS
set CALCULADO = 1
WHERE NUM_ALBARAN = @num_ALBARAN
if @@error <> 0 begin set @err = @@error goto MAL end
end
else
begin
INSERT INTO Tb_FACTU_ALB_STATUS
VALUES (@num_albaran, 1)
if @@error <> 0 begin set @err = @@error goto MAL end
end

FETCH NEXT FROM albaranes
INTO @num_albaran, @dto_especial, @dto_p_p, @gtos_financ,
@codigo_iva, @iva_aplicar, @irpf,
@imp_portes, @imp_embalajes, @imp_seguros, @imp_varios
set @control = @@FETCH_STATUS
end

CLOSE albaranes
DEALLOCATE albaranes

BIEN:
if @hay_transaccion = 0 COMMIT TRAN Mi_Transaccion
goto SALIR

MAL:
if @hay_transaccion = 0 ROLLBACK TRAN Mi_Transaccion


SALIR:
SET NOCOUNT OFF

if @err IS NULL set @err = 0

RETURN (@err)

end
<<<<



"qwalgrande" <qwalgrande*nospam*@yahoo.es> escribió en el mensaje
news:
Hola.

Creo que te he respondido, pero de todos modos, ¿puedes pasarme el código


y
te lo devuelvo con las modificaciones para que sólo devuelva el return?

qwalgrande

"AC" wrote:

> Gracias por la respuesta.
>
> Creo que no me he explicado demasiado bien. El problema está en


determinar
> el/los recordset de datos que son devueltos por el procedimiento.
>
> Tengo un procedimiento 'A' que efectúa unos cálculos a partir de unos
> parámetros de entrada, y que devuelve el estado final del cálculo


mediante
> un código de retorno. A los que llaman a este procedimiento ( que
> normalmente serán otros procedimientos ) sólo les interesa recibir este
> código de retorno para conocer si durante el proceso se ha producido


alguna
> incidencia.
>
> Pues bien, todos los recordset procesados por el procedimiento 'A' no
> interesan en absoluto que sean devueltos al que le llama. Entonces la
> pregunta general es: ¿ Cómo, si se puede, evitar que un SELECT dentro


de un
> procedimiento sea devuelto como un recordset de datos?
>
> Otra forma de verlo sería: ¿ Puedo escoger cuáles de los SELECT's de un
> procedimiento forman parte del retorno de datos ? Y si es así, ¿ cómo


puedo
> seleccionarlos ?
>
> Espero haberme explicado mejor. Saludos.
>
> Ac
>
>
>
>
>
> "qwalgrande" <qwalgrande*nospam*@yahoo.es> escribió en el mensaje
> news:
> > Hola.
> >
> > Por lo que comentas, los recordset no los precisas para cálculos
> > posteriores, por lo que sólo los querrás para saber si hay o no datos


(o
> algo
> > similar). Tienes la función exists (significa "si hay registros en


esta
> > consulta"):
> >
> > ...
> >
> > if exists(select * from sysobjects)
> > begin
> > ...
> > end
> >
> > Este anterior está muy bien, además ganas (un pelín) de rendimiento,


al no
> > tener que estar enviando datos de un sitio a otro y en cuanto


encuentra un
> > registro, el motor deja de buscar. También puedes meter cada campo de


esos
> > recordset que no deseas retornar en variables que no uses más que para
> esto
> > (devuelve un solo campo, tardarás menos en escribirlo).
> >
> > Hay otros métodos.
> >
> > qwalgrande
> >
> > "AC" wrote:
> >
> > > Buenos días.
> > >
> > > En SQL 2000, es posible impedir el retorno de los recordset de


SELECT en
> un
> > > procedimiento? Se trata de un PR de cálculo y este retorno no tiene
> nínguna
> > > utilidad. Es más, me crea problemas en el control de los recordsets
> > > retornados cuando este procedimiento está anidado con otros de los


que
> sí se
> > > necesita controlar el retorno de datos.
> > >
> > > Saludos y muchas gracias de antemano.
> > >
> > > AC
> > >
> > >
> > >
> > >
>
>
>
Respuesta Responder a este mensaje
#4 qwalgrande
07/09/2004 - 09:35 | Informe spam
Hola.

En la parte que me pasas sólo he encontrado un punto en que te devolvería un
recordset (igual hay más, pero sólo he encontrado uno). Está por la línea 86
más o menos. He visto que la función exists está siendo usada, así que sólo
te queda tener paciencia para ir revisando todo el código en busca de esos
recordset. Ten en cuenta también que a lo mejor tienes algún trigger que
devuelve un recordset (todo es posible). Te pongo el detalle del cambio, el
resto de cambios a realizar serían idénticos:


if @calculo_incondicional = 'no'
begin

/*variable inútil*/
declare @in_NUM_ALBARAN int

SELECT @in_NUM_ALBARAN = NUM_ALBARAN --asignación a variable inútil
FROM Tb_FACTU_ALBARANES WITH (ROWLOCK HOLDLOCK)
WHERE NUM_ALBARAN IN
(SELECT A.NUM_ALBARAN
FROM Tb_FACTU_ALBARANES AS A INNER JOIN Tb_FACTU_ALB_STATUS
ON (A.NUM_ALBARAN = Tb_FACTU_ALB_STATUS.NUM_ALBARAN
AND A.NUM_ALBARAN >= @desde_albaran
AND A.NUM_ALBARAN <= @hasta_albaran
AND A.COD_CLIENTE >= @desde_cliente
AND A.COD_CLIENTE <= @hasta_cliente
AND Tb_FACTU_ALB_STATUS.CALCULADO <> 1))
if @@error <> 0 begin set @err = @@error goto MAL end
end
else
begin
SELECT @in_NUM_ALBARAN = NUM_ALBARAN
FROM Tb_FACTU_ALBARANES WITH (ROWLOCK HOLDLOCK)
WHERE (NUM_ALBARAN >= @desde_albaran
AND NUM_ALBARAN <= @hasta_albaran
AND COD_CLIENTE >= @desde_cliente
AND COD_CLIENTE <= @hasta_cliente)
if @@error <> 0 begin set @err = @@error goto MAL end
end

Suerte y paciencia.

qwalgrande


"AC" wrote:

Gracias por el ofrecimiento. Lo paso a continuación. Le he eliminado algunas
páginas intermedias que no afectan a la estructura. Para cualquier
comentario a tu disposición.

>>
CREATE PROCEDURE PR_FACTU_ALB_VALORAR
@desde_albaran char(10) = NULL,
@hasta_albaran char(10) = NULL,
@desde_cliente int = 0,
@hasta_cliente int = 999999999,
@calculo_incondicional char (2) = 'si'

AS

begin

SET NOCOUNT ON

SET LOCK_TIMEOUT 100

declare
@num_albaran char(10),
@control int,
@err int,
@rec int,
@tipo_iva char(8),
@imp_bruto_alb dec(10,2),
@imp_dto1_alb dec(10,2),
@imp_dto2_alb dec(10,2),
@imp_dto3_alb dec(10,2),
@imp_neto dec(10,2),
@imp_dto_espec dec(10,2),
@imp_dto_pp dec(10,2),
@imp_gtos_financ dec(10,2),
@base_irpf dec(10,2),
@imp_irpf dec(10,2),
@total_alb dec(10,2),
@imp_portes dec (10,2),
@imp_embalajes dec (10,2),
@imp_seguros dec(10,2),
@imp_varios dec(10,2),
@total_iva dec(10,2),
@dto_especial dec(5,2),
@dto_p_p dec(5,2),
@gtos_financ dec(5,2),
@codigo_iva tinyint,
@iva_aplicar tinyint,
@irpf dec(5,2),
@tipo_iva_portes char(8),
@tipo_iva_seguros char(8),
@tipo_iva_embalajes char(8),
@tipo_iva_varios char(8),
@gtos_fin_baseiva bit,
@hay_transaccion bit

set @hay_transaccion = 0
if @@TRANCOUNT > 0 set @hay_transaccion = 1
if @hay_transaccion = 0 BEGIN TRAN Mi_Transaccion


if @desde_albaran IS NULL set @desde_albaran = ''
if @hasta_albaran IS NULL set @hasta_albaran = REPLICATE (CHAR(255),10)

if @desde_cliente IS NULL set @desde_cliente = 0
if @hasta_cliente IS NULL set @hasta_cliente = 999999999

if ISNUMERIC (@desde_cliente) = 0 set @desde_cliente = 0
if ISNUMERIC (@hasta_cliente) = 0 set @hasta_cliente = 999999999

if @calculo_incondicional IS NULL set @calculo_incondicional = 'si'
set @calculo_incondicional = LOWER(@calculo_incondicional)
if @calculo_incondicional not in ('si','no') set @calculo_incondicional > 'si'

SELECT TOP 1
@tipo_iva_portes = TIPO_IVA_PORTES,
@tipo_iva_seguros = TIPO_IVA_SEGUROS,
@tipo_iva_embalajes = TIPO_IVA_EMBALAJES,
@tipo_iva_varios = TIPO_IVA_VARIOS,
@gtos_fin_baseiva = GTOS_FIN_BASEIVA
FROM Tb_DATOS_GENERALES
SELECT @err = @@error, @rec = @@ROWCOUNT
if @@error <> 0 begin set @err = @@error goto MAL end

if @gtos_fin_baseiva IS NULL set @gtos_fin_baseiva = 0

if @calculo_incondicional = 'no'
begin
SELECT NUM_ALBARAN
FROM Tb_FACTU_ALBARANES WITH (ROWLOCK HOLDLOCK)
WHERE NUM_ALBARAN IN
(SELECT A.NUM_ALBARAN
FROM Tb_FACTU_ALBARANES AS A INNER JOIN Tb_FACTU_ALB_STATUS
ON (A.NUM_ALBARAN = Tb_FACTU_ALB_STATUS.NUM_ALBARAN
AND A.NUM_ALBARAN >= @desde_albaran
AND A.NUM_ALBARAN <= @hasta_albaran
AND A.COD_CLIENTE >= @desde_cliente
AND A.COD_CLIENTE <= @hasta_cliente
AND Tb_FACTU_ALB_STATUS.CALCULADO <> 1))
if @@error <> 0 begin set @err = @@error goto MAL end
end
else
begin
SELECT NUM_ALBARAN
FROM Tb_FACTU_ALBARANES WITH (ROWLOCK HOLDLOCK)
WHERE (NUM_ALBARAN >= @desde_albaran
AND NUM_ALBARAN <= @hasta_albaran
AND COD_CLIENTE >= @desde_cliente
AND COD_CLIENTE <= @hasta_cliente)
if @@error <> 0 begin set @err = @@error goto MAL end
end
-

if @calculo_incondicional = 'no' -- albaranes no calculados
begin
DECLARE albaranes CURSOR
LOCAL FAST_FORWARD READ_ONLY
FOR
SELECT A.NUM_ALBARAN, A.DTO_ESPECIAL, A.DTO_P_P, A.GTOS_FINANC,
A.CODIGO_IVA, A.IVA_APLICAR, A.IRPF,
A.IMP_PORTES, A.IMP_EMBALAJES, A.IMP_SEGUROS, A.IMP_VARIOS
FROM Tb_FACTU_ALBARANES AS A INNER JOIN Tb_FACTU_ALB_STATUS
ON (A.NUM_ALBARAN = Tb_FACTU_ALB_STATUS.NUM_ALBARAN
AND A.NUM_ALBARAN >= @desde_albaran
AND A.NUM_ALBARAN <= @hasta_albaran
AND A.COD_CLIENTE >= @desde_cliente
AND A.COD_CLIENTE <= @hasta_cliente
AND Tb_FACTU_ALB_STATUS.CALCULADO <> 1)
if @@error <> 0 begin set @err = @@error goto MAL end
end
else
begin
DECLARE albaranes CURSOR -- todos los albaranes entre límites
LOCAL FAST_FORWARD READ_ONLY
FOR
SELECT NUM_ALBARAN, DTO_ESPECIAL, DTO_P_P, GTOS_FINANC,
CODIGO_IVA, IVA_APLICAR, IRPF,
IMP_PORTES, IMP_EMBALAJES, IMP_SEGUROS, IMP_VARIOS
FROM Tb_FACTU_ALBARANES
WHERE (NUM_ALBARAN >= @desde_albaran
AND NUM_ALBARAN <= @hasta_albaran
AND COD_CLIENTE >= @desde_cliente
AND COD_CLIENTE <= @hasta_cliente)
if @@error <> 0 begin set @err = @@error goto MAL end
end

OPEN albaranes

FETCH NEXT FROM albaranes
INTO @num_albaran, @dto_especial, @dto_p_p, @gtos_financ,
@codigo_iva, @iva_aplicar, @irpf,
@imp_portes, @imp_embalajes, @imp_seguros, @imp_varios

set @control = @@FETCH_STATUS

WHILE @control = 0
begin

INSERT INTO Tb_FACTU_ALBLIN_VAL
SELECT NUM_ALBARAN, ID_ALBLIN, 0, 0, 0, 0
FROM Tb_FACTU_ALBLIN
WHERE NUM_ALBARAN = @num_albaran AND
NOT EXISTS
(SELECT NUM_ALBARAN, ID_ALBLIN
FROM Tb_FACTU_ALBLIN_VAL
WHERE Tb_FACTU_ALBLIN_VAL.NUM_ALBARAN > Tb_FACTU_ALBLIN.NUM_ALBARAN AND
Tb_FACTU_ALBLIN_VAL.ID_ALBLIN > Tb_FACTU_ALBLIN.ID_ALBLIN)
if @@error <> 0 begin set @err = @@error goto MAL end

UPDATE Tb_FACTU_ALBLIN_VAL
set
IMPORTE_BRUTO = ROUND (((CANTIDAD_FACTUR /
ISNULL(Tb_ARTICULOS.UNID_VTA,1))* PRECIO), 2)
FROM (SELECT * FROM Tb_FACTU_ALBLIN WHERE NUM_ALBARAN = @num_albaran) AS
X
LEFT JOIN Tb_ARTICULOS
ON (X.COD_ARTICULO = Tb_ARTICULOS.COD_ARTICULO)
WHERE Tb_FACTU_ALBLIN_VAL.NUM_ALBARAN = X.NUM_ALBARAN
AND Tb_FACTU_ALBLIN_VAL.ID_ALBLIN = X.ID_ALBLIN
if @@error <> 0 begin set @err = @@error goto MAL end

UPDATE Tb_FACTU_ALBLIN_VAL
set
IMPORTE_DTO1 = ROUND ( IMPORTE_BRUTO * (DTO_1/100),2),
IMPORTE_DTO2 = ROUND ((IMPORTE_BRUTO - ROUND ( IMPORTE_BRUTO *
(DTO_1/100) ,2) ) * (DTO_2/100),2),
IMPORTE_DTO3 = ROUND ( (IMPORTE_BRUTO -
ROUND ( IMPORTE_BRUTO * (DTO_1/100),2) - ROUND ((IMPORTE_BRUTO - ROUND
( IMPORTE_BRUTO * (DTO_1/100) ,2) ) * (DTO_2/100),2)) * (DTO_3/100), 2)
FROM (SELECT * FROM Tb_FACTU_ALBLIN WHERE NUM_ALBARAN = @num_albaran) AS
X
WHERE Tb_FACTU_ALBLIN_VAL.NUM_ALBARAN = X.NUM_ALBARAN
AND Tb_FACTU_ALBLIN_VAL.ID_ALBLIN = X.ID_ALBLIN
if @@error <> 0 begin set @err = @@error goto MAL end

SELECT
@imp_bruto_alb = ISNULL (SUM (IMPORTE_BRUTO), 0),
@imp_dto1_alb = ISNULL (SUM (IMPORTE_DTO1), 0),
@imp_dto2_alb = ISNULL (SUM (IMPORTE_DTO2), 0),
@imp_dto3_alb = ISNULL (SUM (IMPORTE_DTO3), 0)
FROM Tb_FACTU_ALBLIN_VAL WHERE NUM_ALBARAN = @num_albaran
if @@error <> 0 begin set @err = @@error goto MAL end

set @imp_neto = ISNULL((@imp_bruto_alb - @imp_dto1_alb - @imp_dto2_alb -
@imp_dto3_alb),0)
set @imp_dto_espec = ISNULL(ROUND ((@imp_neto / 100) * @dto_especial, 2),0)
set @imp_dto_pp = ISNULL(ROUND (((@imp_neto - @imp_dto_espec) / 100) *
@dto_p_p, 2),0)
set @imp_gtos_financ = ISNULL(ROUND (((@imp_neto - @imp_dto_espec -
@imp_dto_pp) / 100) * @gtos_financ, 2),0)
set @base_irpf = ISNULL((@imp_neto - @imp_dto_espec - @imp_dto_pp),0)
set @imp_irpf = ISNULL(ROUND ((@base_irpf / 100) * @irpf, 2),0)


DELETE FROM Tb_FACTU_ALB_IVA
WHERE NUM_ALBARAN = @num_albaran
if @@error <> 0 begin set @err = @@error goto MAL end

INSERT INTO Tb_FACTU_ALB_IVA -- Se insertan todos los TIPO_IVA del albarán.
(NUM_ALBARAN, TIPO_IVA, BASE_IVA, TPC_IVA, TPC_REC_EQUIV)
SELECT DISTINCT @num_albaran, TIPO_IVA, 0, 0, 0
FROM Tb_FACTU_ALBLIN WHERE NUM_ALBARAN = @num_albaran
if @@error <> 0 begin set @err = @@error goto MAL end

if @tipo_iva_portes IS NOT NULL AND @imp_portes <> 0 -- IVA portes
begin
if NOT EXISTS ( SELECT NUM_ALBARAN FROM Tb_FACTU_ALB_IVA
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA > @tipo_iva_portes)
INSERT INTO Tb_FACTU_ALB_IVA
(NUM_ALBARAN, TIPO_IVA, BASE_IVA, TPC_IVA, TPC_REC_EQUIV)
VALUES (@num_albaran, @tipo_iva_portes, @imp_portes, 0, 0)
else
UPDATE Tb_FACTU_ALB_IVA
set BASE_IVA = BASE_IVA + @imp_portes
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA = @tipo_iva_portes
end

if @tipo_iva_seguros IS NOT NULL AND @imp_seguros <> 0 -- IVA seguros
begin
if NOT EXISTS ( SELECT NUM_ALBARAN FROM Tb_FACTU_ALB_IVA
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA > @tipo_iva_seguros)
INSERT INTO Tb_FACTU_ALB_IVA
(NUM_ALBARAN, TIPO_IVA, BASE_IVA, TPC_IVA, TPC_REC_EQUIV)
VALUES (@num_albaran, @tipo_iva_seguros, @imp_seguros, 0, 0)
else
UPDATE Tb_FACTU_ALB_IVA
set BASE_IVA = BASE_IVA + @imp_seguros
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA = @tipo_iva_seguros
end

if @tipo_iva_embalajes IS NOT NULL AND @imp_embalajes <> 0 -- IVA embalajes
begin
if NOT EXISTS ( SELECT NUM_ALBARAN FROM Tb_FACTU_ALB_IVA
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA > @tipo_iva_embalajes)
INSERT INTO Tb_FACTU_ALB_IVA
(NUM_ALBARAN, TIPO_IVA, BASE_IVA, TPC_IVA, TPC_REC_EQUIV)
VALUES (@num_albaran, @tipo_iva_embalajes, @imp_embalajes, 0, 0)
else
UPDATE Tb_FACTU_ALB_IVA
set BASE_IVA = BASE_IVA + @imp_embalajes
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA = @tipo_iva_embalajes
end

if @tipo_iva_varios IS NOT NULL AND @imp_varios <> 0 -- IVA varios
begin
if NOT EXISTS ( SELECT NUM_ALBARAN FROM Tb_FACTU_ALB_IVA
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA > @tipo_iva_varios)
INSERT INTO Tb_FACTU_ALB_IVA
(NUM_ALBARAN, TIPO_IVA, BASE_IVA, TPC_IVA, TPC_REC_EQUIV)
VALUES (@num_albaran, @tipo_iva_varios, @imp_varios, 0, 0)
else
UPDATE Tb_FACTU_ALB_IVA
set BASE_IVA = BASE_IVA + @imp_varios
WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA = @tipo_iva_varios
end

if @gtos_fin_baseiva = 0
begin
UPDATE Tb_FACTU_ALB_IVA
set BASE_IVA > BASE_IVA +
IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial, 2)
- ROUND ( (IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial, 2))*
@dto_p_p, 2)
FROM
(SELECT ISNULL(SUM (IMPORTE_NETO),0) AS IMPORTE, TIPO_IVA
FROM Tb_FACTU_ALBLIN, Tb_FACTU_ALBLIN_VAL
WHERE Tb_FACTU_ALBLIN.NUM_ALBARAN = @num_albaran AND
Tb_FACTU_ALBLIN.NUM_ALBARAN = Tb_FACTU_ALBLIN_VAL.NUM_ALBARAN AND
Tb_FACTU_ALBLIN.ID_ALBLIN = Tb_FACTU_ALBLIN_VAL.ID_ALBLIN
GROUP BY TIPO_IVA) AS X
WHERE Tb_FACTU_ALB_IVA.NUM_ALBARAN = @num_albaran AND
Tb_FACTU_ALB_IVA.TIPO_IVA = X.TIPO_IVA
if @@error <> 0 begin set @err = @@error goto MAL end
end
else
begin
UPDATE Tb_FACTU_ALB_IVA
set BASE_IVA > BASE_IVA +
IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial, 2)
- ROUND ( ((IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial,
2))/100)* @dto_p_p, 2)
+ ROUND (
((IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial, 2)
- ROUND ( ((IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial,
2))/100)* @dto_p_p, 2))
/100) * @gtos_financ, 2)
FROM
(SELECT ISNULL(SUM (IMPORTE_NETO),0) AS IMPORTE, TIPO_IVA
FROM Tb_FACTU_ALBLIN, Tb_FACTU_ALBLIN_VAL
WHERE Tb_FACTU_ALBLIN.NUM_ALBARAN = @num_albaran AND
Tb_FACTU_ALBLIN.NUM_ALBARAN = Tb_FACTU_ALBLIN_VAL.NUM_ALBARAN AND
Tb_FACTU_ALBLIN.ID_ALBLIN = Tb_FACTU_ALBLIN_VAL.ID_ALBLIN
GROUP BY TIPO_IVA) AS X
WHERE Tb_FACTU_ALB_IVA.NUM_ALBARAN = @num_albaran AND
Tb_FACTU_ALB_IVA.TIPO_IVA = X.TIPO_IVA
if @@error <> 0 begin set @err = @@error goto MAL end
end

DELETE FROM Tb_FACTU_ALB_IVA
WHERE NUM_ALBARAN = @num_albaran AND
BASE_IVA = 0 AND IMPORTE_IVA = 0 AND
IMPORTE_REC_EQUIV = 0
if @@error <> 0 begin set @err = @@error goto MAL end

importes)
UPDATE Tb_FACTU_ALB_IVA
set
TPC_IVA = Tb_TIPOS_IVA.TPC_IVA,
TPC_REC_EQUIV = Tb_TIPOS_IVA.TPC_REC_EQUIV
FROM Tb_TIPOS_IVA
WHERE Tb_FACTU_ALB_IVA.NUM_ALBARAN = @num_albaran AND
Tb_FACTU_ALB_IVA.TIPO_IVA = Tb_TIPOS_IVA.TIPO_IVA
if @@error <> 0 begin set @err = @@error goto MAL end

SELECT
@total_iva = ISNULL(SUM (IMPORTE_IVA + IMPORTE_REC_EQUIV),0)
FROM Tb_FACTU_ALB_IVA
WHERE NUM_ALBARAN = @num_albaran
if @@error <> 0 begin set @err = @@error goto MAL end

set @total_alb = ISNULL ((@imp_neto
- @imp_dto_espec
- @imp_dto_pp
+ @imp_gtos_financ
+ @imp_portes
+ @imp_embalajes
+ @imp_seguros
+ @imp_varios
+ @total_iva
- @imp_irpf),0)

A2:
UPDATE Tb_FACTU_ALB_VAL
set
IMPORTE_BRUTO = @imp_bruto_alb,
IMPORTE_DTO1 = @imp_dto1_alb,
IMPORTE_DTO2 = @imp_dto2_alb,
IMPORTE_DTO3 = @imp_dto3_alb,
IMPORTE_NETO = @imp_neto,
IMPORTE_DTO_ESPEC = @imp_dto_espec,
IMPORTE_DTO_PP = @imp_dto_pp,
IMPORTE_GTOS_FINANC = @imp_gtos_financ,
BASE_IRPF = @base_irpf,
IMPORTE_IRPF = @imp_irpf,
TOTAL_ALB = @total_alb
WHERE NUM_ALBARAN = @num_albaran
select @rec = @@ROWCOUNT, @err = @@error
if @err <> 0 goto SALIR
if @rec = 0
begin
INSERT INTO Tb_FACTU_ALB_VAL
VALUES (@num_albaran, 0,0,0,0,0,0,0,0,0,0,0)
goto A2
end

/* PONER STATUS DE CALCULADO */
IF EXISTS (SELECT NUM_ALBARAN FROM Tb_FACTU_ALB_STATUS
WHERE NUM_ALBARAN = @num_albaran)
begin
UPDATE Tb_FACTU_ALB_STATUS
set CALCULADO = 1
WHERE NUM_ALBARAN = @num_ALBARAN
if @@error <> 0 begin set @err = @@error goto MAL end
end
else
begin
INSERT INTO Tb_FACTU_ALB_STATUS
VALUES (@num_albaran, 1)
if @@error <> 0 begin set @err = @@error goto MAL end
end

FETCH NEXT FROM albaranes
INTO @num_albaran, @dto_especial, @dto_p_p, @gtos_financ,
@codigo_iva, @iva_aplicar, @irpf,
@imp_portes, @imp_embalajes, @imp_seguros, @imp_varios
set @control = @@FETCH_STATUS
end

CLOSE albaranes
DEALLOCATE albaranes

BIEN:
if @hay_transaccion = 0 COMMIT TRAN Mi_Transaccion
goto SALIR

MAL:
if @hay_transaccion = 0 ROLLBACK TRAN Mi_Transaccion


SALIR:
SET NOCOUNT OFF

if @err IS NULL set @err = 0

RETURN (@err)

end
<<<<



"qwalgrande" <qwalgrande*nospam*@yahoo.es> escribió en el mensaje
news:
> Hola.
>
> Creo que te he respondido, pero de todos modos, ¿puedes pasarme el código
y
> te lo devuelvo con las modificaciones para que sólo devuelva el return?
>
> qwalgrande
>
> "AC" wrote:
>
> > Gracias por la respuesta.
> >
> > Creo que no me he explicado demasiado bien. El problema está en
determinar
> > el/los recordset de datos que son devueltos por el procedimiento.
> >
> > Tengo un procedimiento 'A' que efectúa unos cálculos a partir de unos
> > parámetros de entrada, y que devuelve el estado final del cálculo
mediante
> > un código de retorno. A los que llaman a este procedimiento ( que
> > normalmente serán otros procedimientos ) sólo les interesa recibir este
> > código de retorno para conocer si durante el proceso se ha producido
alguna
> > incidencia.
> >
> > Pues bien, todos los recordset procesados por el procedimiento 'A' no
> > interesan en absoluto que sean devueltos al que le llama. Entonces la
> > pregunta general es: ¿ Cómo, si se puede, evitar que un SELECT dentro
de un
> > procedimiento sea devuelto como un recordset de datos?
> >
> > Otra forma de verlo sería: ¿ Puedo escoger cuáles de los SELECT's de un
> > procedimiento forman parte del retorno de datos ? Y si es así, ¿ cómo
puedo
> > seleccionarlos ?
> >
> > Espero haberme explicado mejor. Saludos.
> >
> > Ac
> >
> >
> >
> >
> >
> > "qwalgrande" <qwalgrande*nospam*@yahoo.es> escribió en el mensaje
> > news:
> > > Hola.
> > >
> > > Por lo que comentas, los recordset no los precisas para cálculos
> > > posteriores, por lo que sólo los querrás para saber si hay o no datos
(o
> > algo
> > > similar). Tienes la función exists (significa "si hay registros en
esta
> > > consulta"):
> > >
> > > ...
> > >
> > > if exists(select * from sysobjects)
> > > begin
> > > ...
> > > end
> > >
> > > Este anterior está muy bien, además ganas (un pelín) de rendimiento,
al no
> > > tener que estar enviando datos de un sitio a otro y en cuanto
encuentra un
> > > registro, el motor deja de buscar. También puedes meter cada campo de
esos
> > > recordset que no deseas retornar en variables que no uses más que para
> > esto
> > > (devuelve un solo campo, tardarás menos en escribirlo).
> > >
> > > Hay otros métodos.
> > >
> > > qwalgrande
> > >
> > > "AC" wrote:
> > >
> > > > Buenos días.
> > > >
> > > > En SQL 2000, es posible impedir el retorno de los recordset de
SELECT en
> > un
> > > > procedimiento? Se trata de un PR de cálculo y este retorno no tiene
> > nínguna
> > > > utilidad. Es más, me crea problemas en el control de los recordsets
> > > > retornados cuando este procedimiento está anidado con otros de los
que
> > sí se
> > > > necesita controlar el retorno de datos.
> > > >
> > > > Saludos y muchas gracias de antemano.
> > > >
> > > > AC
> > > >
> > > >
> > > >
> > > >
> >
> >
> >



Respuesta Responder a este mensaje
#5 AC
07/09/2004 - 10:52 | Informe spam
Muchas gracias.

"qwalgrande" <qwalgrande*nospam*@yahoo.es> escribió en el mensaje
news:
Hola.

En la parte que me pasas sólo he encontrado un punto en que te devolvería


un
recordset (igual hay más, pero sólo he encontrado uno). Está por la línea


86
más o menos. He visto que la función exists está siendo usada, así que


sólo
te queda tener paciencia para ir revisando todo el código en busca de esos
recordset. Ten en cuenta también que a lo mejor tienes algún trigger que
devuelve un recordset (todo es posible). Te pongo el detalle del cambio,


el
resto de cambios a realizar serían idénticos:


if @calculo_incondicional = 'no'
begin

/*variable inútil*/
declare @in_NUM_ALBARAN int

SELECT @in_NUM_ALBARAN = NUM_ALBARAN --asignación a variable inútil
FROM Tb_FACTU_ALBARANES WITH (ROWLOCK HOLDLOCK)
WHERE NUM_ALBARAN IN
(SELECT A.NUM_ALBARAN
FROM Tb_FACTU_ALBARANES AS A INNER JOIN Tb_FACTU_ALB_STATUS
ON (A.NUM_ALBARAN = Tb_FACTU_ALB_STATUS.NUM_ALBARAN
AND A.NUM_ALBARAN >= @desde_albaran
AND A.NUM_ALBARAN <= @hasta_albaran
AND A.COD_CLIENTE >= @desde_cliente
AND A.COD_CLIENTE <= @hasta_cliente
AND Tb_FACTU_ALB_STATUS.CALCULADO <> 1))
if @@error <> 0 begin set @err = @@error goto MAL end
end
else
begin
SELECT @in_NUM_ALBARAN = NUM_ALBARAN
FROM Tb_FACTU_ALBARANES WITH (ROWLOCK HOLDLOCK)
WHERE (NUM_ALBARAN >= @desde_albaran
AND NUM_ALBARAN <= @hasta_albaran
AND COD_CLIENTE >= @desde_cliente
AND COD_CLIENTE <= @hasta_cliente)
if @@error <> 0 begin set @err = @@error goto MAL end
end

Suerte y paciencia.

qwalgrande


"AC" wrote:

> Gracias por el ofrecimiento. Lo paso a continuación. Le he eliminado


algunas
> páginas intermedias que no afectan a la estructura. Para cualquier
> comentario a tu disposición.
>




> >>
> CREATE PROCEDURE PR_FACTU_ALB_VALORAR
> @desde_albaran char(10) = NULL,
> @hasta_albaran char(10) = NULL,
> @desde_cliente int = 0,
> @hasta_cliente int = 999999999,
> @calculo_incondicional char (2) = 'si'
>
> AS
>
> begin
>
> SET NOCOUNT ON
>
> SET LOCK_TIMEOUT 100
>
> declare
> @num_albaran char(10),
> @control int,
> @err int,
> @rec int,
> @tipo_iva char(8),
> @imp_bruto_alb dec(10,2),
> @imp_dto1_alb dec(10,2),
> @imp_dto2_alb dec(10,2),
> @imp_dto3_alb dec(10,2),
> @imp_neto dec(10,2),
> @imp_dto_espec dec(10,2),
> @imp_dto_pp dec(10,2),
> @imp_gtos_financ dec(10,2),
> @base_irpf dec(10,2),
> @imp_irpf dec(10,2),
> @total_alb dec(10,2),
> @imp_portes dec (10,2),
> @imp_embalajes dec (10,2),
> @imp_seguros dec(10,2),
> @imp_varios dec(10,2),
> @total_iva dec(10,2),
> @dto_especial dec(5,2),
> @dto_p_p dec(5,2),
> @gtos_financ dec(5,2),
> @codigo_iva tinyint,
> @iva_aplicar tinyint,
> @irpf dec(5,2),
> @tipo_iva_portes char(8),
> @tipo_iva_seguros char(8),
> @tipo_iva_embalajes char(8),
> @tipo_iva_varios char(8),
> @gtos_fin_baseiva bit,
> @hay_transaccion bit
>
> set @hay_transaccion = 0
> if @@TRANCOUNT > 0 set @hay_transaccion = 1
> if @hay_transaccion = 0 BEGIN TRAN Mi_Transaccion
>
>
> if @desde_albaran IS NULL set @desde_albaran = ''
> if @hasta_albaran IS NULL set @hasta_albaran = REPLICATE (CHAR(255),10)
>
> if @desde_cliente IS NULL set @desde_cliente = 0
> if @hasta_cliente IS NULL set @hasta_cliente = 999999999
>
> if ISNUMERIC (@desde_cliente) = 0 set @desde_cliente = 0
> if ISNUMERIC (@hasta_cliente) = 0 set @hasta_cliente = 999999999
>
> if @calculo_incondicional IS NULL set @calculo_incondicional = 'si'
> set @calculo_incondicional = LOWER(@calculo_incondicional)
> if @calculo_incondicional not in ('si','no') set @calculo_incondicional
> 'si'
>
> SELECT TOP 1
> @tipo_iva_portes = TIPO_IVA_PORTES,
> @tipo_iva_seguros = TIPO_IVA_SEGUROS,
> @tipo_iva_embalajes = TIPO_IVA_EMBALAJES,
> @tipo_iva_varios = TIPO_IVA_VARIOS,
> @gtos_fin_baseiva = GTOS_FIN_BASEIVA
> FROM Tb_DATOS_GENERALES
> SELECT @err = @@error, @rec = @@ROWCOUNT
> if @@error <> 0 begin set @err = @@error goto MAL end
>
> if @gtos_fin_baseiva IS NULL set @gtos_fin_baseiva = 0
>
> if @calculo_incondicional = 'no'
> begin
> SELECT NUM_ALBARAN
> FROM Tb_FACTU_ALBARANES WITH (ROWLOCK HOLDLOCK)
> WHERE NUM_ALBARAN IN
> (SELECT A.NUM_ALBARAN
> FROM Tb_FACTU_ALBARANES AS A INNER JOIN Tb_FACTU_ALB_STATUS
> ON (A.NUM_ALBARAN = Tb_FACTU_ALB_STATUS.NUM_ALBARAN
> AND A.NUM_ALBARAN >= @desde_albaran
> AND A.NUM_ALBARAN <= @hasta_albaran
> AND A.COD_CLIENTE >= @desde_cliente
> AND A.COD_CLIENTE <= @hasta_cliente
> AND Tb_FACTU_ALB_STATUS.CALCULADO <> 1))
> if @@error <> 0 begin set @err = @@error goto MAL end
> end
> else
> begin
> SELECT NUM_ALBARAN
> FROM Tb_FACTU_ALBARANES WITH (ROWLOCK HOLDLOCK)
> WHERE (NUM_ALBARAN >= @desde_albaran
> AND NUM_ALBARAN <= @hasta_albaran
> AND COD_CLIENTE >= @desde_cliente
> AND COD_CLIENTE <= @hasta_cliente)
> if @@error <> 0 begin set @err = @@error goto MAL end
> end
> -
>
> if @calculo_incondicional = 'no' -- albaranes no calculados
> begin
> DECLARE albaranes CURSOR
> LOCAL FAST_FORWARD READ_ONLY
> FOR
> SELECT A.NUM_ALBARAN, A.DTO_ESPECIAL, A.DTO_P_P, A.GTOS_FINANC,
> A.CODIGO_IVA, A.IVA_APLICAR, A.IRPF,
> A.IMP_PORTES, A.IMP_EMBALAJES, A.IMP_SEGUROS, A.IMP_VARIOS
> FROM Tb_FACTU_ALBARANES AS A INNER JOIN Tb_FACTU_ALB_STATUS
> ON (A.NUM_ALBARAN = Tb_FACTU_ALB_STATUS.NUM_ALBARAN
> AND A.NUM_ALBARAN >= @desde_albaran
> AND A.NUM_ALBARAN <= @hasta_albaran
> AND A.COD_CLIENTE >= @desde_cliente
> AND A.COD_CLIENTE <= @hasta_cliente
> AND Tb_FACTU_ALB_STATUS.CALCULADO <> 1)
> if @@error <> 0 begin set @err = @@error goto MAL end
> end
> else
> begin
> DECLARE albaranes CURSOR -- todos los albaranes entre límites
> LOCAL FAST_FORWARD READ_ONLY
> FOR
> SELECT NUM_ALBARAN, DTO_ESPECIAL, DTO_P_P, GTOS_FINANC,
> CODIGO_IVA, IVA_APLICAR, IRPF,
> IMP_PORTES, IMP_EMBALAJES, IMP_SEGUROS, IMP_VARIOS
> FROM Tb_FACTU_ALBARANES
> WHERE (NUM_ALBARAN >= @desde_albaran
> AND NUM_ALBARAN <= @hasta_albaran
> AND COD_CLIENTE >= @desde_cliente
> AND COD_CLIENTE <= @hasta_cliente)
> if @@error <> 0 begin set @err = @@error goto MAL end
> end
>
> OPEN albaranes
>
> FETCH NEXT FROM albaranes
> INTO @num_albaran, @dto_especial, @dto_p_p, @gtos_financ,
> @codigo_iva, @iva_aplicar, @irpf,
> @imp_portes, @imp_embalajes, @imp_seguros, @imp_varios
>
> set @control = @@FETCH_STATUS
>
> WHILE @control = 0
> begin
>
> INSERT INTO Tb_FACTU_ALBLIN_VAL
> SELECT NUM_ALBARAN, ID_ALBLIN, 0, 0, 0, 0
> FROM Tb_FACTU_ALBLIN
> WHERE NUM_ALBARAN = @num_albaran AND
> NOT EXISTS
> (SELECT NUM_ALBARAN, ID_ALBLIN
> FROM Tb_FACTU_ALBLIN_VAL
> WHERE Tb_FACTU_ALBLIN_VAL.NUM_ALBARAN > > Tb_FACTU_ALBLIN.NUM_ALBARAN AND
> Tb_FACTU_ALBLIN_VAL.ID_ALBLIN > > Tb_FACTU_ALBLIN.ID_ALBLIN)
> if @@error <> 0 begin set @err = @@error goto MAL end
>
> UPDATE Tb_FACTU_ALBLIN_VAL
> set
> IMPORTE_BRUTO = ROUND (((CANTIDAD_FACTUR /
> ISNULL(Tb_ARTICULOS.UNID_VTA,1))* PRECIO), 2)
> FROM (SELECT * FROM Tb_FACTU_ALBLIN WHERE NUM_ALBARAN @num_albaran) AS
> X
> LEFT JOIN Tb_ARTICULOS
> ON (X.COD_ARTICULO = Tb_ARTICULOS.COD_ARTICULO)
> WHERE Tb_FACTU_ALBLIN_VAL.NUM_ALBARAN = X.NUM_ALBARAN
> AND Tb_FACTU_ALBLIN_VAL.ID_ALBLIN = X.ID_ALBLIN
> if @@error <> 0 begin set @err = @@error goto MAL end
>
> UPDATE Tb_FACTU_ALBLIN_VAL
> set
> IMPORTE_DTO1 = ROUND ( IMPORTE_BRUTO * (DTO_1/100),2),
> IMPORTE_DTO2 = ROUND ((IMPORTE_BRUTO - ROUND ( IMPORTE_BRUTO *
> (DTO_1/100) ,2) ) * (DTO_2/100),2),
> IMPORTE_DTO3 = ROUND ( (IMPORTE_BRUTO -
> ROUND ( IMPORTE_BRUTO * (DTO_1/100),2) - ROUND ((IMPORTE_BRUTO -


ROUND
> ( IMPORTE_BRUTO * (DTO_1/100) ,2) ) * (DTO_2/100),2)) * (DTO_3/100), 2)
> FROM (SELECT * FROM Tb_FACTU_ALBLIN WHERE NUM_ALBARAN @num_albaran) AS
> X
> WHERE Tb_FACTU_ALBLIN_VAL.NUM_ALBARAN = X.NUM_ALBARAN
> AND Tb_FACTU_ALBLIN_VAL.ID_ALBLIN = X.ID_ALBLIN
> if @@error <> 0 begin set @err = @@error goto MAL end
>
> SELECT
> @imp_bruto_alb = ISNULL (SUM (IMPORTE_BRUTO), 0),
> @imp_dto1_alb = ISNULL (SUM (IMPORTE_DTO1), 0),
> @imp_dto2_alb = ISNULL (SUM (IMPORTE_DTO2), 0),
> @imp_dto3_alb = ISNULL (SUM (IMPORTE_DTO3), 0)
> FROM Tb_FACTU_ALBLIN_VAL WHERE NUM_ALBARAN = @num_albaran
> if @@error <> 0 begin set @err = @@error goto MAL end
>
> set @imp_neto = ISNULL((@imp_bruto_alb - @imp_dto1_alb - @imp_dto2_alb -
> @imp_dto3_alb),0)
> set @imp_dto_espec = ISNULL(ROUND ((@imp_neto / 100) * @dto_especial,


2),0)
> set @imp_dto_pp = ISNULL(ROUND (((@imp_neto - @imp_dto_espec) / 100) *
> @dto_p_p, 2),0)
> set @imp_gtos_financ = ISNULL(ROUND (((@imp_neto - @imp_dto_espec -
> @imp_dto_pp) / 100) * @gtos_financ, 2),0)
> set @base_irpf = ISNULL((@imp_neto - @imp_dto_espec - @imp_dto_pp),0)
> set @imp_irpf = ISNULL(ROUND ((@base_irpf / 100) * @irpf, 2),0)
>
>
> DELETE FROM Tb_FACTU_ALB_IVA
> WHERE NUM_ALBARAN = @num_albaran
> if @@error <> 0 begin set @err = @@error goto MAL end
>
> INSERT INTO Tb_FACTU_ALB_IVA -- Se insertan todos los TIPO_IVA del


albarán.
> (NUM_ALBARAN, TIPO_IVA, BASE_IVA, TPC_IVA, TPC_REC_EQUIV)
> SELECT DISTINCT @num_albaran, TIPO_IVA, 0, 0, 0
> FROM Tb_FACTU_ALBLIN WHERE NUM_ALBARAN = @num_albaran
> if @@error <> 0 begin set @err = @@error goto MAL end
>
> if @tipo_iva_portes IS NOT NULL AND @imp_portes <> 0 -- IVA portes
> begin
> if NOT EXISTS ( SELECT NUM_ALBARAN FROM Tb_FACTU_ALB_IVA
> WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA > > @tipo_iva_portes)
> INSERT INTO Tb_FACTU_ALB_IVA
> (NUM_ALBARAN, TIPO_IVA, BASE_IVA, TPC_IVA, TPC_REC_EQUIV)
> VALUES (@num_albaran, @tipo_iva_portes, @imp_portes, 0, 0)
> else
> UPDATE Tb_FACTU_ALB_IVA
> set BASE_IVA = BASE_IVA + @imp_portes
> WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA = @tipo_iva_portes
> end
>
> if @tipo_iva_seguros IS NOT NULL AND @imp_seguros <> 0 -- IVA seguros
> begin
> if NOT EXISTS ( SELECT NUM_ALBARAN FROM Tb_FACTU_ALB_IVA
> WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA > > @tipo_iva_seguros)
> INSERT INTO Tb_FACTU_ALB_IVA
> (NUM_ALBARAN, TIPO_IVA, BASE_IVA, TPC_IVA, TPC_REC_EQUIV)
> VALUES (@num_albaran, @tipo_iva_seguros, @imp_seguros, 0, 0)
> else
> UPDATE Tb_FACTU_ALB_IVA
> set BASE_IVA = BASE_IVA + @imp_seguros
> WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA = @tipo_iva_seguros
> end
>
> if @tipo_iva_embalajes IS NOT NULL AND @imp_embalajes <> 0 -- IVA


embalajes
> begin
> if NOT EXISTS ( SELECT NUM_ALBARAN FROM Tb_FACTU_ALB_IVA
> WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA > > @tipo_iva_embalajes)
> INSERT INTO Tb_FACTU_ALB_IVA
> (NUM_ALBARAN, TIPO_IVA, BASE_IVA, TPC_IVA, TPC_REC_EQUIV)
> VALUES (@num_albaran, @tipo_iva_embalajes, @imp_embalajes, 0, 0)
> else
> UPDATE Tb_FACTU_ALB_IVA
> set BASE_IVA = BASE_IVA + @imp_embalajes
> WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA = @tipo_iva_embalajes
> end
>
> if @tipo_iva_varios IS NOT NULL AND @imp_varios <> 0 -- IVA varios
> begin
> if NOT EXISTS ( SELECT NUM_ALBARAN FROM Tb_FACTU_ALB_IVA
> WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA > > @tipo_iva_varios)
> INSERT INTO Tb_FACTU_ALB_IVA
> (NUM_ALBARAN, TIPO_IVA, BASE_IVA, TPC_IVA, TPC_REC_EQUIV)
> VALUES (@num_albaran, @tipo_iva_varios, @imp_varios, 0, 0)
> else
> UPDATE Tb_FACTU_ALB_IVA
> set BASE_IVA = BASE_IVA + @imp_varios
> WHERE NUM_ALBARAN = @num_albaran AND TIPO_IVA = @tipo_iva_varios
> end
>
> if @gtos_fin_baseiva = 0
> begin
> UPDATE Tb_FACTU_ALB_IVA
> set BASE_IVA > > BASE_IVA +
> IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial, 2)
> - ROUND ( (IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial, 2))*
> @dto_p_p, 2)
> FROM
> (SELECT ISNULL(SUM (IMPORTE_NETO),0) AS IMPORTE, TIPO_IVA
> FROM Tb_FACTU_ALBLIN, Tb_FACTU_ALBLIN_VAL
> WHERE Tb_FACTU_ALBLIN.NUM_ALBARAN = @num_albaran AND
> Tb_FACTU_ALBLIN.NUM_ALBARAN = Tb_FACTU_ALBLIN_VAL.NUM_ALBARAN AND
> Tb_FACTU_ALBLIN.ID_ALBLIN = Tb_FACTU_ALBLIN_VAL.ID_ALBLIN
> GROUP BY TIPO_IVA) AS X
> WHERE Tb_FACTU_ALB_IVA.NUM_ALBARAN = @num_albaran AND
> Tb_FACTU_ALB_IVA.TIPO_IVA = X.TIPO_IVA
> if @@error <> 0 begin set @err = @@error goto MAL end
> end
> else
> begin
> UPDATE Tb_FACTU_ALB_IVA
> set BASE_IVA > > BASE_IVA +
> IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial, 2)
> - ROUND ( ((IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial,
> 2))/100)* @dto_p_p, 2)
> + ROUND (
> ((IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial, 2)
> - ROUND ( ((IMPORTE - ROUND ( (IMPORTE / 100) * @dto_especial,
> 2))/100)* @dto_p_p, 2))
> /100) * @gtos_financ, 2)
> FROM
> (SELECT ISNULL(SUM (IMPORTE_NETO),0) AS IMPORTE, TIPO_IVA
> FROM Tb_FACTU_ALBLIN, Tb_FACTU_ALBLIN_VAL
> WHERE Tb_FACTU_ALBLIN.NUM_ALBARAN = @num_albaran AND
> Tb_FACTU_ALBLIN.NUM_ALBARAN = Tb_FACTU_ALBLIN_VAL.NUM_ALBARAN AND
> Tb_FACTU_ALBLIN.ID_ALBLIN = Tb_FACTU_ALBLIN_VAL.ID_ALBLIN
> GROUP BY TIPO_IVA) AS X
> WHERE Tb_FACTU_ALB_IVA.NUM_ALBARAN = @num_albaran AND
> Tb_FACTU_ALB_IVA.TIPO_IVA = X.TIPO_IVA
> if @@error <> 0 begin set @err = @@error goto MAL end
> end
>
> DELETE FROM Tb_FACTU_ALB_IVA
> WHERE NUM_ALBARAN = @num_albaran AND
> BASE_IVA = 0 AND IMPORTE_IVA = 0 AND
> IMPORTE_REC_EQUIV = 0
> if @@error <> 0 begin set @err = @@error goto MAL end
>
> importes)
> UPDATE Tb_FACTU_ALB_IVA
> set
> TPC_IVA = Tb_TIPOS_IVA.TPC_IVA,
> TPC_REC_EQUIV = Tb_TIPOS_IVA.TPC_REC_EQUIV
> FROM Tb_TIPOS_IVA
> WHERE Tb_FACTU_ALB_IVA.NUM_ALBARAN = @num_albaran AND
> Tb_FACTU_ALB_IVA.TIPO_IVA = Tb_TIPOS_IVA.TIPO_IVA
> if @@error <> 0 begin set @err = @@error goto MAL end
>
> SELECT
> @total_iva = ISNULL(SUM (IMPORTE_IVA + IMPORTE_REC_EQUIV),0)
> FROM Tb_FACTU_ALB_IVA
> WHERE NUM_ALBARAN = @num_albaran
> if @@error <> 0 begin set @err = @@error goto MAL end
>
> set @total_alb = ISNULL ((@imp_neto
> - @imp_dto_espec
> - @imp_dto_pp
> + @imp_gtos_financ
> + @imp_portes
> + @imp_embalajes
> + @imp_seguros
> + @imp_varios
> + @total_iva
> - @imp_irpf),0)
>
> A2:
> UPDATE Tb_FACTU_ALB_VAL
> set
> IMPORTE_BRUTO = @imp_bruto_alb,
> IMPORTE_DTO1 = @imp_dto1_alb,
> IMPORTE_DTO2 = @imp_dto2_alb,
> IMPORTE_DTO3 = @imp_dto3_alb,
> IMPORTE_NETO = @imp_neto,
> IMPORTE_DTO_ESPEC = @imp_dto_espec,
> IMPORTE_DTO_PP = @imp_dto_pp,
> IMPORTE_GTOS_FINANC = @imp_gtos_financ,
> BASE_IRPF = @base_irpf,
> IMPORTE_IRPF = @imp_irpf,
> TOTAL_ALB = @total_alb
> WHERE NUM_ALBARAN = @num_albaran
> select @rec = @@ROWCOUNT, @err = @@error
> if @err <> 0 goto SALIR
> if @rec = 0
> begin
> INSERT INTO Tb_FACTU_ALB_VAL
> VALUES (@num_albaran, 0,0,0,0,0,0,0,0,0,0,0)
> goto A2
> end
>
> /* PONER STATUS DE CALCULADO */
> IF EXISTS (SELECT NUM_ALBARAN FROM Tb_FACTU_ALB_STATUS
> WHERE NUM_ALBARAN = @num_albaran)
> begin
> UPDATE Tb_FACTU_ALB_STATUS
> set CALCULADO = 1
> WHERE NUM_ALBARAN = @num_ALBARAN
> if @@error <> 0 begin set @err = @@error goto MAL end
> end
> else
> begin
> INSERT INTO Tb_FACTU_ALB_STATUS
> VALUES (@num_albaran, 1)
> if @@error <> 0 begin set @err = @@error goto MAL end
> end
>
> FETCH NEXT FROM albaranes
> INTO @num_albaran, @dto_especial, @dto_p_p, @gtos_financ,
> @codigo_iva, @iva_aplicar, @irpf,
> @imp_portes, @imp_embalajes, @imp_seguros, @imp_varios
> set @control = @@FETCH_STATUS
> end
>
> CLOSE albaranes
> DEALLOCATE albaranes
>
> BIEN:
> if @hay_transaccion = 0 COMMIT TRAN Mi_Transaccion
> goto SALIR
>
> MAL:
> if @hay_transaccion = 0 ROLLBACK TRAN Mi_Transaccion
>
>
> SALIR:
> SET NOCOUNT OFF
>
> if @err IS NULL set @err = 0
>
> RETURN (@err)
>
> end



<<
> <<<<
>
>
>
> "qwalgrande" <qwalgrande*nospam*@yahoo.es> escribió en el mensaje
> news:
> > Hola.
> >
> > Creo que te he respondido, pero de todos modos, ¿puedes pasarme el


código
> y
> > te lo devuelvo con las modificaciones para que sólo devuelva el


return?
> >
> > qwalgrande
> >
> > "AC" wrote:
> >
> > > Gracias por la respuesta.
> > >
> > > Creo que no me he explicado demasiado bien. El problema está en
> determinar
> > > el/los recordset de datos que son devueltos por el procedimiento.
> > >
> > > Tengo un procedimiento 'A' que efectúa unos cálculos a partir de


unos
> > > parámetros de entrada, y que devuelve el estado final del cálculo
> mediante
> > > un código de retorno. A los que llaman a este procedimiento ( que
> > > normalmente serán otros procedimientos ) sólo les interesa recibir


este
> > > código de retorno para conocer si durante el proceso se ha producido
> alguna
> > > incidencia.
> > >
> > > Pues bien, todos los recordset procesados por el procedimiento 'A'


no
> > > interesan en absoluto que sean devueltos al que le llama. Entonces


la
> > > pregunta general es: ¿ Cómo, si se puede, evitar que un SELECT


dentro
> de un
> > > procedimiento sea devuelto como un recordset de datos?
> > >
> > > Otra forma de verlo sería: ¿ Puedo escoger cuáles de los SELECT's de


un
> > > procedimiento forman parte del retorno de datos ? Y si es así, ¿


cómo
> puedo
> > > seleccionarlos ?
> > >
> > > Espero haberme explicado mejor. Saludos.
> > >
> > > Ac
> > >
> > >
> > >
> > >
> > >
> > > "qwalgrande" <qwalgrande*nospam*@yahoo.es> escribió en el mensaje
> > > news:
> > > > Hola.
> > > >
> > > > Por lo que comentas, los recordset no los precisas para cálculos
> > > > posteriores, por lo que sólo los querrás para saber si hay o no


datos
> (o
> > > algo
> > > > similar). Tienes la función exists (significa "si hay registros en
> esta
> > > > consulta"):
> > > >
> > > > ...
> > > >
> > > > if exists(select * from sysobjects)
> > > > begin
> > > > ...
> > > > end
> > > >
> > > > Este anterior está muy bien, además ganas (un pelín) de


rendimiento,
> al no
> > > > tener que estar enviando datos de un sitio a otro y en cuanto
> encuentra un
> > > > registro, el motor deja de buscar. También puedes meter cada campo


de
> esos
> > > > recordset que no deseas retornar en variables que no uses más que


para
> > > esto
> > > > (devuelve un solo campo, tardarás menos en escribirlo).
> > > >
> > > > Hay otros métodos.
> > > >
> > > > qwalgrande
> > > >
> > > > "AC" wrote:
> > > >
> > > > > Buenos días.
> > > > >
> > > > > En SQL 2000, es posible impedir el retorno de los recordset de
> SELECT en
> > > un
> > > > > procedimiento? Se trata de un PR de cálculo y este retorno no


tiene
> > > nínguna
> > > > > utilidad. Es más, me crea problemas en el control de los


recordsets
> > > > > retornados cuando este procedimiento está anidado con otros de


los
> que
> > > sí se
> > > > > necesita controlar el retorno de datos.
> > > > >
> > > > > Saludos y muchas gracias de antemano.
> > > > >
> > > > > AC
> > > > >
> > > > >
> > > > >
> > > > >
> > >
> > >
> > >
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida