Você está na página 1de 39

9   Más    Siguiente blog» Crear un blog   Acceder

Parvulos.Net
jueves, 10 de octubre de 2013 Archivo del blog

ReportViewer y Rdlc, ejemplo Factura (datos fijos) ►  2015 (5)
►  2014 (2)
Hola a todos:
El siguiente articulo pretende mostrar la manera de crear un reporte local usando ReportViewer y Local Report o ▼  2013 (13)
Rdlc enlazando su origen datos (DataSource) a una fuente proveniente de una Lista Genérica de propiedades. ►  diciembre (1)
Como se que esto puede resultar un tema demasiado complicado cuando no se tiene experiencia en el manejo de
reportes tratare de que el articulo sea lo mas descriptivo posible y para ello me apoyare en la mayor cantidad de
▼  octubre (4)
imágenes posibles, traten de realizar el ejemplo siguiendo el tutorial, si un paso no les queda claro siéntanse con ReportViewer y
toda confianza de hacer las consultas necesarias, al final del articulo tendrán el link de descarga del proyecto de Rdlc, ejemplo
ejemplo. Factura (Base
de dato...
Los datos los enviaremos desde un formulario simulando ser los datos de una Factura comercial, que contiene Agregar una Base
Datos del cliente y los artículos adquiridos. de datos
SqlCompact a
Bien, comencemos creando un Formulario y arrastrando los controles necesarios hasta obtener un formulario un proyecto...
como este: App. Config,
cadenas de
conexión
ReportViewer y
Rdlc, ejemplo
Factura (datos
fijos)...

►  septiembre (2)
►  agosto (3)
►  julio (3)

Datos personales

Agregue un segundo formulario, llámelo FacturaRpt.cs este contendrá el control ReportViewer al cual enlazaremos
el LocalReport, asi que agregue uno arrastrándolo desde el cuadro de herramientas.

José Luis García Bautista
Desarrollador de software con
experiencia en tecnologías
microsoft usando lenguajes
como : * C# * Vb.Net * Vba *
SqlServer * SqlCe * Access... y
Java como lenguaje
secundario...
Ver todo mi perfil

Formulario de contacto

Nombre 
Agregue un LocalReport, deje el nombre default:

Correo electrónico * 

Mensaje * 

Enviar

Seguidores
Seguidores (16)

Seguir

Entradas populares

ReportViewer y Rdlc, ejemplo
Factura (datos fijos)
Ahora, crearemos las clases contenedoras de las entidades, recuerde que una entidad esta compuesta por
campos y propiedades. Programación en 3 capas

Inserte una nueva clase y nómbrela EArticulo, la cual contendrá todas las propiedades de la entidad Articulo, la Pasar datos de un
clase deberá de quedar con esta estructura: DataGridView a otro
DataGridView ubicados en
Forms diferentes
Código C#:
App. Config, cadenas de
namespace ReportViewerInvoiceReport_CSharp 
conexión

    public class EArticulo  Llenar DataGridView con
    {  datos de TextBox’s usando
        public int Numero { get; set; }  Datasource o el método Add()
        public string Upc { get; set; } 
        public string Descripcion { get; set; }  Agregar una Base de datos
SqlCompact a un proyecto de
        public decimal Piezas { get; set; } 
Visual Studio
        public decimal Precio { get; set; } 
        public decimal Importe { get; set; }  Trabajar con archivos Excel
    }  desde WindowsForms
} (SpreadSheetLight)

ReportViewer y Rdlc, ejemplo
Código Vb.Net: Factura­ Eviar Imagen

Public Class EArticulo  ReportViewer y Rdlc, ejemplo
    Public Property Numero() As Integer  Factura (Base de datos)
    Public Property Upc() As String 
contextMenuStrip y
    Public Property Descripcion() As String  DataGridView
    Public Property Piezas() As Decimal 
    Public Property Precio() As Decimal 
    Public Property Importe() As Decimal 
End Class 9

Después inserte una nueva clase y nómbrela EFactura, esta clase contendrá todas las propiedades del
encabezado de la factura, la clase deberá de quedar con esta estructura:

Código C#:

using System; 
using System.Collections.Generic; 

namespace ReportViewerInvoiceReport_CSharp 

    public class EFactura 
    { 
        public int Numero { get; set; } 
        public string Nombre { get; set; } 
        public string Rfc { get; set; } 
        public string Direccion { get; set; } 
        public decimal Subtotal { get; set; } 
        public decimal Iva { get; set; } 
        public decimal Total { get; set; } 
        public DateTime FechaFacturacion { get; set; } 

        //Creamos una lista con una nueva Instancia de la clase Articulo 
        //esta lista contendra el detalle de la factura 
        public List<EArticulo> Detail = new List<EArticulo>(); 
    } 
}

Código Vb.Net:
Imports System.Collections.Generic
Public Class EFactura 
    Public Property Numero() As Integer 
    Public Property Nombre() As String 
    Public Property Rfc() As String 
    Public Property Direccion() As String 
    Public Property Subtotal() As Decimal 
    Public Property Iva() As Decimal 
    Public Property Total() As Decimal 
    Public Property FechaFacturacion() As DateTime 

    'Creamos una lista con una nueva Instancia de la clase Articulo 
    'esta lista contendra el detalle de la factura 
    Public Detail As New List(Of EArticulo)() 

End Class

Configurar el Reporte del informe “Report1.rdlc”

Para poder usar las clases de EFactura para llenar el Encabezado del reporte y EArticulo para el detalle del
mismo, primero debemos de generar el proyecto, para ello localice el menú Generar –> Generar Solución

 Establecer la fuente de datos del Reporte

Active el cuadro Datos del informe, Menú Ver –>Datos del informe

Establezca el Nombre del conjunto de datos y haga click sobre el botón Nuevo:

Seleccione Objeto y haga Click sobre el botón Siguiente:

 
Seleccione la clase EFactura, recuerde que esta clase contiene las propiedades para el encabezado de la factura
y haga Click sobre el botón Finalizar (Si no hubiera generado el proyecto estas clases no estarían visibles, así que
si no las ve por favor cierre la ventana y genere la solución):

Observe que ya tiene una fuente de datos seleccionada, solo haga Click en el botón Aceptar:

Bien, ya tiene una Fuente de datos configurada:

Siga los mismos pasos para agregar la fuente de datos para el detalle del reporte solo que ahora seleccionara la
clase EArticulo, al final tendrá un resultado como el siguiente:
Configurar tamaño y encabezado del informe

Active la regla del informe para ello menú Informe –> Regla

Configure el tamaño del informe, menú Informe –> Propiedades del informe

Un punto muy importante en este paso es tener presente el Ancho o alto del reporte dependiendo que tipo de
orientación se haya elegido, en este caso el ancho es lo que interesa, considere que tiene un ancho máximo de
21.59 cm. a este espacio le restara el valor total de los márgenes que son 2.0 cm en total ya que configuro un
margen de 0.5 cm, dando un espacio de trabajo real disponible de 19.59 cm., si en el diseño de nuestro reporte
nos pasamos de este espacio disponible nuestro reporte en lugar de mostrarnos una hoja nos mostrar ara dos,
normalmente la segunda hoja sin o con pocos datos.

Bien, continuemos…

Agregue un encabezado de reporte, menú Informe –> Agregar encabezado de pagina

Active el cuadro de herramientas, menú Ver –> Cuadro de herramientas:

Arrastre tantos Cuadros de texto como se requieran, recuerde que nuestros datos provienen de una clase,
entonces por cada campo­propiedad de la clase tiene que crear un control Cuadro de texto para poder visualizar el
dato…esto de crear un control por cada propiedades de la clase origen es únicamente para este reporte, en
realidad usted puede elegir que datos mostrar y cuales no.
Configurar control cuadro de texto:

Click derecho sobre el control cuadro de texto que deseemos configurar:

Recuerde que establecer un nombre a los controles que vayamos utilizando es de vital importancia porque será en
base a este como los identificaremos, en proyectos pequeños tal vez no tenga problemas si deja los nombres
asignados por default pero, en proyectos grandes esta mala practica nos provocara constantes dolores de cabeza,
entonces, nunca olvide ponerle un nombre a los controles. Considere que el nombre debe de identificar fácilmente
al control al que hace referencia y al dato que contendrá o al cual estará relacionado, en este caso txtFactura es
muy descriptivo, ya que se entiende que es un control textBox o cuadro de texto y que contendrá el numero de
factura.

Para definir el origen del dato que mostrara el control cuadro de texto despliegue el ComboBox Valor, vera que
este estará cargado con las propiedades de las clases las cuales definimos como fuente de datos, no le será
difícil identificar a que clase pertenece cada una ya que al final podra ver el nombre que le puso al origen de datos.

Desactivar la casilla “Permitir aumentar el alto” puede resultar muy importante para conservar un buen diseño,
tener activada esta casilla permite que el control cambie de tamaño en tiempo de ejecución adecuándose al
tamaño del valor que contiene, modificando con esto el diseño hasta el punto de generar hojas innecesarias.
En este ejemplo el campo Factura será del tipo numérico por lo cual para conservar un formato de numero
correcto, tendrá que configurar el lenguaje que utilizara el campo, para mi ubicación (México) la configuración de
lenguaje será “es­Mex”, para configurar esta propiedad:

  Seleccione el control cuadro de texto –> Presione F4:

Si no hiciera esto, un formato numérico podría no mostrarse correctamente por ejemplo la cantidad Mil doscientos
cincuenta y seis con cincuenta y seis decimales en México será 1,256.56 pero en España se escribiría de esta
manera 1.256,56. Esta configuración debemos de hacerla aun si en la clase Main de nuestro proyecto hayamos
definido un lenguaje de manera predeterminada.

Agregar parámetros al Reporte:

Para abarcar mas sobre el tema de ReportViewer y local report, subamos un poco mas el nivel de nuestro
proyecto agregando parámetros al mismo, esto no siempre es necesario así que en este articulo solo lo haremos
para fines ilustrativos, es decir, para cuando lleguemos a necesitarlo tendremos el conocimiento disponible de
como usarlos.
En el Datos del informe –> Click derecho sobre Parametros –> Agregar parametro:

De nuevo, recuerde que nombrar correctamente a cada control que agregamos es de vital importancia:

Agregue un  nuevo parámetro y nómbrelo parametroEmpresa.

Ahora, arrastre dos controles Cuadro de texto al informe, y vaya a las propiedades para configurar el valor a
mostrar:
Haga lo mismo para el segundo control agregado, veamos como va nuestro diseño del informe:

Para el detalle del informe, agregue un Tabla arrastrándola desde el cuadro de herramientas, vaya a las
propiedades de la tabla recién agregada, ubique la propiedad DataSetName par establecer el origen de datos y
seleccione Detalle, recuerde que ese fue el nombre que establecimos al origen de datos:

Agregue las columnas que falten para completar el cuerpo del informe, para ello haga Click derecho sobre la tabla,
Insertar columna, Izquierda o derecha.

Después establezca el valor que mostrara cada columna, para ello tiene dos opciones, seleccionar el valor desde
el icono que vera en la esquina superior derecha de cada celda o ir a propiedades del cuadro de texto tal cual
como lo hizo anteriormente:
Establezca el tamaño de fuente, borde, tipo de dato, lenguaje a utilizar (recuerde lo comentado anteriormente
sobre el formato de numero/moneda)

¿Como va nuestro diseño de informe?

Si tienen un resultado como este, pueden dar su tarea por terminada en cuanto al diseño del informe si aun no lo
logran, todo es cuestión que revisen como configurar un control TextBox o cuadro de texto como gusten llamarlo y
ponerse a ver Alineación, tipo de fuente, borde, relleno, etc…

Hasta aquí daremos por terminado nuestro diseño, ahora vayamos a:

Establecer una Lista Genérica como DataSource de un local report:

