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:

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=almacen.mdb; " +//<==poner aqui la ruta de la base de datos
"Jet OLEDB : Database Password=; Persist Security Info=False;"; //<== ojo, aqui no lleva espacios, sin espacios se ve OLEDB
atabase
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["id"].ToString());
lvSalida.Items.SubItems.Add(tmpEntrada.Rows["id_articulo"].ToString());
lvSalida.Items.SubItems.Add(tmpEntrada.Rows["articulo"].ToString());
lvSalida.Items.SubItems.Add(String.Format("{0:N}",
Convert.ToDouble(tmpEntrada.Rows["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["id_articulo"]);
double _Cantidad = Convert.ToDouble(tmpEntrada.Rows["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:

Continuar con el siguiente post...
Visita mi Blog:

Si deseas que te haga un trabajo de programació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:

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=almacen.mdb; " +//<==poner aqui la ruta de la base de datos
"Jet OLEDB : Database Password=; Persist Security Info=False;"; //<== ojo, aqui no lleva espacios, sin espacios se ve OLEDB

atabaseEscribiremos 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["id"].ToString());
lvSalida.Items.SubItems.Add(tmpEntrada.Rows["id_articulo"].ToString());
lvSalida.Items.SubItems.Add(tmpEntrada.Rows["articulo"].ToString());
lvSalida.Items.SubItems.Add(String.Format("{0:N}",
Convert.ToDouble(tmpEntrada.Rows["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["id_articulo"]);
double _Cantidad = Convert.ToDouble(tmpEntrada.Rows["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:

Continuar con el siguiente post...
Visita mi Blog:

Si deseas que te haga un trabajo de programación: