none
Consulta Agrupada RRS feed

  • Pregunta

  • Hola como va de nuevo recurriendo a sus conocimientos. De una aplicación que no es mía, de un DBF obtengo los siguientes datos

    4	3071222542	110043	OLGA DE SIMONETTO Y OTROS SH	HABER	390,00	OC	00000082	PESOS
    5	3071222542	110043	OLGA DE SIMONETTO Y OTROS SH	HABER	15,50	OC	00000083	PESOS
    6	30714372153	110018	SOLANO S.A.	                HABER	100,00	OC	00000014	PESOS
    7	30714372153	110018	SOLANO S.A.	                HABER	926,00	OC	00000016	PESOS
    9	30714372153	110018	SOLANO S.A.	                HABER	380,00	OC	00000024	DOLARES
    10	30714372153	110018	SOLANO S.A.	                HABER	198,00	OC	00000029	DOLARES
    11	30714372153	110018	SOLANO S.A.	                HABER	29,50	OC	00000030	EUROS
    12	30714372153	110018	SOLANO S.A.	                HABER	64,00	OC	00000031	EUROS
    13	30714372153	110018	SOLANO S.A.	                HABER	490,00	OC	00000084	PESOS
    17	30714372153	110018	SOLANO S.A.	                DEBE	100,00	OC-A	00000014	PESOS
    

    Luego hice una consulta para agrupar los totales asi

      var suma= from BP in (latabladbf)
                               group BP by new
                               {
                                   BP.Cuit,
                                   BP.Tipo_Asiento,
                                   BP.Tipo_Moneda
                               } into g
                               select new
                               {
                                   CUIT = g.Key.Cuit,
                                   ASIENTO = g.Key.Tipo_Asiento,
                                   MONEDA = g.Key.Tipo_Moneda,
                                   SUMA = g.Sum(x => x.Monto)
                               }; 
    Y en la agrupación suma bien por cuit, tipo de asiento y tipo de moneda. Lo que pretendo hacer ahora es agrupar esos totales para poder tomar el saldo en tipo de asiento tengo DEBE y HABER y que sea un solo registro. Desde ya gracias 

    domingo, 3 de diciembre de 2017 12:41

Respuestas

  • No, no debes agrupar por 'Tipo_Asiento'.

    group BP by new { BP.Cuit, BP.Tipo_Moneda } into g
    select new
    {
       CUIT = g.Key.Cuit,
       DEBE = g.Where(x => x.Tipo_Asiento == "DEBE").Sum(x => x.Monto),
       HABER = g.Where(x => x.Tipo_Asiento == "HABER").Sum(x => x.Monto),                           
       SALDO = g.Sum(x => x.Tipo_Asiento == "HABER" ? x.Monto * -1 : x.Monto),
       MONEDA = g.Key.Tipo_Moneda
    };

    • Marcado como respuesta EnzoTuc40 lunes, 4 de diciembre de 2017 22:30
    lunes, 4 de diciembre de 2017 19:29
  • No, no debes agrupar por 'Tipo_Asiento'.

    group BP by new { BP.Cuit, BP.Tipo_Moneda } into g
    select new
    {
       CUIT = g.Key.Cuit,
       DEBE = g.Where(x => x.Tipo_Asiento == "DEBE").Sum(x => x.Monto),
       HABER = g.Where(x => x.Tipo_Asiento == "HABER").Sum(x => x.Monto),                           
       SALDO = g.Sum(x => x.Tipo_Asiento == "HABER" ? x.Monto * -1 : x.Monto),
       MONEDA = g.Key.Tipo_Moneda
    };

    Excelente es lo que necesitaba, una consulta mas si no es molestia como debería hacer para en caso de que no tenga valores en el debe o en el haber poner 0.Desde ya gracias 
    • Marcado como respuesta EnzoTuc40 lunes, 4 de diciembre de 2017 22:30
    lunes, 4 de diciembre de 2017 19:54
  • Puedes utilizar el operador de uso combinado de NULL: (??), por ejemplo:

    DEBE = g.Where(x => x.Tipo_Asiento == "DEBE").Sum(x => (decimal?)x.Monto) ?? 0,

    Como todas las veces que me colaboraste excelente !!!!. Muchas gracias
    • Marcado como respuesta EnzoTuc40 lunes, 4 de diciembre de 2017 22:30
    lunes, 4 de diciembre de 2017 22:30

