none
Agrupar DatagridView con C# RRS feed

  • Pregunta

  • Buenas tardes, tengo un DatagridView, lo estoy trabajando con C# con registros idénticos o pudiera contener distintos, pero quiero agrupar los registros idénticos y sumar la columna monto para la agrupación. Anexo imágen de lo que tengo y el resultado que he intentado obtener. Muchas gracias de antemano.

    miércoles, 18 de abril de 2018 0:34

Todas las respuestas

  • La agrupación de los datos no es algo que le compete al DGV.  Simplemente agrupe los datos y asigne la agrupación resultante al DGV.

    La agrupación suele pedírsele al motor de base de datos en uso.  Usualmente una sentencia SELECT con la cláusula GROUP BY.

    ¿Tendría usted algún problema en implementar algo así?  ¿O será que lo que busca es algo distinto a lo que he descrito?


    Jose R. MCP
    Code Samples

    miércoles, 18 de abril de 2018 1:06
    Moderador
  • Gracias por responder. De hecho hago las agrupaciones del lado de la base de datos, pero en éste caso busco insertar ya agrupada la información. He pensado guardar los datos en una tabla auxiliar, agrupar esa información y ahí insertar ya la información previamente agrupada, pero busco una forma de hacerlo en el lenguaje y posterior ya hacer la inserción en la tabla. He visto ejemplos realizados en LINQ pero aun no consigo implementarlo para obtener lo que busco. Gracias por la ayuda
    miércoles, 18 de abril de 2018 2:29
  • ¿Por qué desea persistir en una tabla los resultados de la agrupación?  Normalmente este tipo de datos es un tipo que cambia constantemente conforme registros se agregan a la base de datos.  No es usual para nada persistirlos y lo usual es siempre calcularlos.

    Si hace las agrupaciones del lado de base de datos, ¿para qué necesita un DGV?  Puede hacer todo directamente en base de datos y no tiene que ir a la app y luego volver.  Es 100% innecesario.  Supongo que esta es la parte que me cuesta trabajo entender:  ¿Qué papel cree usted que el DGV deba jugar en el proceso de calcular y luego persistir los resultados del cálculo?  Porque todo el proceso es posible sin él.


    Jose R. MCP
    Code Samples

    miércoles, 18 de abril de 2018 5:35
    Moderador
  • Tiene toda la razón, en éste caso el DGV si tiene un papel clave, ya que el usuario es el que captura ésta información, pero el usuario puede capturar registros idénticos con monto igual o distinto, entonces es ahí que necesito la agrupación para que esos registros sean unificados antes de guardarlos a la base de datos de la tabla en donde deben ya figurar unificados.
    miércoles, 18 de abril de 2018 14:28
  • Ok, entonces usted desea que el usuario busque/digite registros en una grilla, luego que el programa, a la hora de guardar, agrupe.

    Lo que puede hacer es:

    1. Proveer la grilla para que el usuario seleccione/digite los registros.
    2. Proveer un botón de Guardar, que tomaría los registros sin agrupar y los envía a un procedimiento almacenado a la base de datos.
    3. La base de datos toma los registros, calcula la agrupación, la guarda y la devuelve (con un SELECT).
    4. El programa de Windows Forms lee el resultado, vacía la grilla y carga el resultado.

    Jose R. MCP
    Code Samples

    miércoles, 18 de abril de 2018 16:37
    Moderador
  • ¿El procedimiento almacenado recibe la información, él mismo agrupa y él mismo hace la inserción? O sería el siguiente orden:

    1. Una vez que el usuario pulsa Guardar, se guardan los datos en una tabla auxiliar sin agrupación (mediante un          procedimiento almacenado).

    2. Un segundo procedimiento almacenado insertará en la tabla principal los valores de la tabla auxiliar ya agrupados

    3. Cargar el DGV con la información de la tabla principal, osea ya agrupados.

    ¿Se puede evitar ese proceso de guardado en tabla auxiliar siendo que el procedimiento almacenado tome la información, él mismo agrupe y él mismo inserte en la tabla principal?

    jueves, 19 de abril de 2018 0:09
  • ¿El procedimiento almacenado recibe la información, él mismo agrupa y él mismo hace la inserción?

    Correcto.  A menos claro, que también necesite guardar la información que recibe a manera de respaldo o algo similar.  Y aún así, el mismo procedimiento almacenado también puede hacer eso.  O sea, un único SP lo puede todo.


    Jose R. MCP
    Code Samples

    jueves, 19 de abril de 2018 0:17
    Moderador
  • Interesante. El SP toma la información para procesarla en un Cursor? Variable Table? podría guiarme por favor a realizar el proceso a manera de código?
    jueves, 19 de abril de 2018 16:52
  • En SQL Server, uno puede tener un parámetro tipo tabla y puede usarse como tabla.

    Create Type dbo.DatosAgrupables As Table
    (
        Usuario nvarchar(100) Not Null
        , IdCategoria bigint Not Null
        , Monto money Not Null
    );
    Go
    
    Create Procedure dbo.uspAgruparDatos
        @datos dbo.DatosAgrupables readonly
    As
    Begin
        Set NoCount On;
    
        Insert Into dbo.TablaDeAgrupados
        Select
            Usuario
            , IdCategoria
            , Sum(Monto)
        From
            @datos
        Group By
            Usuario
            , IdCategoria
        ;
        Return @@Error;
    End
    Go
    


    Jose R. MCP
    Code Samples

    jueves, 19 de abril de 2018 17:14
    Moderador