none
Imprimir report *.rdlc directamente a la impresora. RRS feed

  • Pregunta

  • Buenos días.

    tengo un reporte creado con extension *.rdlc que funciona perfectamente integrado en un reportviewer, el codigo que uso para esto es el siguiente. Le paso los datos a través de parametros desde una fila seleccionada de un datagrid.

    La pregunta es que quiero imprimir directamente a la impresora que tengo por defecto sin pasar por el reportviewer, he estado viendo ejemplos pero no me sacan de mucha duda.

    Alguna idea????

       Me.ReportViewer1.RefreshReport()
    
            ReportViewer1.LocalReport.DataSources.Clear()
    
    
            Dim parametros As New List(Of Microsoft.Reporting.WinForms.ReportParameter)
            parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("Nombre", Principal.DataGrid.SelectedRows(0).Cells(1).Value.ToString(), False))
            parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("Direccion", Principal.DataGrid.SelectedRows(0).Cells(2).Value.ToString(), False))
            parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("Numero", Principal.DataGrid.SelectedRows(0).Cells(3).Value.ToString, False))
            parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("CodigoPostal", Principal.DataGrid.SelectedRows(0).Cells(5).Value.ToString(), False))
            parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("Localidad", Principal.DataGrid.SelectedRows(0).Cells(6).Value.ToString(), False))
            parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("Provincia", Principal.DataGrid.SelectedRows(0).Cells(7).Value.ToString(), False))
            parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("TotalCopias", NumeroImpresiones.numeroC.Text.Trim(), False))
    
           
    ' uso para imprimir pagina 1 de n....
            For a As Integer = 1 To NumeroImpresiones.numeroC.Value
                parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("ContadorCopias", a.ToString, False))
    
            Next
            ReportViewer1.LocalReport.SetParameters(parametros)
            ReportViewer1.RefreshReport()

    miércoles, 11 de octubre de 2017 8:33

Respuestas

