Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-07-2011
zajoma zajoma is offline
Miembro
 
Registrado: feb 2006
Posts: 32
Poder: 0
zajoma Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 18-07-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Recuerda poner etiquetas con el código:




.
Responder Con Cita
  #3  
Antiguo 18-07-2011
abelg abelg is offline
Miembro
 
Registrado: jul 2004
Posts: 50
Poder: 20
abelg Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 18-07-2011
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 18
mightydragonlor Va por buen camino
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
__________________
mas confundido que Garavito el día del Niño.
Responder Con Cita
  #5  
Antiguo 19-07-2011
abelg abelg is offline
Miembro
 
Registrado: jul 2004
Posts: 50
Poder: 20
abelg Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
error al gravar una devolucion spia Conexión con bases de datos 4 18-10-2007 16:33:07
modulo alquiler y devolucion enecumene Conexión con bases de datos 9 06-07-2006 12:03:04
Lo importante son los resultados. Héctor Randolph Humor 1 21-12-2005 19:42:42
Limite de devolución de datos Novás SQL 1 08-04-2004 16:53:21
Consulta sin resultados!!!! Giniromero Conexión con bases de datos 8 03-10-2003 13:17:41


La franja horaria es GMT +2. Ahora son las 04:39:04.


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
Copyright 1996-2007 Club Delphi