Crear Un Punto de Venta Con ASP

download Crear Un Punto de Venta Con ASP

of 40

Transcript of Crear Un Punto de Venta Con ASP

Crear un punto de venta con ASP.NET y SQL Server (Parte 1)Diseo de la base de datosSer una base de datos relacional, llamada pventa, muy bsica, con la siguiente estructura:

Y el script para crear labase de datos seria:USE [pventa]GO/****** Object: Table [dbo].[users] Script Date: 09/08/2011 17:27:43 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[users]( [user_login] [nvarchar](50) NOT NULL, [user_password] [nvarchar](250) NULL, [nombre] [nvarchar](150) NULL, [activo] [bit] NOT NULL, [ventas] [bit] NOT NULL, [reportes] [bit] NOT NULL, [administrar] [bit] NOT NULL, [fecha_registro] [datetime] NOT NULL, CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED ( [user_login] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]GO/****** Object: Table [dbo].[unidad_medida] Script Date: 09/08/2011 17:27:43 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[unidad_medida]( [id_unidad_medida] [smallint] NOT NULL, [unidad_medida] [nvarchar](150) NULL, CONSTRAINT [PK_unidad_medida] PRIMARY KEY CLUSTERED ( [id_unidad_medida] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]GO/****** Object: Table [dbo].[productos] Script Date: 09/08/2011 17:27:43 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[productos]( [id_producto] [nvarchar](50) NOT NULL, [producto] [nvarchar](250) NULL, [id_unidad_medida] [smallint] NULL, [p_compra] [float] NULL, [p_venta] [float] NULL, [existencia] [float] NULL, CONSTRAINT [PK_productos] PRIMARY KEY CLUSTERED ( [id_producto] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]GO/****** Object: Table [dbo].[venta] Script Date: 09/08/2011 17:27:43 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[venta]( [id_venta] [int] IDENTITY(1,1) NOT NULL, [fecha_registro] [datetime] NOT NULL, [user_login] [nvarchar](50) NOT NULL, CONSTRAINT [PK_venta] PRIMARY KEY CLUSTERED ( [id_venta] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]GO/****** Object: Table [dbo].[venta_detalle_tmp] Script Date: 09/08/2011 17:27:43 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[venta_detalle_tmp]( [id_venta_detalle_tmp] [int] IDENTITY(1,1) NOT NULL, [id_producto] [nvarchar](50) NOT NULL, [cantidad] [float] NOT NULL, [user_login] [nvarchar](50) NOT NULL, [p_venta] [float] NOT NULL, CONSTRAINT [PK_venta_detalle_tmp] PRIMARY KEY CLUSTERED ( [id_venta_detalle_tmp] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]GO/****** Object: Table [dbo].[venta_detalle] Script Date: 09/08/2011 17:27:43 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[venta_detalle]( [id_venta_detalle] [int] IDENTITY(1,1) NOT NULL, [id_venta] [int] NOT NULL, [id_producto] [nvarchar](50) NOT NULL, [cantidad] [float] NOT NULL, [p_venta] [float] NOT NULL, CONSTRAINT [PK_venta_detalle] PRIMARY KEY CLUSTERED ( [id_venta_detalle] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]GO/****** Object: Default [DF_users_fecha_registro] Script Date: 09/08/2011 17:27:43 ******/ALTER TABLE [dbo].[users] ADD CONSTRAINT [DF_users_fecha_registro] DEFAULT (getdate()) FOR [fecha_registro]GO/****** Object: Default [DF_venta_fecha_registro] Script Date: 09/08/2011 17:27:43 ******/ALTER TABLE [dbo].[venta] ADD CONSTRAINT [DF_venta_fecha_registro] DEFAULT (getdate()) FOR [fecha_registro]GO/****** Object: ForeignKey [FK_productos_unidad_medida] Script Date: 09/08/2011 17:27:43 ******/ALTER TABLE [dbo].[productos] WITH CHECK ADD CONSTRAINT [FK_productos_unidad_medida] FOREIGN KEY([id_unidad_medida])REFERENCES [dbo].[unidad_medida] ([id_unidad_medida])GOALTER TABLE [dbo].[productos] CHECK CONSTRAINT [FK_productos_unidad_medida]GO/****** Object: ForeignKey [FK_venta_users] Script Date: 09/08/2011 17:27:43 ******/ALTER TABLE [dbo].[venta] WITH CHECK ADD CONSTRAINT [FK_venta_users] FOREIGN KEY([user_login])REFERENCES [dbo].[users] ([user_login])GOALTER TABLE [dbo].[venta] CHECK CONSTRAINT [FK_venta_users]GO/****** Object: ForeignKey [FK_venta_detalle_productos] Script Date: 09/08/2011 17:27:43 ******/ALTER TABLE [dbo].[venta_detalle] WITH CHECK ADD CONSTRAINT [FK_venta_detalle_productos] FOREIGN KEY([id_producto])REFERENCES [dbo].[productos] ([id_producto])GOALTER TABLE [dbo].[venta_detalle] CHECK CONSTRAINT [FK_venta_detalle_productos]GO/****** Object: ForeignKey [FK_venta_detalle_venta] Script Date: 09/08/2011 17:27:43 ******/ALTER TABLE [dbo].[venta_detalle] WITH CHECK ADD CONSTRAINT [FK_venta_detalle_venta] FOREIGN KEY([id_venta])REFERENCES [dbo].[venta] ([id_venta])GOALTER TABLE [dbo].[venta_detalle] CHECK CONSTRAINT [FK_venta_detalle_venta]GO/****** Object: ForeignKey [FK_venta_detalle_tmp_productos] Script Date: 09/08/2011 17:27:43 ******/ALTER TABLE [dbo].[venta_detalle_tmp] WITH CHECK ADD CONSTRAINT [FK_venta_detalle_tmp_productos] FOREIGN KEY([id_producto])REFERENCES [dbo].[productos] ([id_producto])GOALTER TABLE [dbo].[venta_detalle_tmp] CHECK CONSTRAINT [FK_venta_detalle_tmp_productos]GO/****** Object: ForeignKey [FK_venta_detalle_tmp_users] Script Date: 09/08/2011 17:27:43 ******/ALTER TABLE [dbo].[venta_detalle_tmp] WITH CHECK ADD CONSTRAINT [FK_venta_detalle_tmp_users] FOREIGN KEY([user_login])REFERENCES [dbo].[users] ([user_login])GOALTER TABLE [dbo].[venta_detalle_tmp] CHECK CONSTRAINT [FK_venta_detalle_tmp_users]GOCreamos elproyecto:

