none
problema con LocalReport.Render() en aplicación de consola RRS feed

  • Pregunta

  • me pidieron hacer una pequeña aplicación de consola que cuando se ejecute mande un correo con un reporte adjunto.

    es en realidad tarea fácil, dedique muy poco al desarrollo, pero cuando estuve haciendo las pruebas se me presento un problema muy peculiar que no e podido resolver, el reporte debe estar en Excel, por lo que decidí hacerlo con los informes nativos de .NET (RDLC), todo funciona hasta que llega a la línea en donde transforma el reporte a bytes, no marca ningún error simplemente no avanza, ahí se queda y la consola ya no sigue con su ejecución.

    espero alguien pueda ayudarme y decirme a que se deba o bien si hay alguna forma mas sencilla de realizar esto.

    saludos a todos y gracias de antemano

    dejo el código aquí abajo

     

     Function genera_reporte(ByVal IdAlmacen As String) As Byte()
            'Variables para la consulta de bd
            Dim objRes As New ENTRespuesta
            Dim lista As New List(Of Parametro)
            Dim par As Parametro
    
    
            ' Variables del reporte
            Dim warnings As Warning()
            Dim streamIds As String()
            Dim mimeType As String = ""
            Dim encoding As String = String.Empty
            Dim extension As String = String.Empty
    
    
            Dim rds As New ReportDataSource
            Dim detalle As New DataSet
            Dim dt As New DataTable
            Dim encabezado As New DataSet
    
    
            'LLenado de parametros
            par = New Parametro With {.Nombre = "pFecha", .Valor = DateTime.Now.ToString("yyyy-MM-dd")}
            lista.Add(par)
            par = New Parametro With {.Nombre = "pAlmacen", .Valor = IdAlmacen}
            lista.Add(par)
    
            ' Transacción
            objRes = Utilerias.getRespuesta(REPORTE_CITA_DIARIA, lista)
    
            ' Setup the report viewer object and get the array of bytes
            Dim viewer As New ReportViewer()
            viewer.ProcessingMode = ProcessingMode.Remote
            viewer.LocalReport.ReportPath = My.Application.Info.DirectoryPath & "\Reports\RptCitaDiario.rdlc"
            'viewer.LocalReport.ReportPath = "C:\oswaldo\consiss\DelSol\CitasWeb\proyectos\slnCitas\Citas.Bath\Reports\RptCitaDiario.rdlc"
    
            dt = objRes.dsRespuesta.Tables(0)
    
    
            viewer.ShowParameterPrompts = False
            viewer.ShowPromptAreaButton = False
            viewer.DocumentMapCollapsed = True
    
            rds.Name = "dtRptCita"
            rds.Value = dt
            'ReportViewer1.DataBind()
            viewer.LocalReport.DataSources.Add(rds)
    
            Dim bytes As Byte() = viewer.LocalReport.Render("Excel", Nothing, mimeType, encoding, extension, streamIds, warnings)
            Return bytes
        End Function

    el detalle justo antes de el return, en la línea donde se usa el viewer.localreport.render()

    martes, 14 de enero de 2014 21:14

Respuestas

  • encontré que el problema no era el código para generar el informe.

    no estaba ni en el localreport ni en el reportviewer, si no en el uso e threads en el proceso...

    separe por completo el proceso de generación y envío de reporte en un exe independiente que es ejecutado por cada uno de los hilos del programa cuando sea necesario, funciono perfectamente.

    • Marcado como respuesta Arthuro Zerda jueves, 16 de enero de 2014 21:01
    jueves, 16 de enero de 2014 21:01

Todas las respuestas

  • Tal vez no sea buena idea usar el ReportViewer en la aplicación de consola. Al ser un control de Winforms, es posible que internamente tenga una dependencia de la bomba de mensajes del entorno de ventanas, y que por eso no funcione. No sé si efectivamente ese es el caso del ReportViewer, pero sí sé de otros casos, como el Timer de WinForms, en los que el funcionamiento depende de la bomba de mensajes y por tanto no va en Consola.

    Afortunadamente hay una alternativa: puedes usar el .Render de la clase LocalReport:

    http://msdn.microsoft.com/en-us/library/microsoft.reporting.winforms.localreport(v=vs.80).aspx

    miércoles, 15 de enero de 2014 6:48
  • Gracias Alberto, precisamente ese es el método que estoy usando

    te refieres a usar el localreport sin el reportviewer?

    lo e probado de esa forma, pero me a resultado igual

      Dim rpt As New LocalReport
            rpt.ReportPath = My.Application.Info.DirectoryPath & "\Reports\RptCitaDiario.rdlc"
    
            dt = objRes.dsRespuesta.Tables(0)
    
    
            'viewer.ShowParameterPrompts = False
            'viewer.ShowPromptAreaButton = False
            'viewer.DocumentMapCollapsed = True
    
            rds.Name = "dtRptCita"
            rds.Value = dt
            'ReportViewer1.DataBind()
            rpt.DataSources.Add(rds)
    
            Dim bytes As Byte() = rpt.Render("Excel", Nothing, mimeType, encoding, extension, streamIds, warnings)
            Return bytes


    miércoles, 15 de enero de 2014 15:29
  • Exacto, fíjate en el enlace que te envié y mira el ejemplo. Verás que no usa un ReportViewer, sino solo un LocalReport, y que llama al .Render del LocalReport (no el .Render del ReportViewer).
    miércoles, 15 de enero de 2014 15:34
  • Gracias Alberto, lo intente pero sigo teniendo el mismo problema...

    miércoles, 15 de enero de 2014 16:06
  • después de esperar un rato a que la aplicación reaccionara sin ningún éxito, manda este mensaje de MDA

    ******************************************************************************************

    Se detectó ContextSwitchDeadlock
    Message: El CLR no ha podido realizar la transición del contexto COM 0x71c170 al contexto COM 0x71c228 durante 60 segundos. Es probable que el subproceso que contiene el contexto o apartamento de destino esté en espera sin proporcionar mensajes o que procese una operación de ejecución muy larga que no proporcione mensajes Windows. Normalmente, esta situación tiene un impacto negativo en el rendimiento y puede hacer que la aplicación no responda o que acumule continuamente el uso de la memoria. Para evitar este problema, todos los subprocesos de contenedores uniproceso (STA) deberían utilizar primitivos de espera que proporcionen mensajes (como CoWaitForMultipleHandles) y proporcionar mensajes regularmente durante operaciones de ejecución largas.

    *******************************************************************************************

    la verdad es que ya llevo un rato atorado con este problema, si alguien conoce una solución se agradecería bastante, este método me funciona perfecto en asp.net

    miércoles, 15 de enero de 2014 16:47
  • encontré que el problema no era el código para generar el informe.

    no estaba ni en el localreport ni en el reportviewer, si no en el uso e threads en el proceso...

    separe por completo el proceso de generación y envío de reporte en un exe independiente que es ejecutado por cada uno de los hilos del programa cuando sea necesario, funciono perfectamente.

    • Marcado como respuesta Arthuro Zerda jueves, 16 de enero de 2014 21:01
    jueves, 16 de enero de 2014 21:01