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


Reporte de Salidas


Diseño de la pantalla


Para comenzar, le daremos diseño al formulario "frmSalidasLista" el cual nos servirá para mostrar un listado de las salidas 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
ListViewNamelvSalidas
FullRowSelectTrue
GridLinesTrue
HideSelectionFalse
LabelNamelblMensaje
TextDoble clic para imprimir.

Ahora procedemos con el diseño del reporte de salidas, este proceso se muestra en la parte 4 de este tutorial, el cual deberá quedar mas o menos así:




Ahora agregamos los siguientes procedimientos:

void generaColumnas(){
  lvSalidas.Clear();
  lvSalidas.View = View.Details;
  lvSalidas.Columns.Add("Folio ", 40, HorizontalAlignment.Left);
  lvSalidas.Columns.Add("Fecha Salida", 85, HorizontalAlignment.Left);
  lvSalidas.Columns.Add("Responsable", 200, HorizontalAlignment.Left);
}
void mostrarSalidas(){
  try {
      OleDbConnection cnn = new OleDbConnection(CnnStr);
      cnn.Open();
      OleDbCommand cmd = new OleDbCommand();
      cmd.Connection = cnn;
      cmd.CommandText = "select * from salidas";
      OleDbDataReader dr = cmd.ExecuteReader();
      int i = 0;
      lvSalidas.Items.Clear();
      while (dr.Read()) {
          //mostramos los datos
          lvSalidas.Items.Add(dr["id_salida"].ToString());
          lvSalidas.Items[i].SubItems.Add(String.Format("{0:dd/MM/yyyy}", dr["fecha_salida"]));
          lvSalidas.Items[i].SubItems.Add(dr["responsable"].ToString());
          i++;
      }
      dr.Close();
      cnn.Close();
  }
  catch (Exception ex) {
      MessageBox.Show(ex.Message);
  }
}
void mostrarReporte(int prmIdSalida){
  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 salidas_detalle d,articulos a " +
          " where a.id_articulo=d.id_articulo and id_salida=" + prmIdSalida + "", cnn);
      da.Fill(dsReporte, "rptSalida");
      if (dsReporte.Tables["rptSalida"].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("dsRptSalida",
          dsReporte.Tables["rptSalida"]));
      frm.reportViewer1.LocalReport.ReportPath = reportFile;
      //parametros
      List<ReportParameter> param = new List<ReportParameter>();
      OleDbCommand cmd = new OleDbCommand("select * from salidas where id_salida=" + prmIdSalida + "", cnn);
      OleDbDataReader dr = cmd.ExecuteReader();
      while (dr.Read()){
          //fecha_salida
          ReportParameter pFechaEntrada = new ReportParameter();
          pFechaEntrada.Name = "prmFechaSalida";
          pFechaEntrada.Values.Add(dr["fecha_salida"].ToString());
          param.Add(pFechaEntrada);
          //responsable
          ReportParameter pProveedor = new ReportParameter();
          pProveedor.Name = "prmResponsable";
          pProveedor.Values.Add(dr["responsable"].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 al cargar el reporte",
          MessageBoxButtons.OK, MessageBoxIcon.Error);
  }
}

Agregamos sl siguiente código en el Form_Load:

lvSalidas.DoubleClick += new EventHandler(lvSalidas_DoubleClick);
          generaColumnas();
          mostrarSalidas();

Luego, agregamos el siguiente código:

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

El código para el botón btnNueva:

frmSalida salida = new frmSalida();
salida.StartPosition = FormStartPosition.CenterScreen;
salida.ShowDialog();

El código para el botón btnMostrar:

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

this.Close();

Aqui un ejemplo de la pantalla funcionando:


Aqui un ejemplo del reporte:


Hasta este punto ya hemos desarrollado la funcionalidad básica. En la siguiente parte haremos que aparesca una pantalla pricipal desde la que mandaremos llamar las que hasta hoy hemos desarrollado.


Regresar a la parte 5|Ir a la parte 7