Ubique el Formulario contenedor del ReportViewer llamado FacturaRpt, seleccione el icono superior derecho del
reportViewer –> Seleccione el local report que utilizaremos (el único que hemos diseñado) 

Una vez echo lo anterior, genere el evento Load del Formulario, para ello puede hacer doble click sobre la barra de
titulo o seleccionar el form y presionar la tecla de función F4, esto abrirá la caja de propiedades, en la parte
superior podrá ver un icono con forma de “rayo” de color amarillo, haga click sobre el para ver los eventos que
implementa el control, después ubique el Evento que le interese implementar en este caso nos interesa el evento
“Load”.

Copie y pegue el siguiente código:

Código C#:

using System; 
using System.Collections.Generic; 
using System.Windows.Forms; 
using Microsoft.Reporting.WinForms; 

namespace ReportViewerInvoiceReport_CSharp 

    public partial class FacturaRpt : Form 
    { 
        // 
        //Cree dos listas una para el Encabezado y otra para el detalle 
        // 
        public List<EFactura> Invoice = new List<EFactura>(); 
        public List<EArticulo> Detail = new List<EArticulo>(); 
        // 
        //Cree las propiedades publicas Titulo y Empresa 
        // 
        public string Titulo { get; set; } 
        public string Empresa { get; set; } 

        public FacturaRpt() 
        { 
            InitializeComponent();
        } 

        private void FacturaRpt_Load(object sender, EventArgs e) 
        { 
            //Limpiemos el DataSource del informe 
            reportViewer1.LocalReport.DataSources.Clear(); 
            // 
            //Establezcamos los parámetros que enviaremos al reporte 
            //recuerde que son dos para el titulo del reporte y para el nombre de la empresa 
            // 
            ReportParameter[] parameters = new ReportParameter[2]; 
            parameters[0] = new ReportParameter("parameterTitulo", Titulo); 
            parameters[1] = new ReportParameter("parameterEmpresa", Empresa); 

            // 
            //Establezcamos la lista como Datasource del informe 
            // 
            reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("Encabezado", Invoice)); 
            reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("Detalle", Detail)); 
            // 
            //Enviemos la lista de parametros 
            // 
            reportViewer1.LocalReport.SetParameters(parameters); 
            // 
            //Hagamos un refresh al reportViewer 
            // 
            reportViewer1.RefreshReport(); 
        } 
    } 
}

Código Vb.Net:

Imports Microsoft.Reporting.WinForms 

Public Class FacturaRpt 
    ' 
    'Cree dos listas una para el Encabezado y otra para el detalle 
    ' 
    Public Invoice As New List(Of EFactura)() 
    Public Detail As New List(Of EArticulo)() 
    ' 
    'Cree las propiedades publicas Titulo y Empresa 
    ' 
    Public Property Titulo() As String 
    Public Property Empresa() As String 

    Private Sub FacturaRpt_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 

        'Limpiemos el DataSource del informe 
        ReportViewer1.LocalReport.DataSources.Clear() 
        ' 
        'Establezcamos los parametros que enviaremos al reporte 
        'recuerde que son dos para el titulo del reporte y para el nombre de la empresa 
        ' 
        Dim parameters As ReportParameter() = New ReportParameter(1) {} 
        parameters(0) = New ReportParameter("parameterTitulo", Titulo) 
        parameters(1) = New ReportParameter("parameterEmpresa", Empresa) 

        ' 
        'Establezcamos la lista como Datasource del informe 
        ' 
        ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("Encabezado", Invoice)) 
        ReportViewer1.LocalReport.DataSources.Add(New ReportDataSource("Detalle", Detail)) 
        ' 
        'Enviemos la lista de parametros 
        ' 
        ReportViewer1.LocalReport.SetParameters(parameters) 
        ' 
        'Hagamos un refresh al reportViewer 
        ' 
        ReportViewer1.RefreshReport() 
    End Sub 
End Class

Hagamos lo ultimo que falta, enviar los datos desde el formulario principal:
Genere el Evento load del Formulario principal,

Después de generado el evento trate de seguir estas líneas de código, escriba linea por linea si copia y pega será
mas complicado que comprenda (suponiendo que su experiencia en desarrollo no es amplia):

Código C#:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 

namespace ReportViewerInvoiceReport_CSharp 

    public partial class Form1 : Form 
    { 
        public Form1() 
        { 
            InitializeComponent();
        } 

        /// <summary> 
        /// Funcion encargada de llenar el control DataGridView 
        /// <autor>José Luis García Bautista</autor> 
        /// </summary> 
        /// <returns>Una lista generica de la clase artículo</returns> 
        private static List<EArticulo> FillDgv() 
        { 
            // 
            //Cree una lista generica de la entidad EArticulo 
            // 
            List<EArticulo> listaArticulos = new List<EArticulo>(); 

            // 
            //Instancie la clase EArticulo para agregar datos a la lista 
            // 
            EArticulo item = new EArticulo 
                                { 
                                    //Establezca valores a cada una de las propiedades 
                                    Numero = 1, 
                                    Upc = "7501020405680", 
                                    Descripcion = "Descripción del artículo 1", 
                                    Piezas = 6, 
                                    Precio = new decimal(12.50), 
                                    Importe = (decimal)(6 * 12.5), 
                                };
            // 
            //Agregamos el Item a la lista 
            // 
            listaArticulos.Add(item); 

            EArticulo item1 = new EArticulo 
                                 {
                                     Numero = 2, 
                                     Upc = "7501040805610", 
                                     Descripcion = "Descripción del artículo 2", 
                                     Piezas = 3, 
                                     Precio = new decimal(22.50), 
                                     Importe = (decimal)(3 * 22.5), 
                                 }; 
            listaArticulos.Add(item1); 

            EArticulo item2 = new EArticulo 
            { 
                Numero = 3, 
                Upc = "0412200805610", 
                Descripcion = "Descripción del artículo 3", 
                Piezas = 20, 
                Precio = new decimal(52.80), 
                Importe = (decimal)(20 * 52.80), 
            }; 
            listaArticulos.Add(item2); 

            return listaArticulos;
        } 

        private void Form1_Load(object sender, EventArgs e) 
        { 
            // 
            //La funcion GenerateNumber() se utiliza unicamente para generar un Número 
            //aleatorio que simulara ser el numerod e factura 
            txtnumero.Text = GenerateNumber().ToString(); 

            //Establecemos la propiedad AutoGenerateColumns en False para evitar que se agreguen 
            //nuevas columnas a la derecha de las que creamos en tiempo de diseño. 
            // 
            dgvdetalle.AutoGenerateColumns = false; 
            // 
            //Establecemos el DataSource del control DataGridView 
            // 
            dgvdetalle.DataSource = FillDgv(); 
            // 
            //Mapeamos las propiedades de la clase devuelta por la Funcion FillDgv() 
            //recuerde que esta funcion devuelve una lista del tipo EArticulo 
            // 
            dgvdetalle.Columns["columnNumero"].DataPropertyName = "Numero"; 
            dgvdetalle.Columns["columnUpc"].DataPropertyName = "Upc"; 
            dgvdetalle.Columns["columnDescripcion"].DataPropertyName = "Descripcion"; 
            dgvdetalle.Columns["columnPiezas"].DataPropertyName = "Piezas"; 
            dgvdetalle.Columns["columnPrecio"].DataPropertyName = "Precio"; 
            dgvdetalle.Columns["columnImporte"].DataPropertyName = "Importe"; 

            // 
            //Hacemos las sumatorias usando un método de extensión de Linq 
            // 
            decimal sum = FillDgv().Sum(x => x.Importe); 
            decimal iva = (Math.Round(((sum / 116) * 16), 2)); 
            decimal subtotal = Math.Round(sum ‐ iva, 2); 

            txttotal.Text = Convert.ToString(Math.Round(sum, 2)); 
            txtiva.Text = Convert.ToString(iva); 
            txtsubtotal.Text = Convert.ToString(subtotal); 
        } 

        private static int GenerateNumber() 
        { 
            Random rdm = new Random(); 

            return rdm.Next(); 
        } 

        private void InvoiceGenerate() 
        { 
            // 
            //Hacemos una instancia de la clase EFactura para 
            //llenarla con los valores contenidos en los controles del Formulario 
            EFactura invoice = new EFactura(); 
            invoice.Numero = Convert.ToInt32(txtnumero.Text); 
            invoice.Nombre = txtnombre.Text; 
            invoice.Rfc = txtrfc.Text; 
            invoice.Direccion = txtdireccion.Text; 
            invoice.FechaFacturacion = dtpfecha.Value.Date; 
            invoice.Subtotal = Convert.ToDecimal(txtsubtotal.Text); 
            invoice.Iva = Convert.ToDecimal(txtiva.Text); 
            invoice.Total = Convert.ToDecimal(txttotal.Text); 

            //Recorremos los Rows existentes actualmente en el control DataGridView 
            //para asignar los datos a las propiedades 
            foreach (DataGridViewRow row in dgvdetalle.Rows) 
            { 
                EArticulo article = new EArticulo(); 
                // 
                //Vamos tomando los valores de las celdas del row que estamos  
                //recorriendo actualmente y asignamos su valor a la propiedad de la clase intanciada 
                // 
                article.Numero = Convert.ToInt32(row.Cells["columnNumero"].Value); 
                article.Upc = Convert.ToString(row.Cells["columnUpc"].Value); 
                article.Descripcion = Convert.ToString(row.Cells["columnDescripcion"].Value); 
                article.Piezas = Convert.ToDecimal(row.Cells["columnPiezas"].Value); 
                article.Precio = Convert.ToDecimal(row.Cells["columnPrecio"].Value); 
                article.Importe = Convert.ToDecimal(row.Cells["columnImporte"].Value); 

                // 
                //Vamos agregando el Item a la lista del detalle 
                // 
                invoice.Detail.Add(article); 
            } 

            // 
            //Creamos una instancia del Formulario que contiene nuestro 
            //ReportViewer 
            // 
            FacturaRpt frm = new FacturaRpt(); 
            // 
            //Usamos las propiedades publicas del formulario, aqui es donde enviamos el valor 
            //que se mostrara en los parametros creados en el LocalReport, para este ejemplo 
            //estamos Seteando los valores directamente pero usted puede usar algun control 
            // 
            frm.Titulo = "Este es un ejemplo de Factura"; 
            frm.Empresa = "Este es un ejemplo del Nombre de la Empresa"; 
            // 
            //Recuerde que invoice es una Lista Generica declarada en el FacturaRtp, es una lista 
            //porque el origen de datos del LocalReport unicamente permite ser enlazado a objetos que  
            //implementen IEnumerable. 
            // 
            //Usamos el metod Add porque Invoice es una lista e invoice es una entidad simple 
            frm.Invoice.Add(invoice); 
            // 
            //Enviamos el detalle de la Factura, como Detail es una lista e invoide.Details tambien 
            //es un lista del tipo EArticulo bastara con igualarla 
            // 
            frm.Detail = invoice.Detail; 
            frm.Show(); 
        } 

        private void btnImprimir_Click(object sender, EventArgs e) 
        { 
            InvoiceGenerate(); 
        } 
    } 
}

Código Vb.Net:

Public Class Form1 

    ''' <summary> 
    ''' Funcion encargada de llenar el control DataGridView 
    ''' <autor>José Luis García Bautista</autor> 
    ''' </summary> 
    ''' <returns>Una lista generica de la clase artículo</returns> 
    Private Shared Function FillDgv() As List(Of EArticulo) 
        ' 
        'Cree una lista generica de la entidad EArticulo 
        ' 
        Dim listaArticulos As New List(Of EArticulo)() 
        ' 
        'Instancie la clase EArticulo para agregar datos a la lista 
        ' 
        'Establezca valores a cada una de las propiedades 
        Dim item As New EArticulo() 
        item.Numero = 1 
        item.Upc = "7501020405680"
        item.Descripcion = "Descripción del artículo 1" 
        item.Piezas = 6 
        item.Precio = New Decimal(12.5) 
        item.Importe = CDec(6 * 12.5) 
        ' 
        'Agregamos el Item a la lista 
        ' 
        listaArticulos.Add(item) 

        Dim item1 As New EArticulo() 
        item1.Numero = 2 
        item1.Upc = "7501040805610" 
        item1.Descripcion = "Descripción del artículo 2" 
        item1.Piezas = 3 
        item1.Precio = New Decimal(22.5) 
        item1.Importe = CDec(3 * 22.5) 

        listaArticulos.Add(item1) 

        Dim item2 As New EArticulo() 
        item2.Numero = 3 
        item2.Upc = "0412200805610" 
        item2.Descripcion = "Descripción del artículo 3" 
        item2.Piezas = 20 
        item2.Precio = New Decimal(52.8) 
        item2.Importe = CDec(20 * 52.8) 
        listaArticulos.Add(item2) 

        Return listaArticulos 
    End Function 

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
        ' 
        'La funcion GenerateNumber() se utiliza unicamente para generar un Número 
        'aleatorio que simulara ser el numerod e factura 
        txtnumero.Text = GenerateNumber().ToString() 

        'Establecemos la propiedad AutoGenerateColumns en False para evitar que se agreguen 
        'nuevas columnas a la derecha de las que creamos en tiempo de diseño. 
        ' 
        dgvdetalle.AutoGenerateColumns = False 
        ' 
        'Establecemos el DataSource del control DataGridView 
        ' 
        dgvdetalle.DataSource = FillDgv() 
        ' 
        'Mapeamos las propiedades de la clase devuelta por la Funcion FillDgv() 
        'recuerde que esta funcion devuelve una lista del tipo EArticulo 
        ' 
        dgvdetalle.Columns("columnNumero").DataPropertyName = "Numero" 
        dgvdetalle.Columns("columnUpc").DataPropertyName = "Upc" 
        dgvdetalle.Columns("columnDescripcion").DataPropertyName = "Descripcion" 
        dgvdetalle.Columns("columnPiezas").DataPropertyName = "Piezas" 
        dgvdetalle.Columns("columnPrecio").DataPropertyName = "Precio" 
        dgvdetalle.Columns("columnImporte").DataPropertyName = "Importe" 
        ' 
        'Hacemos las sumatorias usando un método de extensión de Linq 
        ' 
        Dim sum As Decimal = FillDgv().Sum(Function(x) x.Importe) 
        Dim iva As Decimal = (Math.Round(((sum / 116) * 16), 2)) 
        Dim subtotal As Decimal = Math.Round(sum ‐ iva, 2) 

        txttotal.Text = Convert.ToString(Math.Round(sum, 2)) 
        txtiva.Text = Convert.ToString(iva) 
        txtsubtotal.Text = Convert.ToString(subtotal) 
    End Sub 

    Private Shared Function GenerateNumber() As Integer 
        Dim rdm As New Random() 

        Return rdm.[Next]() 
    End Function 

    Private Sub InvoiceGenerate() 
        ' 
        'Hacemos una instancia de la clase EFactura para 
        'llenarla con los valores contenidos en los controles del Formulario 
        Dim invoice As New EFactura() 
        invoice.Numero = Convert.ToInt32(txtnumero.Text) 
        invoice.Nombre = txtnombre.Text 
        invoice.Rfc = txtrfc.Text 
        invoice.Direccion = txtdireccion.Text 
        invoice.FechaFacturacion = dtpfecha.Value.[Date] 
        invoice.Subtotal = Convert.ToDecimal(txtsubtotal.Text) 
        invoice.Iva = Convert.ToDecimal(txtiva.Text) 
        invoice.Total = Convert.ToDecimal(txttotal.Text) 

        'Recorremos los Rows existentes actualmente en el control DataGridView 
        'para asignar los datos a las propiedades 
        For Each row As DataGridViewRow In dgvdetalle.Rows 
            Dim article As New EArticulo() 
            ' 
            'Vamos tomando los valores de las celdas del row que estamos  
            'recorriendo actualmente y asignamos su valor a la propiedad de la clase intanciada
            ' 
            article.Numero = Convert.ToInt32(row.Cells("columnNumero").Value) 
            article.Upc = Convert.ToString(row.Cells("columnUpc").Value) 
            article.Descripcion = Convert.ToString(row.Cells("columnDescripcion").Value) 
            article.Piezas = Convert.ToDecimal(row.Cells("columnPiezas").Value) 
            article.Precio = Convert.ToDecimal(row.Cells("columnPrecio").Value) 
            article.Importe = Convert.ToDecimal(row.Cells("columnImporte").Value) 

            ' 
            'Vamos agregando el Item a la lista del detalle 
            ' 
            invoice.Detail.Add(article) 
        Next 

        ' 
        'Creamos una instancia del Formulario que contiene nuestro 
        'ReportViewer 
        ' 
        Dim frm As New FacturaRpt() 
        ' 
        'Usamos las propiedades publicas del formulario, aqui es donde enviamos el valor 
        'que se mostrara en los parametros creados en el LocalReport, para este ejemplo 
        'estamos Seteando los valores directamente pero usted puede usar algun control 
        ' 
        frm.Titulo = "Este es un ejemplo de Factura" 
        frm.Empresa = "Este es un ejemplo del Nombre de la Empresa" 
        ' 
        'Recuerde que invoice es una Lista Generica declarada en FacturaRtp, es una lista 
        'porque el origen de datos del LocalReport unicamente permite ser enlazado a objetos que  
        'implementen IEnumerable. 
        ' 
        'Usamos el metod Add porque Invoice es una lista e invoice es una entidad simple 
        frm.Invoice.Add(invoice) 
        ' 
        'Enviamos el detalle de la Factura, como Detail es una lista e invoide.Details tambien 
        'es un lista del tipo EArticulo bastara con igualarla 
        ' 
        frm.Detail = invoice.Detail 
        frm.Show() 
    End Sub 

    Private Sub btnImprimir_Click(sender As System.Object, e As System.EventArgs) Handles btnImprimir.Click 
        InvoiceGenerate() 
    End Sub 
End Class 

Ahora solo queda probar nuestra aplicación:

Llenamos los datos:

Presione el botón Imprimir, si siguió al pie de la letra el Articulo tendrá un reporte como este: 
Observe, en el reporte el Formato numérico y Módena, al igual que no tenemos hojas de mas sin datos…

Ahora, exporte el reporte a Pdf y observe que los márgenes están dentro del limite, sin generar hojas de mas, ni
salirse de los márgenes:

Bueno, hemos llegado al final de este tutorial, en un entrega posterior abordaremos las imágenes en Reportes
Locales y utilizaremos una Bd como fuente de datos para nuestro reporte.

Saludos desde Monterrey, Nuevo León México! 

Ejemplo C#
Ejemplo Vb.Net
Nota: El proyecto fue desarrollado en Vs2010 Ultímate usando Framework 4.0

Publicado por José Luis García Bautista en 22:49 
+9   Recomendar esto en Google

151 comentarios:

Anónimo 22 de octubre de 2013, 12:58
Hola  Jose  Luis  muy  interesante  tu  aporte.  Yo  quiero  hacer  algo  muy  parecido  pero  con  un  DataReader  y
con  formularios  donde  el  usuario  de  iformacion  como  filros  y  al  darle  aceptar  le  mande  los  reportes,
aunque  mis  conocimientos  aun  son  pocos  por  que  stoy  entrando  a  programar  en  C#  ando  buscando
información y poder lograrlo. Saludos
Responder

José Luis García 23 de octubre de 2013, 22:49
Hola:
Me alegro que te haya gustado y espero se haya sido de utilidad, con el tema del DataReader si te animas
a  usar  listas  genéricas  (que  de  echo  deberías  de  ir  despegándote  del  DataTable)  seria  prácticamente  lo
mismo lo unico que cambia es la manera de llenar la fuente de datos, pero todo lo demas que se a visto
en  este  articulo  seguiria  igual...espero  pronto  poder  subir  un  articulo  sobre  el  tema  que  planteas  para
aclararte mas el panorama....

Saludos
Responder

Respuestas
Jaimesco 5 de enero de 2017, 18:58
Hola jose
una pregunta que tal si tengo 3 tablas
estudiante(cod_est, nombre, fechanac, foto)
padres (cod_pad, nombre)
disciplina (cod_dis, cod_est, cod_pad, descripción, fechafalta)
la  pregunta  es  como  hacer  un  reportin  con  c#  en  el  que  se  pueda  visualizar  en  el  reporte  (al,
momento de la impresión) el campo foto de la tabla eestudiante.

osea que se pueda ver las descripciones disciplinarias de cada estudiante con sus respectivas
foto 
si me ayudas te lo agradecería no se como hacerlo

Responder

German Mauro 27 de octubre de 2013, 23:16
Esta  muy  bueno,  yo  hago  algo  parecido,  peeero,  tengo  los  detalles,  y  para  el  encabezado  necesito,  los
datos del presupuesto, para eso tengo una funcion que me devuelve una entidad con las propiedades. El
problema  es  que  no  me  aparece  como  una  opcion  cuando  elijo  el  origen  de  datos,  solo  aparecen  las
funciones que devulven listas

Responder

José Luis García 28 de octubre de 2013, 20:40
Hola Germán:

Me  da  gusto  que  te  haya  gustado  el  articulo  y  ojala  te  haya  servido  para  tu  propósito,  con  respecto  a  lo
que comentas, en el mismo articulo explico del porque únicamente puedes enlazar objetos del tipo List<>
y es que necesitas objetos que implementen Ienumerable, esto es así tanto si usas un DataTable como si
usas  Generic  list  ya  que  ambos  lo  implementan,  pero  esto  no  es  problema,  crea  el  DataSource  de  tu
encabezado normalmente y asignas una lista, no le veo problema; la otra opción aunque no tan elegante
seria que para los encabezados insertaras Parámetros para asignarle valores desde las propiedades de tu
entidad simple sin mas ni mas.

Saludos desde Monterrey, Nuevo León, México!
Responder

carmen lm 29 de octubre de 2013, 12:02
interesante tu aporte. ... yo hago un reporte similar pero desde mi base de datos, esta todo super. Pero yo
necesito  generar  el  reporte  sin  vista  previa  es  decir  imprimir  desde  un  botón  sin  mostrar  el  reporte  por
favor alguna idea???
Responder

Respuestas

José Luis García 29 de octubre de 2013, 20:14
Hola Carmen:

La verdad no veo porque hacer esto que deseas y complicarte la vida, si el reportviewer no te
quita mucho tiempo pero, bueno tus razones has de tener:

La verdad nunca lo he intentado pero aqui tienes un tutorial del propio Microsoft, espero te sea
de utilidad;

http://msdn.microsoft.com/es­es/library/ms252091.aspx

JONATHAN VELAZQUEZ 21 de junio de 2016, 14:09
tiene  que  crear  un  visor  en  donde  se  lo  asines  al  boton  de  vista  previa...  y  al  visor  le  asginas
los datos para el reporte esta sencillo

JONATHAN VELAZQUEZ 21 de junio de 2016, 14:11
tiene  que  crear  un  visor  en  donde  se  lo  asines  al  boton  de  vista  previa...  y  al  visor  le  asginas
los datos para el reporte esta sencillo

Jose Antonio Chavez Verdin 27 de agosto de 2016, 18:47
Yo  necesito  hacer  lo  mismo  ya  que  estoy  diseñando  el  recibo  de  un  punto  de  venta  y  quiero
que la cajera que opera el spoftware no le de click al boton imprimir del reportviewer, que salga
directo.

Jose Antonio Chavez Verdin 27 de agosto de 2016, 18:51
Yo  necesito  hacer  lo  mismo  ya  que  estoy  diseñando  el  recibo  de  un  punto  de  venta  y  quiero
que la cajera que opera el spoftware no le de click al boton imprimir del reportviewer, que salga
directo.

Responder

Luisfer 17 de diciembre de 2013, 8:35

Donde se debe colocar los ensamblados cuando se agregan a un reporte .rdlc cuando uno esta trabajando
con el Business Intelligent Development Estudio y cuando uno publica en reporting services es necesario
colocar estos ensamblados en una ruta esecifica dependiendo si se esta depurando o en un ambiente de
publicación.  Estoy  migrando  mis  reportes  para  que  no  sean  remotos  sino  locales  y  me  esta  saliendo  un
error de que no encuentra el ensamblado, donde lo debería agregar??
Responder

Unknown 4 de enero de 2014, 23:24
Excelente tutorial José Luis.
Estoy  haciendo  un  pequeño  programa  para  pasar  las  facturas  electrónicas  de  xml  a  pdf  y  me  ayudó
mucho.
Me surgió un curioso problema que te quiero comentar. 
Creé una clase parecida a tu EArticulo y de ella instancio un objeto llamado linea.
Creé una colección generica de objetos "linea", llamada "lineas"
Como  tengo  que  leer  del  xml,  y  no  se  cuantas  lineas  tiene  la  factura,  creé  un  bucle  dentro  del  cual  se
llena el objeto "linea" y a continuación se añade a la colección "lineas" con el método add.
De  momento  todo  bien.  El  problema  aparece  al  llenar  la  colección,  porque  la  llena  con  tres  elementos
iguales a la última linea (la factura que leí, tiene  tres  lineas  distintas).  Depuré  el  codigo  paso  por  paso  y
llegué a la conclusión de que el problema estaba en que el método add, al añadir un objeto a la colección
lo  hace  "por  referencia",  es  decir,  lo  que  almacena  es  un  puntero  hacia  el  objeto  "linea".  Al  cambiar  el
valor del objeto en el bucle siguiente, se cambian automáticamente los datos ya almacenados, y al final,
todos los elementos de la colección son iguales.
Como  solución  provisional,  instancio  el  objeto  "linea"  justo  antes  de  entrar  al  bucle  y  lo  destruyo  con
nothing  al  terminar  de  añadir  el  objeto  a  la  colección.  Así  funciona  bien,  pero  debe  haber  alguna  otra
solución mas "elegante" ¿no?

Responder

Unknown 4 de enero de 2014, 23:34
Vaya, mi comentario salió como "Unknown" 
Me llamo Oscar González
Responder

José Luis García Bautista 5 de enero de 2014, 0:37
Hola: 
Me  da  muchos  gusto  que  el  tutorial  haya  sido  de  utilidad  para  tus  propósitos,  muchas  gracias  por  tus
comentarios  y  gracias  también  por  tomarte  el  tiempo  de  hacerlo,  eso  motiva  a  seguir  compartiendo
conocimiento.

En relación a tu caso, seria cuestión de ver como es que lo estas haciendo a simple vista no logro ver la
dimensión del problema ni una posible solución. 

Si  te  es  posible  mándame  tu  correo  por  medio  del  formulario  de  contacto  y  vemos  como  poder
resolverlo...tal  tu  también  podrías  ayudarme  con  un  tema  sobre  facturación  que  estoy  enfrentando
actualmente.

Saludos desde Monterrey, Nuevo León, México!
Responder

Respuestas

Unknown 6 de enero de 2014, 15:37

Hola José Luis. 
Al  contrario,  gracias  a  gente  como  tu,  que  comparte  sus  conocimientos,  podemos  aprender
algo los demas.
Te  envié  mi  email,  aunque  no  creo  poder  ayudarte  mucho,  porque  yo  no  me  dedico  a  la
programación.  Trabajo  en  algo  que  no  tiene  nada  que  ver,  y  en  mis  ratos  libres,  que  no  son
muchos, hago algún programita sencillo.
Comenté aquí este problema, porque me pareció que que con el se entiende muy bien lo de los
tipos  de  datos  (por  valor  y  por  referencia),  ademas  de  que  le  encontré  una  utilidad  que  no
conocía al método de crear objetos en dos lineas (en una línea se define el objeto y en otra se
crea).

Abusando  un  poco  de  tu  amabilidad,  te  comento  que  ya  estoy  terminando  el  programa  para
pasar de xml a pdf,pero estoy un poco atorado con el asunto del qrcode.
Ya se como generarlo, y consigo verlo en cualquier formulario, pero no en el informe. 
Intenté poner una imagen y que la carge desde una ruta local (C:\qrcode.jpg por ejemplo)
tambien intenté crear una propiedad en una clase en la que se guarde la imagen y pasarsela al
informe  igual  que  los  demas  datos,  pero  nunca  me  sale  la  imagen.Me  sale  un  icono  pequeño,
como de imagen rota. 
No se si estoy guardando mal la imagen, o no referencio bien la ruta con las expresiones...
Si sabes como poner una imagen variable en un informe, telo agradecería mucho.

Saludos
Oscar Gonzalez

Responder

Anónimo 8 de enero de 2014, 16:12
Saludos,  tengo  una  duda,  como  se  puede  mandar  a  impresión  tu  reporte  sin  ver  el  formulario  de  vista
previa ??
Responder

José Luis García Bautista 8 de enero de 2014, 20:53
Hola:
Me hubiera gustado que mencionaras tu nombre para saber a quien me dirijo...

En  relación  a  tu  pregunta  te  comento  que  no  he  tenido  la  necesidad  de  hacerlo,  pero  te  dejo  este  Link
donde se menciona como hacer esto que deseas:

http://social.msdn.microsoft.com/Forums/en­US/57692388­f234­4cc0­9b55­4899a0c7e0b5/printing­a­rdlc­
directly­to­a­printer

Y este otro del propio Msdn con un ejemplo bastante claro:
http://msdn.microsoft.com/en­us/library/ms252091(VS.80).aspx
Responder

Santos Roberto Poot Montiel 22 de enero de 2014, 20:27
Excelente tutorial, Jose Luis, me va a servir de mucho, pues estaba luchando con los reportes
Responder

José Luis García Bautista 22 de enero de 2014, 20:56
Hola Santos:

Que gusto que el articulo sea de utilidad, cuando empece con el tema de los reportes la verdad me costo
mucho  comprenderlos  sobre  todo  porque  los  tutoriales  que  encontraba  o  estaban  en  ingles  y  no  eran
claros  o  estaban  en  español  y  tampoco  estaban  completos  y  cuando  estas  comenzando  y  desconoces
tantas  cosas,  un  paso  sin  mencionar  manda  todo  lo  demás  a  la  basura  porque  resulta  estresante  andar
adivinando.

No dudes en compartir el articulo y suscribirte al blog si lo deseas, muy pronto subiré mas artículos.

Saludos desde Monterrey, Nuevo León, México!
Responder

Anónimo 1 de febrero de 2014, 0:13
Muy Buen Post

Responder

LORENA URIBE OSORIO 6 de febrero de 2014, 9:55
HOLA  JOSE  LUIS,  EXCELENTE  EXPLICACIÓN  MUCHISIMAS  GRACIAS  POR  COMPARTIR  TUS
CONOCIMIENTOS, ME SIRVIO MUCHISIMO.
Responder

Anónimo 7 de febrero de 2014, 0:31
Hola José Luis, excelente tutorial, muy bien explicado, es lo que tanto andaba buscando, muchas gracias
por la información. saludos.

Responder

José Luis García Bautista 7 de febrero de 2014, 23:45
Hola:
Lorena,  muchas  gracias  por  tus  comentarios,  la  idea  fue  esa  precisamente  ofrecer  un  manual  completo,
como el que me hubiera gustado a mi encontrar en su momento. Tenemos temas pendientes que subir los
cuales no se han podido lograr por falta de tiempo pero, espero pronto poder subirlos.

No dudes en compartir el link y suscribirte al blog.

Saludos desde Monterrey, Nuevo León, México!
Responder

José Luis García Bautista 7 de febrero de 2014, 23:47
Hola "Anonimos":

Me hubiera gustado que publicaran su nombre para asi dirigirme a ustedes por su nombre. Gracias por sus
comentarios motivan a seguir publicando.

No duden en compartir el link y suscribirse al blog.

Saludos desde Monterrey, Nuevo León, México!
Responder

Vladimir Martinez 10 de febrero de 2014, 21:14
brother  tengo  un  problema  con  el  proyecto  que  isistes  yo  estoy  en  visual  studio  2013  y  me  dice  en  esta
parte lo siguiente cuando lo escribo y lo termino dice
incoherencia de accesibilidad ; es menos accesible que en el campo

public List Detail = new List();

ayudame por favor 

mi nombre es Vladimir Martinez mi email es vladimirmartinez_2@hotmail.com

Responder

Vladimir Martinez 10 de febrero de 2014, 21:16
Esto es lo que me dice no se si me puedes ayudar es con los dos con Invoice y detail me sale este error
ayudarme por favor que es mi ultimo ejercicio please 

Error  1  Incoherencia  de  accesibilidad:  el  tipo  de  campo  'System.Collections.Generic.List'  es  menos
accesible  que  el  campo  'ReportViewerInvoiceReport_CSharp.FacturaRpt.invoice'
C:\Users\Keiry\Documents\Visual  Studio
2013\Projects\ReportViewerInvoiceReport_CSharp\ReportViewerInvoiceReport_CSharp\FacturaRpt.cs  20
35 ReportViewerInvoiceReport_CSharp 
Responder

Respuestas

Anónimo 18 de febrero de 2014, 10:28
tengo el mismo problema, no se como resolverlo
ayudenme

Vladimir Martinez 18 de febrero de 2014, 12:04

Anonimo  sabes  cual  es  el  problema  y  como  lo  solucione  El  codigo  de  mi  amigo  esta  bueno  y
funciona exactamente original

el problema se da por que en la clase tu no le as puesto public por eso da el problema solo la
declarastes predetermidamente que solo es class

pero en realidad es public class factura esto es un ejemplo 

Cualquier duda avisa a mi amigo y que me escriba para poderte ayudar Estamos a las ordenes
de todos 

gracias

Vladimir Martinez 18 de febrero de 2014, 16:19
Mandamelo  a  mi  correo  subilo  en  skyDriver  para  verlo  y  me  mandas  a  mi  correo
vladimirmartinez_2@hotmail.com o al ing.martinezchavez@gmail.com

Responder

Dovannys Hernández 18 de febrero de 2014, 9:03

Muy buen POST. Solo una pregunta: Se puede realizar igual en ASP.NET MVC?
Responder

Respuestas

José Luis García Bautista 19 de febrero de 2014, 22:02

Hola Dovannys:

Gracias  por  tu  comentario,  lamentablemente  no  tengo  experiencia  aun  en  ambientes  web  así
que no sabría decirte si aplica o no aplica.

Responder

Vladimir Martinez 18 de febrero de 2014, 12:03

Anonimo  sabes  cual  es  el  problema  y  como  lo  solucione  El  codigo  de  mi  amigo  esta  bueno  y  funciona
exactamente original

el problema se da por que en la clase tu no le as puesto public por eso da el problema solo la declarastes
predetermidamente que solo es class

pero en realidad es public class factura esto es un ejemplo 

Cualquier duda avisa a mi amigo y que me escriba para poderte ayudar Estamos a las ordenes de todos 

gracias

Responder

Respuestas

José Luis García Bautista 19 de febrero de 2014, 22:00

Hola Vladimir:

Muchas gracias por interesarte en el artículo y me alegro que te haya sido de utilidad, también
muchas  gracias  por  compartir  tu  experiencia  con  el  usuario  "Anonimo"  que  espero  lo  haya
solucionado con tu aporte.

Generemos conocimiento entre todos!

No  olvides  compartir  el  artículo  y  suscribirte  al  blog,  próximamente  subiré  otros  artículos  que
podrían ser de tu interés!

Responder

Edy Alberto Mejia Hernandez 21 de febrero de 2014, 23:31

Solo tengo una palabra para ti. Gracias
Responder

Respuestas

José Luis García Bautista 22 de febrero de 2014, 12:14
Hola Edy:

Muchas gracias por tu comentario, me alegro que el articulo te haya sido de utilidad.

No olvides suscribirte al blog, esto es un motivante para seguir publicando.

Responder

Luis Ilian Herrera 22 de febrero de 2014, 17:06

Hola Excelente Articulo. Amigo tengo una duda, estoy haciendo un informe donde tiene campos estaticos
es decir no es una lista o tabla indeteminada de datos, digamos es un informe estilo factura donde tiene
un numero fijo de datos, este informe solo tiene dos paginas, donde relleno los campos de estas paginas
de acuerdo a la consulta a la base de datos. el problema que tengo es que necesito poder tener esas dos
paginas en diseño en el archivo rdlc, pero por mas que he buscado solo puedo tener una, y necesito poder
diseñar la segunda. agradezco la ayuda que me puedas dar.
Responder

Respuestas

José Luis García Bautista 22 de febrero de 2014, 17:25

Hola Luis:
Lamentablemente  esto  que  quieres  hacer  aun  no  lo  he  logado,  lo  intente  varias  veces  pero  al
pareces esto no es posible, no obstante te dejo este link probablemente te de alguna idea:

http://msdn.microsoft.com/en­us/library/ms251701(v=vs.90).aspx

Saludos desde Monterrey, Nuevo León, México!

Luis Ilian Herrera 22 de febrero de 2014, 19:01
Muchas  gracias,  de  todas  formas  me  toca  seguir  investigando,  por  que  es  necesario  para  lo
que necesito hacer.

Responder

Anónimo 7 de marzo de 2014, 10:46
HOLA AMIGO MUY BUEN APORTE AGRADESCO MUCHO YA QUE EXPLICAS TODO BIEN ... CHIDO
AMIGO MUCHAS GRACIAS.
Responder

Respuestas

José Luis García Bautista 10 de marzo de 2014, 20:23

Hola Anónimo:
Muchas  gracias  por  tus  comentarios,  no  olvides  compartir  el  enlace  para  que  mas  gentes  se
sirvan de este articulo.

Saludos desde Monterrey, Nuevo León, México!

Responder

Agustina N. 10 de marzo de 2014, 0:54

Hola, muy bueno tu aporte, pero intente hacerlo y cuando quiero agregar los objetos en el reporte (origen
de  datos  )  no  me  aparecen...  probé  guardando,  ejecutando  el  código,  cerrando  y  volviéndolo  a  abrir  y
tampoco...
Responder

Respuestas

José Luis García Bautista 10 de marzo de 2014, 20:26

Hola Agustina:
Creo que no leíste bien el articulo, o te pasaste por alto esta parte:

{...Para  poder  usar  las  clases  de  EFactura  para  llenar  el  Encabezado  del  reporte  y  EArticulo
para  el  detalle  del  mismo,  primero  debemos  de  generar  el  proyecto,  para  ello  localice  el  menú
Generar –> Generar Solución...}

Prueba con eso y me comentas como te va!
Saludos desde Monterrey, Nuevo León, México!

Responder

Anónimo 26 de marzo de 2014, 10:16

Hola!
Hola!

He  intentado  de  mil  maneras  que  se  autoimprima  el  reporte.  Pero  no  hay  manera.  Ni  siguiendo  las
instrucciones de Microsoft.
Alguien sabe cómo hacerlo?
Muchas gracias!

Responder

Teo Renteria 26 de marzo de 2014, 15:16
Hola Jose Luis

Me pareció muy útil este tutorial, estoy haciendo algo parecido pero con orígenes de datos dinámicos 
y  estoy  llenando  el  report  viewer  manualmente  ya  q  mis  procedimientos  tardan  demasiado  y  por
cuestiones de timeout lo tengo que hacer manualmente y no me carga absolutamente nada 
este es mi código si pudieras ayudar te agradecería mucho

SqlDataAdapter sqlAdaptador;
SqlConnection sqlConexion = new SqlConnection();
DataSet dt = new DataSet();
try
{
sqlConexion.ConnectionString = ConfigurationManager.ConnectionStrings["IMArk"].ConnectionString; 
sqlConexion.Open(); 

sqlAdaptador = new SqlDataAdapter(sConsulta, sqlConexion);
sqlAdaptador.SelectCommand.CommandTimeout = 0; 
sqlAdaptador.Fill(dt); 
Microsoft.Reporting.WinForms.ReportDataSource  rds  =  new
Microsoft.Reporting.WinForms.ReportDataSource("Datos", dt.Tables[0]); 

reportViewer1.LocalReport.ReportPath = "ReportTop100.rdlc"; 
//  reportViewer1.LocalReport.DataSources.Add(new
Microsoft.Reporting.WinForms.ReportDataSource("DataSetInformeFidelizacion", dt.Tables[0])); 
reportViewer1.LocalReport.DataSources.Add(new
Microsoft.Reporting.WinForms.ReportDataSource("Datos", dt.Tables[0])); 

reportViewer1.Refresh(); 

}
catch (Exception ex)
{

}
Responder

Anónimo 16 de abril de 2014, 3:00

Ya era hora de que alguien creara un blog para problemas con ReportViewer.  
Soy nuevo en esto y me gustaria hacer una pregunta que me trae loco.
Resulta que tengo un report y dentro de este tengo otro report. Quiero pasarle unos parametros del primer
report  al  segundo  pero  cuando  los  defino  me  llegan  al  segundo  report  a  null  y  no  me  muestra  la
informacion.
Los  parametros  son  campos  de  la  clase  he  probado  a  escribir  directamente  un  texto  y  si  aparecen  en  el
subreport pero si es un campo de la clase no va.

Espero que alguien pueda ayudarme con este problema.
Gracias.
Responder

Angelo 28 de abril de 2014, 9:53

Excelente aporte!!! me ha funcionado de maravillas al enlazarlo a un objeto de un servicio web.
Un saludo desde www.systemdeveloper.info

Responder
Anónimo 3 de mayo de 2014, 8:59
Necesito que por cada registro en la darse de dato mostrar una pagina de reporte rdlc. Necesito hacer una
combinación de correspondencia
Responder

Jonatan 26 de mayo de 2014, 10:36

Buenas, en primer lugar enhorabuena por el articulo!

Estoy  realizando  un  programa  en  C#  el  cual  maneja  una  base  de  datos  sqlite  para  almacenar  datos  de
clientes, proveedores, distribuidores, etc!
El programa tiene como fin visualizar un informe el cual recoge dos recetas en un mismo folio!
Mi problema es que necesito hacer una plantilla para una receta y pasarle un List de una clase que tengo
al  igual  que  tu,  y  que  muestre  doble  esa  receta!  No  se  si  me  he  explicado,  pero  haber  si  me  pueden
ayudar, gracias.
Responder

jgarale 2 de junio de 2014, 23:06

hola,  me  gusto  mucho  el  tutorial,  solo  que  tengo  un  problema,  me  marca  un  error,  me  dice  que
"dgvdetalle"  no  esta  declarado,  y  en  efecto  busco  en  el  código,  pero  no  encuentro  en  que  momento  se
declara "dgvdetalle". ojalá me pudieras ayudar muchas gracias.
Responder

Respuestas

José Luis García Bautista 2 de junio de 2014, 23:12

Hola Jgarale:
El dgvDetalle fue agregado al proyecto en tiempo de diseño, descarga el codigo que se ofrece
mas abajo esta disponible tanto para C# como para Vb.Net..

Saludos desde Monterrey, Nuevo León, México!

Responder

jgarale 2 de junio de 2014, 23:07

hola, se me pasó mencionar que estoy usando visual basic 2010
Responder

jgarale 2 de junio de 2014, 23:11

hola, perdón que oso, jajaja... ya me di cuenta que asi se llama el datagridview muchas gracias. saludos
Responder

Anónimo 10 de junio de 2014, 13:28

Gracias por el tuto,me sirvio mucho :)
Responder

Sergio Diaz 11 de junio de 2014, 18:35

Hola, muy buen tutorial, me podrías ayudar con la siguiente línea
reportViewer1.LocalReport.SetParameters(parameters); 
Me marca el siguiente error
No se controló Microsoft.Reporting.WinForms.LocalProcessingException
Gracias

Responder

Respuestas

Brianda Uriarte 6 de noviembre de 2014, 11:38
Me surgió el mismo error como le dio solución??

José Luis García Bautista 6 de noviembre de 2014, 21:10

Hola Brianda Uriarte:

Analiza  este  articulo,  ahi  se  mencionan  las  posibles  soluciones  a  la  excepction  que  estas
obteniendo:

http://stackoverflow.com/questions/6297282/how­to­fix­the­bug­local­processing­exception­was­
unhandled­when­passing­paramet

Si esta es la solución no olvides comentarnos.

Responder

Sergio Diaz 11 de junio de 2014, 18:49

Wuju!!!! ya encontré el error (el nombre del cuadro de texto de los parametros los tenía incorrectos). 

Saludos.
Responder

Anónimo 18 de junio de 2014, 22:20

Esto es la solución QRcode, veo, espero poder ayudarle a:'descargar ejemplo qrcode en visual c#.net

Responder

Anónimo 18 de junio de 2014, 22:22
Esto es la solución QRcode, veo, espero poder ayudarle a: descargar ejemplo qrcode en visual c#.net

Responder

Respuestas

José Luis García Bautista 18 de junio de 2014, 22:57

Hola Anónimo:

Seria  interesante  conocer  tu  nombre  para  saber  a  quien  agradecerle  el  aporte  del  BarCode,
usare la Dll para mostrar como poner una imagen en un RDLC...

Saludos desde Monterrey, Nuevo León, México!

Responder

Ralex Bárcenas 23 de junio de 2014, 9:32
Excelente tutorial Compadre!! Me salvaste la vida...
Gracias!!!
Responder

José Luis García Bautista 23 de junio de 2014, 13:23

Hola Ralex:

Me alegro que te haya servido el articulo.

Saludos desde Monterrey, Nuevo León, México!

Responder

Iván Sánchez 27 de junio de 2014, 4:17
Excelente  tutorial!  Muchas  gracias  porque  la  verdad  que  no  he  encontrado  nada  ni  la  mitad  de  bueno.
Únicamente tengo un problema, he seguido todo el tutorial pero cuando relleno los datos y pulso Imprimir,
me aparece el reportviewer vacío. He comprobado que tiene asociado el report1.rdlc pero aún así nada de
nada :'( ¿Alguna idea? Gracias nuevamente, un saludo.
Responder

Respuestas
Iván Sánchez 27 de junio de 2014, 4:37

Hola  de  nuevo,  me  respondo  con  la  solución  a  mí  mismo,  le  había  puesto  otro  nombre  a  los
parámetros y no intersectaba el error de que no se podía cargar porque el nombre del parámetro
Title pasado no existía ;­D Ahora todo perfecto! Muchísimas gracias.

José Luis García Bautista 27 de junio de 2014, 20:13

Hola iván:

Gracias por tus comentarios, lamentablemente no tengo acceso al blog desde el trabajo y solo
veo  los  comentarios  hasta  tarde,  lamento  no  haber  podido  asistirte  y  me  alegro  que  hayas
encontrado la solución por ti mismo.

Saludos desde Monterrey, Nuevo León, México!

Responder

cesar maza 11 de julio de 2014, 14:59

Muy Buen aporte.
Tengo  un  Reporte(R1)  que  contiene  campos  con  hypervinculos  que  abren  un  reporte(R2),  Quisera  saber
como hacer para que al Exportar el R1 a Excel ,no se Creen los Hypervinculos..
Agradecería si alguien me ayuda con este tema,Estoy usando C#2012

Responder

Francisco 20 de julio de 2014, 19:11

Gran aporte.
Pero no se si me puedas ayudar... lo que quiero es mostrar imágenes ( las cuales pueden cambiar registro
a registro ). lo único que he logrado es que muestre solo una (la primera) pero las demás se repiten. Las
imágenes y los textos a mostrar están guardadas dentro de los objetos del List<>.
Gracias !!
Responder

Carlos Andres Bonilla Cardona 24 de agosto de 2014, 17:37

Muchas  gracias  José  Luis  García  Bautista,  de  verdad  lo  buscaba  desde  hace  mucho  tiempo,  siempre
encontraba  como  hacerlo  pero  usando  el  asistente,  ahora  sé  como  hacerlo  manualmente,  que  es  lo  que
me  interesa.  Estoy  haciendo  una  aplicación  que  debe  conectarse  a  una  bd  que  se  encuentra  en  otro
equipo  y  luego  de  un  pago  debe  general  un  recibo  el  cual  se  debe  guardar  o  imprimir.  Me  has  ayudado
muchísimo, en serio, ahora mismo me pondré a adaptarlo a mi necesidad.
Responder

LA LEYENDA VIVIENTE 28 de agosto de 2014, 19:54

EXCELENTE APORTE: 
pero tengo una dua o ayuda sobre tu programa,que en ves de tener dato fijo en el datagriw tener texbo que
llenen el datagriw para haci hacer reporte de vario detalle no de dato fijo

Responder

Respuestas

José Luis García Bautista 29 de agosto de 2014, 10:23
Hola:  recuerda  que  la  finalidad  del  artículo  es  mostrar  como  utilizar  un  LocalReport,  sus
controles, parámetros y como enlazar su DataSource a una lista genérica de objetos. El origen
de los datos no importa puesto que podría ser cualquiera.

Lo  que  sugieres  o  deseas  ver  no  es  nada  complicado  bastará  con  que  unas  otro  artículo  de
este  blog  (en  donde  hablo  de  como  llenar  un  control  DataGridView  usando  dos  técnicas
distintas) a este proyecto y listo! Tendrás el proyecto que deseas. 

Si tienes alguna otra duda Siéntete libre de externarla

Saludos
J. Luis

Responder

EDTA 10 de septiembre de 2014, 19:06
Buenos dias Jose Luis
Muy  interesante  el  aporte,  de  todas  maneras  tengo  un  pequeño  problema  (aparte  de  que  estoy
comenzando y mis conocimientos son limitados). He ociado letra a letra tu proyecto y al imprimir report en
blanco. He bajado tu proyecto, imprimir y report en blanco.... No hay errores no hay nada. Tendra algo que
ver que sea Visual Studio 2013???. 
Gracias  por  adelantado  por  echarme  una  mano.  Tengo  que  terminar  un  pequeño  programa  que  necesita
imprimir y aquí estoy esperando como agua de mayo..

Sldos
Responder

Respuestas

José Luis García Bautista 10 de septiembre de 2014, 21:08

Hola EDTA: 

Si  migraste  la  aplicación  directamente  probablemente  haya  alguna  incompatibilidad  en  algún
fragmento de código o en el mismo Rdlc.

Te  recomiendo  que  en  lugar  de  bajar  el  reporte,  intentes  hacerlo  tu  desde  cero  en  tu  Visual
Studio 2013 siguiendo paso a paso este articulo, si aun si tienes dudas o problemas con gusto
podemos revisarlo uno a uno...

Espero poder ayudado un poco en la resolución de tu problema.

Saludos
J. Luis

Responder

Alvin Cat 22 de septiembre de 2014, 16:48

Hola Jose Luis:
Tengo  un  problema  dentro  del  report  ya  que  me  imprime  una  hoja  demas  q  tiene  solo  el  encabezado,
espero puedas ayudarme
Responder

Respuestas

José Luis García Bautista 22 de septiembre de 2014, 17:04

Hola Alvin: 
Analiza por favor lo que comentó en la sección. "Configurar tamaño y encabezado del informe"
ahí encontrarás el motivo del porque se te esta presentando esta situación. 

Saludos

Alvin Cat 24 de septiembre de 2014, 10:51
como siempre tienes la razon, jaja q cabeza la mia, gracias por tu ayuda, y una consulta mas
por favor, quisiera insertar una imagen de un codigo qr por cada factura, lo q no logro hacer es
que  la  imagen  cambie  automaticamente  para  cada  factura  o  reporte  ya  q  el  codigo  qr  tiene
datos unicos por factura, agradezco de antemano tu ayuda.

José Luis García Bautista 24 de septiembre de 2014, 21:14
Para  el  tema  de  la  imagen  QR  tienes  que  agregar  un  objeto  Imagen  (si  mal  no  recuerdo  se
llama  así)  después  en  las  propiedades  de  dicho  objeto  seleccionarías  una  opción  que  dice
Origen  de  base  de  datos  y  lo  que  le  enviarías  en  seria  un  arreglo  lo  Bytes  dicho  arreglo  de
bytes seria la imagen del QR descompuesto en bytes :­D, si eres paciente te prometo que para
el Sábado subo un articulo que hable sobre los codigo QR en reportes locales...

Saludos

Responder

Karim Yunis Muñoz 22 de octubre de 2014, 13:45

como  puedo  crear  un  un  reporte  a  partir  de  un  dataset  que  lllene  por  codigo  mediante  una  consulta  a  la
base  de  datos,  ejemplo:  dim  dsDatos  as  Dataset  =  getDatos()  //  funcion  que  me  trae  un  dataset  de  una
consulta a la base de datos
Responder
Respuestas

José Luis García Bautista 22 de octubre de 2014, 14:28

Hola:  La  primer  sugerencia  es  que  dejes  de  pensar  en  DataSet  porque  ya  noves  usan  o  no
deberían  de  usarse,  la  segunda  busca  dentro  de  los  artículos  del  blog  ahí  encontraras  un
artículo  con  nombre  similar  a  este,  ahí  hablo  sobre  comí  traer  datos  de  una  base  de  datos  y
como se enlaza al DataSource de un LocalReport.

Si el artículo es de tu agrado considera unirte al blog o Compartir el artículo.

Karim Yunis Muñoz 22 de octubre de 2014, 15:01
Este proyecto está para ser descargado?

José Luis García Bautista 22 de octubre de 2014, 20:36

Hola Karim:

Claro,  todos  los  articulos  aqui  creados  tiene  el  proyecto  disponible  para  su  descarga,  en  caso
de que en alguno de ellos no lo encuentres por favor hasmelo saber para reparar el link.

Te dejo el link del articulo que comente en mi respuesta anterior: 
http://joseluisgarciab.blogspot.mx/2013/10/reportviewer­y­rdlc­ejemplo­factura.html

o búscalo por nombre:
ReportViewer y Rdlc, ejemplo Factura (Base de datos) 

Ahí podrás encontrar como enlazar el DataSource del LocalReport a una base de datos.

Saludos

Karim Yunis Muñoz 23 de octubre de 2014, 6:21
Este proyecto donde lo puedo descargar?

Responder

Pablo Ruffo Claure 22 de octubre de 2014, 16:48
Te complicas demasiado, y confundes al resto, esto lo solucionabas con un Array de @parametros

Responder

Respuestas

José Luis García Bautista 22 de octubre de 2014, 20:33
Hola Pablo Ruffo Claure: 

Me  da  gusto  que  visites  el  blog  (aunque  sea  por  curiosidad),  en  relación  a  tu  comentario,
permiteme responder con varias puntos:

1.  Seria  bueno  que  extendieras  tu  aportación,  comentas  que  lo  solucionarías  con  un  array  de
parámetros, pero no comentas que arreglarías, si el paso de dos parámetros al encabezado del
reporte o quizás apuntes a llenar un reporte con un array de parámetros.

2. Seria bueno que nos compartieras tu solución al "problema", recuerda que el objetivo de este
blog es que expandamos el conocimiento, no solo yo si no el resto de la gente que diariamente
acude a el buscando guías para realizar sus actividades, al compartir, ganamos todos. 

3.  En  el  titulo  del  articulo  se  menciona  que  se  tratara  sobre  listas  genéricas,  que  hoy  por  hoy
forman  parte  de  la  médula  de  la  programación  orientada  a  objetos  y  son  mil  veces  mas
potentes que un simple array. 

4.  Me  gustaría  también  nos  comentaras  que  parte  del  articulo  te  provoca  confusión,
seguramente alguien mas del blog podría expandir la explicación para ayudarte a comprender el
articulo  y  sus  objetivos  o  si  es  necesario  crear  un  nuevo  articulo  donde  se  evite  crear  la
confusión que hoy te provoca, recuerda que el nombre del blog es "Parvulos .Net" y si alguien
no comprende del todo los temas aquí tratados entonces seguramente hay algo que cambiar. 

Saludos desde Monterrey, Nuevo León, México! 

Responder
Pedro Avila 22 de octubre de 2014, 20:59
Hola estoy de acuerdo con lo que dice José Luis la creación de este blog es con la finalidad de compartir
el conocimiento, no de tirar la piedra y esconderse.
Aparte  que  se  enseña  la  creación  de  reporte,  se  esta  enseñado  a  usar  listas  genericas  fuertemente
tipadas, la cual tiene un mejor performance que un array.
Responder

L 31 de octubre de 2014, 13:21

Hola, gracias por este tutorial, me ha servido de ayuda.

Pero  ahora  me  surge  una  duda:  si  por  ejemplo  necesito  imprimir  todas  las  facturas  de  un  mes  (o  de  un
año),  ¿cómo  podría  hacer  para  unir  todas  estas  facturas  en  un  único  informe  de  manera  que  se  puedan
visualizar  en  el  reportviewer  como  un  único  documento  y  además  así  se  podrían  imprimir  todas  de  una
vez?.

Muchas gracias.

Responder

colimote79 5 de noviembre de 2014, 11:40

Gracias por tu aportación, es un excelente artículo. Creo que ya me puedo ir olvidando de los reportes con
el control "PrintDocument". Saludos!

Responder

Gustavo Esquivel 7 de noviembre de 2014, 21:04
excelente amigo un capo te felicito muy bien explicado

Responder

Respuestas

José Luis García Bautista 7 de noviembre de 2014, 21:59
Gracias  Gustavo  la  idea  era  no  confundir  a  los  Párvulos  sobre  cómo  usar  estos  controles  y
clases.

Saludos

Responder

E.J. CHOCHOCA 8 de noviembre de 2014, 19:39

Gracias por su aporte amigo buen tutorial!!!!! saludos
Responder

Brayan Loayza 15 de noviembre de 2014, 17:36

MUCHISIMAS  GRACIAS  AMIGO  FUNCIONA  A  LA  PERFECCION  MEJOR  EXPLICADO  NO  PUEDE
ESTAR...!

Responder

Noelia Córdoba 6 de diciembre de 2014, 11:05
Hola!  Muy  buen  aporte!  Muchas  gracias!  Quería  consultar  si  alguien  sabe  porque  puede  ser  que  si  yo
tengo un reporte, similar a este, que es de una factura se repita el pie de pagina en otras dos hojas más
sin que hubiese detalles, ya que hago una validación para que carguen justo los que entrar en una pagina
A4. Si alguien sabe como resolverlo se lo agradecería mucho. Saludos

Responder

Respuestas

José Luis García Bautista 9 de diciembre de 2014, 20:34
Hola Noelia:
Una disculpa por responder hasta ahora, si supieras la cantidad de trabajo que tengo encima.

El  problema  que  te  es  sucediendo  es  por  la  altura  de  tu  reporte,  muchas  veces  no
consideramos los margenes, los pie de paginas etc, en nuestro tamaño total.

Prueba reduciendo el tamaño de estos y veras como corriges tu problema.
Gracias por visitar Parvulos .Net

Responder

kloz 9 de diciembre de 2014, 15:54
Muy  buen  aporte,  Jose  Luis,  me  sirvio  mucho,  le  realice  unos  cambios  y  me  funciona  perfecto,  tienes
algun blog donde publiques tus aportes? si es asi me gustaria saber, ya que explicas muy bien
Responder

Respuestas

José Luis García Bautista 9 de diciembre de 2014, 20:43

Hola Kloz:

Gracias  por  visita  Parvulos  .Net,  me  da  gusto  que  el  articulo  te  haya  sido  de  utilidad  para  tus
propósitos, no olvides darnos un voto y compartir el articulo.

Si estas interesado en recibir nuevos artículos podrías unirte al blog sin problemas.

Responder

Jorge Can 23 de marzo de 2015, 19:13

No puedo bajar el tutorial!!!
Responder

YGm Juan Andres 15 de abril de 2015, 9:05

hola tienes algun video de paso con el Código Vb.Net: de este tutorial ?
gracias hermano

Responder

YGm Juan Andres 15 de abril de 2015, 9:12
hola 

EN: Agrege un segundo formulario, llámelo FacturaRpt.cs este contendrá el control ReportViewer al cual 
enlazaremos el LocalReport,

en vb.studio 2013 con el Código Vb.Net: 
no  encuentro  :  ReportViewer  o  LocalReport  ,  ya  los  busque  en  elegir  elementos  o  en  componentes  .net
framerwork o componentes com pero no los localizo ?

de antemao muchas gracias por la ayuda

Responder

Kelvis Osvaldo Ferreras Arias 28 de abril de 2015, 9:49
Buenos  días  a  todos,  me  sumo  a  todos  aquellos  "Agradecidos"  por  este  gran  aporte,  así  que  muchas
gracias Jose Luis. 

Planteo el problema que tengo:

Trabajo  con  VS  2013  y  tengo  un  reporte  que  utiliza  como  dataset  un  objeto  Cotizacion,  el  cual  a  su  vez
tiene  una  propiedad  cliente  de  tipo  Cliente,  la  cual  contiene  los  datos  del  mismo.  El  reporte  visualiza  sin
problemas los datos de la Cotizacion, pero no me muestra los datos de la propiedad cliente. Entiendo que
se  debe  a  que  la  propiedad  NO  es  de  tipo  primitiva,  sino  un  objeto.  Puede  alguien  decirme  como  puedo
mostrar los datos de esta propiedad?

Gracias anticipadas y saludos.

Responder

Respuestas

José Luis García Bautista 28 de abril de 2015, 23:57
Hola Kelvis:

Desafortunadamente  el  RDLC  no  permite  entidades  complejas  como  fuente  de  datos,  por  lo
cual tendras que crear una fuente de datos por cada objeto que desees mostrar y tendras que
cargar cada uno por separado...de otra forma no podras hacerlo.

Gracias por visitar Parvulos .Net, no olvides apoyar al blog visitando nuestros anuncios.

Saludos

Responder

Kelvis Osvaldo Ferreras Arias 12 de mayo de 2015, 15:40

Buenas  tardes  Jose  Luis,  muchas  gracias  por  la  solución.  lo  he  hecho  como  indicaste  y  funciona
correctamente.

Ahora estoy intentando imprimir una factura en un punto de venta, con una impresora BIXOLON SRP 275
que utiliza rollo de papel continuo. Lo primero es que se debe imprimir directamente (sin  mostrar  la  vista
preliminar)  y  lo  segundo  es  que  la  altura  del  papel  debe  ser  dinámica,  es  decir,  determinada  por  la
cantidad de lineas de detalle a imprimir. He visto algunos ejemplos creando una imagen de la factura, pero
hasta el momento ninguno me ha funcionado.

Agradecería cualquier comentario que pudiera arrojarme un poco de luz al respecto. Un saludo.
Responder

Respuestas

José Luis García Bautista 12 de mayo de 2015, 20:46

Hola Kelvis:

Que  bueno  que  te  haya  servido  el  consejo,  mira  en  relacion  a  imprimir  sin  vista  preliminar  me
he encontrado con esta documentacion y ejemplo en la propia libreria de MSDN pero la verdad
nunca  la  he  implementado  pero  te  dejo  este  Link  donde  se  menciona  como  hacer  esto  que
deseas:

http://social.msdn.microsoft.com/Forums/en­US/57692388­f234­4cc0­9b55­
4899a0c7e0b5/printing­a­rdlc­directly­to­a­printer

Y este otro del propio Msdn con un ejemplo bastante claro:
http://msdn.microsoft.com/en­us/library/ms252091(VS.80).aspx

En  relación  al  tamaño  del  reporte  esto  realmente  no  importara  porque  al  igual  que  se  puede
generar  un  reporte  de  1  hoja  se  puede  crear  uno  de  10  y  mientras  tengas  papel  este  se
imprimirá sin problemas, solo ojo con la configuración del pie de pagina para que no repita por
cada hoja que genere.

Saludos

Responder

colimote79 13 de junio de 2015, 11:38

Este comentario ha sido eliminado por el autor.
Responder

colimote79 13 de junio de 2015, 11:40

¡Que  tal  José  Luis!  Muchas  gracias  por  este  gran  aporte,  gracias  a  ello  he  podido  integrar  este  tipo  de
reporte en mis sistemas.

Quisiera hacerte una pregunta.
Tengo un reporte de facturas donde solo se listan las facturas que se realizaron entre un rango de fechas,
que tiene estos datos:

Reporte de Facturas entre rango de fechas
Folio 1, Factura 1, Fecha...
Folio 2, Factura 2, Fecha...
.....
Folio N, Factura N, Fecha...

Y otro con los detalles de la factura por separado, o sea, algo así:

Reporte  de  detalles  de  factura  (Donde  se  especifica  los  productos  que  se  compraron,  con  costo  y
cantidad dentro de una sola factura)

Folio1, Factura1, Fecha...
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
| Codigo 1, Producto 1, Costo, Cantidad, Total | 
|­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­|
| Codigo 4, Producto 4, Costo, Cantidad, Total | 
|­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­|
| Codigo 9, Producto 9, Costo, Cantidad, Total | 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Lo  que  necesito  hacer  es,  que  cuando  de  click  en  el  "Reporte  de  Facturas"  sobre  el  campo  "Folio",  me
envíe  directamente  al  reporte  de  "Detalles  de  Factura"  con  los  datos  de  los  conceptos  de  la  factura,  o
sea,  que  si  le  doy  click  al  "Folio  3"  me  envié  al  reporte  de  detalles  de  la  factura  con  folio  3  (como  un
hypervinculo).  Se  que  se  puede  hacer  configurando  las  "propiedades  de  marcador  de  posición"  del  texto
en la opción "Acción", pero no he podido hacer el brinco de un reporte a otro.

De  casualidad  tu  sabes  algo  sobre  este  tema?  te  agradecería  mucho  si  pudieras  darme  un  norte....  y
gracias de nuevo. ¡Saludos!

Responder

Alexis Molina 1 de julio de 2015, 19:02
hola  como  puedo  obtener  tu  proyecto  en  C#?,  lo  trate  de  descargar  pero  veo  que  no  esta  disponible,  me
seria de mucha utilidad, Muchas gracias :), alexisxm1492@gmail.com
Responder

Respuestas

José Luis García Bautista 1 de julio de 2015, 19:55

Hola Alexis, es extraño esto que mencionas ahora mismo ingrese desde una computadora de la
oficina y si puedo descargar los archivos...

Saludos

Responder

juan manuel alvarez gonzalez 9 de julio de 2015, 17:54
buenas tardes José Luis García Bautista me gusaria que me proporcionaras tu proyecto debido a  qeu  no
lo puedo descargar desde tu publicacion en c# no se si ya no lo tines disponible o el link se ha caido me
seria de gran utilidad tu proyecto mi corre es bennigton21@gmail.com

Responder

Respuestas

juan manuel alvarez gonzalez 9 de julio de 2015, 18:10
ya sea en ese correo o en este jbennignos@hotmail.com

José Luis García Bautista 9 de julio de 2015, 21:21

Hola:
intenta descargarlo desde aqui:

http://1drv.ms/1Bmelcu 

Responder

juan manuel alvarez gonzalez 10 de julio de 2015, 23:26

gracias me servira de mucho para mi proyecto 

Responder

Brandon Palacios 30 de julio de 2015, 13:29

Este comentario ha sido eliminado por el autor.
Responder

A nombre de quien va a quedar 6 de agosto de 2015, 15:34

Excelente aporte, no cabe duda, muy bien explicado, esto me servira para realizar etiquetas.

Responder
Moises Mata Martinez 21 de agosto de 2015, 17:15
Buenas tardes, gracias por tu aporte me sirvio mucho ya que los reportes los tenia pensado realizar con
SQL Server Business Intelligence, e integralos a mi proyecto. Al igual por que me diste una idea de como
no usar un dataset en si y usar las clases para poder pasar la informacion al reporte sin la necesidad de
los dataset.

De antemano gracias y saludos.

Reynosa Tamps.

Responder

Unknown 14 de noviembre de 2015, 15:19

Hola Jose Luis he hecho todo desde 0 cero en visual basic.net con  visual  estudio  2013  sin  embargo  me


indica  al  emitir  el  reporte  no  se  ha  proporcionado  ninguna  instancia  de  origen  de  datos  para  el  origen  de
datos 'encabezado' me podrias ayudar con este inconveniente?

Responder

Unknown 14 de noviembre de 2015, 15:20
Hola Jose Luis he hecho todo desde 0 cero en visual basic.net con  visual  estudio  2013  sin  embargo  me
indica  al  emitir  el  reporte  no  se  ha  proporcionado  ninguna  instancia  de  origen  de  datos  para  el  origen  de
datos 'encabezado' me podrias ayudar con este inconveniente?

Responder

Cuervo Pablo 18 de noviembre de 2015, 11:02
Hola  Jose  Luis,  me  sirvió  muchisimo  este  tutotial.  Aprovecho  para  preguntarte  si  hay  alguna  forma  para
incluir en el reporte Rich Text puesto que no he logrado hacerlos. Muchas gracias.
Responder

Unknown 19 de noviembre de 2015, 14:33

Hola  Jose  Luis.  Me  fue  de  mucha  utilidad  este  tutorial.  Ahora  mi  duda  es  si  es  que  puedo  hacer  que  un
report obtenga Datos De Varios Procedimientos almacenados. Osea Me explico varios datos de diferentes
tablas. y cada tabla en el caso tendria un procedimiento almacenado. Y que al Generar el report me salga
el resumen de todas las tablas en un solo report

Responder

Yusimy Barrios Frómeta 27 de noviembre de 2015, 15:09
Hola, muchas gracias, tu artículo me ha sevido de mucho, estoy trabajando en un pequeño proyecto para
generar reportes con dotos contenidos en un archivo de texto, y me ha ayudado mucho tu publicacion, ya
se  como  obtener  los  datos  del  archivo  y  visualizarlos  en  el  reporte,  pero  tengo  un  problema,  mi  reporte
necesita  de  una  portada  con  un  buen  diseño  grafico,  eso  lo  puedo  hacer  facilmente  con  las  erramientas
que  contiene  en  diseñador  de  reportes,  pero  ademas  de  eso  quiero  que  mi  informe  tenga  paginas  de
contenido  diferentes  a  la  portada,  necesito  saber  como  puedo  controlar  la  cantidad  de  paginas  que  va  a
tener. Me puedes ayudar por favor? 
Mi nombre es Yusimy Barrios Frómeta

Responder

Respuestas

José Luis García Bautista 29 de noviembre de 2015, 12:28
Hola Yusimy: 

Lo siento, esto que solicitas los desconozco pero seria un buen aporte de tu parte compartir el
conocimiento si descubres como lograrlo.

Saludos

Responder

Denis Ortiz 28 de noviembre de 2015, 22:03
Revisando tu ejemplo se explica muy bien. Hay alguna forma de agregar una imagen por ejemplo el logo
de  la  empresa  que  emite  la  factura  en  el  report  viewer.  Yo  lo  hice  con  el  datareport  del  viejo  vb  pero
tratando  con  este  control  no.  Esto  porque  los  datos  que  carga  van  relacionados  a  datos  de  una  tabla.
Gracias.
Responder
Respuestas

José Luis García Bautista 29 de noviembre de 2015, 12:27

Hola Denis:

Po ravor revisa el articulo:

http://joseluisgarciab.blogspot.mx/2015/11/reportviewer­y­rdlc­ejemplo­factura.html 

Ahi explico como hacer esto que deseas.

Saludos

Responder

Denis Ortiz 30 de noviembre de 2015, 14:57
Gracias  por  tu  colaboración.  Todo  el  proceso  es  entendible  pero  estoy  usando  VB  2010  pero  en  mis
plantillas  no  tengo  el  informe  formulario  o  el  Reporting.  He  descargado  el  Report  Viewer  de  Microsoft  y
agregado  en  la  Referencia.  Sin  embargo  no  puedo  agregar  esa  plantilla  para  poder  usarla  y  asociarla  al
report  viewer.  He  buzeado  en  Google  y  ayuda  msdn  pero  no  lo  he  logrado.  Te  agradezco  si  me  podrías
indicar algún link para poder agregar dicha plantilla.
Gracias por tu aporte.
Responder

Martin Lopez Jordan 19 de febrero de 2016, 13:39

Hola Jose Luis, muy buen post, te felicito por tu dedicación!
Te queria consultar un inconveniente que se me presentó. He agregado un origen de datos al Reporte, en
otro  proyecto  para  asociarle  los  campos  y  salió  de  maravilla.  Luego,  creo  una  clase  nueva  dentro  del
mismo  proyecto  y  no  me  aparece  en  Conjuntos  de  datos  disponibles.  Recompile  la  solucion  y  todos  los
proyectos, a que se puede deber el inconveniente? Muchas gracias

Responder

Flavio 1 de abril de 2016, 11:30
Una  consulta,Estoy  haciendo  registro  de  factura  con  bd  real,  quiero  editar  y  cambiar  detalle  de  factura,
digamos  que  el  cliente  registra  una  cantidad  de  articulos,  y  sucede  que  quiere  editar  y  eliminar  ciertos
articulos  del  detalle  y  agregar  otros  articulos,como  puedo  hacer  para  que  se  actualice  en  la  bd?,porfa
alguna sugerencia
Responder

Respuestas

José Luis García Bautista 2 de abril de 2016, 9:28

Hola:

Podrías mostrar el detalle en un DataGridview como lo muestra el ejemplo, para esto lo que yo
recomendaría  es  que  cargaras  toda  la  información  en  un  lista  de  clases,  despues  para  poder
eliminar  un  item  del  detalle  bastara  con  que  selecciones  el  Row  y  presiones  una  tecla  "Supr"
por ejemplo, en la programacion de la tecla tendras que tomar el Row seleccionado actualmente
y  tomar  la  cell  correspondiente  al  Id  del  elemento,  y  solo  hacer  un  simple  Remove  de  la  lista,
este elemento podrias guardarlo en otra lista para despues enviar la lista y que te elimine todos
los  elementos  contenidos  en  el  de  la  base  de  datos,  y  seria  todo  para  la  eliminacion  de
registros....

Si tienes mas dudas puedes contactarme por el formulario de contacto.

Responder

Dan SB 3 de abril de 2016, 17:20

Amigo,  buenas  tardes!  lei  tu  explicacion,  segui  tus  pasos  (Con  datos  distintos  claro),  y  al  compilar,  al
momento que se van a imprimir los datos en el DataGrid me lanza el siguiente error:

"error referencia a objeto no establecida como instancia de un objeto"

Las lineas donde se detiene todo es el siguiente:

DataHelper.AutoGenerateColumns = False 
DataHelper.DataSource = RegistrarArticulos() 
ERROR ­­>DataHelper.Columns("ColumnCodigo").DataPropertyName = "Codigo"*** 
DataHelper.Columns("ColumnProducto").DataPropertyName = "Producto" 
DataHelper.Columns("ColumnModelo").DataPropertyName = "Modelo" 
DataHelper.Columns("ColumnPrecio").DataPropertyName = "Precio" 
DataHelper.Columns("ColumnCantidad").DataPropertyName = "Cantidad" 
DataHelper.Columns("ColumnSubtotal").DataPropertyName = "Subtotal" 
DataHelper.Columns("ColumnComentario").DataPropertyName ="Comentario" 

¿Podrias decirme a que se debe esto y que debo hacer?

Responder

Respuestas

Dan SB 3 de abril de 2016, 20:09

Amigo  ya  pude  resolver!,  resulta  ser  que  le  habia  puesto  mal  el  nombre  de  la  columna  de  mi
datagrid!  Ahora  tengo  otro  problemita...  cuando  le  doy  a  imprimir  informe  me  suelta  que  no  he
elegido ningun origen de datos... Porq saldra eso?

José Luis García Bautista 4 de abril de 2016, 20:08
Hola Dan:

Recuerda que en el evento Load del formulario que contiene el reportviewer tienes que asignar
los objetos con datos.

Revisa esa parte seguramente ahí esta tu error. 

Saludos

Dan SB 4 de abril de 2016, 21:28

Este comentario ha sido eliminado por el autor.

Dan SB 4 de abril de 2016, 21:54
Jose  gracias  por  tu  ayuda!!  acabe  de  revisar  donde  me  dijiste  y  tenias  razón,  escribi  mal  el
nombre del primer ReportDataSource al momento de añadirla a los otros DataSources.. Tu post
me  sirvio  demasiado!!  me  guie  excelente,  claro,  añadiendo  mis  necesidades  y  que  fuese
dinámico... Gracias!!!

José Luis García Bautista 4 de abril de 2016, 22:02
Excelente!!!

Saludos

Responder

Andrea Barzola 6 de abril de 2016, 19:20
Hola José Luis, me parece excelente el tutorial, he seguido paso a paso tu explicación con windows form,
pero cuando realizo los pasos en asp.net 4.0 al momento de elegir el Origen de Datos no me aparece la
opción Objeto, no quiero utilizar DataSet, me podrías ayudar en ello.
Gracias mil
Responder

Aurch 20 de abril de 2016, 5:43

Una  pregunta  Jose  Luis.  Yo  tengo  unas  hojas  de  factura  con  el  logo  y  demás  y  he  realizado  un  informe
para que se adecúe cada elemento en el hueco correspondiente de la hoja. Tengo un elemento con el total
de la factura que va casi abajo pegado a la derecha de la hoja, pero dependiendo del número de items que
vayan en el detalle de la factura se me mueve. ¿Hay alguna posibilidad de fijar en una posición concreta
un campo de texto? Independientemente del resto del informe?
Un saludo y gracias.
Responder

Respuestas

Abraham Leon 1 de septiembre de 2016, 3:07

Encontraste la solución tengo el mismo problema que no encuentro una solución.

Responder
Santiago Corrao 29 de abril de 2016, 18:21
Excelente Tutorial!!

Responder

José Julián Arroyo Quintero 23 de mayo de 2016, 18:15
Muchas Gracias por sus aportes, un cordial saludo!

Responder

PEDRO FERNANDO OSTAIZA GARCIA 13 de junio de 2016, 11:07
como hago para controlar el boton imprimir...  

Responder

Christian Martinez Laserna 28 de junio de 2016, 7:36
Me  ha  gustado  mucho  como  lo  has  explicado,  necesitaba  un  programa  para  hacer  facturas,  ya  que  el
anterior no me termina de convencer, a ver que tal me va con este
Responder

Christián Hevia 4 de julio de 2016, 16:10

Hola Jose Luis, soy Christián Hevia
estoy trabajando hace poco con SSRS, no es específicamente de facturación, son reportes idénticos que
tengo que sacar de Crystal Reports... Tienes algún tutorial de agrupaciones y subtotales. Si tienes algún
correo  te  puedo  mostrar  los  problemas  que  he  tenido  y  la  información  que  hay  en  internet  no  me  ha
servido de nada.

Que estés bien

Responder

JOSE JAVIER CACERES MAMANI 8 de julio de 2016, 11:23
Una  consulta  con  respecto  al  ancho  de  la  pagina  que  siempre  tengo  problemas,  mencionas  21.59  y
descuentas  2  por  el  total  de  margenes,  pienso  que  solo  debes  descontar  uno  para  el  ancho,  puedes
aclararme mejor este tema.
Gracias por tu articulo
Responder

LUIS SANDOVAL RAMOS 22 de julio de 2016, 10:33

Amigo buenos dias me puedes enviar el ejemplo a mi correo lsandovalramos@hotmail.comn el enlace no
fucniona. mil gracias

Responder

Jean Pierre Alba 11 de agosto de 2016, 11:04
hola amigo me puedes enviar tu ejemplo a mi correo: jeanpier29.12@gmail.com

el enlace esta roto. gracias por enseñarnos. me es util esto

Responder

Abelardo 28 de agosto de 2016, 21:55

hola, muy aporte.
me podrás enviar el ejemplo en VB.net por favor al correo: abe_rodriguez@hotmail.com
muchas gracias.
Responder

Unknown 3 de septiembre de 2016, 13:07

José  Luis,  muy  bueno  tu  Post  la  verdad  es  de  muchísima  utilidad,  podrías  enviarme  el  código  a  mi
correo?? marcelo_a_medina@hotmail.com o pasarme un nuevo link el de la página esta roto. Un Abrazo.

Responder

RUBY CHAC 6 de septiembre de 2016, 12:22
hola luis, queria felicitarte, como puedo generar el pdf mas de una vez

Responder

servermaster 14 de octubre de 2016, 16:50
me puedes pasar el link porfavor

Responder

Evelyn Anaya Garcia 21 de octubre de 2016, 12:31
Hola buenas tardes, sabes como agregar 10 tablas diferentes en un reporte ?

Responder

Raul Ernesto 1 de noviembre de 2016, 17:54
puedes compartir el link de descarga gumdam2017@gmail.com

Responder

Grover 8 de noviembre de 2016, 14:58
Podrias compartirme el link para descarga c#, te agradezco grovdex@hotmail.com

Responder

Grover 8 de noviembre de 2016, 14:58
Podrias compartirme el link para descarga c#, te agradezco grovdex@hotmail.com

Responder

Tobias tobi 3 de enero de 2017, 15:09
hola el enlace esta roto ya no existe para realizae la descarga. podrias compartir el enlace de descarga en
c# y VB a mi correo tobissf@gmail.com
te agradesco gracias..!!

Responder

Introduce tu comentario...

Comentar como:  Seleccionar perfil...

Publicar
  Vista previa

Deja un comentario si el articulo fue de utilidad.
Entrada más reciente Página principal Entrada antigua

Suscribirse a: Enviar comentarios (Atom)

Google+ Followers

Etiquetas

Agregar cadena de conexion en Visual Studio
Archivo de configuracion
Arquitectura 3 Capas .Net
Cadenas de conexion
Crear un archivo Excel desde WindowsForms
Crear un archivos excel desde C#
Crear un archivos excel desde VB.Net
Enviar imagen a ReportViewer
Enviar imagen de base de datos a Rdlc
FluentValidation
FluentValidation and WindowsForms
How to use FluentValidation in a WindowsForms Project
Imagen en Local report
Leer un archivos excel desde VB.Net o C#
Listas genericas y Rdlc
Parametros en un Local Report
Pasar datos de un DataGridView a otro
Pasar datos de un DataGridView a Textbox de forms diferentes
Pasar datos entre dos formularios
Programacion en 3 Capas
Programacion en capas C#
Programacion en capas.Net
Report viewer imagen CSharp
Report Viewer imagen Visual basic .Net
Reportes locales
Reportes locales en windows forms
SpreadSheetLigth
SpreadSheetLigth y WindowsForms
Uso de SQLCe

Plantilla Fantástico, S.A.. Con la tecnología de Blogger.

Você também pode gostar