En la imagen se muestran las opciones que debemos seleccionar.Se mostrar el explorador de soluciones como se muestra en la imagen:Nuestro proyecto est vaco, por ahora crearemos varios objetos que describimos a continuacin.Creacin de la Pgina Maestra (main.master)

Modificamos el cdigo HTMLpara que quede asi:

Punto de Venta Web

SISTEMA PUNTO DE VENTA

  • Inicio
  • Cerrar Sesin


DESARROLLADO POR TYRODEVELOPER

Luego agregamos la pgina principal (default.aspx)

El cdigo HTML quedara:

VENTAS

Para ejecutar nuestro sistema, nos vamos presionamos la combinacin de teclas Windows + R, y se muestra la siguiente pantalla:Y al ejecutarlo, se ver lo siguiente en el explorador de Internet:Ahora le daremos un poco de formaAgregamos un documento CSS, como se muestra:

Al nuevo elemento le agregamos el siguiente cdigo:body { font-family:Verdana}img{ border:0px;}#menuh { font: 80% "Trebuchet MS", Arial, Helvetica, sans-serif; margin-top: 20px;}

#menuh ul, li { list-style-type: none;}

#menuh ul { margin: 0; padding: 0;}

#menuh li { float: left;}

#menuh a { text-decoration: none; color: #3366CC; background: #F0F7FC; display: block; padding: 3px 10px; text-align: center; border: 1px solid #ACCFE8; border-width: 1px 1px 1px 0;}

Luego, arrastramos el archivo a la pgina maestra, as:

Si ejecutamos de nuevo el sistema, se vera as:Nuestro sistema ya va agarrando fuerza.Pantalla de Inicio de Sesin (login.aspx)

Ahora, tenemos que agregar un registro a la base de datos, en la tabla users:

Agregamos una nueva pgina llamada login.aspx

Aqu debemos poner un poco de atencin, porque hay que empezar a programar, debemos tener abierto SQL Server Management Studio porque escribiremos procedimientos almacenados al mismo tiempo que programamos.Este es el cdigo HTML de login.aspx

Iniciar Sesin