Todas las respuestas

  • Este artículo de MSDN explica cómo hacerlo, y contiene un ejemplo completo:

    https://msdn.microsoft.com/en-us/library/ms252091.aspx

    miércoles, 11 de octubre de 2017 8:55
  • Ya lo he intentado, pero no ha sido posible, no hay alguna manera de hacerlo más sencillo?

    Saludos.

    miércoles, 11 de octubre de 2017 9:12
  • Cuando preguntes en los foros, nunca digas cosas como "no funciona" o "no ha sido posible". Hay que dar detalles acerca de cuál es la forma en la que no funciona o cuales son los motivos concretos por los que no es posible. Si da un error en tiempo de comkpilación, hay que aportar código señalando la línea en la que da el error y el texto exacto del mensaje de error. Si es un error en tiempo de ejecución, lo mismo, señalar la línea en la que ocurre y el contenido exacto de la excepción. Si no da ningún error pero los resultados no son los esperados, indicar qué se esperaba, qué se obtuvo, y qué se averigua mediante el debugger en cuanto a cuál el punto del código en el que lo esperado no coincide con lo obtenido.

    Con este tipo de informaciones, los participantes del foro pueden colaborar para solucionar el problema. Pero con una respuesta de una línea diciendo "no ha sido posible", no hay suficiente información para que te aporten una solución.

    miércoles, 11 de octubre de 2017 15:44
  • Buenos Días.

    Tienes razón, debí de ser más explicito, aunque dificil ya que el error que obtengo al ejecutar el código es muy genérico. Exactamente es "Se ha producido un error durante el procesamiento local del informe"

    Todos los ejemplos que estoy viendo son que los informes vienen precedidos de un dataset, en mi caso no es así estoy intentando imprimir desde una fila seleccionada de un datagrid y le paso los datos a través de parametros, todo esto funciona cuando muestro el formulario con el report view, pero se complica cuando intento imprimirlo directamente.

    Quedo a la espera de ver si hay alguna solución.

    Saludos.

    lunes, 16 de octubre de 2017 7:17
  • El motor de reportes lamentablemente da ese error tan poco claro cuando alguno de los parametros que se le ha pasado no es correcto, o no esta en el formato que espera.

    Si estas siguiendo el ejemplo del articulo de Microsoft, me imagino que en el metodo Run(), donde construye el objeto Report y le pasa el DataSource, le estaras pasando los ReportParameters en lugar del DataSource. Yo probaria a poner con el debugger un punto de ruptura en sa ubicacion, y examinar desde el debugger con toda atencion el contenido de los Parameters (y cualesquiera otros datos que se le pasen al Report), a ver si difiere en algo del contenido que tienen (tambien examinado con el Debugger) cuando haces lo mismo en la version que si que funciona mostrandolo en el formulario.

    lunes, 16 de octubre de 2017 16:09
  • Estoy revisando y por más que reviso, no doy con el error, finalmente voy a optar y mostrar el reportviewer y que el usuario pulse el botón de imprimir.

    Aunque en este sentido tengo una duda, creo que no se puede hacer lo que yo deseo... pero por si acaso pregunto: Si yo pulso desde reportviewer el botón imprimir e imprimo el desde el printdialog 3 copias... Es posible pasarle al informe un parametro e imprimir el numero de copias totales y el numero de copia en cada página?

    he probado a ponerle una variable al reporte de imprimir el número de copias totales pero como en primera instacia solo lo muestro, me aparece como una copia solamente.

    Gracias y saludos.

    miércoles, 18 de octubre de 2017 15:00
  • Estoy revisando y por más que reviso, no doy con el error, finalmente voy a optar y mostrar el reportviewer y que el usuario pulse el botón de imprimir.

    Aunque en este sentido tengo una duda, creo que no se puede hacer lo que yo deseo... pero por si acaso pregunto: Si yo pulso desde reportviewer el botón imprimir e imprimo el desde el printdialog 3 copias... Es posible pasarle al informe un parametro e imprimir el numero de copias totales y el numero de copia en cada página?

    he probado a ponerle una variable al reporte de imprimir el número de copias totales pero como en primera instacia solo lo muestro, me aparece como una copia solamente.

    Gracias y saludos.


    viernes, 20 de octubre de 2017 6:44
  • Es posible pasarle al informe un parametro e imprimir el numero de copias totales y el numero de copia en cada página?

    No creo que se pueda. El PrintDocument siempre imprime una única copia, y luego las "réplicas" las hace el driver de la impresora, por lo que tu código no tiene la oportunidad de andar cambiando el número de la copia. Se me ocurre que podrías deshabilitar en el PrintDialog el número de copias, y en su lugar preguntar el número en tu programa, y luego llamar al PrintDialog.Print usando un bucle tantas veces como indique ese número (es decir, hacer tú las copias en lugar de dejar que las haga el driver de la impresora).
    viernes, 20 de octubre de 2017 6:51
  • Me parece buena tu idea, pero puedes se más conciso, por favor, nunca he trabajado con este tipo de controlos y voy un poco perdido.

    Muchas gracias.

    viernes, 20 de octubre de 2017 7:37
  • Me temo que me precipité al hacer esa sugerencia. Estoy revisando las propiedades del PrintDialog, y tiene opciones para AllowCurrentPage, AlloPrintToFile, AllowSelection y AllowSomePages. Pensé que habría una para "AllowNumberOfCopies" o algo similar, para permitir ocultar la opción de "número de copias", del mismo modo que se ocultan el resto de las opciones que tienen un "Allow...". Pero lamentablemente, no existe esa opción para el número de copias.

    Hay otra opción que sí que debería funcionar: El PrinterSettings sí que tiene una propiedad para indicar "MaximumCopies". Si le asignas un 1, eso debería efectivamente impedir que el usuario seleccione más de una copia.

    printDialog1.PrinterSettings.MaximumCopies = 1



    viernes, 20 de octubre de 2017 10:44
  • Creo que no me explique bien.

    Estoy haciendo una aplicacion para que el usuario imprima etiquetas, el problema que tengo es que necesito decirle en cada etiqueta el numero de etiquetas que imprimo, por ejemplo etiqueta 1 de 3, etiqueta 2 de 3.....

    si pongo las opicones de paginación del informe, no funciona porque siempre me sale etiqueta 1 de 1....

    Gracias por tu ayuda

    viernes, 20 de octubre de 2017 10:55
  • Pero, ¿es el informe el que pagina las etiquetas, o imprimes una sola etiqueta y confías en el driver de la impresora para que la replique N veces? Y, si lo haces en el informe, ¿la numeración es "por página", o es una lista de etiquetas y cada etiqueta de la lista tiene que tener un número distinto? Si es esto último, lo mejor es que asignes la numeración por código dentro de un campo en el DataTable con el que alimentas el informe.
    viernes, 20 de octubre de 2017 11:48
  • Este es el codigo que uso, la sistematica es sacar un informe con una página, entondes uso el botón print del report viewer, hay me viene el problema, como pinto en el informe el numero de copias que imprimo desde el botón imprimir del report viewer.

    Me.ReportViewer1.RefreshReport()
    
            ReportViewer1.LocalReport.DataSources.Clear()
    
    
            Dim parametros As New List(Of Microsoft.Reporting.WinForms.ReportParameter)
            parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("Nombre", Principal.DataGrid.SelectedRows(0).Cells(1).Value.ToString(), False))
            parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("Direccion", Principal.DataGrid.SelectedRows(0).Cells(2).Value.ToString(), False))
            parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("Numero", Principal.DataGrid.SelectedRows(0).Cells(3).Value.ToString, False))
            parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("CodigoPostal", Principal.DataGrid.SelectedRows(0).Cells(5).Value.ToString(), False))
            parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("Localidad", Principal.DataGrid.SelectedRows(0).Cells(6).Value.ToString(), False))
            parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("Provincia", Principal.DataGrid.SelectedRows(0).Cells(7).Value.ToString(), False))
            parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("TotalCopias", NumeroImpresiones.numeroC.Text.Trim(), False))
    
           
    ' uso para imprimir pagina 1 de n....
            For a As Integer = 1 To NumeroImpresiones.numeroC.Value
                parametros.Add(New Microsoft.Reporting.WinForms.ReportParameter("ContadorCopias", a.ToString, False))
    
            Next
            ReportViewer1.LocalReport.SetParameters(parametros)
            ReportViewer1.RefreshReport()


    viernes, 20 de octubre de 2017 13:18
  •  uso el botón print del report viewer, hay me viene el problema, como pinto en el informe el numero de copias que imprimo desde el botón imprimir del report viewer.

    Eso es precisamente lo que no puedes hacer. Cuando pulsas el botón del ReportViewer, se activa directamente el diálogo de impresora y va directo a la impresora el número de copias que pongas ahí. En ningún momento recibes en tu código el control para poder intervenir y "hacer algo" con el número de copias.

    Por eso yo proponía evitar ese paso y en su lugar imprimir directamente sin usar el ReportViewer. Haciéndolo así, podrías controlar tú las copias, llamando varias veces al proceso de impresión, imprimiendo una sola copia en cada una de las llamadas, y así podrías cambiar el contenido entre copia y copia para imprimir el número de esa copia.

    Cierto que eso es más complicado y requiere más código. Pero cuando las herramientas que vienen "de fábrica" no hacen lo que queremos hacer, a veces no hay más remedio que resignarse a escribir un código mucho más complejo que el que sería necesario si tuviéramos una herramienta que ya hiciese todo como lo queremos hacer. En estos casos, o se aguanta uno y prescinde de esa funcionalidad, o si no hay más remedio que tenerla, pues hay que hacer el esfuerzo y escribir código mucho más largo y complejo.

    Dicho esto, el error que comentabas más atrás que te salía al emitir el informe y que pensábamos que podría ser un error de parámetros, tiene una fácil explicación a la vista de tu código: Tienes un bucle en el que añades múltiples veces EL MISMO parámetro. No es de extrañar que el informe "se queje".

    viernes, 20 de octubre de 2017 17:11
  • He apañado el tema de parámetro y no es ese el problema, el tema es que como tu bien dices es my poco explicativo el error, es más dificil solucionarlo.

    He optado hacer el reporte con cystal reports, creo que da mas facilidades a la hora de hacer los reportes.

    Gracias y saludos.

    martes, 24 de octubre de 2017 10:42