sábado, 3 de octubre de 2009

C# - Crystal Reports – Sumatoria Condicional (Conditional Sum)

 
Introducción

Cuando se requiere trabajar con Crystal en la creación de reportes un punto interesante es poder agregar condiciones a los campos de agregación, como se una sumatoria al final de la pagina, para ello tenemos herramientas en Crystal que utilizaremos en este ejemplo

Desarrollo

Para el ejemplo haremos uso de un ambiente simple en donde tendremos una lista de usuarios y sus asistencias a determinado evento.

Para ello ene le ejemplo se hará uso como origen de datos un DataSet Tipado, el cual era cargado en este caso de forma manual, pero bien podría hacerse accediendo a una base de datos

Como próximo paso se creara el reporte agregando a la sección de detalle los campos definidos en el DataSet.

Una vez que tenemos el reporte armado, se procederá a la creación del campo de sumatoria, para ello se realiza un click sobre el campos al cual se le quiere aplicar la suma y se selecciona Insert –> Running Total …

En el dialogo que se visualizara se podrá cambiar el nombre en este caso se utilizo “AsistenciasTotal”, y la parte mas importante será definir la formula que usara, para ello se deberá utilizar la opción que dice “Use a formula”

Al presionarla se visualizara otro cuadro en donde se introducirá la formula que es requerida en este caso filtraremos por un nombre, por ejemplo “Carlos”, por último se acepta el cuadro con el botón superior “Save and close”.

Cuando se acepte el ultimo cuadro seguramente los campos pueden quedar encimados, pera solucionarlo solo hace falta moverlos, ubicándolos donde sea requerido.

El reporte final, luego de ubicar correctamente los campos, quedara de esta forma:

Y al ejecutarlo el resultado será el siguiente:

Debe notarse además que si se visualiza el “Field Explorer” se encontrara el campo de sumatoria recién creado.

 

