Creación de un sistema de almacén con C# (Parte 4)


Reporte de Entradas

Diseño de la pantalla

Para comenzar, le daremos diseño al formulario "frmEntradasLista" el cual nos servirá para mostrar un listado de las entradas que se hayan registrado, la apariencia debe de quedar mas o menos así:


Se agregaron tres Button, un ListView y un Label, las propiedades están descritas en la siguiente tabla:
ObjetoPropiedadValor
ButtonNamebtnNueva
TextNueva
ButtonNamebtnMostrar
TextMostrar
ButtonNamebtnSalir
TextSalir
ListViewNamelvEntradas
FullRowSelectTrue
GridLinesTrue
HideSelectionFalse
LabelNamelblMensaje
TextDoble clic para imprimir.

Ahora procedemos con el diseño del reporte de entradas, lo primero que haremos será crear un DataSet el cual nos servirá para el posterior diseño del reporte.

Agregamos un nuevo objeto del tipo DataSet y le asignamos el nombre dsRptEntrada como se muestra:



Le damos diseño para que quede como se muestra:



El DataSet aparece vacío, debemos agregar un DataTable y darle el diseño para que

quede como se muestra en la imagen. De entre las propiedades que debemos destacar
es que el tipo de datos de los campos cantidad, precio_compra e iva son System.Double.

Los tipos de datos para los campos id_articulo y articulo son System.String.

Una vez terminado el diseño del DataSet agregamos un Reporte, pero utilizaremos un asistente, aqui muestro con imagenes todo el proceso:


Selecionamos que nuestro origen de datos es un objeto:


En la siguiente ventana, expanda todo y ubique el DataSet que acaba de crear anteriormente, como se muestra a continuación:


Luego, escriba un nombre para el DataSet (propiedad Name), se recomienda poner el mismo que puso anteriormente:


Arrastre los campos que desea mostrar en el reporte a la sección Values como se muestra en la imagen:


Desactive la operación Sum:


Seleccione un formato (apariencia):


Elija a su gusto:


Agregue el encabezado y el pié del reporte:


Agregue los parametros prmFechaEntrada, prmFechaFactura, prmFolioFactura y prmProveedor


Ejemplo de como agregar un parametro (Repitalo con los demás):


Agregue cuatro TextBox al encabezado y organicelos ordenadamente:


Arrastre los parametros creados enfrente de los TextBox:


Agrege una columna al reporte:


Puede darle diseño al reporte, hagalo a su gusto, aqui se muestra algo muy básico:


Agregaremos una función para calcular el total:


En seguida se muestra como hacerla:


Agregaremos un nuevo formulario llamado frmVerReporte al cual agregaremos un control ReportViewer al cual estableceremos una propiedad Modifiers=Public (En la ventana de propiedades), aqui se muestra una imagen:


Hasta aqui todo ha sido diseño, ahora escribiremos el código que hace todo posible:

Declaramos las siguientes variables (En el formulario frmEntradasLista):

string CnnStr = @" Provider=Microsoft.Jet.OLEDB.4.0; " +
"Data Source=D:\\DOCS\\tyrodeveloper\\almacen.mdb; " +
"Jet OLEDB:Database Password=; Persist Security Info=False;";
string reportFile = @"D:\\DOCS\\tyrodeveloper\\almacen\\almacen\\Reportes\\rptEntrada.rdlc";

Ahora agregamos los siguientes procedimientos:

void generaColumnas()
{
lvEntradas.Clear();
lvEntradas.View = View.Details;
lvEntradas.Columns.Add("Folio ", 40, HorizontalAlignment.Left);
lvEntradas.Columns.Add("Fecha Entrada", 85, HorizontalAlignment.Left);
lvEntradas.Columns.Add("Fecha Factura", 85, HorizontalAlignment.Left);
lvEntradas.Columns.Add("Folio Factura", 85, HorizontalAlignment.Left);
lvEntradas.Columns.Add("Proveedor", 200, HorizontalAlignment.Left);
}
void mostrarEntradas() {
try {
    OleDbConnection cnn = new OleDbConnection(CnnStr);
    cnn.Open();
    OleDbCommand cmd = new OleDbCommand();
    cmd.Connection = cnn;
    cmd.CommandText = "select * from entradas";
    OleDbDataReader dr = cmd.ExecuteReader();
    int i = 0;
    lvEntradas.Items.Clear();
    while (dr.Read()) {
        //mostramos los datos
        lvEntradas.Items.Add(dr["id_entrada"].ToString());
        lvEntradas.Items[i].SubItems.Add(String.Format("{0:dd/MM/yyyy}",dr["fecha_entrada"]));
        lvEntradas.Items[i].SubItems.Add(String.Format("{0:dd/MM/yyyy}", dr["fecha_factura"]));
        lvEntradas.Items[i].SubItems.Add(dr["folio_factura"].ToString());
        lvEntradas.Items[i].SubItems.Add(dr["proveedor"].ToString());
        i++;
    }
    dr.Close();
    cnn.Close();
}
catch (Exception ex) {
    MessageBox.Show(ex.Message);
}
}
void mostrarReporte(int prmIdEntrada)
{
try
{

    if (!File.Exists(reportFile))
    {
        MessageBox.Show(String.Format("No se encuentra \n{0}\nRevise por favor", reportFile));
        return;
    }
    //AHORA MOSTRAMOS EL REPORTE
    OleDbConnection cnn = new OleDbConnection(CnnStr);
    cnn.Open();
    DataSet dsReporte = new DataSet();
    OleDbDataAdapter da = new OleDbDataAdapter("select d.*,a.articulo "+
        " from entradas_detalle d,articulos a "+
        " where a.id_articulo=d.id_articulo and id_entrada="+ prmIdEntrada +"", cnn);
    da.Fill(dsReporte, "rptentrada");
    if (dsReporte.Tables["rptEntrada"].Rows.Count == 0)
    {
        cnn.Close();
        MessageBox.Show("No hay Datos");
        return;
    }

    Formularios.frmVerReporte frm = new Formularios.frmVerReporte();
    frm.reportViewer1.LocalReport.DataSources.Clear();
    frm.reportViewer1.LocalReport.Dispose();
    frm.reportViewer1.Reset();
    frm.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("dsRptEntrada",
        dsReporte.Tables["rptEntrada"]));
    frm.reportViewer1.LocalReport.ReportPath = reportFile;
    //parametros
    List<ReportParameter> param = new List<ReportParameter>();
    OleDbCommand cmd = new OleDbCommand("select * from entradas where id_entrada=" + prmIdEntrada + "", cnn);
    OleDbDataReader dr = cmd.ExecuteReader();
    while (dr.Read())
    {
        //folio_factura
        ReportParameter pFolioFactura = new ReportParameter();
        pFolioFactura.Name = "prmFolioFactura";
        pFolioFactura.Values.Add(dr["folio_factura"].ToString());
        param.Add(pFolioFactura);
        //fecha_entrada
        ReportParameter pFechaEntrada = new ReportParameter();
        pFechaEntrada.Name = "prmFechaEntrada";
        pFechaEntrada.Values.Add(dr["fecha_entrada"].ToString());
        param.Add(pFechaEntrada);
        //fecha_factura
        ReportParameter pFechaFactura = new ReportParameter();
        pFechaFactura.Name = "prmFechaFactura";
        pFechaFactura.Values.Add(dr["fecha_factura"].ToString());
        param.Add(pFechaFactura);
        //proveedor
        ReportParameter pProveedor = new ReportParameter();
        pProveedor.Name = "prmProveedor";
        pProveedor.Values.Add(dr["proveedor"].ToString());
        param.Add(pProveedor);

            
    }
    dr.Close();
    //agregamos los parametros a la coleccion
    frm.reportViewer1.LocalReport.SetParameters(param);
    frm.reportViewer1.RefreshReport();
    frm.ShowDialog();
    cnn.Close();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "Error loading report",
        MessageBoxButtons.OK, MessageBoxIcon.Error);
}

}

Agregamos sl siguiente código en el Form_Load:

lvEntradas.DoubleClick += new EventHandler(lvEntradas_DoubleClick);
        generaColumnas();
        mostrarEntradas();

Luego, agregamos el siguiente código:

void lvEntradas_DoubleClick(object sender, EventArgs e)
{
if (lvEntradas.SelectedItems.Count != 0) {
    int _FolioEntrada = Convert.ToInt32(lvEntradas.SelectedItems[0].Text);
    mostrarReporte(_FolioEntrada);
}
}

El código para el botón btnNueva:

frmEntrada entrada = new frmEntrada();
entrada.StartPosition = FormStartPosition.CenterScreen;
entrada.ShowDialog();

El código para el botón btnMostrar:

mostrarEntradas();
El código para el botón btnSalir

this.Close();

Aqui un ejemplo de la pantalla funcionando:



Aqui un ejemplo del reporte:



Regresar a la parte 3|Ir a la parte 5

32 comentarios:

  1. Excelente ejemplo nos es de mucha ayuda a todos los que empezamos en este lenguaje, solo el link de la parte 5 no funciona.

    ResponderEliminar
  2. En el metodo mostrarEntradas(), es necesario la creacion de un objeto DateTime para darle formato a la afecha en los campos fecha entrad y fecha factura.

    Excelente tutorial, tutoriales como este necesitamos los principaiantes.

    ResponderEliminar
  3. Gracias por el tutorial, está excelente. Pero tengo un problema, estoy haciendolo en vb 2010 express, y la ultima parte de crear el reporte no me aparece la opcion de report wizard. Mi pregunta es: tengo que agregarlo al 2010 express?...como lo hago si es que se puede y en caso contrario, tendria que tener la version completa del vb 2010?....

    Gracias espero tu respuesta.

    ResponderEliminar
  4. NEcesitas la versión Estandar como minimo para poder hacer el reporte

    ResponderEliminar
  5. tengo problemas en el apartado del ReportDataSource no me reconoce el tipo de objeto. ademas en la List tbn me marca error en el tipo de dato. ¿Debo poner alguna referencia .dll o alguna libreria??

    ResponderEliminar
  6. No compa, para usar el ReportDataSource debes poner la referencia siguiente para que jale:

    using Microsoft.Reporting.WinForms;

    ResponderEliminar
  7. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  8. no me aparece nada en el "Select Data Objects" a que se debe? Excelente el ejemplo

    ResponderEliminar
  9. muy buenos noches me sale este error

    Error 1 El nombre 'File' no existe en el contexto actual

    ResponderEliminar
  10. En cual link consigo vb 2010 standar

    ResponderEliminar
  11. @DinastiaSalvacion te falta la librea system.IO o System.IO.File..

    ResponderEliminar
  12. Me marca un error en el OleDbCommand k falta una directiva using o una referencia de ensamblado

    ResponderEliminar
  13. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  14. Gracias al autor de Este Tutorial y un poco de google, han hecho que todo funcione bien.

    gracias.

    ResponderEliminar
  15. Tengo un problema, no tengo el REPORT WIZARD...donde lo puedo conseguir, en referencia, o descargarlo?

    ResponderEliminar
  16. fijate que me aparece este error Error 4 The type or namespace name 'OleDbCommand' could not be found (are you missing a using directive or an assembly reference?) C:\Users\Josue\Documents\Visual Studio 2010\Projects\Almacen\Almacen\Formulario\frmEntradaLista.cs 54 40 Almacen

    ResponderEliminar
  17. No me aparece Report Wizard

    ResponderEliminar
  18. No me aparece el Report Wizard como lo consigo

    ResponderEliminar
  19. tengo un problema la ultima ventana de reporte no me sale cual es el codigo o como le hago

    ResponderEliminar
  20. alguien que me pueda envia su codigo por favor rrosalescortes@gmail.com

    ResponderEliminar
  21. A mi tampoco me aparece el Report Wizard, tengo la versión Microsoft Visual C# 2010 Express. Alguien me puede ayudar??

    ResponderEliminar
  22. El Report Wizard solo está en la versión completa de Microsoft Visual Studio (o Microsoft Visual C#) no lo tiene la versión express...

    Me aparece el siguiente error: "No se controló CannotUploadAppDomainException" al darle doble clic al reporte, alguien me puede ayudar....

    Gracias, saludos !!

    ResponderEliminar
  23. Hola necesito ayuda con este error,
    Error 1 The type or namespace name 'frmVerReporte' does not exist in the namespace 'Inventario_Aserfex.Formularios' (are you missing an assembly reference?) C:\Users\Piero\documents\visual studio 2012\Projects\Inventario Aserfex\Inventario Aserfex\Formularios\frmSalidaLista.cs 91 29 Inventario Aserfex

    ResponderEliminar
  24. Revisalo, quizá lo pusiste con otro nombre. c# es estricto con los nombres, una mayuscula/minuscula, etc. Saludos

    ResponderEliminar
  25. El código para el botón btnMostrar:

    mostrarEntradas();

    ????

    ResponderEliminar
  26. El codigo para lblMensaje?

    ResponderEliminar
  27. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  28. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  29. buenas tardes disculpa no me sale la opcion de agregar el dataset

    ResponderEliminar