none
Agrupar datos y mostrar el resultado en una sola fila RRS feed

  • Pregunta

  • Buen Dia

    Soy nuevo en el tema asi que suplico misercordia... la situacion es la siguiente: Estoy tratando de crear un proceso almacenado el cual me muestre el total de existencias de mis productos al buscarlos por codigo o nombre, el proceso que tengo me muestra las existencias pero  separadas por compra:

    Este es mi proceso almacenado que uso:

    create proc spbuscararticulo_venta_codigo
    @textobuscar varchar (50)
    as
    select di.iddetalle_ingreso,a.idarticulo,a.Codigo,a.Nombre,
    sum(di.stock_actual) as Cantidad,di.precio_compra,
    di.precio_venta,c.nombre as Categoria, p.nombre as Presentacion
    from articulo a inner join categoria c
    on a.idcategoria=c.idcategoria
    inner join presentacion p
    on a.idpresentacion = p.idpresentacion
    inner join detalle_ingreso di
    on a.idarticulo=di.idarticulo
    inner join ingreso i
    on i.idingreso=di.idingreso
    where a.codigo=@textobuscar
    and di.stock_actual>0
    and i.estado<>'ANULADO'
    group by di.iddetalle_ingreso,a.idarticulo,a.Codigo,a.Nombre,
    di.stock_actual,di.precio_compra,
    di.precio_venta,c.nombre, p.nombre

    y quisiera que me las muestre la existencia total de todas la compras - las ventas realizadas de esta forma:

    Candela   -   240   -   8.62  -  15  -  Repuestos  -  Combo

    Estoy utilizando SQL SERVER 2016 - VISUAL STUDIO 2015 C# El concepto del proyecto es un punto de venta.

    Gracias de antemano por su ayuda!!.

    miércoles, 17 de mayo de 2017 23:13

Respuestas

  • ¿Has ejecutado el procedimiento desde Management Studio?, ¿no obtienes resultados? Lo primero es revisar si el procedimiento está correctamente escrito y si retorna los datos esperados, luego trabajas con el desde tu aplicación.

    Has el siguiente cambio en el procedimiento almacenado:

    CREATE PROCEDURE dbo.spbuscararticulo_venta 
        @textobuscar VARCHAR(50)
    AS
    BEGIN
        SELECT 	   
    	   a.idarticulo,
    	   a.Codigo,
    	   a.Nombre,
    	   SUM(di.stock_actual) AS Cantidad,
    	   AVG(di.precio_compra) AS PrecioCompra,
    	   AVG(di.precio_venta) AS PrecioVenta,
    	   c.nombre AS Categoria,
    	   p.nombre AS Presentacion
        FROM 
    	   articulo a
    	   INNER JOIN categoria c ON a.idcategoria = c.idcategoria
    	   INNER JOIN presentacion p ON a.idpresentacion = p.idpresentacion
    	   INNER JOIN detalle_ingreso di ON a.idarticulo = di.idarticulo
    	   INNER JOIN ingreso i ON i.idingreso = di.idingreso
        WHERE 
    	   (a.Codigo LIKE '%' + @textobuscar + '%' OR a.Nombre LIKE '%' + @textobuscar + '%')
    	   AND di.stock_actual > 0
    	   AND i.estado <> 'ANULADO'
        GROUP BY 
    	   a.idarticulo, a.Codigo, a.Nombre, c.nombre, p.nombre;
    END
    GO

    - Utiliza Management Studio para realizar las pruebas respectivas:

    EXECUTE dbo.spbuscararticulo_venta 'SomeValue';
    GO

    Ambos métodos de búsqueda hacen lo mismo, utiliza un sólo método y que sea el procedimiento el defina sobre que columna buscar

    //Metodo para ocultar columnas
    private void OcultarColumnas()
    {
    	this.dataListado.Columns[0].Visible = false;
    }
    
    //Metodo MostrarArticulo
    private void MostrarArticulo_Venta()
    {
    	this.dataListado.DataSource = NVenta.MostrarArticulo_Venta(this.txtBuscar.Text);
    	this.OcultarColumnas();
    	lblTotal.Text = "Total de Registros: " + Convert.ToString(dataListado.Rows.Count);
    }
    
    private void btnBuscar_Click(object sender, EventArgs e)
    {
    	this.MostrarArticulo_Venta_Codigo();
    }


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Jorge_R jueves, 18 de mayo de 2017 5:16
    jueves, 18 de mayo de 2017 0:29

