Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Problemas con la devolución de resultados (https://www.clubdelphi.com/foros/showthread.php?t=74914)

zajoma 18-07-2011 14:02:36

Problemas con la devolución de resultados
 
Hola a todos.

He creado el siguiente procedimiento en el servidor SQL

CREATE PROCEDURE [dbo].[acumula_piezas_defectuosas]
@ID_Trabajo INT, @CodDefecto INT, @NumPiezas INT
AS
BEGIN
SET IMPLICIT_TRANSACTIONS ON

BEGIN TRY

-- analiza si ya existen piezas en esta partida con el tipo de defecto

SELECT * FROM DefectosTemp
WHERE ID_Trabajo = @ID_Trabajo AND CodDefecto = @CodDefecto

IF @@ROWCOUNT > 0

-- si ya hay piezas con ese defecto acumula las piezas

UPDATE DefectosTemp SET NumPiezas = NumPiezas + @NumPiezas
WHERE ID_Trabajo = @ID_Trabajo AND CodDefecto = @CodDefecto

ELSE

-- el tipo de defecto es nuevo para la partida actual y por ello crea un
-- nuevo registro

INSERT INTO DefectosTemp
(CodDetalle, CodInstalacion, CodDefecto, NumPiezas, ID_Trabajo)

SELECT CodDetalle, CodInstalacion, @CodDefecto, @NumPiezas, @ID_Trabajo
FROM TrabajosActivos WHERE ID_Trabajo = @ID_Trabajo

COMMIT TRANSACTION
RETURN 0 -- Operación correcta
END TRY

BEGIN CATCH
ROLLBACK TRANSACTION
RETURN -4
END CATCH
END

y lo llamo con la siguiente consulta

DECLARE @Ret INT
EXECUTE @Ret = dbo.acumula_piezas_defectuosas :V0, :V1, :V2
SELECT Result = @Ret

el proceso se ejecuta correctamente pero me devuelve el primer campo del
primer select de la función en vez de @Ret

Cómo podría solucionar esto?

Espero vuestras respuestas. Gracias a todos

Casimiro Noteví 18-07-2011 14:28:17

Recuerda poner etiquetas con el código:




.

abelg 18-07-2011 17:44:38

Mira si te es lo que quieres.
Código SQL [-]
CREATE PROCEDURE [dbo].[acumula_piezas_defectuosas]
@ID_Trabajo INT, @CodDefecto INT, @NumPiezas INT, @Ret int output
AS
BEGIN
        SET IMPLICIT_TRANSACTIONS ON

        BEGIN TRY

                -- analiza si ya existen piezas en esta partida con el tipo de defecto

                SELECT * FROM DefectosTemp
                WHERE ID_Trabajo = @ID_Trabajo AND CodDefecto = @CodDefecto

                IF @@ROWCOUNT > 0

                -- si ya hay piezas con ese defecto acumula las piezas

                UPDATE DefectosTemp SET NumPiezas = NumPiezas + @NumPiezas
                WHERE ID_Trabajo = @ID_Trabajo AND CodDefecto = @CodDefecto

                ELSE

                -- el tipo de defecto es nuevo para la partida actual y por ello crea un
                -- nuevo registro

                INSERT INTO DefectosTemp
                (CodDetalle, CodInstalacion, CodDefecto, NumPiezas, ID_Trabajo)

                SELECT CodDetalle, CodInstalacion, @CodDefecto, @NumPiezas, @ID_Trabajo
                FROM TrabajosActivos WHERE ID_Trabajo = @ID_Trabajo

                COMMIT TRANSACTION
                RETURN 0 -- Operación correcta
        END TRY

        BEGIN CATCH
                ROLLBACK TRANSACTION
                RETURN -4
        END CATCH
END
-- Llamandolo de la siguiente forma
DECLARE @Ret INT
EXECUTE dbo.acumula_piezas_defectuosas :V0, :V1, :V2, @Ret Output
SELECT @Ret

mightydragonlor 18-07-2011 18:23:56

Cambia esto
Código SQL [-]
SELECT * FROM DefectosTemp
WHERE ID_Trabajo = @ID_Trabajo AND CodDefecto = @CodDefecto

IF @@ROWCOUNT > 0
por esto
Código SQL [-]
DECLARE @Conteo INT
SELECT @Conteo = COUNT(*) FROM DefectosTemp
WHERE ID_Trabajo = @ID_Trabajo AND CodDefecto = @CodDefecto

IF @@ROWCOUNT > 0--Y esto si quieres por esto otro, aunque no es necesario
IF @Conteo NOT IS NULL

abelg 19-07-2011 14:35:06

En mi solución anterior olvide cambiar la parte de Return

Código SQL [-]
-- Return = 0
-- quedaría 
Set @Ret = 0

-- y para Return = -4
Set @Ret = -4
-- luego puedes terminar con Return 0 ya no importa.


La franja horaria es GMT +2. Ahora son las 11:24:27.

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