Você está na página 1de 37

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 !press el cual puede descar"arse desde la p#"ina$%ttp$&&'''.microso(t.com&)isualstudio&en*us&products&2010*editions&)isual*cs%arp*e!press 1. Creamos un nue)o proyecto$

2. liminamos el (ormulario y la clase$

+. ,"re"amos )arias carpetas las cuales nos ser)ir#n para or"anizar nuestro proyecto$

-. ,%ora a"re"amos cinco (ormularios y una clase. as/ como se muestra en la (i"ura$

Nota$ Por (a)or i"norar la carpeta llamada 0Turorial0. es la 1ue estoy utilizando para "enerar este documento. 2na )ez %ec%o esto. continuaremos con el dise3o de la base de datos

Creacin de un sistema de almacn con C# (Parte 2) Creacin de la 4ase de datos


Creamos una base de datos con 5icroso(t ,ccess. con las si"uientes tablas$

users Nombre del Campo user_login user_password nombre activo administrar reportes Tipo de Datos Texto(50) Texto(255) Texto(255) i!No i!No i!No Descripcin Nombre de inicio de sesin Contrasea del usuario Nombre del usuario i est" activo i puede administrar el sistema i puede ver reportes

articulos Nombre del Campo id_articulo articulo Tipo de Datos Texto(50) Texto(255) Descripcin #d del art$culo Nombre del art$culo

locali%acion grupo unidad_medida existencia cant_min costo_promedio

Texto(255) Texto(255) Texto(255) N)mero(*oble) N)mero(*oble) N)mero(*oble)

&bicacin en el almac'n (rupo del articulo &nidad de medida +xistencia +xistencia m$nima Costo promedio

entradas Nombre del Campo id_entrada -ec.a_registro -ec.a_entrada proveedor -olio_-actura -ec.a_-actura user_login Tipo de Datos ,utonum'rico /ec.a!0ora /ec.a!0ora Texto(255) Texto(50) /ec.a!0ora Texto(50) Descripcin #d de la entrada /ec.a de registro en el sistema /ec.a de la entrada en el almacen Nombre del proveedor /olio de la -actura de compra /ec.a de la -actura &suario 1ue registra la entrada

entradas_detalle Nombre del Campo id_entrada_detalle id_entrada id_articulo cantidad precio_compra iva Tipo de Datos ,utonum'rico N)mero Texto(50) N)mero(*oble) N)mero(*oble) N)mero(*oble) Descripcin #d del detalle de la entrada #d de la entrada #d del art$culo Cantidad 1ue entra al almac'n 2recio de compra (segun -actura) #mpuesto 1ue cobra el proveedor (en porcenta3e)

salidas

Nombre del Campo id_salida -ec.a_registro -ec.a_salida responsable user_login

Tipo de Datos ,utonum'rico /ec.a!0ora /ec.a!0ora Texto(255) Texto(50)

Descripcin #d de la salida /ec.a de registro en el sistema /ec.a de la salida 4esponsable de la salida &suario 1ue registra la salida

salidas_detalle Nombre del Campo id_salida_detalle id_salida id_articulo cantidad Tipo de Datos ,utonum'rico N)mero Texto(50) N)mero(*oble) Descripcin #d del detalle de la salida #d de la salida #d del art$culo Cantidad 1ue sale

2na )ez 1ue dise3amos nuestras tablas. las relacionamos. 6as relaciones deben de 1uedar as/$

speci(icaciones tcnicas$ Todos los nombres de los campos son con min7sculas. sto no a(ecta en la pro"ramacin. pero deseamos poder lle)ar un est#ndar en todo lo 1ue )ayamos desarrollando. 8eber# respetar los tipos de datos. eso nos e)itar# posibles errores en tiempo de e9ecucin.

ntradas al ,lmacn Diseo de la pantalla


mpezaremos dise3ando la pantalla de entradas :(ormulario (rm ntrada;. la apariencia debe de 1uedar mas o menos as/$

, continuacion una tabla descripti)a con los nombres de los ob9etos$

Objeto

Propiedad Name

Valor lbl<ec%a ntrada <ec%a ntrada$ dtp<ec%a ntrada Custom dd&55&yyyy lbl<ec%a<actura <ec%a <actura$ dtp<ec%a<actura Custom dd&55&yyyy lbl<olio<actura <olio <actura$ t!t<olio<actura

6abel

Te!t Name

8ateTimePic=er

<ormat Custom<ormat Name

6abel

Te!t Name

8ateTimePic=er

<ormat Custom<ormat Name

6abel Te!t4o!

Te!t Name

Name 6abel Te!t Te!t4o! Name Name 6abel Te!t Te!t4o! Name Name 6abel Te!t Name Name 6abel Te!t Te!t4o! Name Name 4utton Te!t Name 4utton Te!t Name 4utton Te!t Name <ull@o'Select 6istVie' ?rid6ines AideSelection

lblNombrePro)eedor Nombre del Pro)eedor$ t!tNombrePro)eedor lbl>d,rticulo ,rticulo$ t!t>d,rticulo lblCantidad Cantidad$ t!tCantidad lblPrecioCompra Precio$ t!tPrecioCompra btn,"re"ar ,"re"ar btn?rabar ?rabar btnCancelar Cancelar l) ntrada True True <alse

Te!t4o!

Programacin
6a parte de la pro"ramacin es la mas enredada. Voy a considerar 1ue el lector es un no)ato con nociones bastante b#sicas e insu(icientes como para comprender la estructura de la pro"ramacin C#. @ecomiendo al lector poner muc%a atencin

a los pasos 1ue a1ui se describan y no omitir nada leer ! re"leer #asta $ue #a!a comprendido lo $ue tiene $ue #acer%

Comprendiendo el cdigo de un &ormulario C#


Con muc%o cuidado %aremos doble clic sobre el (ormulario asegur'ndonos de no tocar con el puntero del mouse ningun objeto. Veremos un cdi"o muy parecido al si"uiente$

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 pu!lic partial class "rm#ntrada $ Form pu!lic "rm#ntrada%& 'nitiali(eComponent%&; ) pri*ate *oid "rm#ntrada+Load%o!,ect sender- #*ent.rgs e& ) ) )

, continuacin incluir comentarios en esta misma porcin de cdi"o con la (inalidad de 1ue podamos identi(icar claramente su or"anizacin$

/00 0 .qui se agrupan los espacios de nom!res 0 Son necesarios para "acilitarnos el acceso 0 a ciertas li!rerias o DLLs 0/ 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; //.qui inicia nuestro espacio de nom!res namespace almacen.Formularios //aqui inicia la clase pu!lic partial class "rm#ntrada $ Form //este es el constructor predeterminado pu!lic "rm#ntrada%& 'nitiali(eComponent%&; ) //.qui declararemos nuestras *aria!les pri*ate *oid "rm#ntrada+Load%o!,ect sender- #*ent.rgs e&

/00

) /00 0 Fin del #spacio de 2om!res 0 #ste espacio no lo utili(aremos0 normalmente no se utili(a 0/

) //Fin de la clase- normalmente no se utili(a

) //.qui se u!ican los procedimientos y "unciones

0 .qui incia la e,ecuci1n del Formulario 0/

,s/ se or"aniza el cdi"o de un (ormulario C#. 8ebemos notar 1ue todo inicia y termina con las lla)es( ). e!isten al"unos casos en los 1ue puede omitirse el uso de las lla)es. principalmente en las estructuras de desicin i&. pero para este tutorial. me ase"urar de escribir tanto muc%o o tanto poco :muc%o o poco; cdi"o se"un sea necesario para e)itar con(usiones. ,%ora comenzaremos a pro"ramar. iniciamos nuestra tarea declarando todas las )ariables 1ue )amos a utilizar. n la zona de declaraciones. declaramos las si"uientes )ariables$

DataTa!le tmp#ntrada 3 new DataTa!le%&; string CnnStr 3 45 6ro*ider3Microso"t.7et.8L#D9.:.;; 5< 5Data Source3D$==D8CS==tyrode*eloper==almacen.md!; 5< 57et 8L#D9$Data!ase 6assword3; 6ersist Security 'n"o3False;5;

,%ora escribiremos el cdi"o de las (unciones y procedimientos$

*oid generaColumnas%& l*#ntrada.Clear%&; l*#ntrada.>iew 3 >iew.Details; l*#ntrada.Columns..dd%55- ;- ?ori(ontal.lignment.Le"t&; l*#ntrada.Columns..dd%5'd 5- @;;- ?ori(ontal.lignment.Le"t&; l*#ntrada.Columns..dd%56roducto5- A:;- ?ori(ontal.lignment.Le"t&; l*#ntrada.Columns..dd%5Cantidad5- B;- ?ori(ontal.lignment.CigDt&; l*#ntrada.Columns..dd%56recio5- B;- ?ori(ontal.lignment.CigDt&; l*#ntrada.Columns..dd%5Total5- E;- ?ori(ontal.lignment.CigDt&;

) *oid mostrar#ntrada%& try

dou!le *ar'>. 3 ;; dou!le *arT8T.L 3 ;; l*#ntrada.'tems.Clear%&; "or %int i 3 ;; i F tmp#ntrada.Cows.Count; i<<& l*#ntrada.'tems..dd%tmp#ntrada.CowsGiHG5id5H.ToString%&&; l*#ntrada.'temsGiH.Su!'tems..dd%tmp#ntrada.CowsGiHG5id+articulo5H.ToString%&&; l*#ntrada.'temsGiH.Su!'tems..dd%tmp#ntrada.CowsGiHG5articulo5H.ToString%&&; l*#ntrada.'temsGiH.Su!'tems..dd%String.Format%5 ;$2)5Con*ert.ToDou!le%tmp#ntrada.CowsGiHG5cantidad5H&&&; l*#ntrada.'temsGiH.Su!'tems..dd%String.Format%5 ;$C)5Con*ert.ToDou!le%tmp#ntrada.CowsGiHG5precio+compra5H&&&; l*#ntrada.'temsGiH.Su!'tems..dd%String.Format%5 ;$C)5%Con*ert.ToDou!le%tmp#ntrada.CowsGiHG5precio+compra5H& 0 Con*ert.ToDou!le%tmp#ntrada.CowsGiHG5cantidad5H&&&&; *arT8T.L <3 Con*ert.ToDou!le%tmp#ntrada.CowsGiHG5precio+compra5H& 0

Con*ert.ToDou!le%tmp#ntrada.CowsGiHG5cantidad5H&; *ar'>. <3 %Con*ert.ToDou!le%tmp#ntrada.CowsGiHG5cantidad5H& 0 Con*ert.ToDou!le%tmp#ntrada.CowsGiHG5precio+compra5H&& I %%Con*ert.ToDou!le%tmp#ntrada.CowsGiHG5cantidad5H& 0 Con*ert.ToDou!le%tmp#ntrada.CowsGiHG5precio+compra5H&& / %@.@B&&; ) ) catcD %#xception ex& Message9ox.SDow%ex.Message- 5#rror5Message9ox9uttons.8J- Message9ox'con.#rror&; ) ) !ool agregar.rticulo%string prm'd- dou!le prmCantidad- dou!le prm6recioCompra- dou!le prm'>.& try string *ar'd 3 55; string *ar2om!re 3 55; 8leD!Connection cnn 3 new 8leD!Connection%CnnStr&; cnn.8pen%&; string strSKL35select articulo "rom articulos 5< 5wDere id+articulo3L5< prm'd <5L5; 8leD!Command cmd 3 new 8leD!Command%strSKL- cnn&; 8leD!DataCeader dr 3 cmd.#xecuteCeader%&; i" %dr.Cead%&& *ar'd 3 prm'd; *ar2om!re 3 drG5articulo5H.ToString%&; ; //agregamos la *enta a la ta!la temporal DataCow row 3 tmp#ntrada.2ewCow%&; rowG5id+articulo5H 3 *ar'd; rowG5articulo5H 3 *ar2om!re; rowG5cantidad5H 3 prmCantidad; rowG5precio+compra5H 3 prm6recioCompra; rowG5i*a5H 3 prm'>.; tmp#ntrada.Cows..dd%row&; ) else Message9ox.SDow%5#l articulo no existe5- 5#rror5Message9ox9uttons.8J- Message9ox'con.#rror&; return %"alse&; ) dr.Close%&; cnn.Close%&; return %true&; ) catcD %#xception ex& Message9ox.SDow%ex.Message- 5#rror5- Message9ox9uttons.8JMessage9ox'con.#rror&; return %"alse&;

) ) !ool gra!ar#ntrada%string prmFecDa#ntrada- string prmFecDaFactura- string prmFolioFacturastring prm2om!re6ro*eedor- string prmMserLogin& try 8leD!Connection cnn 3 new 8leD!Connection%CnnStr&; cnn.8pen%&; 8leD!Transaction tran 3 cnn.9eginTransaction%&; 8leD!Command cmd 3 new 8leD!Command%&; cmd.Connection 3 cnn; cmd.Transaction 3 tran; //insertamos el registro de la #ntrada try cmd.CommandText 3 5insert into entradas%"ecDa+entrada-"ecDa+"actura-"olio+"actura-pro*eedor-user+login& 5 < 5 *alues %N5 < prmFecDa#ntrada < 5N-N5 < prmFecDaFactura < 5N-L5 < prmFolioFactura < 5L-L5 < prm2om!re6ro*eedor < 5L-L5 < prmMserLogin < 5L&5; cmd.#xecute2onKuery%&; //o!tenemos el "olio

int +Folio#ntrada 3 ;; cmd.CommandText 3 5select 44identity5; +Folio#ntrada 3 Con*ert.To'ntOA%cmd.#xecuteScalar%&&; //insertamos el detalle de laentrada "or %int i 3 ;; i F tmp#ntrada.Cows.Count; i<<& string +'d.rticulo 3 Con*ert.ToString%tmp#ntrada.CowsGiHG5id+articulo5H&; dou!le +Cantidad 3 Con*ert.ToDou!le%tmp#ntrada.CowsGiHG5cantidad5H&; dou!le +'>. 3 Con*ert.ToDou!le%tmp#ntrada.CowsGiHG5i*a5H&; dou!le +6recioCompra 3 Con*ert.ToDou!le%tmp#ntrada.CowsGiHG5precio+compra5H&; dou!le +Costo6romedio 3 ;; //insertamos el articulo cmd.CommandText 3 5insert into entradas+detalle%id+entrada-id+articulo-cantidad-precio+compra-i*a& 5 < 5*alues%5 < +Folio#ntrada < 5-L5 < +'d.rticulo < 5L-5 < +Cantidad < 5-5 < +6recioCompra < 5-5 < +'>. < 5&5; cmd.#xecute2onKuery%&; //actuali(amosexistencias cmd.CommandText 3 5update articulos set 5 < 5 existencia3existencia < 5 < +Cantidad < 55 < 5 wDere id+articulo3L5 < +'d.rticulo < 5L5; cmd.#xecute2onKuery%&; //esta!lecemos el costo promedio cmd.CommandText 3 5select a*g%precio+compra& 5 < 5 "rom entradas+detalle 5 < 5 wDere id+articulo3L5 < +'d.rticulo < 5L5; +Costo6romedio 3 Con*ert.ToDou!le%cmd.#xecuteScalar%&&; cmd.CommandText 3 5update articulos set 5 < 5 costo+promedio35 < +Costo6romedio < 55 < 5 wDere id+articulo3L5 < +'d.rticulo < 5L5; cmd.#xecute2onKuery%&; ) //"inali(amos la transaccion tran.Commit%&; cnn.Close%&; Message9ox.SDow%5#ntrada gra!ada correctamente55'n"ormaci1n del Sistema5- Message9ox9uttons.8JMessage9ox'con.'n"ormation&; return %true&; ) catcD %8leD!#xception err#ntrada& tran.Coll!acP%&; cnn.Close%&; Message9ox.SDow%err#ntrada.Message&; return %"alse&; ) ) catcD %#xception ex& Message9ox.SDow%ex.Message- 5#rror5- Message9ox9uttons.8JMessage9ox'con.#rror&; return %"alse&;

) )

,%ora damos doble clic sobre el botn ,"re"ar :btn,"re"ar; y escribimos el si"uiente cdi"o$

try i" %agregar.rticulo%txt'd.rticulo.TextCon*ert.ToDou!le%txtCantidad.Text&Con*ert.ToDou!le%txt6recioCompra.Text&;.@B&& mostrar#ntrada%&; ) ) catcD %#xception ex& Message9ox.SDow%ex.Message&; )

,%ora. a"re"aremos el cdi"o para "rabar la entrada. %acemos doble clic sobre el botn ?rabar

:btn?rabar; y escribimos el si"uiente cdi"o$

i" %gra!ar#ntrada%dtpFecDa#ntrada.>alue.ToSDortDateString%&dtpFecDaFactura.>alue.ToSDortDateString%&txtFolioFactura.Text- txt2om!re6ro*eedor.Text-5admin5&& tDis.Close%&; )

l cdi"o 1ue pondremos en el <ormB6oad es el si"uiente$

//QDe"inimos la ta!la para las *entas Temporales DataColumn idColumn 3 new DataColumn%5id5- typeo"%int&&; idColumn.Mnique 3 true; idColumn..uto'ncrement 3 true; idColumn..uto'ncrementSeed 3 @; idColumn..uto'ncrementStep 3 @; tmp#ntrada.Columns..dd%idColumn&; //declaramos el resto de los campos tmp#ntrada.Columns..dd%5id+articulo5- typeo"%string&&; tmp#ntrada.Columns..dd%5articulo5- typeo"%string&&; tmp#ntrada.Columns..dd%5cantidad5- typeo"%Dou!le&&; tmp#ntrada.Columns..dd%5precio+compra5- typeo"%Dou!le&&; tmp#ntrada.Columns..dd%5i*a5- typeo"%Dou!le&&; //agregamos un primary Pey tmp#ntrada.6rimaryJey 3 new DataColumnGH tmp#ntrada.ColumnsG5id5H ); //Ftermina la de"icinic1n de la ta!la temporal generaColumnas%&; mostrar#ntrada%&;

n el botn Salir :btnSalir; escribimos esto$

tDis.Close%&;

Para e(ectos de aprendiza9e basico me ase"ur de no poner (uncionalidad demasiado complicada. 6o 1ue 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 (uturo. lo"rar un "ran sistema de almacn con toda la (uncionalidad comercial.

,1ui un e9emplo de la pantalla (uncionando$

@eporte de ntradas Diseo de la pantalla


Para comenzar. le daremos dise3o al (ormulario 0(rm ntradas6ista0 el cual nos ser)ir# para mostrar un listado de las entradas 1ue se %ayan re"istrado. la apariencia debe de 1uedar mas o menos as/$

Se a"re"aron tres 4utton. un 6istVie' y un 6abel. las propiedades est#n descritas en la si"uiente tabla$ Objeto Propiedad Name 4utton Te!t Name 4utton Te!t 4utton Name 5ostrar btnSalir Nue)a btn5ostrar Valor btnNue)a

Te!t Name <ull@o'Select 6istVie' ?rid6ines AideSelection Name 6abel Te!t

Salir l) ntradas True True <alse lbl5ensa9e 8oble clic para imprimir.

,%ora procedemos con el dise3o del reporte de entradas. lo primero 1ue %aremos ser# crear un 8ataSet el cual nos ser)ir# para el posterior dise3o del reporte. ,"re"amos un nue)o ob9eto del tipo 8ataSet y le asi"namos el nombre ds*pt+ntrada como se muestra$

6e damos dise3o para 1ue 1uede como se muestra$

l 8ataSet aparece )ac/o. debemos a"re"ar un 8ataTable y darle el dise3o para 1ue 1uede como se muestra en la ima"en. 8e entre las propiedades 1ue debemos destacar es 1ue el tipo de datos de los campos cantidad precio,compra e i-a son System.8ouble. 6os tipos de datos para los campos id,articulo ! articulo son

System.Strin". 2na )ez terminado el dise3o del 8ataSet a"re"amos un @eporte. pero utilizaremos un asistente. a1ui muestro con ima"enes todo el proceso$

Selecionamos 1ue nuestro ori"en de datos es un ob9eto$

n la si"uiente )entana. e!panda todo y ubi1ue el 8ataSet 1ue acaba de crear anteriormente. como se muestra a continuacin$

6ue"o. escriba un nombre para el 8ataSet :propiedad .ame;. se recomienda poner el mismo 1ue puso anteriormente$

,rrastre los campos 1ue desea mostrar en el reporte a la seccin Values como se muestra en la ima"en$

8esacti)e la operacin /um$

Seleccione un (ormato :apariencia;$

li9a a su "usto$

,"re"ue el encabezado y el pi del reporte$

,"re"ue los parametros prm0ec#a+ntrada prm0ec#a0actura prm0olio0actura ! prmPro-eedor

9emplo de como a"re"ar un parametro :@epitalo con los dem#s;$

,"re"ue cuatro Te!t4o! al encabezado y or"anicelos ordenadamente$

,rrastre los parametros creados en(rente de los Te!t4o!$

,"re"e una columna al reporte$

Puede darle dise3o al reporte. %a"alo a su "usto. a1ui se muestra al"o muy b#sico$

,"re"aremos una (uncin para calcular el total$

n se"uida se muestra como %acerla$

,"re"aremos un nue)o (ormulario llamado &rmVer*eporte al cual a"re"aremos un control @eportVie'er al cual estableceremos una propiedad 1odi&iers2Public : n la )entana de propiedades;. a1ui se muestra una ima"en$

Aasta a1ui todo %a sido dise3o. a%ora escribiremos el cdi"o 1ue %ace todo posible$ 8eclaramos las si"uientes )ariables : n el (ormulario (rm ntradas6ista;$

string CnnStr 3 45 6ro*ider3Microso"t.7et.8L#D9.:.;; 5 < 5Data Source3D$==D8CS==tyrode*eloper==almacen.md!; 5 < 57et 8L#D9$Data!ase 6assword3; 6ersist Security 'n"o3False;5; string reportFile 3 45D$==D8CS==tyrode*eloper==almacen==almacen==Ceportes==rpt#ntrada.rdlc5;

,%ora a"re"amos los si"uientes procedimientos$

*oid generaColumnas%& l*#ntradas.Clear%&; l*#ntradas.>iew 3 >iew.Details; l*#ntradas.Columns..dd%5Folio 5- :;- ?ori(ontal.lignment.Le"t&; l*#ntradas.Columns..dd%5FecDa #ntrada5- ER- ?ori(ontal.lignment.Le"t&; l*#ntradas.Columns..dd%5FecDa Factura5- ER- ?ori(ontal.lignment.Le"t&; l*#ntradas.Columns..dd%5Folio Factura5- ER- ?ori(ontal.lignment.Le"t&; l*#ntradas.Columns..dd%56ro*eedor5- A;;- ?ori(ontal.lignment.Le"t&; ) *oid mostrar#ntradas%& try 8leD!Connection cnn 3 new 8leD!Connection%CnnStr&; cnn.8pen%&; 8leD!Command cmd 3 new 8leD!Command%&; cmd.Connection 3 cnn; cmd.CommandText 3 5select 0 "rom entradas5; 8leD!DataCeader dr 3 cmd.#xecuteCeader%&; int i 3 ;; l*#ntradas.'tems.Clear%&; wDile %dr.Cead%&& //mostramos los datos l*#ntradas.'tems..dd%drG5id+entrada5H.ToString%&&; l*#ntradas.'temsGiH.Su!'tems..dd%String.Format%5 ;$dd/MM/yyyy)5-drG5"ecDa+entrada5H&&; l*#ntradas.'temsGiH.Su!'tems..dd%String.Format%5 ;$dd/MM/yyyy)5drG5"ecDa+"actura5H&&; l*#ntradas.'temsGiH.Su!'tems..dd%drG5"olio+"actura5H.ToString%&&; l*#ntradas.'temsGiH.Su!'tems..dd%drG5pro*eedor5H.ToString%&&; i<<; ) dr.Close%&; cnn.Close%&; ) catcD %#xception ex&

Message9ox.SDow%ex.Message&; ) ) *oid mostrarCeporte%int prm'd#ntrada& try i" %SFile.#xists%reportFile&& Message9ox.SDow%String.Format%52o se encuentra =n ;)=nCe*ise por "a*or5- reportFile&&; return;

) //.?8C. M8STC.M8S #L C#68CT# 8leD!Connection cnn 3 new 8leD!Connection%CnnStr&; cnn.8pen%&; DataSet dsCeporte 3 new DataSet%&; 8leD!Data.dapter da 3 new 8leD!Data.dapter%5select d.0-a.articulo 5< 5 "rom entradas+detalle d-articulos a 5< 5 wDere a.id+articulo3d.id+articulo and id+entrada35< prm'd#ntrada <55- cnn&; da.Fill%dsCeporte- 5rptentrada5&; i" %dsCeporte.Ta!lesG5rpt#ntrada5H.Cows.Count 33 ;& cnn.Close%&; Message9ox.SDow%52o Day Datos5&; return;

Formularios."rm>erCeporte "rm 3 new Formularios."rm>erCeporte%&; "rm.report>iewer@.LocalCeport.DataSources.Clear%&; "rm.report>iewer@.LocalCeport.Dispose%&; "rm.report>iewer@.Ceset%&; "rm.report>iewer@.LocalCeport.DataSources..dd%new CeportDataSource%5dsCpt#ntrada5dsCeporte.Ta!lesG5rpt#ntrada5H&&; "rm.report>iewer@.LocalCeport.Ceport6atD 3 reportFile; //parametros ListFCeport6arameterQ param 3 new ListFCeport6arameterQ%&; 8leD!Command cmd 3 new 8leD!Command%5select 0 "rom entradas wDere id+entrada35 < prm'd#ntrada < 55- cnn&; 8leD!DataCeader dr 3 cmd.#xecuteCeader%&; wDile %dr.Cead%&& //"olio+"actura Ceport6arameter pFolioFactura 3 new Ceport6arameter%&; pFolioFactura.2ame 3 5prmFolioFactura5; pFolioFactura.>alues..dd%drG5"olio+"actura5H.ToString%&&; param..dd%pFolioFactura&; //"ecDa+entrada Ceport6arameter pFecDa#ntrada 3 new Ceport6arameter%&; pFecDa#ntrada.2ame 3 5prmFecDa#ntrada5; pFecDa#ntrada.>alues..dd%drG5"ecDa+entrada5H.ToString%&&; param..dd%pFecDa#ntrada&; //"ecDa+"actura Ceport6arameter pFecDaFactura 3 new Ceport6arameter%&; pFecDaFactura.2ame 3 5prmFecDaFactura5; pFecDaFactura.>alues..dd%drG5"ecDa+"actura5H.ToString%&&; param..dd%pFecDaFactura&; //pro*eedor Ceport6arameter p6ro*eedor 3 new Ceport6arameter%&; p6ro*eedor.2ame 3 5prm6ro*eedor5; p6ro*eedor.>alues..dd%drG5pro*eedor5H.ToString%&&; param..dd%p6ro*eedor&; ) dr.Close%&; //agregamos los parametros a la coleccion "rm.report>iewer@.LocalCeport.Set6arameters%param&; "rm.report>iewer@.Ce"resDCeport%&; "rm.SDowDialog%&; cnn.Close%&; ) catcD %#xception ex& Message9ox.SDow%ex.Message- 5#rror loading report5Message9ox9uttons.8J- Message9ox'con.#rror&;

) )

,"re"amos sl si"uiente cdi"o en el 0orm,3oad$

l*#ntradas.Dou!leClicP <3 new #*ent?andler%l*#ntradas+Dou!leClicP&; generaColumnas%&; mostrar#ntradas%&;

6ue"o. a"re"amos el si"uiente cdi"o$

*oid l*#ntradas+Dou!leClicP%o!,ect sender- #*ent.rgs e& i" %l*#ntradas.Selected'tems.Count S3 ;& int +Folio#ntrada 3 Con*ert.To'ntOA%l*#ntradas.Selected'temsG;H.Text&; mostrarCeporte%+Folio#ntrada&; ) )

l cdi"o para el botn btn.ue-a4

"rm#ntrada entrada 3 new "rm#ntrada%&; entrada.Start6osition 3 FormStart6osition.CenterScreen; entrada.SDowDialog%&;

l cdi"o para el botn btn1ostrar4 mostrar ntradas:;C l cdi"o para el botn btn/alir

tDis.Close%&;

,1ui un e9emplo de la pantalla (uncionando$

,1ui un e9emplo del reporte$

Salidas del ,lmacn

Diseo de la pantalla
mpezaremos dise3ando la pantalla de salidas :(ormulario (rmSalida;. la apariencia debe de 1uedar mas o menos as/$

, continuacion una tabla descripti)a con los nombres de los ob9etos$

Objeto

Propiedad Name

Valor lbl<ec%aSalida <ec%a Salida$ dtp<ec%aSalida Custom dd&55&yyyy lbl@esponsable @esponsable de la Salida$ t!t@esponsable lbl>d,rticulo ,rticulo$ t!t>d,rticulo lblCantidad Cantidad$ t!tCantidad btn,"re"ar ,"re"ar btn?rabar

6abel Te!t Name 8ateTimePic=er <ormat Custom<ormat Name 6abel Te!t Te!t4o! Name Name 6abel Te!t Te!t4o! Name Name 6abel Te!t Te!t4o! Name Name 4utton Te!t 4utton Name

Te!t Name 4utton Te!t Name <ull@o'Select 6istVie' ?rid6ines AideSelection

?rabar btnCancelar Cancelar l)Salida True True <alse

Programacin
6a parte de la pro"ramacin es la mas enredada. Voy a considerar 1ue el lector es un no)ato con nociones bastante b#sicas e insu(icientes como para comprender la estructura de la pro"ramacin C#. @ecomiendo al lector poner muc%a atencin a los pasos 1ue a1ui se describan y no omitir nada leer ! re"leer #asta $ue #a!a comprendido lo $ue tiene $ue #acer%

8eclaramos las si"uientes )ariables$

//>aria!les DataTa!le tmp#ntrada 3 new DataTa!le%&; string CnnStr 3 45 6ro*ider3Microso"t.7et.8L#D9.:.;; 5 < 5Data Source3D$==D8CS==tyrode*eloper==almacen.md!; 5 < 57et 8L#D9$Data!ase 6assword3; 6ersist Security 'n"o3False;5;

scribiremos el cdi"o de las (unciones y procedimientos$

*oid generaColumnas%& l*Salida.Clear%&; l*Salida.>iew 3 >iew.Details; l*Salida.Columns..dd%55- ;- ?ori(ontal.lignment.Le"t&; l*Salida.Columns..dd%5'd 5- @;;- ?ori(ontal.lignment.Le"t&; l*Salida.Columns..dd%56roducto5- A:;- ?ori(ontal.lignment.Le"t&; l*Salida.Columns..dd%5Cantidad5- B;- ?ori(ontal.lignment.CigDt&;

) *oid mostrar#ntrada%& try l*Salida.'tems.Clear%&; "or %int i 3 ;; i F tmp#ntrada.Cows.Count; i<<& l*Salida.'tems..dd%tmp#ntrada.CowsGiHG5id5H.ToString%&&; l*Salida.'temsGiH.Su!'tems..dd%tmp#ntrada.CowsGiHG5id+articulo5H.ToString%&&; l*Salida.'temsGiH.Su!'tems..dd%tmp#ntrada.CowsGiHG5articulo5H.ToString%&&; l*Salida.'temsGiH.Su!'tems..dd%String.Format%5 ;$2)5Con*ert.ToDou!le%tmp#ntrada.CowsGiHG5cantidad5H&&&; ) ) catcD %#xception ex& Message9ox.SDow%ex.Message- 5#rror5Message9ox9uttons.8J- Message9ox'con.#rror&; ) ) !ool agregar.rticulo%string prm'd.rticulo- dou!le prmCantidad& try string *ar'd 3 55; string *ar2om!re 3 55; dou!le *ar#xistencia 3 ;; 8leD!Connection cnn 3 new 8leD!Connection%CnnStr&; cnn.8pen%&; string strSKL 3 5select articulo-existencia "rom articulos 5 < 5wDere id+articulo3L5 < prm'd.rticulo < 5L5; 8leD!Command cmd 3 new 8leD!Command%strSKL- cnn&; 8leD!DataCeader dr 3 cmd.#xecuteCeader%&; i" %dr.Cead%&& *ar'd 3 prm'd.rticulo; *ar2om!re 3 drG5articulo5H.ToString%&; *ar#xistencia 3Con*ert.ToDou!le%drG5existencia5H&; i" %*ar#xistencia Q3 prmCantidad& //agregamos la *enta a la ta!la temporal DataCow row 3 tmp#ntrada.2ewCow%&; rowG5id+articulo5H 3 *ar'd; rowG5articulo5H 3 *ar2om!re; rowG5cantidad5H 3 prmCantidad; tmp#ntrada.Cows..dd%row&; ) else ) ) else Message9ox.SDow%5#l articulo no existe5- 5#rror5Message9ox9uttons.8J- Message9ox'con.#rror&; return %"alse&; ) dr.Close%&; cnn.Close%&; return %true&; ) catcD %#xception ex& Message9ox.SDow%ex.Message- 5#rror5- Message9ox9uttons.8JMessage9ox'con.#rror&; return %"alse&; ) ) !ool gra!arSalida%string prmFecDaSalida- string prmCesponsa!le- string prmMserLogin& try 8leD!Connection cnn 3 new 8leD!Connection%CnnStr&; cnn.8pen%&; 8leD!Transaction tran 3 cnn.9eginTransaction%&; Message9ox.SDow%52o Day su"icientes existencias5&;

8leD!Command cmd 3 new 8leD!Command%&; cmd.Connection 3 cnn; cmd.Transaction 3 tran; //insertamos el registro de la #ntrada try cmd.CommandText 3 5insert into salidas%"ecDa+salida-responsa!le-user+login& 5 < 5 *alues %N5 < prmFecDaSalida < 5N-L5 < prmCesponsa!le < 5L-L5 < prmMserLogin < 5L&5; cmd.#xecute2onKuery%&; //o!tenemos el "olio int +FolioSalida 3 ;; cmd.CommandText 3 5select 44identity5; +FolioSalida 3 Con*ert.To'ntOA%cmd.#xecuteScalar%&&; //insertamos el detalle de laentrada "or %int i 3 ;; i F tmp#ntrada.Cows.Count; i<<& string +'d.rticulo 3 Con*ert.ToString%tmp#ntrada.CowsGiHG5id+articulo5H&; dou!le +Cantidad 3 Con*ert.ToDou!le%tmp#ntrada.CowsGiHG5cantidad5H&; //insertamos el articulo cmd.CommandText 3 5insert into salidas+detalle%id+salida-id+articulo-cantidad& 5 5*alues%5 < +FolioSalida < 5-L5 < +'d.rticulo < 5L-5 < +Cantidad < cmd.#xecute2onKuery%&; //actuali(amosexistencias cmd.CommandText 3 5update articulos set 5 < 5 existencia3existencia I 5 < +Cantidad < 55 < 5 wDere id+articulo3L5 < +'d.rticulo < 5L5; cmd.#xecute2onKuery%&; ) //"inali(amos la transaccion tran.Commit%&; cnn.Close%&; Message9ox.SDow%5Salida gra!ada correctamente55'n"ormaci1n del Sistema5- Message9ox9uttons.8JMessage9ox'con.'n"ormation&; return %true&; ) catcD %8leD!#xception err#ntrada& tran.Coll!acP%&; cnn.Close%&; Message9ox.SDow%err#ntrada.Message&; return %"alse&; 5&5;

<

) ) catcD %#xception ex&

Message9ox.SDow%ex.Message- 5#rror5- Message9ox9uttons.8JMessage9ox'con.#rror&; return %"alse&; ) )

,%ora damos doble clic sobre el botn ,"re"ar :btn,"re"ar; y escribimos el si"uiente cdi"o$

try i" %agregar.rticulo%txt'd.rticulo.TextCon*ert.ToDou!le%txtCantidad.Text&&& mostrar#ntrada%&; ) catcD %#xception ex& )

Message9ox.SDow%ex.Message&; )

,%ora. a"re"aremos el cdi"o para "rabar la entrada. %acemos doble clic sobre el botn ?rabar :btn?rabar; y escribimos el si"uiente cdi"o$

i" %gra!arSalida%dtpFecDaSalida.>alue.ToSDortDateString%&txtCesponsa!le.Text- 5admin5&& ) tDis.Close%&;

l cdi"o 1ue pondremos en el <ormB6oad es el si"uiente$

//QDe"inimos la ta!la para las salida Temporal DataColumn idColumn 3 new DataColumn%5id5- typeo"%int&&; idColumn.Mnique 3 true; idColumn..uto'ncrement 3 true; idColumn..uto'ncrementSeed 3 @; idColumn..uto'ncrementStep 3 @; tmp#ntrada.Columns..dd%idColumn&; //declaramos el resto de los campos tmp#ntrada.Columns..dd%5id+articulo5- typeo"%string&&; tmp#ntrada.Columns..dd%5articulo5- typeo"%string&&; tmp#ntrada.Columns..dd%5cantidad5- typeo"%Dou!le&&; //agregamos un primary Pey tmp#ntrada.6rimaryJey 3 new DataColumnGH tmp#ntrada.ColumnsG5id5H ); //Ftermina la de"icinic1n de la ta!la temporal generaColumnas%&; mostrar#ntrada%&;

n el botn Salir :btnSalir; escribimos esto$

tDis.Close%&;

,1ui un e9emplo de la pantalla (uncionando$

@eporte de Salidas

Diseo de la pantalla
Para comenzar. le daremos dise3o al (ormulario 0(rmSalidas6ista0 el cual nos ser)ir# para mostrar un listado de las salidas 1ue se %ayan re"istrado. la apariencia debe de 1uedar mas o menos as/$

Se a"re"aron tres 4utton. un 6istVie' y un 6abel. las propiedades est#n descritas en la si"uiente tabla$ Objeto Propiedad Name 4utton Te!t Nue)a Valor btnNue)a

Name 4utton Te!t Name 4utton Te!t Name <ull@o'Select 6istVie' ?rid6ines AideSelection Name 6abel Te!t

btn5ostrar 5ostrar btnSalir Salir l)Salidas True True <alse lbl5ensa9e 8oble clic para imprimir.

,%ora procedemos con el dise3o del reporte de salidas. este proceso se muestra en la parte - de este tutorial. el cual deber# 1uedar mas o menos as/$

,%ora a"re"amos los si"uientes procedimientos$

*oid generaColumnas%& l*Salidas.Clear%&; l*Salidas.>iew 3 >iew.Details; l*Salidas.Columns..dd%5Folio 5- :;- ?ori(ontal.lignment.Le"t&; l*Salidas.Columns..dd%5FecDa Salida5- ER- ?ori(ontal.lignment.Le"t&; l*Salidas.Columns..dd%5Cesponsa!le5- A;;- ?ori(ontal.lignment.Le"t&; ) *oid mostrarSalidas%& try 8leD!Connection cnn 3 new 8leD!Connection%CnnStr&; cnn.8pen%&; 8leD!Command cmd 3 new 8leD!Command%&; cmd.Connection 3 cnn; cmd.CommandText 3 5select 0 "rom salidas5; 8leD!DataCeader dr 3 cmd.#xecuteCeader%&; int i 3 ;;

l*Salidas.'tems.Clear%&; wDile %dr.Cead%&& //mostramos los datos l*Salidas.'tems..dd%drG5id+salida5H.ToString%&&; l*Salidas.'temsGiH.Su!'tems..dd%String.Format%5 ;$dd/MM/yyyy)5drG5"ecDa+salida5H&&; l*Salidas.'temsGiH.Su!'tems..dd%drG5responsa!le5H.ToString%&&; i<<; ) dr.Close%&; cnn.Close%&; ) catcD %#xception ex& Message9ox.SDow%ex.Message&; ) ) *oid mostrarCeporte%int prm'dSalida& try i" %SFile.#xists%reportFile&& Message9ox.SDow%String.Format%52o se encuentra =n ;)=nCe*ise por "a*or5reportFile&&; return; ) //.?8C. M8STC.M8S #L C#68CT# 8leD!Connection cnn 3 new 8leD!Connection%CnnStr&; cnn.8pen%&; DataSet dsCeporte 3 new DataSet%&; 8leD!Data.dapter da 3 new 8leD!Data.dapter%5select d.0-a.articulo 5 < 5 "rom salidas+detalle d-articulos a 5 < 5 wDere a.id+articulo3d.id+articulo and id+salida35 < prm'dSalida < 55- cnn&; da.Fill%dsCeporte- 5rptSalida5&; i" %dsCeporte.Ta!lesG5rptSalida5H.Cows.Count 33 ;& cnn.Close%&; Message9ox.SDow%52o Day Datos5&; return; ) Formularios."rm>erCeporte "rm 3 new Formularios."rm>erCeporte%&; "rm.report>iewer@.LocalCeport.DataSources.Clear%&; "rm.report>iewer@.LocalCeport.Dispose%&; "rm.report>iewer@.Ceset%&; "rm.report>iewer@.LocalCeport.DataSources..dd%new CeportDataSource%5dsCptSalida5dsCeporte.Ta!lesG5rptSalida5H&&; "rm.report>iewer@.LocalCeport.Ceport6atD 3 reportFile; //parametros ListFCeport6arameterQ param 3 new ListFCeport6arameterQ%&; 8leD!Command cmd 3 new 8leD!Command%5select 0 "rom salidas wDere id+salida35 < prm'dSalida < 55- cnn&; 8leD!DataCeader dr 3 cmd.#xecuteCeader%&; wDile %dr.Cead%&& //"ecDa+salida Ceport6arameter pFecDa#ntrada 3 new Ceport6arameter%&; pFecDa#ntrada.2ame 3 5prmFecDaSalida5; pFecDa#ntrada.>alues..dd%drG5"ecDa+salida5H.ToString%&&; param..dd%pFecDa#ntrada&; //responsa!le Ceport6arameter p6ro*eedor 3 new Ceport6arameter%&; p6ro*eedor.2ame 3 5prmCesponsa!le5; p6ro*eedor.>alues..dd%drG5responsa!le5H.ToString%&&; param..dd%p6ro*eedor&; ) dr.Close%&; //agregamos los parametros a la coleccion "rm.report>iewer@.LocalCeport.Set6arameters%param&; "rm.report>iewer@.Ce"resDCeport%&; "rm.SDowDialog%&; cnn.Close%&; ) catcD %#xception ex& Message9ox.SDow%ex.Message- 5#rror al cargar el reporte5Message9ox9uttons.8J- Message9ox'con.#rror&; ) )

,"re"amos sl si"uiente cdi"o en el 0orm,3oad$

l*Salidas.Dou!leClicP <3 new #*ent?andler%l*Salidas+Dou!leClicP&; generaColumnas%&; mostrarSalidas%&;

6ue"o. a"re"amos el si"uiente cdi"o$

*oid l*Salidas+Dou!leClicP%o!,ect sender- #*ent.rgs e& i" %l*Salidas.Selected'tems.Count S3 ;& int +FolioSalida 3 Con*ert.To'ntOA%l*Salidas.Selected'temsG;H.Text&; mostrarCeporte%+FolioSalida&; ) )

l cdi"o para el botn btn.ue-a4

"rmSalida salida 3 new "rmSalida%&; salida.Start6osition 3 FormStart6osition.CenterScreen; salida.SDowDialog%&;

l cdi"o para el botn btn1ostrar4 mostrarSalidas:;C l cdi"o para el botn btn/alir

tDis.Close%&;

,1ui un e9emplo de la pantalla (uncionando$

,1ui un e9emplo del reporte$

Aasta este punto ya %emos desarrollado la (uncionalidad b#sica. n la si"uiente parte %aremos 1ue aparesca una pantalla pricipal desde la 1ue mandaremos llamar las 1ue %asta %oy %emos desarrollado.

Pantalla principal
6e daremos dise3o al (ormulario (rmPrincipal a"re"ando un 5enuStrip. un ToolStrip y estableciendo su pripiedad >s5diContainer D true para 1ue 1uede de la si"uiente manera$

, continuacin una tabla 1ue describe los ob9etos$ Objeto 5enuStrip Propiedad Name Name ToolStrip5enu>tem Te!t ToolStrip5enu>tem Name Te!t ,rc%i)o mnu,yuda ,yuda Valor mnuPrincipal mnu,rc%i)o

Name ToolStrip5enu>tem Te!t Name ToolStrip5enu>tem Te!t Name ToolStrip5enu>tem Te!t ToolStrip Name Name Te!t ToolStrip4utton 8isplayStyle Te!t>ma"e@elation >ma"e Name ToolStrip4utton Te!t 8isplayStyle Te!t>ma"e@elation >ma"e Name Te!t ToolStrip4utton 8isplayStyle Te!t>ma"e@elation >ma"e

mnu ntradas ntradas mnuSalidas Salidas mnuSalir Salir del Sistema barPrincipal btn ntradas ntradas >ma"e,ndTe!t >ma"e,bo)eTe!t :, su "usto; btnSalidas Salidas >ma"e,ndTe!t >ma"e,bo)eTe!t :, su "usto; btnSalir Salir >ma"e,ndTe!t >ma"e,bo)eTe!t :, su "usto;

,%ora crearemos los si"uientes procedimientos$

*oid entradas%& "rm#ntradasLista entradas 3 new "rm#ntradasLista%&; entradas.Mdi6arent 3 tDis;

entradas.SDow%&; ) *oid salidas%& "rmSalidasLista salidas 3 new "rmSalidasLista%&; salidas.Mdi6arent 3 tDis; salidas.SDow%&; ) *oid salir%& tDis.Close%&; )

,%ora solo resta poner el cdi"o en cada uno de los botones y men7s. los ponemos de uno por uno. dando doble clic sobre cada uno. iniciamos con mnu ntradas$ entradas:;C Se"uimos con mnuSalidas$ salidas:;C ,si lo %acemos tambin con los botones btn ntradas y btnSalidas ,%ora. el to1ue (inal de nuestra aplicacin. abrimos la clase >nicio,plicacion y nos ase"uramos 1ue est como se muestra a continuacin$

using System; using System.Windows.Forms; namespace almacen.Clases class 'nicio.plicacion /// FsummaryQ /// TDe main entry point "or tDe application. /// F/summaryQ GST.TDreadH static *oid Main%& .pplication.#na!le>isualStyles%&; .pplication.SetCompati!leTextCenderingDe"ault%"alse&;

.pplication.Cun%new Formularios.6rincipal%&&; ) ) )

,1ui un e9emplo de la pantalla (uncionando$

Aemos terminado este tutorial. espero 1ue les sea de utilidad... 8ios los 4endi"a

Você também pode gostar