Todas las respuestas

  • Vamos! no es para suplicar tanto, ya tienes el 95% del trabajo resuelto.

    CREATE PROCEDURE dbo.spbuscararticulo_venta_codigo 
        @textobuscar VARCHAR(50)
    AS
    BEGIN
        SELECT 	   
    	   a.idarticulo,
    	   a.Codigo,
    	   a.Nombre,
    	   SUM(di.stock_actual) AS Cantidad,
    	   AVG(di.precio_compra) AS PrecioCompra,
    	   AVG(di.precio_venta) AS PrecioVenta,
    	   c.nombre AS Categoria,
    	   p.nombre AS Presentacion
        FROM 
    	   articulo a
    	   INNER JOIN categoria c ON a.idcategoria = c.idcategoria
    	   INNER JOIN presentacion p ON a.idpresentacion = p.idpresentacion
    	   INNER JOIN detalle_ingreso di ON a.idarticulo = di.idarticulo
    	   INNER JOIN ingreso i ON i.idingreso = di.idingreso
        WHERE 
    	   a.codigo = @textobuscar
    	   AND di.stock_actual > 0
    	   AND i.estado <> 'ANULADO'
        GROUP BY 
    	   a.idarticulo, a.Codigo, a.Nombre, c.nombre, p.nombre;
    END
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 17 de mayo de 2017 23:28
  • Hola Jorge_R

    No hay necesidad de pedir misericordia, tranquilo. Solo te falta promediar el precio_compra y el precio_venta. Recuerda que en Sql el promedio lo obtienes con AVG (Transact-SQL)

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    miércoles, 17 de mayo de 2017 23:31
  • Gracias por tu ayuda.. Solo que ahora no me muestra nada al consultar, no se que podrá ser... mi codigo c# del formulario es el siguiente:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;

    using CapaNegocio;

    namespace CapaPresentacion.Consultas
    {
        public partial class FrmConsulta_Stock_Articulos : Form
        {
            public FrmConsulta_Stock_Articulos()
            {
                InitializeComponent();
            }

            //Metodo para ocultar columnas
            private void OcultarColumnas()
            {
                this.dataListado.Columns[0].Visible = false;
                this.dataListado.Columns[1].Visible = false;
                this.dataListado.Columns[2].Visible = false;

            }
      
            //Metodo MostrarArticulo_Venta_Nombre
            private void MostrarArticulo_Venta_Nombre()
            {
                this.dataListado.DataSource = NVenta.MostrarArticulo_Venta_Nombre(this.txtBuscar.Text);
                this.OcultarColumnas();
                lblTotal.Text = "Total de Registros: " + Convert.ToString(dataListado.Rows.Count);
            }

            //Metodo BuscarArticulo_Venta_Codigo
            private void MostrarArticulo_Venta_Codigo()
            {
               this.dataListado.DataSource = NVenta.MostrarArticulo_Venta_Codigo(this.txtBuscar.Text);
               this.OcultarColumnas();
               lblTotal.Text = "Total de Registros: " + Convert.ToString(dataListado.Rows.Count);
            }
            private void FrmConsulta_Stock_Articulos_Load(object sender, EventArgs e)
            {
                
            }

            private void btnBuscar_Click(object sender, EventArgs e)
            {
                if (cbBuscar.Text.Equals("Codigo"))
                {
                    this.MostrarArticulo_Venta_Codigo();
                }
                else if (cbBuscar.Text.Equals("Nombre"))
                {
                    this.MostrarArticulo_Venta_Nombre();

                }
            }
        }
    }

    miércoles, 17 de mayo de 2017 23:55
  • ¿Has ejecutado el procedimiento desde Management Studio?, ¿no obtienes resultados? Lo primero es revisar si el procedimiento está correctamente escrito y si retorna los datos esperados, luego trabajas con el desde tu aplicación.

    Has el siguiente cambio en el procedimiento almacenado:

    CREATE PROCEDURE dbo.spbuscararticulo_venta 
        @textobuscar VARCHAR(50)
    AS
    BEGIN
        SELECT 	   
    	   a.idarticulo,
    	   a.Codigo,
    	   a.Nombre,
    	   SUM(di.stock_actual) AS Cantidad,
    	   AVG(di.precio_compra) AS PrecioCompra,
    	   AVG(di.precio_venta) AS PrecioVenta,
    	   c.nombre AS Categoria,
    	   p.nombre AS Presentacion
        FROM 
    	   articulo a
    	   INNER JOIN categoria c ON a.idcategoria = c.idcategoria
    	   INNER JOIN presentacion p ON a.idpresentacion = p.idpresentacion
    	   INNER JOIN detalle_ingreso di ON a.idarticulo = di.idarticulo
    	   INNER JOIN ingreso i ON i.idingreso = di.idingreso
        WHERE 
    	   (a.Codigo LIKE '%' + @textobuscar + '%' OR a.Nombre LIKE '%' + @textobuscar + '%')
    	   AND di.stock_actual > 0
    	   AND i.estado <> 'ANULADO'
        GROUP BY 
    	   a.idarticulo, a.Codigo, a.Nombre, c.nombre, p.nombre;
    END
    GO

    - Utiliza Management Studio para realizar las pruebas respectivas:

    EXECUTE dbo.spbuscararticulo_venta 'SomeValue';
    GO

    Ambos métodos de búsqueda hacen lo mismo, utiliza un sólo método y que sea el procedimiento el defina sobre que columna buscar

    //Metodo para ocultar columnas
    private void OcultarColumnas()
    {
    	this.dataListado.Columns[0].Visible = false;
    }
    
    //Metodo MostrarArticulo
    private void MostrarArticulo_Venta()
    {
    	this.dataListado.DataSource = NVenta.MostrarArticulo_Venta(this.txtBuscar.Text);
    	this.OcultarColumnas();
    	lblTotal.Text = "Total de Registros: " + Convert.ToString(dataListado.Rows.Count);
    }
    
    private void btnBuscar_Click(object sender, EventArgs e)
    {
    	this.MostrarArticulo_Venta_Codigo();
    }


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Jorge_R jueves, 18 de mayo de 2017 5:16
    jueves, 18 de mayo de 2017 0:29
  • ¿Has ejecutado el procedimiento desde Management Studio?, ¿no obtienes resultados? Lo primero es revisar si el procedimiento está correctamente escrito y si retorna los datos esperados, luego trabajas con el desde tu aplicación.

    Has el siguiente cambio en el procedimiento almacenado:

    CREATE PROCEDURE dbo.spbuscararticulo_venta 
        @textobuscar VARCHAR(50)
    AS
    BEGIN
        SELECT 	   
    	   a.idarticulo,
    	   a.Codigo,
    	   a.Nombre,
    	   SUM(di.stock_actual) AS Cantidad,
    	   AVG(di.precio_compra) AS PrecioCompra,
    	   AVG(di.precio_venta) AS PrecioVenta,
    	   c.nombre AS Categoria,
    	   p.nombre AS Presentacion
        FROM 
    	   articulo a
    	   INNER JOIN categoria c ON a.idcategoria = c.idcategoria
    	   INNER JOIN presentacion p ON a.idpresentacion = p.idpresentacion
    	   INNER JOIN detalle_ingreso di ON a.idarticulo = di.idarticulo
    	   INNER JOIN ingreso i ON i.idingreso = di.idingreso
        WHERE 
    	   (a.Codigo LIKE '%' + @textobuscar + '%' OR a.Nombre LIKE '%' + @textobuscar + '%')
    	   AND di.stock_actual > 0
    	   AND i.estado <> 'ANULADO'
        GROUP BY 
    	   a.idarticulo, a.Codigo, a.Nombre, c.nombre, p.nombre;
    END
    GO

    - Utiliza Management Studio para realizar las pruebas respectivas:

    EXECUTE dbo.spbuscararticulo_venta 'SomeValue';
    GO

    Ambos métodos de búsqueda hacen lo mismo, utiliza un sólo método y que sea el procedimiento el defina sobre que columna buscar

    //Metodo para ocultar columnas
    private void OcultarColumnas()
    {
    	this.dataListado.Columns[0].Visible = false;
    }
    
    //Metodo MostrarArticulo
    private void MostrarArticulo_Venta()
    {
    	this.dataListado.DataSource = NVenta.MostrarArticulo_Venta(this.txtBuscar.Text);
    	this.OcultarColumnas();
    	lblTotal.Text = "Total de Registros: " + Convert.ToString(dataListado.Rows.Count);
    }
    
    private void btnBuscar_Click(object sender, EventArgs e)
    {
    	this.MostrarArticulo_Venta_Codigo();
    }


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    Gracias!! Willams Morales y Brayan De La Cruz, con esto logre obtener el resultado que queria..


    Dios los bendiga!! espero poder seguir contando con su apoyo.. 


    • Editado Jorge_R viernes, 19 de mayo de 2017 16:10
    jueves, 18 de mayo de 2017 5:30