Sistema de almacen con C#

Share Embed Donate


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

Copyright � 2017 NANOPDF Inc.
SUPPORT NANOPDF