none
Procedimiento almacenado: Seleccionar datos e insertar en tabla detalle tomando en cuenta el id del maestro. RRS feed

  • Pregunta

  • Hola

    Tengo el siguiente procedimiento:

    CREATE procedure [dbo].[uspMaestroDetalle]
    
    AS
    
    BEGIN
    BEGIN TRANSACTION;  
    
     BEGIN TRY
    	 --SET NOCOUNT ON added to prevent extra result sets from
    	 --interfering with SELECT statements.
    	SET NOCOUNT ON;
    	
    	DECLARE @monto_neto DECIMAl(18, 0)
    	DECLARE @Id_Empleado INT
    	DECLARE @existe INT
    	DECLARE @monto_neto_det DECIMAl(18, 0)
    
    
       SET @monto_neto=(SELECT sum(v.monto) as monto_total FROM dbo.Ventas v)
     
    	
    	 --Insert statements for procedure here
    	INSERT INTO  dbo.Empleados
    	 (
    	  nombre,
    	  ventas
    	 )
    	 VALUES
    	 (
    	   	'ruyz',
    	   	@monto_neto
    	 )
    	 
    	 SELECT @Id_Empleado= SCOPE_IDENTITY()
    	 
    	 
    	 SET @existe = (SELECT 1 from dbo.Empleados WHERE idEmpleados = @Id_Empleado)
    
       IF (@existe = 1)
        BEGIN
     
    	SELECT
    		@monto_neto_det = sum(p.monto2)
    	FROM dbo.Ventas2 p 
    		
    		 
    	INSERT INTO dbo.EmpleadosDetalle
              (idEmpleado,
                montoVenta1,
                montoVenta2
               )
         VALUES(
                @Id_Empleado,
                @monto_neto,
                @monto_neto_det
    			)
         
        END
    
      END TRY
        
      BEGIN CATCH  
    	SELECT ERROR_NUMBER() AS ErrorNumber,
    		       ERROR_SEVERITY() AS ErrorSeverity,
    		       ERROR_STATE() AS ErrorState,
    		       ERROR_LINE() AS ErrorLine,
    		       ERROR_MESSAGE() AS ErrorMessage; 
    
    	   IF @@TRANCOUNT > 0  
    		  ROLLBACK TRANSACTION;  
       END CATCH;  
    
       IF @@TRANCOUNT > 0  
         COMMIT TRANSACTION; 
        
    END

    El problema que tengo es que en la tabla dbo.EmpleadoDetalle, solamente guarda la ultima fila de la tabla dbo.Ventas2, cuando deberia insertar todos los datos.

    Si alguien pudiera mejorar este procedimiento estaría agradecido.

    Envio la BD: BD_Empleados_Ventas

    Saludos.

    jueves, 4 de mayo de 2017 20:13

Respuestas

  • En esta instrucción que pones solo hay un insert por lo tanto solo se inserta la suma de lo que haya en ventas2
    IF (@existe = 1)
        BEGIN
     
    	SELECT
    		@monto_neto_det = sum(p.monto2)
    	FROM dbo.Ventas2 p 
    		
    		 
    	INSERT INTO dbo.EmpleadosDetalle
              (idEmpleado,
                montoVenta1,
                montoVenta2
               )
         VALUES(
                @Id_Empleado,
                @monto_neto,
                @monto_neto_det
    			)
         
        END
    

    Si quieres insertar todos los valores sería algo así como

    INSERT INTO dbo.EmpleadosDetalle
              (idEmpleado,
                montoVenta1,
                montoVenta2
               )
    select @idempleado,@montoneto,monto2 from dbo.ventas2


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    viernes, 5 de mayo de 2017 7:25
    Moderador

Todas las respuestas

  • Hola Joseph:

    El procedimiento inserta en una tabla maestro "Empleado", hace consultas de dos tablas Venta y Venta2 para luego insertar en una tabla detalle "EmpleadoDetalle", el problema que tengo es que en la tabla EmpleadoDetalle unicamente inserto el ultimo registro de la tabla Venta2.

    ¿Sabes como insertar todos los datos de una tabla a una detalle? ya tengo el id de la insercion de la tabla Empleado con:

     SELECT @Id_Empleado= SCOPE_IDENTITY()

    Puedes revisar en la BD.

    jueves, 4 de mayo de 2017 20:30
  • En esta instrucción que pones solo hay un insert por lo tanto solo se inserta la suma de lo que haya en ventas2
    IF (@existe = 1)
        BEGIN
     
    	SELECT
    		@monto_neto_det = sum(p.monto2)
    	FROM dbo.Ventas2 p 
    		
    		 
    	INSERT INTO dbo.EmpleadosDetalle
              (idEmpleado,
                montoVenta1,
                montoVenta2
               )
         VALUES(
                @Id_Empleado,
                @monto_neto,
                @monto_neto_det
    			)
         
        END
    

    Si quieres insertar todos los valores sería algo así como

    INSERT INTO dbo.EmpleadosDetalle
              (idEmpleado,
                montoVenta1,
                montoVenta2
               )
    select @idempleado,@montoneto,monto2 from dbo.ventas2


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    viernes, 5 de mayo de 2017 7:25
    Moderador
  • Gracias Miguel Egea Gómez:

    Es mejor así como indicas.

    Saludos.

    viernes, 26 de mayo de 2017 14:56