Sistema de almacen con C#
Short Description
Download Sistema de almacen con C#...
Description
Nuestro proyecto lo realizaremos con Visual Studio 2010. También puede utilizarse Visual C# 2010 Express el cual puede descargarse desde la página: http://www.microsoft.com/visualstudio/enus/products/2010-editions/visual-csharp-express 1. Creamos un nuevo proyecto:
2. Eliminamos el formulario y la clase:
3. Agregamos varias carpetas las cuales nos servirán para organizar nuestro proyecto:
4. Ahora agregamos cinco formularios y una clase, así como se muestra en la figura:
Nota: Por favor ignorar la carpeta llamada "Turorial", es la que estoy utilizando para generar este documento. Una vez hecho esto, continuaremos con el diseño de la base de datos
Creación de un sistema de almacén con C# (Parte 2)
Creación de la Base de datos Creamos una base de datos con Microsoft Access, con las siguientes tablas: Nombre del Campo user_login user_password nombre activo administrar reportes
users Tipo de Datos Texto(50) Texto(255) Texto(255) Si/No Si/No Si/No
Descripción Nombre de inicio de sesión Contraseña del usuario Nombre del usuario Si está activo Si puede administrar el sistema Si puede ver reportes
Nombre del Campo id_articulo articulo localizacion grupo unidad_medida existencia cant_min costo_promedio
articulos Tipo de Datos Texto(50) Texto(255) Texto(255) Texto(255) Texto(255) Número(Doble) Número(Doble) Número(Doble)
Descripción Id del artículo Nombre del artículo Ubicación en el almacén Grupo del articulo Unidad de medida Existencia Existencia mínima Costo promedio
Nombre del Campo id_entrada fecha_registro fecha_entrada proveedor folio_factura fecha_factura user_login
entradas Tipo de Datos Autonumérico Fecha/Hora Fecha/Hora Texto(255) Texto(50) Fecha/Hora Texto(50)
Descripción Id de la entrada Fecha de registro en el sistema Fecha de la entrada en el almacen Nombre del proveedor Folio de la factura de compra Fecha de la factura Usuario que registra la entrada
Nombre del Campo id_entrada_detalle id_entrada id_articulo cantidad precio_compra iva
Nombre del Campo id_salida fecha_registro fecha_salida responsable user_login
entradas_detalle Tipo de Datos Descripción Autonumérico Id del detalle de la entrada Número Id de la entrada Texto(50) Id del artículo Número(Doble) Cantidad que entra al almacén Número(Doble) Precio de compra (segun factura) Impuesto que cobra el proveedor (en Número(Doble) porcentaje)
salidas Tipo de Datos Autonumérico Fecha/Hora Fecha/Hora Texto(255) Texto(50)
Descripción Id de la salida Fecha de registro en el sistema Fecha de la salida Responsable de la salida Usuario que registra la salida
Nombre del Campo id_salida_detalle id_salida id_articulo cantidad
salidas_detalle Tipo de Datos Autonumérico Número Texto(50) Número(Doble)
Descripción Id del detalle de la salida Id de la salida Id del artículo Cantidad que sale
Una vez que diseñamos nuestras tablas, las relacionamos. Las relaciones deben de quedar así:
Especificaciones técnicas:
Todos los nombres de los campos son con minúsculas. Esto no afecta en la programación, pero deseamos poder llevar un estándar en todo lo que vayamos desarrollando. Deberá respetar los tipos de datos, eso nos evitará posibles errores en tiempo de ejecución.
Creación de un sistema de almacén con C# (Parte 3)
Entradas al Almacén Diseño de la pantalla Empezaremos diseñando la pantalla de entradas (formulario frmEntrada), la apariencia debe de quedar mas o menos así:
A continuacion una tabla descriptiva con los nombres de los objetos: Objeto
Label
DateTimePicker
Label
Propiedad
Valor
Name
lblFechaEntrada
Text
Fecha Entrada:
Name
dtpFechaEntrada
Format
Custom
CustomFormat
dd/MM/yyyy
Name
lblFechaFactura
Text
Fecha Factura:
Name
dtpFechaFactura
DateTimePicker
Label TextBox
Format
Custom
CustomFormat
dd/MM/yyyy
Name
lblFolioFactura
Text
Folio Factura:
Name
txtFolioFactura
Name
lblNombreProveedor
Text
Nombre del Proveedor:
Name
txtNombreProveedor
Name
lblIdArticulo
Text
Articulo:
Name
txtIdArticulo
Name
lblCantidad
Text
Cantidad:
Name
txtCantidad
Name
lblPrecioCompra
Text
Precio:
Name
txtPrecioCompra
Name
btnAgregar
Text
Agregar
Name
btnGrabar
Text
Grabar
Name
btnCancelar
Text
Cancelar
Label
TextBox
Label
TextBox
Label
TextBox
Label
TextBox
Button
Button
Button
Name
lvEntrada
FullRowSelect
True
GridLines
True
HideSelection
False
ListView
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. Comprendiendo el código de un formulario C#
Con mucho cuidado haremos doble clic sobre el formulario asegurándonos de no tocar con el puntero del mouse ningun objeto. Veremos un código muy parecido al siguiente: using using using using using using using using
System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms;
namespace almacen.Formularios { public partial class frmEntrada : Form { public frmEntrada() { InitializeComponent(); } private void frmEntrada_Load(object sender, EventArgs e) { } } }
A continuación incluiré comentarios en esta misma porción de código con la finalidad de que podamos identificar claramente su organización: /** * Aqui se agrupan los espacios de nombres * Son necesarios para facilitarnos el acceso * a ciertas librerias o DLLs */ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; //Aqui inicia nuestro espacio de nombres namespace almacen.Formularios { //aqui inicia la clase public partial class frmEntrada : Form { //este es el constructor predeterminado public frmEntrada() { InitializeComponent(); } //Aqui declararemos nuestras variables private void frmEntrada_Load(object sender, EventArgs e) { /** * Aqui incia la ejecución del Formulario */ } //Aqui se ubican los procedimientos y funciones } //Fin de la clase, normalmente no se utiliza } /** * Fin del Espacio de Nombres * Este espacio no lo utilizaremos, * normalmente no se utiliza */
Así se organiza el código de un formulario C#. Debemos notar que todo inicia y termina con las llaves { }, existen algunos casos en los que puede omitirse el uso de las llaves, principalmente en las estructuras de desición if, pero para este tutorial, me aseguraré de escribir tanto mucho o tanto poco (mucho o poco) código segun sea necesario para evitar confusiones. Ahora comenzaremos a programar, iniciamos nuestra tarea declarando todas las variables que vamos a utilizar. En la zona de declaraciones, declaramos las siguientes 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;";
Ahora escribiremos el código de las funciones y procedimientos: void generaColumnas() { lvEntrada.Clear(); lvEntrada.View = View.Details; lvEntrada.Columns.Add("", 0, HorizontalAlignment.Left); lvEntrada.Columns.Add("Id ", 100, HorizontalAlignment.Left); lvEntrada.Columns.Add("Producto", 240, HorizontalAlignment.Left); lvEntrada.Columns.Add("Cantidad", 60, HorizontalAlignment.Right); lvEntrada.Columns.Add("Precio", 60, HorizontalAlignment.Right); lvEntrada.Columns.Add("Total", 80, HorizontalAlignment.Right); } void mostrarEntrada() { try { double varIVA = 0; double varTOTAL = 0; lvEntrada.Items.Clear(); for (int i = 0; i < tmpEntrada.Rows.Count; i++) { lvEntrada.Items.Add(tmpEntrada.Rows[i]["id"].ToString()); lvEntrada.Items[i].SubItems.Add(tmpEntrada.Rows[i]["id_articulo"].ToString()); lvEntrada.Items[i].SubItems.Add(tmpEntrada.Rows[i]["articulo"].ToString()); lvEntrada.Items[i].SubItems.Add(String.Format("{0:N}", Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"]))); lvEntrada.Items[i].SubItems.Add(String.Format("{0:C}", Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"]))); lvEntrada.Items[i].SubItems.Add(String.Format("{0:C}", (Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"]) * Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"])))); varTOTAL += Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"]) * Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"]); varIVA += (Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"]) * Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"])) ((Convert.ToDouble(tmpEntrada.Rows[i]["cantidad"]) * Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"])) / (1.16)); } } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } bool agregarArticulo(string prmId, double prmCantidad, double prmPrecioCompra, double prmIVA) { try { string varId = ""; string varNombre = ""; OleDbConnection cnn = new OleDbConnection(CnnStr); cnn.Open(); string strSQL="select articulo from articulos "+ "where id_articulo='"+ prmId +"'"; OleDbCommand cmd = new OleDbCommand(strSQL, cnn); OleDbDataReader dr = cmd.ExecuteReader(); if (dr.Read()) { varId = prmId;
varNombre = dr["articulo"].ToString(); ; //agregamos la venta a la tabla temporal DataRow row = tmpEntrada.NewRow(); row["id_articulo"] = varId; row["articulo"] = varNombre; row["cantidad"] = prmCantidad; row["precio_compra"] = prmPrecioCompra; row["iva"] = prmIVA; tmpEntrada.Rows.Add(row); } 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 grabarEntrada(string prmFechaEntrada, string prmFechaFactura, string prmFolioFactura, string prmNombreProveedor, 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 entradas(fecha_entrada,fecha_factura,folio_factura,proveedor,user_login) " + " values (#" + prmFechaEntrada + "#,#" + prmFechaFactura + "#,'" + prmFolioFactura + "','" + prmNombreProveedor + "','" + prmUserLogin + "')"; cmd.ExecuteNonQuery(); //obtenemos el folio int _FolioEntrada = 0; cmd.CommandText = "select @@identity"; _FolioEntrada = 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"]); double _IVA = Convert.ToDouble(tmpEntrada.Rows[i]["iva"]); double _PrecioCompra = Convert.ToDouble(tmpEntrada.Rows[i]["precio_compra"]); double _CostoPromedio = 0; //insertamos el articulo cmd.CommandText = "insert into entradas_detalle(id_entrada,id_articulo,cantidad,precio_compra,iva) " + "values(" + _FolioEntrada + ",'" + _IdArticulo + "'," + _Cantidad + "," + _PrecioCompra + "," + _IVA + ")"; cmd.ExecuteNonQuery(); //actualizamosexistencias cmd.CommandText = "update articulos set " + " existencia=existencia + " + _Cantidad + "" + " where id_articulo='" + _IdArticulo + "'"; cmd.ExecuteNonQuery(); //establecemos el costo promedio
cmd.CommandText = "select avg(precio_compra) " + " from entradas_detalle " + " where id_articulo='" + _IdArticulo + "'"; _CostoPromedio = Convert.ToDouble(cmd.ExecuteScalar()); cmd.CommandText = "update articulos set " + " costo_promedio=" + _CostoPromedio + "" + " where id_articulo='" + _IdArticulo + "'"; cmd.ExecuteNonQuery(); } //finalizamos la transaccion tran.Commit(); cnn.Close(); MessageBox.Show("Entrada 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), Convert.ToDouble(txtPrecioCompra.Text), 0.16)) { 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 (grabarEntrada(dtpFechaEntrada.Value.ToShortDateString(), dtpFechaFactura.Value.ToShortDateString(), txtFolioFactura.Text, txtNombreProveedor.Text,"admin")) { this.Close(); }
El código que pondremos en el Form_Load es el siguiente: //>Definimos la tabla para las ventas Temporales 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)); tmpEntrada.Columns.Add("precio_compra", typeof(Double)); tmpEntrada.Columns.Add("iva", typeof(Double)); //agregamos un primary key tmpEntrada.PrimaryKey = new DataColumn[] { tmpEntrada.Columns["id"] }; //= 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"] }; //
View more...
Comments