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

Salidas del Almacén


Diseño de la pantalla


Empezaremos diseñando la pantalla de salidas (formulario frmSalida), la apariencia debe de quedar mas o menos así:



A continuacion una tabla descriptiva con los nombres de los objetos:

ObjetoPropiedadValor
LabelNamelblFechaSalida
TextFecha Salida:
DateTimePicker NamedtpFechaSalida
FormatCustom
CustomFormatdd/MM/yyyy
LabelNamelblResponsable
TextResponsable de la Salida:
TextBoxNametxtResponsable
LabelNamelblIdArticulo
TextArticulo:
TextBoxNametxtIdArticulo
LabelNamelblCantidad
TextCantidad:
TextBoxNametxtCantidad
ButtonNamebtnAgregar
TextAgregar
ButtonNamebtnGrabar
TextGrabar
ButtonNamebtnCancelar
TextCancelar
ListViewNamelvSalida
FullRowSelectTrue
GridLinesTrue
HideSelectionFalse


Programación


La parte de la programación es la mas enredada. Voy a considerar que el lector es un novato con nociones bastante
básicas e insuficientes como para comprender la estructura de la programación C#. Recomiendo al lector poner mucha atención
a los pasos que aqui se describan y no omitir nada, leer y re-leer hasta que haya comprendido lo que tiene que hacer.


Declaramos las siguientes variables:


//Variables
DataTable tmpEntrada = new DataTable();
string CnnStr = @" Provider=Microsoft.Jet.OLEDB.4.0; " +
    "Data Source=D:\\DOCS\\tyrodeveloper\\almacen.mdb; " +
    "Jet OLEDB:Database Password=; Persist Security Info=False;";



Escribiremos el código de las funciones y procedimientos:


void generaColumnas()
{
  lvSalida.Clear();
  lvSalida.View = View.Details;
  lvSalida.Columns.Add("", 0, HorizontalAlignment.Left);
  lvSalida.Columns.Add("Id ", 100, HorizontalAlignment.Left);
  lvSalida.Columns.Add("Producto", 240, HorizontalAlignment.Left);
  lvSalida.Columns.Add("Cantidad", 60, HorizontalAlignment.Right);
}
void mostrarEntrada()
{
  try
  {
      lvSalida.Items.Clear();
      for (int i = 0; i < tmpEntrada.Rows.Count; i++)
      {
          lvSalida.Items.Add(tmpEntrada.Rows[i]["id"].ToString());
          lvSalida.Items[i].SubItems.Add(tmpEntrada.Rows[i]["id_articulo"].ToString());
          lvSalida.Items[i].SubItems.Add(tmpEntrada.Rows[i]["articulo"].ToString());
          lvSalida.Items[i].SubItems.Add(String.Format("{0:N}",
              Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"])));
      }
  }
  catch (Exception ex)
  {
      MessageBox.Show(ex.Message, "Error",
          MessageBoxButtons.OK, MessageBoxIcon.Error);
  }
}
bool agregarArticulo(string prmIdArticulo, double prmCantidad)
{
  try
  {
      string varId = "";
      string varNombre = "";
      double varExistencia = 0;
      OleDbConnection cnn = new OleDbConnection(CnnStr);
      cnn.Open();
      string strSQL = "select articulo,existencia from articulos " +
          "where id_articulo='" + prmIdArticulo + "'";
      OleDbCommand cmd = new OleDbCommand(strSQL, cnn);
      OleDbDataReader dr = cmd.ExecuteReader();
      if (dr.Read())
      {
          varId = prmIdArticulo;
          varNombre = dr["articulo"].ToString();
          varExistencia =Convert.ToDouble(dr["existencia"]);
          if (varExistencia >= prmCantidad)
          {
              //agregamos la venta a la tabla temporal
              DataRow row = tmpEntrada.NewRow();
              row["id_articulo"] = varId;
              row["articulo"] = varNombre;
              row["cantidad"] = prmCantidad;
              tmpEntrada.Rows.Add(row);
          }
          else {
              MessageBox.Show("No hay suficientes existencias");
          }
      }
      else
      {
          MessageBox.Show("El articulo no existe", "Error",
              MessageBoxButtons.OK, MessageBoxIcon.Error);
          return (false);
      }
      dr.Close();
      cnn.Close();
      return (true);
  }
  catch (Exception ex)
  {
      MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
          MessageBoxIcon.Error);
      return (false);
  }
}
bool grabarSalida(string prmFechaSalida, string prmResponsable, string prmUserLogin)
{
  try
  {
      OleDbConnection cnn = new OleDbConnection(CnnStr);
      cnn.Open();
      OleDbTransaction tran = cnn.BeginTransaction();
      OleDbCommand cmd = new OleDbCommand();
      cmd.Connection = cnn;
      cmd.Transaction = tran;
      //insertamos el registro de la Entrada
      try
      {
          cmd.CommandText = "insert into salidas(fecha_salida,responsable,user_login) " +
              " values (#" + prmFechaSalida + "#,'" +
                  prmResponsable + "','" + prmUserLogin + "')";
          cmd.ExecuteNonQuery();
          //obtenemos el folio
          int _FolioSalida = 0;
          cmd.CommandText = "select @@identity";
          _FolioSalida = Convert.ToInt32(cmd.ExecuteScalar());
          //insertamos el detalle de laentrada
          for (int i = 0; i < tmpEntrada.Rows.Count; i++)
          {
              string _IdArticulo = Convert.ToString(tmpEntrada.Rows[i]["id_articulo"]);
              double _Cantidad = Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"]);
                   
              //insertamos el articulo
              cmd.CommandText = "insert into salidas_detalle(id_salida,id_articulo,cantidad) " +
                  "values(" + _FolioSalida + ",'" + _IdArticulo + "'," + _Cantidad +  ")";
              cmd.ExecuteNonQuery();
              //actualizamosexistencias
              cmd.CommandText = "update articulos set " +
                  " existencia=existencia - " + _Cantidad + "" +
                  " where id_articulo='" + _IdArticulo + "'";
              cmd.ExecuteNonQuery();
                   
          }
          //finalizamos la transaccion
          tran.Commit();
          cnn.Close();
          MessageBox.Show("Salida grabada correctamente",
          "Información del Sistema", MessageBoxButtons.OK,
          MessageBoxIcon.Information);
          return (true);
      }
      catch (OleDbException errEntrada)
      {
          tran.Rollback();
          cnn.Close();
          MessageBox.Show(errEntrada.Message);
          return (false);
      }
  }
  catch (Exception ex)
  {
      MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
          MessageBoxIcon.Error);
      return (false);
  }
}



Ahora damos doble clic sobre el botón Agregar (btnAgregar) y escribimos el siguiente código:

try
{
  if (agregarArticulo(txtIdArticulo.Text,
      Convert.ToDouble(txtCantidad.Text)))
  {
      mostrarEntrada();
  }
}
catch (Exception ex)
{
  MessageBox.Show(ex.Message);
}

Ahora, agregaremos el código para grabar la entrada, hacemos doble clic sobre el botón Grabar (btnGrabar) y escribimos el siguiente código:

if (grabarSalida(dtpFechaSalida.Value.ToShortDateString(),
  txtResponsable.Text, "admin"))
{
  this.Close();
}

El código que pondremos en el Form_Load es el siguiente:

//>Definimos la tabla para las salida Temporal
DataColumn idColumn = new DataColumn("id", typeof(int));
idColumn.Unique = true;
idColumn.AutoIncrement = true;
idColumn.AutoIncrementSeed = 1;
idColumn.AutoIncrementStep = 1;
tmpEntrada.Columns.Add(idColumn);
//declaramos el resto de los campos
tmpEntrada.Columns.Add("id_articulo", typeof(string));
tmpEntrada.Columns.Add("articulo", typeof(string));
tmpEntrada.Columns.Add("cantidad", typeof(Double));
//agregamos un primary key
tmpEntrada.PrimaryKey = new DataColumn[] { tmpEntrada.Columns["id"] };
//<termina la deficinicón de la tabla temporal
generaColumnas();
mostrarEntrada();

En el botón Salir (btnSalir) escribimos esto:

this.Close();


Aqui un ejemplo de la pantalla funcionando:



Regresar a la parte 4|Ir a la parte 6

6 comentarios:

  1. necesito mas ayuda por favor, los siguientes codigos: FrmEntradaLista, ReportParameter, ReportDataSource me dan el siguiente mensaje de error: could not be found(are you missin a ussing directive or an assembly reference?) y los siguientes codigos o nombres CnnStr y reportfile me dan el siguiente mensaje: does not exist in the current context.... como puedo solucionar estos problemas???

    ResponderEliminar
  2. Hola al tratar de agregar el articulo me da el siguiente error Object Cannot be cast from DBnull to others types supongo que es por que en la tabla articulos la columna existencias esta como null... como puedo solucionar este problema???

    ResponderEliminar
    Respuestas
    1. intenta poniendo valores predeterminados en la base de datos para todos los campos que sean Numericos, Fecha y booleanos

      Eliminar
  3. me corre todo menos en la parte de agregar a la lista previa me sale el archivo no existe Help me please

    ResponderEliminar
  4. Pregunta
    suponiendo que el usuario agregó por error un producto a la lista
    como sería el código para eliminarlo?

    ResponderEliminar
  5. ya logre terminar todo el tutorial
    pero tengo una pregunta
    suponiendo que el usuario agregó por error un producto a la lista
    como sería el código para eliminarlo?

    ResponderEliminar