Todas las respuestas

  • A que te refieres con "...tomar el saldo en tipo de asiento", ¿qué columna tiene el saldo?, ¿te refieres a transponer el tipo de asiento, de filas a columnas, con la única distinción de la moneda?. La información previa es clara, sin embargo -por lo menos yo- no tengo claro lo que deseas obtener.

    En base a los datos de ejemplo que has proporcionado, ¿podrías indicar el resultado que esperas?

    domingo, 3 de diciembre de 2017 19:03
  • A que te refieres con "...tomar el saldo en tipo de asiento", ¿qué columna tiene el saldo?, ¿te refieres a transponer el tipo de asiento, de filas a columnas, con la única distinción de la moneda?. La información previa es clara, sin embargo -por lo menos yo- no tengo claro lo que deseas obtener.

    En base a los datos de ejemplo que has proporcionado, ¿podrías indicar el resultado que esperas?

    Hola Willams Morales, perdón la verdad no esta muy claro. Los especifico ahora con la consulta agrupada obtengo cada cuit y el tipo de moneda y si tipo de asiento es "debe" suma y me devuelve el valor, también si el asiento es "haber"  lo que quiero hacer es, no existe la columna saldo pero si es el mismo cuit la misma moneda el total del debe restarlo al total del haber y obtener el saldo.Desde ya gracias
    lunes, 4 de diciembre de 2017 18:00
  • Hola me exprese de nuevo mal en mi consulta agrupa CUIT, ASIENTO(debe y haber) y MONEDA y me da el total

    cuando lo recorro asi

    CUIT: xxxxxx1   moneda:peso   asiento:debe    monto:$$$$$$

    CUIT: xxxxxx2   moneda:peso   asiento:debe    monto:$$$$$$

    CUIT: xxxxxx3   moneda:peso   asiento:debe    monto:$$$$$$

    CUIT: xxxxxx1   moneda:peso   asiento:haber    monto:$$$$$$esto devuelve cuando consulto y esta bien porque necesito saber por cada cuit y tipo de moneda cuanto tiene en el debe y cuanto en el haber y ahora dejo como me faltaría la consulta

    CUIT DEBE HABER SALDO MONEDA

    47 3071222542 0 405,50 -405,50 PESOS 48 30714372153 650,00 1516,00 -866,00 PESOS 49 30714372153 0 578,00 -578,00 DOLARES 50 30714372153 0 93,50 -93,50 EUROS

    Este debería ser el resultado final.

              

    lunes, 4 de diciembre de 2017 19:17
  • No, no debes agrupar por 'Tipo_Asiento'.

    group BP by new { BP.Cuit, BP.Tipo_Moneda } into g
    select new
    {
       CUIT = g.Key.Cuit,
       DEBE = g.Where(x => x.Tipo_Asiento == "DEBE").Sum(x => x.Monto),
       HABER = g.Where(x => x.Tipo_Asiento == "HABER").Sum(x => x.Monto),                           
       SALDO = g.Sum(x => x.Tipo_Asiento == "HABER" ? x.Monto * -1 : x.Monto),
       MONEDA = g.Key.Tipo_Moneda
    };

    • Marcado como respuesta EnzoTuc40 lunes, 4 de diciembre de 2017 22:30
    lunes, 4 de diciembre de 2017 19:29
  • No, no debes agrupar por 'Tipo_Asiento'.

    group BP by new { BP.Cuit, BP.Tipo_Moneda } into g
    select new
    {
       CUIT = g.Key.Cuit,
       DEBE = g.Where(x => x.Tipo_Asiento == "DEBE").Sum(x => x.Monto),
       HABER = g.Where(x => x.Tipo_Asiento == "HABER").Sum(x => x.Monto),                           
       SALDO = g.Sum(x => x.Tipo_Asiento == "HABER" ? x.Monto * -1 : x.Monto),
       MONEDA = g.Key.Tipo_Moneda
    };

    Excelente es lo que necesitaba, una consulta mas si no es molestia como debería hacer para en caso de que no tenga valores en el debe o en el haber poner 0.Desde ya gracias 
    • Marcado como respuesta EnzoTuc40 lunes, 4 de diciembre de 2017 22:30
    lunes, 4 de diciembre de 2017 19:54
  • Puedes utilizar el operador de uso combinado de NULL: (??), por ejemplo:

    DEBE = g.Where(x => x.Tipo_Asiento == "DEBE").Sum(x => (decimal?)x.Monto) ?? 0,

    lunes, 4 de diciembre de 2017 21:05
  • Puedes utilizar el operador de uso combinado de NULL: (??), por ejemplo:

    DEBE = g.Where(x => x.Tipo_Asiento == "DEBE").Sum(x => (decimal?)x.Monto) ?? 0,

    Como todas las veces que me colaboraste excelente !!!!. Muchas gracias
    • Marcado como respuesta EnzoTuc40 lunes, 4 de diciembre de 2017 22:30
    lunes, 4 de diciembre de 2017 22:30