23 comentarios:

  1. exelente tutorial lo he estado haciendo pero me muestra el siguiente error //Error 29 'WindowsFormsApplication1.Formularios.frmVerReporte' does not contain a definition for 'reportViewer1' and no extension method 'reportViewer1' accepting a first argument of type 'WindowsFormsApplication1.Formularios.frmVerReporte' could be found (are you missing a using directive or an assembly reference?) C:\Documents and Settings\fam galvan\Mis documentos\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Formularios\frmEntradasLista.cs 121 21 Almacen
    // Y no se que hacer ahi

    ResponderEliminar
  2. tambien me aparece este error al compilarlo

    Error 2 The Value expression for the text box ‘idarticulo’ refers to the field ‘id’. Report item expressions can only refer to fields within the current dataset scope or, if inside an aggregate, the specified dataset scope. C:\Documents and Settings\fam galvan\Mis documentos\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Reporte\rptSalidas.rdlc Almacen

    me pudieras decir que estoy haciendo mal por favor que ya no tengo idea de que hacer.

    ResponderEliminar
  3. Tu problema es que debiste agregar un ReportViewer al formulario frmVerReporte...
    en el siguiente error es respecto del DataSet...
    Realmente tus errores son por que no utilizas los nombres de objetos tal y como fueron indicados en el proyecto; esto incluye el nombre de la aplicación.
    En lenguajes como C#, especialmente cuando vas iniciando, debes ser exacto al seguir tutoriales para que no tengas errores en el transcurso de desarrollo.
    No te se decir exactamente en que estas mal, pues para empezar los nombres que usas para los formularios no son los mismos.
    Revisa que tu dataSet sea tal y como se indica, que los tipos de datos sean los mismos... etc.'
    En elpeor de los casos, vuelve a empezar, no es un sistema muy extenso...
    Saludos

    ResponderEliminar
  4. muchas gracias por la orientación creo que si la regué y feo muchas gracias aprovecho para felicitarte por tu excelente tutorial mejor que ni mis maestros de la escuela mucha suerte en este año nuevo y mucho éxito.

    ResponderEliminar
  5. buenas maestro.

    estoy llevando acabo este proyecto lo unico que no epodido encontrar es la forma de cambiar los bordes de mis formularios tal y como usted lo tiene e buscado referencias en varios sitios y no aparece si usted me puede indicar le agradeceria... Erickson

    ResponderEliminar
  6. No tengo ningun formato en especial.
    Estoy utlizando windows 7
    Saludos

    ResponderEliminar
  7. me marca un error con OleDbConnection, a k se debe ??

    ResponderEliminar
  8. Error 1 The name 'reportFile' does not exist in the current context C:\Users\xxxxxx\Documents\Visual Studio 2010\Projects\Almacen\Almacen\Formularios\frmSalidaLista.cs 77 34 Almacen

    ResponderEliminar
  9. disculpa pero me da este error

    Error 1 El objeto ‘Tablix1’ de tipo tablix hace referencia a una cadena DataSetName ‘rptSalida’ no válida. si me pudieras ayudar te lo agradeceria ya que apenas empiezo a programar

    ResponderEliminar
  10. @OnlyZero... disculpa sea tarde la respuesta..
    pero vale, para otros...

    simple tenias que escribir los codigos de coneccion con la base de tados

    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";

    ResponderEliminar
  11. Error 5 No se puede encontrar el tipo o el nombre de espacio de nombres 'ReportParameter' (¿falta una directiva using o una referencia de ensamblado?) C:\Users\alumno\AppData\Local\Temporary Projects\almacen\Formularios\frmEntradasLista.cs 109 22 almacen
    este error m tira a mi m pueden ayudar soy nuevo en esto gracs

    ResponderEliminar
  12. Gracias por este fantástico tutorial.
    Lo he seguido paso a paso, pero no me acaba de funcionar. Me da problemas al grabar una entrada y al mostrar el informe.
    ¿Podrías mandarme el proyecto a esta dirección mgtformacion@yahoo.es?
    Estoy con un proyecto de universidad y me sería de gran ayuda.
    Gracias

    ResponderEliminar
  13. prodrias enviar el proyecto completo a edwardelfuerte27@hotmail.com

    ResponderEliminar
  14. amigo en que parte se coloca este código

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

    ResponderEliminar
  15. se coloca en cualquier parte, solo ten cuidado de no meterlo dentro de otro void o fuera de la clase

    ResponderEliminar
  16. HOLA PORFAVOR ALGUIEN QUE ME AYUDE 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
    Respuestas
    1. tienes que poner los nombres tal y como estan en el tutorial y si creas el directorio o lo modificas tal cual, es mas probable q no tengas errores

      Eliminar
  17. buen dia me podrias enviar el proyecto completo del control del almacen es que estoy llevando un proyecto acerca de ese tema pero he buscado en otros tutoriales y el tuyo es muy bueno se acopla a lo que estoy buscando.


    gracias

    Atte.

    Layman del angel

    ResponderEliminar
  18. hola que tal he hecho el proyecto pero al final cuando intento agregar un articulo me sale el error de no se encontró el archivo sabes a q se debe ???

    de ante mano gracias por la respuesta

    ResponderEliminar
    Respuestas
    1. disculpa solucionaste este error? me podrias ayudar te lo agradeceria muchisisisisisimo

      Eliminar
    2. disculpa solucionaste este error? me podrias ayudar te lo agradeceria muchisisisisisimo

      Eliminar
  19. disculpa, puedes pasarme el codigo fuente a mi correo? te lo agradeceria mucho! eres un buen salvavidas xD aca mi correo jean.vasquez35@gmail.com

    ResponderEliminar
  20. Estimado profesor, muy lindo el tutorial, tengo un problema al generar el segundo reporte de salidas, el primero me funciona, pero el segundo no, me sale el siguiente error "A data source instance has not been supplied for the data source dsRptSalidas", mil gracias.

    ResponderEliminar