Vous êtes sur la page 1sur 57

Creacin de un sistema de almacn con C# (Parte 1)

Creacin del Proyecto


Nuestro proyecto lo realizaremos con Visual Studio 2010. Tambin puede utilizarse Visual C# 2010 Express el cual puede descargarse desde la pgina: http://www.microsoft.com/visualstudio/en-us/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 servirn 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 diseo de la base de datos

Creacin de un sistema de almacn con C# (Parte 2)


Creacin de la Base de datos

Creamos una base de datos con Microsoft Access, con las siguientes tablas:

users Nombre del Campo user_login user_password nombre activo administrar Tipo de Datos Texto(50) Texto(255) Texto(255) Si/No Si/No Descripcin Nombre de inicio de sesin Contrasea del usuario Nombre del usuario Si est activo Si puede administrar el sistema

reportes

Si/No

Si puede ver reportes

articulos Nombre del Campo id_articulo articulo localizacion grupo unidad_medida existencia cant_min costo_promedio Tipo de Datos Texto(50) Texto(255) Texto(255) Texto(255) Texto(255) Nmero(Doble) Nmero(Doble) Nmero(Doble) Descripcin Id del artculo Nombre del artculo Ubicacin en el almacn Grupo del articulo Unidad de medida Existencia Existencia mnima Costo promedio

entradas Nombre del Campo id_entrada fecha_registro fecha_entrada proveedor Tipo de Datos Autonumrico Fecha/Hora Fecha/Hora Texto(255) Descripcin Id de la entrada Fecha de registro en el sistema Fecha de la entrada en el almacen Nombre del proveedor

folio_factura fecha_factura user_login

Texto(50) Fecha/Hora Texto(50)

Folio de la factura de compra Fecha de la factura Usuario que registra la entrada

entradas_detalle Nombre del Campo id_entrada_detalle id_entrada id_articulo cantidad precio_compra iva Tipo de Datos Autonumrico Nmero Texto(50) Nmero(Doble) Nmero(Doble) Nmero(Doble) Descripcin Id del detalle de la entrada Id de la entrada Id del artculo Cantidad que entra al almacn Precio de compra (segun factura) Impuesto que cobra el proveedor (en porcentaje)

salidas Nombre del Campo id_salida fecha_registro fecha_salida responsable user_login Tipo de Datos Autonumrico Fecha/Hora Fecha/Hora Texto(255) Texto(50) Descripcin Id de la salida Fecha de registro en el sistema Fecha de la salida Responsable de la salida Usuario que registra la salida

salidas_detalle

Nombre del Campo id_salida_detalle id_salida id_articulo cantidad

Tipo de Datos Autonumrico Nmero Texto(50) Nmero(Doble)

Descripcin Id del detalle de la salida Id de la salida Id del artculo Cantidad que sale

Una vez que diseamos nuestras tablas, las relacionamos. Las relaciones deben de quedar as:

Especificaciones tcnicas:

Todos los nombres de los campos son con minsculas. Esto no afecta en la programacin, pero deseamos poder llevar un estndar en todo lo que vayamos desarrollando.

Deber respetar los tipos de datos, eso nos evitar posibles errores en tiempo de ejecucin.

Creacin de un sistema de almacn con C# (Parte 3)


Entradas al Almacn

Diseo de la pantalla

Empezaremos diseando 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

Propiedad

Valor

Label

Name

lblFechaEntrada

Text

Fecha Entrada:

Name

dtpFechaEntrada

DateTimePicker

Format

Custom

CustomFormat dd/MM/yyyy

Name Label Text

lblFechaFactura

Fecha Factura:

Name

dtpFechaFactura

DateTimePicker

Format

Custom

CustomFormat dd/MM/yyyy

Name Label Text

lblFolioFactura

Folio Factura:

TextBox

Name

txtFolioFactura

Label

Name

lblNombreProveedor

Text

Nombre del Proveedor:

TextBox

Name

txtNombreProveedor

Name Label Text

lblIdArticulo

Articulo:

TextBox

Name

txtIdArticulo

Name Label Text

lblCantidad

Cantidad:

TextBox

Name

txtCantidad

Name Label Text

lblPrecioCompra

Precio:

TextBox

Name

txtPrecioCompra

Name Button Text

btnAgregar

Agregar

Name Button Text

btnGrabar

Grabar

Name Button Text

btnCancelar

Cancelar

Name

lvEntrada

FullRowSelect True ListView GridLines True

HideSelection False

Programacin