[C#]
 

42 comentarios:

  1. Hola Leandro,

    Me preguntaba como hago para imprimir un reporte desde código, sin presionar el botón print, de la barra de herramientas del reportviewer. He visto q hay q crear un printdocument, y usar el evento printpage, pero tendria q exportar el reporte, me parece engorroso. Habrá un forma más sencilla, como la de lanzar el método print al mostrar el preview del reporte??

    Gracias.

    ResponderEliminar
  2. hola Pierina

    Disculpa la tardanza en la respuesta

    Algo no me quedo claro, si te refieres al ReportViewer entonces no estas usando Crystal, sino que se trata de Reporting Service, o me equivoco ? el archivo que usas tiene la extension .rpt, o es .rdlc ?

    Si se trata de Crystal podrias usar el metodos

    ReportDocument.PrintToPrinter Method

    de esta forma ya no necesitas el CrystalReportViewer, sino que creando la instancia del ReportDocument puedes imprimirlo.

    saludos

    ResponderEliminar
  3. Hola Leandro te hago una consulta con respecto al crystal report.
    Estoy haciendo un sistema en el que tengo que mostrar muchos informes que derivan de diferentes formularios con diferente información. La pregunta es para cada informe debo crear un crystalreport con un dataset y utilizar el mismo crystalReportViewer?(lo q hago actualmente es crear un dataset tipiado y se lo asigno al crystalreport que he creado y lo muestro con un crystalReportViewer). O puedo crear un solo crystal report y desde el codigo ir asignando y quitando y/o agregando columnas al reporte?
    Desde ya muchas gracias

    ResponderEliminar
  4. hola tintaroja

    La pregunta es para cada informe debo crear un crystalreport con un dataset y utilizar el mismo crystalReportViewer?

    ojo porque son cosas distintas

    Por un lado tienes el reporte y el dataset, debes crear uno por reporte, no aconsejaria entrar en el juego de agregar o quitar columnas dinamicamente porque va a ser muy tedioso de realizar, (si es que es factible), Crystal no se caracterisa por ser flexible ni dinamico en este aspectos.

    Por el otro lado tienes el CrystalReportViewer, este es solo un control para visualizar los reportes que hicistes en el paso previo, de este si puedes tener uno solo he ir cargando los .rpt o instancias de reporte.

    Se tiende a creer un Form con un CrystalReportViewer y luego pasarle la instancia del reporte (ya asignada con los datos) que quieres visualizar en ese Form que se abre, similar a un popup. En ese Form si puedes tener un solo control de visualizacion, pero reporte aconsejaria hagas uno por cada pantalla, el tema de dinamismo no lo veo muy conveniente.


    saludos

    ResponderEliminar
  5. Como estas Leandro necesito restar dos campos en crystal reports

    ResponderEliminar
  6. hola Marcelo

    Seguramente debas crear una formula que aplique el calculo que buscas

    podrias crear una formula

    {campo1} - {campo2}

    Aunque si te animas a usar dataset tipados, podrias definir el calculo directo en los datos, en la query cuandoc argas el dataset tipados y ali realizar esta operacion para que en Crystal solo se reciban los datos ya calculados.

    saludos

    ResponderEliminar
  7. Hola Leandro! tengo una duda y ojala puedas ayudarme! en un reporte seccionado en grupos tengo
    factura fechafactura monto (En el encabezado de grupo) y en el detalle tengo
    fechapago y monto del pago
    Necesito sumar el monto de la factura siempre q la fecha sea la q indique, pero si el pago tiene dos registros me evalua doble, como hago para q solo evalue una vez. gracias

    ResponderEliminar
  8. hola Isis

    Algo que me llama la atencion es que tengas en el encabezado algo compuesto por trees campos, y que ademas sea un monto uno de ellos

    el importe no deberia ser un campo que tengas en una tabla, sino que deberia calaularse por la suma de todos los montos individuales de los detalles

    es por eso que ese monto del grupo deberias quitarlo, para solo dejar el campos sumatoria del detalle
    y que este claculo el monto

    o sea en el encabezado solo deberias tener factura y fecha factura
    y en el detalle la fechapago monto
    pero adiocionalmente el total deberia ser solo la suma del importe del detalle, no usar algun campo calculado del encabezado, porque es logico que lo agregara al calculo

    saludos

    ResponderEliminar
  9. Hola leandro, una consulta estoy haciendo un reporte, en el cual visualizo unos datos numericos, como haria para poder sumar solo los datos que me muestra el reporte y no los que jala el campo, digo esto ya que por unas condiciones muestro ciertos valores y solo necesito sumar los valores que se ven en el reporte.
    Gracias.

    ResponderEliminar
  10. hola Manuel Armando

    La verdad no entendi la consulta, ya que la info que se muestra en el reporte deberia ser la misma que jala el campo, o sea la informacion proviene de la misma consulta, lo que ves en el reporte es lo mismo que el campo tiene, salvo que agregues filtros.


    saludos

    ResponderEliminar
  11. Hola Leandro,
    Lo que pasa es que cuando muestro los datos en el reporte, si cumple una condición que muestre cierto grupo de datos, sino que muestre otro grupo.
    El detalle es que cuando inserto un total por grupo me suma todos los valores incluidos los que no se muestran por la condición.
    Me gustaría saber si se hacer que solo sume los datos que se muestran en el reporte.

    Gracias.

    ResponderEliminar
  12. Hola leandro quise descargar este articulo, pero no puedo, haber si puedes corregir ese problemita.

    Estan muy buenos tus articulos sobre Çrystal Report...

    ResponderEliminar
  13. hola Manuel Armando

    estas definiendo en la formula de la sumatoria que aplique la misma regla que usas para ocultar los registros ?

    esto es clave para que la sumatoria conozca que registros se estan quitando

    saludos

    ResponderEliminar
  14. hola Luis Muñoz Hidalgo

    tuve problemas hace tiempo con el SkyDrive por eso algunso articulos perdieron los links, algunos articulos fueron actualizandose, pero se me pasaron otros

    este ya estaria actualizado

    saludos

    ResponderEliminar
  15. Hola, como seria en el caso de que la condicion no exista, porque me muestra nulo y lo que quiero es que muestre la suma = '0'

    ResponderEliminar
  16. hola, como hago en caso de que la condición no se cumpla, en ese caso muestra null, pero quiero que muestre aunquesea el valor cero, gracias de antemano

    ResponderEliminar
  17. hola julio anyosa

    no has evaluado por medio de una formaula en el campo de poner una conficion que valide si la info es null que muestre un cero

    a donde apunto es que una formula en el campo podrias definir esto que planteas

    saludos

    ResponderEliminar
  18. Hola Leandro, pero la verdad ya he intentado de todo y no me sale, lo que pasa que debe mostrar el total de ventas de productos por boleta, factura o ticket, para todos esos casos cumple dos condiciones, que no esté anulado y que sea o boleta, o factura o ticket. y si en el día no se ha vendido por ejemplo ninguna boleta, en ese campo donde debe mostrarse aparece vacio, y al final debo sumar todos pero cuando uno de ellos es vacio el campo donde debe mostrarse la suma de estos tres tipos de comprobantes tambien aparece vacio:

    if {Comprobante.FlgEst} = true and {Comprobante.NomTipoComprobante} = 'TICKET' then
    sum({Comprobante.Pagado})
    else
    0.00

    hice algo asi pero igual no me sale

    ResponderEliminar
  19. hola julio anyosa

    no sera que aparece vacio porque estas tratando el vacio como un valor numerico y para realziar calculos este no es compatible

    deberas hacer que el campo, a nivel de datos en el datatable venga con un cero, no lo hagas sino sale a nivel de reporte, hazlo a nivel de datos esta adaptacion para ponder informacion donde no la hay


    saludos

    ResponderEliminar
  20. como se haria esto que mencionas de crystal reports pero en un rldc, ya que no se como hacer una sumatoria condicional en un textbox de un reporte que estoy realizando.

    gracias por su atencion y respuesta

    ResponderEliminar
  21. hola Unknown

    la verdad no estoy seguro, porque nunca he aplciado este mismo concepto en reporting service

    aunque quizas esto de una pista

    Conditional sum in reporting services

    como veras aqui tambien hay formulas, pero la verdad no lo he probado

    saludos

    ResponderEliminar
  22. Saludos Leandro,

    Con respecto a las sumatorias en Crystal, sabrás como puedo hacer para crear sumatorias de una fórmula??

    Mi formula se llama: "{@04 Ausencias Valor (Max 408 x Max 401)}" pero si hago esto:

    SUM({@04 Ausencias Valor (Max 408 x Max 401)})

    Me dice que ese campo no se pude resumir.

    Por tu ayuda muy agradecido!!!

    ResponderEliminar
  23. hola Rop

    disculpa la demora

    la verdad nunca he intentado sumar una formula, por eso no sabria decirte si se puede hacerlo lo que planteas

    lo que si no me qudo claro es si ese campo de formula termina devolviendo un valor numerico como respuesta, porque ojo sino devuelve un numerio valido seguro no podra sumarlo

    saludos

    ResponderEliminar
  24. hola leandro con se podria hacer lo mismo pero en lenguaje VB.NET no VB C# ES DECIR QUE ME SUME TODOS LOS NUMERO DE UNA COLUMNA EN CRISTAL REPOSRTS

    ResponderEliminar
  25. hola BLAIDER200

    en realidad la sumatoria ni siquiera la realiza c# es el propio crystal quien la realiza

    saludos

    ResponderEliminar
  26. Yo tengo una gran duda.

    Estoy sacando un precio ponderado entre una columna PRECIO y otra PESO NETO.

    El problema esta que no debe incluirse los registros con PRECIOS menores a 5. intente {TABLA.PRECIO} > 5.

    Pero no me devuelve ningún valor.

    simplemente cuando tengo un precio menor a 5 no me suma nada.,

    ResponderEliminar
  27. hola Juan

    como es que defines el origen de datos del reporte ? usas un dataset tipado o conectas el reporte directo a la db

    porque podrias filtrar esto directo directo en la query que usas para tomar los datos (de la db) que luego asignas al reporte, asi no tienes que filtrar nada dentro del reporte, lo haces antes de asignar los datos

    saludos

    ResponderEliminar
  28. Hola Leandro,

    Bueno e visto lo que haces pero a mi no me aparece la funcion de sum del crystal reports estoy usando Visual Studio 2010 y el Crystal Reports que le corresponde y en ninguna opcion me da la opcion de sum para realizar la suma de una columna podrias ayudarme.

    ResponderEliminar
  29. hola lil junior

    bueno la verdad es raro lo que comentas, pero me pregunto, estaras colocando los campos en la seccion adecuada del reporte

    digo quizas si pones los campos en el header o alguna otra seccion no funcione, pero si los ubicas en el Details si

    saludos

    ResponderEliminar
  30. Hola Leandro, estoy relaizando la misma funcionalidad del SUM, y quisiera saber cuando el sum devuelve 0 no me muestra ningún valor en el reporte y quisiera que muestre 0.00 sabrías darme una solución ? Gracias de Antemano

    ResponderEliminar
  31. cOMO HARIA PARA QUE ME SUME TODA LA COLUMNA SIN USAR FILTRO, SALUDOS

    ResponderEliminar
  32. hola jhording


    sino necesitas ningun filtro solo define un campo de suma simple

    Crystal Reports Summary Fields

    saludos

    ResponderEliminar
  33. Hola, Leandro ..

    Hace poco se me planteó una cuestión en relación a las sumas condicionales de campos no agrupados.

    La solución que tú propones consiste en crear una fórmula por cada registro que queramos sumar, pero ¿Y si quiero hacer que los registros se sumen utilizando una sola formula? Por ejemplo si tengo un gran número de registros y no sé cuáles aparecerán en el informe porque se pueden utilizar filtros.

    Por ejemplo:

    01012014 - Código_01 - XXXX - VIVV
    01012014 - Código_01 - XUUX - FVVV
    02012014 - Código_03 - XXYY - VVPP
    03012014 - Código_02 - XOOX - VVVV
    04012014 - Código_01 - XXZZ - UUVV
    04012014 - Código_03 - GGXX - VVRR
    05012014 - Código_01 - XXII - VSVV

    -----------------------------------
    Total Código_01 : 4
    Total Código_02 : 1
    Total Código_03 : 2
    -----------------
    Total Códigos : 7

    Lo que no quiero es escribir una fórmula para cada uno de los totales y que además muchas veces esos registros ni siquiera aparezcan en el informe.
    No sirve agrupar los registros porque el informe se presenta ordenado por otros datos.

    Gracias y saludos cordiales.

    ResponderEliminar
  34. Buenas tardes LEandro.
    Tengo una inquietud.
    Cómo sumo campos tipo string en el total de un grupo reportviewer.
    todo en la misma tabla:
    sexo total
    masculino 100
    femenino 50

    el count(fileds!sexo.value) me hace el conteo, pero cuando agrego el total de ese count me devuelve el total del autonumerico id de la tabla, no me suma 100+50=150.
    Gracias ,

    ResponderEliminar
  35. hola Orlando

    los datos al reporte desde donde los envias?
    lo pregunto porque quizas esta info deberias trabajarla previamente fuera del reporte y luego asignarla ya con algunos valores calculados para que el reporte los pueda tomar directamente

    no se si quizas con alguna formaula dentro del campo de suma se solucionaria, pero me pregunto cual es el campo que sumas, porque si sumas el id esta claro que ira acumulando ese campos
    deberias aplicar el sum sobre el campo count que tenias definido

    saludos

    ResponderEliminar
  36. Hola tuttini queria felicitarte por todos los tutoriales que has hecho no solo me han ayudado a mi sino a mucho pero queria preguntarte si puedes hacer una partado para crear reportes con crystal report usando el gestor de base de datos de postgres sql muchas gracias y hasta pronto

    ResponderEliminar
  37. Buenas tardes, aprovechando tu generosidad y humildad, tendrás la parte de agregar al carrito de compras en c#?

    ResponderEliminar
  38. Buenos dias, no cargan las imagenes de tu post

    ResponderEliminar
  39. Buenas Tardes . Leandro una consulta ? tengo un Reporte en Excel Gerencial en formato .xlsx y el formato es bien complejo y me han pedido que desde el .NET lo genere el Excel, Mi pregunta seria ? que desde el .NET en modo windowform , el reportview tiene una opcion o comandos avanzados como matrices avanzadas , columas y filas personalizadas para poder generar el reporte en excel,quisas tengas un Ejemplo practico que me pueda servir como guia.Agradeceria tu ayuda

    ResponderEliminar
  40. Buenos Días, tengo un reporte con 2 totales acumulados, donde aplico suma y se evalúa con condición usando una formula.
    El problema es cuando no cumple con la condición no me muestra nada, quisiera que para esos casos muestre "0.00". Por favor si me pueden ayudar. Gracias

    ResponderEliminar
  41. Hola buenas tardes, tengo una duda. Estoy tratando de hacer unas etquetas en Crystal Reports de un listado de articulos, cada una de las etiquetas debe llevar un folio y otros datos que los obtiene de la base de datos, pero me pone el mismo folio en todas las etiquetas como se le puede hacer para que ese folio cambie???

    ResponderEliminar
  42. Buenas tardes, una consulta quiero imprimir al final del informe los totales según los tipos que contenga los detalles (totaltipo a=x; totaltipo b =y; totaltipo c=z) si en los detalles no esta algún tipo no se imprime. habrá alguna forma?

    ResponderEliminar