Inicio de Sesin Usuario: * Contrasea:

Creamos un procedimiento almacenado en SQL Server:USE pventaGOIF EXISTS (SELECT 1 FROM sys.objects WHERE name='proc_USER_LOGIN) DROP PROCEDURE proc_USER_LOGINGOCREATE PROCEDURE [dbo].[proc_USER_LOGIN] @USER_LOGIN NVARCHAR(50), @USER_PASSWORD NVARCHAR(1000) WITH ENCRYPTIONAS DECLARE @FECHA_LIMITE DATETIME, @DIA NVARCHAR(2), @MES NVARCHAR(2), @ANO NVARCHAR(4) ---FECHA--- SET @DIA=CAST(DAY(GETDATE()) AS NVARCHAR(2)) SET @MES=CAST(MONTH(GETDATE()) AS NVARCHAR(2)) SET @ANO=CAST(YEAR(GETDATE()) AS NVARCHAR(4)) IF LEN(@DIA) = 1 SET @DIA='0+@DIA IF LEN(@MES) = 1 SET @MES='0+@MES ---TERMINA FECHA--- SET @FECHA_LIMITE='20161231--LIMITE 31 dic 2016 IF(GETDATE()>@FECHA_LIMITE) GOTO ERROR SELECT U.nombre FROM USERS U WHERE U.[USER_LOGIN]=@USER_LOGIN AND USER_PASSWORD=@USER_PASSWORD AND U.ACTIVO=1RETURNERROR: RAISERROR('
ERROR DE INICIO DE SESIN, CADUCO SU PERIODO DE PRUEBA
,16,1) GOTO FINRETURNFIN:GOLuego, en login.aspx.csModificamos las directivas using,para que queden asi:using System;using System.Data;using System.Data.SqlClient;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.Security;Agregamos el siguiente codigo (OJO, SI SE COLOCA MAL, HABR ERRORES):private bool fnLogin(string prmUserLogin, string prmPassword){ bool _return = false; try { SqlConnection cnnLogin = new SqlConnection(clsMain.CnnStr); cnnLogin.Open(); string varSQL = "EXECUTE proc_USER_LOGIN @USER_LOGIN, @USER_PASSWORD"; SqlCommand cmdLogin = new SqlCommand(varSQL, cnnLogin); SqlParameter paramUserLogin = cmdLogin. Parameters.Add("@USER_LOGIN", SqlDbType.NVarChar, 50); paramUserLogin.Value = prmUserLogin; SqlParameter paramPassword = cmdLogin. Parameters.Add("@USER_PASSWORD", SqlDbType.NVarChar, 50); paramPassword.Value = prmPassword; SqlDataReader drLogin = cmdLogin.ExecuteReader();

if (drLogin.Read()) { Session.Add("USER_NAME", drLogin["nombre"].ToString()); _return = true; } else{ lblMensaje.Text = "Nombre de usuario o contrasea incorrectos"; _return = false; } drLogin.Close(); cnnLogin.Close(); return (_return); } catch (Exception ex) { lblMensaje.Text = ex.Message; return (false); }}protected void btnSubmit_Click(object sender, EventArgs e){ lblMensaje.Text = ""; if (fnLogin(txtUSER_LOGIN.Text,txtPASSWORD.Text)) { //correcto FormsAuthentication. RedirectFromLoginPage(txtUSER_LOGIN.Text, chkPersist.Checked); }}Hasta aqu todo debe ir bien, solamente que es necesario agregar cdigo adicional.Luego, agregamos la carpeta App_Code, de la siguiente manera:

Y agregamos una clase llamada clsMain, asi:

Y le ponemos el siguiente cdigo a clsMain.cs:using System;using System.Configuration;

/// /// Clase Main/// public class clsMain{ public clsMain(){} /// /// Regresa la cadena de conexin /// public static string CnnStr { get { return (ConfigurationManager. ConnectionStrings["dbCnnStr"]. ConnectionString); } } /// /// Lee el archivo de configuracin /// ///

Poner especial atencin a la llaveConnectionStringsya que en esa seccin deben poner la configuracin de su SQL Server.Ahora agregaremos el cdigo para cerrar la sesin, nos vamos a la pgina main.master.cs y agregamos el siguiente cdigo:protected void btnCerrarSesion_Click(object sender, EventArgs e){ FormsAuthentication.SignOut(); Response.Redirect("default.aspx");}Ahora, si ejecutamos de nuevo el sistema, se mostrar la pgina de Login:De acuerdo a los datos que introdujimos a la tabla usersNombre de usuario: adminContrasea: adminLuego, al introducir un nombre de usuario y contrasea correctos, veremos la siguiente pantalla:Y al dar clic al botn Cerrar sesin el sistema nos regresa a lapantalla de Login.Lo que haremos a continuacin ser el diseo de los permisos, es decir, dependiendo de los permisos que tenga el usuario que inici sesin, sern las opciones que podr ver en el menu.

Crear un punto de venta con ASP.NET y SQL Server (Parte 2)Permisos de la aplicacinUna vez llegada a esta parte, nuestro sistema ya nos exige un nombre de usuario y una contrasea. Lo que sigue ahora es que cuando iniciemos sesin, el sistema nos muestre las opciones a las que el usuario tiene acceso. Modificaremos el cdigo HTML de la pginamail.mastery el cdigo C# de la pginamain.master.csEn la pgina main.master ubicamos el objetolblOpcionesel cual tiene el siguiente cdigo:

Lo modificaremos para que quede:

Le hemos agregado"{ventas}{reportes}{administrar}", haremos unReplacede cdigo HTML como se muestra en seguida.Ahora vamos al cdigo C# del archivomain.master.csy escribiremos el siguiente cdigo:void Permisos(string prmUSER_LOGIN){ try{ SqlConnection cnn = new SqlConnection(clsMain.CnnStr); cnn.Open(); SqlCommand cmd = new SqlCommand("EXECUTE [proc_USERS_PERMISOS_MOSTRAR]'" + prmUSER_LOGIN + "'", cnn); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()){ if (Convert.ToBoolean(dr["ADMINISTRAR"])){ lblOpciones.Text = lblOpciones.Text.Replace("{administrar}"," administrar.aspx\">Administrar"); } else{ lblOpciones.Text = lblOpciones.Text.Replace("{administrar}", ""); } if (Convert.ToBoolean(dr["REPORTES"])){ lblOpciones.Text = lblOpciones.Text.Replace("{reportes}", " reportes.aspx\">Reportes"); } else{ lblOpciones.Text = lblOpciones.Text.Replace("{reportes}", ""); } if (Convert.ToBoolean(dr["VENTAS"])){ lblOpciones.Text = lblOpciones.Text.Replace("{ventas}", " ventas.aspx\">Ventas"); } else { lblOpciones.Text = lblOpciones.Text.Replace("{ventas}", ""); } } dr.Close(); cmd.Dispose(); cnn.Close(); cnn.Dispose(); } catch (Exception ex){ lblOpciones.Text = ex.Message; }}Luego creamos el siguiente procedimiento almacenado:USE [pventa]GO

/****** Object: StoredProcedure [dbo].[proc_USERS_PERMISOS_MOSTRAR] Script Date: 09/17/2011 23:10:05 ******/SET ANSI_NULLS ONGO

SET QUOTED_IDENTIFIER ONGO

CREATE PROCEDURE [dbo].[proc_USERS_PERMISOS_MOSTRAR] @USER_LOGIN NVARCHAR(50)ASSELECT U.* FROM USERS U WHERE U.[USER_LOGIN]=@USER_LOGIN

GO

Despus modificamos elPage_Loadpara que quede as:protected void Page_Load(object sender, EventArgs e){ try { Permisos(Context.User.Identity.Name); } catch (Exception ex) { lblOpciones.Text = ex.Message; }}Ahora ejecutamos de nuevo a aplicacin, y al iniciar sesin veremos la siguiente pantalla:Podemos ver como se aplican los permisos. Crea varios usuarios en el SQL Server y ponles diferentes permisos para que veas el efecto que tiene en la pantalla.

Crear un punto de venta con ASP.NET y SQL Server (Parte 3)Pantalla de VentasAgregamos un nuevo WebForm, llamadoventas.aspxcomo se muestra:

Le daremos el siguiente diseo:

El cdigo HTML para lograr ese diseo:

Punto de Venta Web //NO SALIR de esta pantalla window.history.forward(1); //Solo numeros var nav4 = window.Event ? true : false; function acceptNum(evt) { // NOTE: Backspace = 8, Enter = 13, '0' = 48, '9' = 57, '.' = 46 var key = nav4 ? evt.which : evt.keyCode; return (key = 48 && key