La parte de la programacin es la mas enredada. Voy a considerar que el lector es un novato con nociones bastante bsicas e insuficientes como para comprender la estructura de la programacin C#. Recomiendo al lector poner mucha atencin 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 cdigo de un formulario C#

Con mucho cuidado haremos doble clic sobre el formulario asegurndonos de no tocar con el puntero del mouse ningun objeto. Veremos un cdigo muy parecido al siguiente:

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;

namespace almacen.Formularios { public partial class frmEntrada : Form { public frmEntrada() { InitializeComponent(); }

private void frmEntrada_Load(object sender, EventArgs e) {

} } }

A continuacin incluir comentarios en esta misma porcin de cdigo con la finalidad de que podamos identificar claramente su organizacin:

/** * 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 ejecucin 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 cdigo 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 desicin if, pero para este tutorial, me asegurar de escribir tanto mucho o tanto poco (mucho o poco) cdigo 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 cdigo 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"].ToStrin g());

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", "Informacin 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 botn Agregar (btnAgregar) y escribimos el siguiente cdigo:

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 cdigo para grabar la entrada, hacemos doble clic sobre el botn Grabar (btnGrabar) y escribimos el siguiente cdigo:

if (grabarEntrada(dtpFechaEntrada.Value.ToShortDateString(), dtpFechaFactura.Value.ToShortDateString(), txtFolioFactura.Text, txtNombreProveedor.Text,"admin")) { this.Close(); }

El cdigo 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"] }; //<termina la deficinicn de la tabla temporal generaColumnas(); mostrarEntrada();

En el botn Salir (btnSalir) escribimos esto:

this.Close();

Para efectos de aprendizaje basico me asegur de no poner funcionalidad demasiado complicada. Lo que tratamos de desarrollar es un sistema de almacn sencillo, no se trata de desarrollar un sistema comercial cero errores, tratamos de sentar las bases tcnicas para, en un futuro, lograr un gran sistema de almacn con toda la funcionalidad comercial.

Aqui un ejemplo de la pantalla funcionando:

Creacin de un sistema de almacn con C# (Parte 4)


Reporte de Entradas

Diseo de la pantalla

Para comenzar, le daremos diseo al formulario "frmEntradasLista" el cual nos servir para mostrar un listado de las entradas que se hayan registrado, la apariencia debe de quedar mas o menos as:

Se agregaron tres Button, un ListView y un Label, las propiedades estn descritas en la siguiente tabla:

Objeto

Propiedad Name

Valor btnNueva Nueva btnMostrar Mostrar btnSalir Salir lvEntradas True True False lblMensaje

Button Text Name Button Text Name Button Text Name FullRowSelect ListView GridLines HideSelection Label Name

Text

Doble clic para imprimir.

Ahora procedemos con el diseo del reporte de entradas, lo primero que haremos ser crear un DataSet el cual nos servir para el posterior diseo del reporte.

Agregamos un nuevo objeto del tipo DataSet y le asignamos el nombredsRptEntrada como se muestra:

Le damos diseo para que quede como se muestra:

El DataSet aparece vaco, debemos agregar un DataTable y darle el diseo para que quede como se muestra en la imagen. De entre las propiedades que debemos destacar es que el tipo de datos de los campos cantidad, precio_compra e iva son System.Double. Los tipos de datos para los campos id_articulo y articulo son System.String.

Una vez terminado el diseo del DataSet agregamos un Reporte, pero utilizaremos un asistente, aqui muestro con imagenes todo el proceso:

Selecionamos que nuestro origen de datos es un objeto:

En la siguiente ventana, expanda todo y ubique el DataSet que acaba de crear anteriormente, como se muestra a continuacin:

Luego, escriba un nombre para el DataSet (propiedad Name), se recomienda poner el mismo que puso anteriormente:

Arrastre los campos que desea mostrar en el reporte a la seccin Values como se muestra en la imagen:

Desactive la operacin Sum:

Seleccione un formato (apariencia):

Elija a su gusto:

Agregue el encabezado y el pi del reporte:

Agregue los parametros prmFechaEntrada, prmFechaFactura, prmFolioFactura y prmProveedor

Ejemplo de como agregar un parametro (Repitalo con los dems):

Agregue cuatro TextBox al encabezado y organicelos ordenadamente:

Arrastre los parametros creados enfrente de los TextBox:

Agrege una columna al reporte:

Puede darle diseo al reporte, hagalo a su gusto, aqui se muestra algo muy bsico:

Agregaremos una funcin para calcular el total:

En seguida se muestra como hacerla:

Agregaremos un nuevo formulario llamado frmVerReporte al cual agregaremos un control ReportViewer al cual estableceremos una propiedad Modifiers=Public (En la ventana de propiedades), aqui se muestra una imagen:

Hasta aqui todo ha sido diseo, ahora escribiremos el cdigo que hace todo posible:

Declaramos las siguientes variables (En el formulario frmEntradasLista):

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

Ahora agregamos los siguientes procedimientos:

void generaColumnas() { lvEntradas.Clear(); lvEntradas.View = View.Details; lvEntradas.Columns.Add("Folio ", 40, HorizontalAlignment.Left); lvEntradas.Columns.Add("Fecha Entrada", 85, HorizontalAlignment.Left); lvEntradas.Columns.Add("Fecha Factura", 85, HorizontalAlignment.Left); lvEntradas.Columns.Add("Folio Factura", 85, HorizontalAlignment.Left); lvEntradas.Columns.Add("Proveedor", 200, HorizontalAlignment.Left); } void mostrarEntradas() { try { OleDbConnection cnn = new OleDbConnection(CnnStr); cnn.Open(); OleDbCommand cmd = new OleDbCommand(); cmd.Connection = cnn; cmd.CommandText = "select * from entradas"; OleDbDataReader dr = cmd.ExecuteReader(); int i = 0; lvEntradas.Items.Clear(); while (dr.Read()) {

//mostramos los datos lvEntradas.Items.Add(dr["id_entrada"].ToString());

lvEntradas.Items[i].SubItems.Add(String.Format("{0:dd/MM/yyyy}",dr["fecha _entrada"])); lvEntradas.Items[i].SubItems.Add(String.Format("{0:dd/MM/yyyy}", dr["fecha_factura"])); lvEntradas.Items[i].SubItems.Add(dr["folio_factura"].ToString()); lvEntradas.Items[i].SubItems.Add(dr["proveedor"].ToString()); i++; } dr.Close(); cnn.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } void mostrarReporte(int prmIdEntrada) { 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 entradas_detalle d,articulos a "+ " where a.id_articulo=d.id_articulo and id_entrada="+ prmIdEntrada +"", cnn); da.Fill(dsReporte, "rptentrada"); if (dsReporte.Tables["rptEntrada"].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("dsRptEntrada", dsReporte.Tables["rptEntrada"])); frm.reportViewer1.LocalReport.ReportPath = reportFile; //parametros List<ReportParameter> param = new List<ReportParameter>(); OleDbCommand cmd = new OleDbCommand("select * from entradas where id_entrada=" + prmIdEntrada + "", cnn); OleDbDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { //folio_factura ReportParameter pFolioFactura = new ReportParameter(); pFolioFactura.Name = "prmFolioFactura"; pFolioFactura.Values.Add(dr["folio_factura"].ToString()); param.Add(pFolioFactura); //fecha_entrada

ReportParameter pFechaEntrada = new ReportParameter(); pFechaEntrada.Name = "prmFechaEntrada"; pFechaEntrada.Values.Add(dr["fecha_entrada"].ToString()); param.Add(pFechaEntrada); //fecha_factura ReportParameter pFechaFactura = new ReportParameter(); pFechaFactura.Name = "prmFechaFactura"; pFechaFactura.Values.Add(dr["fecha_factura"].ToString()); param.Add(pFechaFactura); //proveedor ReportParameter pProveedor = new ReportParameter(); pProveedor.Name = "prmProveedor"; pProveedor.Values.Add(dr["proveedor"].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 loading report", MessageBoxButtons.OK, MessageBoxIcon.Error); }

Agregamos sl siguiente cdigo en el Form_Load:

lvEntradas.DoubleClick += new EventHandler(lvEntradas_DoubleClick); generaColumnas(); mostrarEntradas();

Luego, agregamos el siguiente cdigo:

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

El cdigo para el botn btnNueva:

frmEntrada entrada = new frmEntrada(); entrada.StartPosition = FormStartPosition.CenterScreen; entrada.ShowDialog();

El cdigo para el botn btnMostrar:

mostrarEntradas(); El cdigo para el botn btnSalir

this.Close();

Aqui un ejemplo de la pantalla funcionando:

Aqui un ejemplo del reporte:

Creacin de un sistema de almacn con C# (Parte 5)


Salidas del Almacn

Diseo de la pantalla

Empezaremos diseando 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:

Objeto

Propiedad Name

Valor lblFechaSalida Fecha Salida: dtpFechaSalida Custom dd/MM/yyyy

Label Text Name DateTimePicker Format CustomFormat

Label

Name Text

lblResponsable Responsable de la Salida: txtResponsable lblIdArticulo Articulo: txtIdArticulo lblCantidad Cantidad: txtCantidad btnAgregar Agregar btnGrabar Grabar btnCancelar Cancelar lvSalida True True False

TextBox

Name Name

Label Text TextBox Name Name Label Text TextBox Name Name Button Text Name Button Text Name Button Text Name FullRowSelect ListView GridLines HideSelection

Programacin

La parte de la programacin es la mas enredada. Voy a considerar que el lector es un novato con nociones bastante bsicas e insuficientes como para comprender la estructura de la programacin C#. Recomiendo al lector poner mucha atencin 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 cdigo 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", "Informacin 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 botn Agregar (btnAgregar) y escribimos el siguiente cdigo:

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

Ahora, agregaremos el cdigo para grabar la entrada, hacemos doble clic sobre el botn Grabar (btnGrabar) y escribimos el siguiente cdigo:

if (grabarSalida(dtpFechaSalida.Value.ToShortDateString(), txtResponsable.Text, "admin")) {

this.Close(); }

El cdigo 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 deficinicn de la tabla temporal generaColumnas(); mostrarEntrada();

En el botn Salir (btnSalir) escribimos esto:

this.Close();

Aqui un ejemplo de la pantalla funcionando:

Creacin de un sistema de almacn con C# (Parte 6)


Reporte de Entradas

Diseo de la pantalla

Para comenzar, le daremos diseo 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 estn descritas en la siguiente tabla:

Objeto

Propiedad Name

Valor btnNueva Nueva btnMostrar Mostrar btnSalir Salir lvSalidas True True False lblMensaje Doble clic para imprimir.

Button Text Name Button Text Name Button Text Name FullRowSelect ListView GridLines HideSelection Name Label Text

Ahora procedemos con el diseo 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 cdigo en el Form_Load:

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

Luego, agregamos el siguiente cdigo:

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

El cdigo para el botn btnNueva:

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

El cdigo para el botn btnMostrar:

mostrarSalidas(); El cdigo para el botn btnSalir

this.Close();

Aqui un ejemplo de la pantalla funcionando:

Aqui un ejemplo del reporte:

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

Creacin de un sistema de almacn con C# (Parte 7)


Pantalla principal

Le daremos diseo al formulario frmPrincipal agregando un MenuStrip, un ToolStrip y estableciendo su pripiedad IsMdiContainer = true para que quede de la siguiente manera:

A continuacin una tabla que describe los objetos:

Objeto MenuStrip

Propiedad Name

Valor mnuPrincipal

ToolStripMenuItem Name Text Name ToolStripMenuItem Text Name ToolStripMenuItem Text Name ToolStripMenuItem Text Name ToolStripMenuItem Text ToolStrip Name Name Text ToolStripButton DisplayStyle

mnuArchivo Archivo mnuAyuda Ayuda mnuEntradas Entradas mnuSalidas Salidas mnuSalir Salir del Sistema barPrincipal btnEntradas Entradas ImageAndText

TextImageRelation ImageAboveText Image Name Text ToolStripButton DisplayStyle (A su gusto) btnSalidas Salidas ImageAndText

TextImageRelation ImageAboveText Image ToolStripButton Name (A su gusto) btnSalir

Text DisplayStyle

Salir ImageAndText

TextImageRelation ImageAboveText Image (A su gusto)

Ahora crearemos los siguientes procedimientos:

void entradas() { frmEntradasLista entradas = new frmEntradasLista(); entradas.MdiParent = this; entradas.Show(); } void salidas() { frmSalidasLista salidas = new frmSalidasLista(); salidas.MdiParent = this; salidas.Show(); } void salir() { this.Close(); }

Ahora solo resta poner el cdigo en cada uno de los botones y mens, los ponemos de uno por uno, dando doble clic sobre cada uno, iniciamos con mnuEntradas:

entradas(); Seguimos con mnuSalidas:

salidas(); Asi lo hacemos tambin con los botones btnEntradas y btnSalidas

Ahora, el toque final de nuestra aplicacin, abrimos la clase InicioAplicacion y nos aseguramos que est como se muestra a continuacin:

using System; using System.Windows.Forms; namespace almacen.Clases { class InicioAplicacion {

/// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main()

{ Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Formularios.Principal());

} } }

Aqui un ejemplo de la pantalla funcionando:

Hemos terminado este tutorial, espero que les sea de utilidad... Dios los Bendiga

Vous aimerez peut-être aussi