Professional Documents
Culture Documents
Organice su proyecto tal y cual se muestra en la figura, de esta manera evitaremos cometer errores en el
momento de programar.
Contenido:
Diseo de la base de datos
Diseo de las pantallas
Programacin
Diseo de la base de datos:
Tenemos 10 tablas.
Para la realizacin de este ejercicio solo utilizaremos la tabla USERS.
Como esta es una clase de Lenguaje de programacin, omitiremos al mximo las explicaciones relativas
a Desarrollo de Base de datos. Solo se hace la aclaracin que para los motivos educativos del presente
curso, la base de datos aqu mostrada tiene el diseo ptimo.
Le agregamos dos Labels, Dos TextBox y dos Button. Segn la siguiente tabla:
Name
Name
Name
Name
Name
Name
Name
lblUSER_NAME
lblPASSWORD
txtUSER_NAME
txtPASSWORD
btnOK
btnCANCEL
frmLogin
Programacin:
Antes quiero hacer la aclaracin de que al formulario mdiMain no se le har ningn diseo por el
momento.
Comenzaremos por escribir el cdigo para frmLogin.
Estructura del cdigo:
//Directivas Using
using System;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
/* Comentarios:
* Programador: Lic. Juan Gabriel Castillo T.
* Carrera:
Licenciado en Computacin Administrativa
* Matricula:
9921868
* Fecha:
14 de Marzo del 2025
* Materia:
Lenguaje Visual
*/
namespace proTienda_9921868.Forms
{
public partial class frmLogin : Form
{
public frmLogin()
{
//Contructor por defecto
InitializeComponent();
}
//Declaraciones
private void frmLogin_Load(object sender, EventArgs e)
{
//Form_Load
}
//Funciones y procedimientos
}
}
using System.Data;
using System.Data.OleDb;
En la seccin Declaraciones, agregamos las siguientes variables (Algunas correspondientes a los campos
de la Tabla USERS):
//Declaraciones
int Intentos = 0;
public static bool _Logged = false;
public static string _USER_NAME = "";
public static string _PATERNO = "";
public static string _MATERNO = "";
public static string _NOMBRE = "";
public static bool _VENTAS = false;
public static bool _ADMINISTRAR = false;
public static bool _REPORTES = false;
public static bool _CATALOGOS = false;
public static bool _CONSULTAS = false;
public static bool _DESHACER_VENTA = false;
this.Close();
using System;
using System.Configuration;
using System.Windows.Forms;
using System.IO;
/* Comentarios:
* Programador: Lic. Juan Gabriel Castillo T.
* Carrera:
LCA
* Matricula:
9921868
* Fecha:
14 de Marzo del 2030
* Materia:
Lenguaje Visual
*/
namespace proTienda_9921868.Class{
class clsMain{
[STAThread]
static void Main()
{
Forms.frmLogin my_frmLogin = new Forms.frmLogin();
Application.Run(my_frmLogin);
if (Forms.frmLogin._Logged == true){
Forms.mdiMain my_mdiMain = new Forms.mdiMain();
Application.Run(my_mdiMain);
}
else{
Application.Exit();
}
}
public static string CnnStr {
get {
string Retorno = "";
string varFileName = "";
try{
varFileName =
ConfigurationManager.AppSettings["DataFile1"];
if (File.Exists(varFileName)){
Retorno =
"Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" +
varFileName + ";" +
"Persist Security Info=False";
}
else{
MessageBox.Show("El archivo de Base"+
Generalizando.- Cuando un usuario intente ingresar a nuestra aplicacin le aparecer una pantalla de
Login para que intruduzca un nombre de usuario y una contrasea. Solo tendr 3 oportunidades para
ingresar antes de que se cierre la aplicacin. Si el usuario ingresa un nombre de usuario y contrasea
correctos, entonces entrar al sistema y ver la pantalla principal de la aplicacin.
Detalladamente.- Lo que hace la aplicacin es verificar que el usuario exista en la tabla USERS, si existe
significa que puede iniciar sesin en el sistema, y se cargan sus permisos a las variables. Tendremos un
contador para verificar la cantidad de veces que el usuario inetenta ingresar, en el momento que exceda
la cantidad de intentos permitidos la aplicacin se cerrar.
Podemos observar que utilizamos las intrucciones try-catch-finally, estas nos ayudarn para que en el
caso de que ocurra un error en nuestra aplicacin mientras es ejecutada, no tengamos mayores
problemas.
Utilizamos la propiedad State de la conexin, esta nos ayuda a saber si la conexin est abierta o cerrara.
La utilizamos para evitar el error de intentar abrir una conexin abierta o cerrar una conexin cerrada lo
cual es ilgico.
La funcin fnLogin recibe dos parametros (Usuario y Contrasea) y retorna un valor booleano (FalsoVerdadero). La utilizamos para organizar nuestro cdigo de tal manera que al ejecutarse la funcin
podamos saber:
True: Puede iniciar sesin y se cargan los datos del usuario a las variables
False: No puede iniciar sesin por error/desconocer al escribir su nombre de usuario y contrasea y se le
cuenta un intento de acceso.
Las variables public static, son variables globales y pueden ser leidas desde cualquier parte de la
aplicacin con escribir el nombre del objeto, un punto y el nombre de la variable. Por ejemplo, si
queremos saber apellido paterno el usuario haramos lo siguiente:
string varPATERNO = Forms.frmLogin._PATERNO;
La aplicacin contaba ya con una clase y dos formularios, agregaremos un tercer formulario
(frmAppConfig) para que nuestro proyecto se organice as:
Nota: aqu se muestran otros formularios, los cuales debemos pasar por alto por el momento. Estos se
realizarn posteriormente.
El nuevo formulario (frmAppConfig), debe quedar como se muestra:
Le agregamos cinco Label, cinco TextBox y tres Button. Segn la siguiente tabla:
Programacin:
Antes quiero hacer la aclaracin de que al formulario mdiMain no se le har ningn diseo por el
momento.
Comenzaremos por escribir el cdigo para frmAppConfig.
Estructura del cdigo:
//Directivas Using
using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using System.IO;
/* Comentarios:
* Programador: Lic. Juan Gabriel Castillo T.
* Carrera:
Licenciado en Computacin Administrativa
* Matricula:
9921868
* Fecha:
15 de Marzo del 2025
* Materia:
Lenguaje Visual
*/
namespace proTienda_9921868.Forms
{
public partial class frmAppConfig : Form
{
public frmAppConfig()
{
//Contructor por defecto
InitializeComponent();
}
//Declaraciones
private void frmAppConfig_Load(object sender, EventArgs e)
{
//Form_Load
}
//Funciones y procedimientos
}
}
Despus abrimos el formulario frmLogin y le agregamos una LinkLabel (lblDataBase), para que el
formulario quede como se muestra:
varFileName + ";" +
"Persist Security Info=False";
}
else{
MessageBox.Show("El archivo de Base"+
" de datos no existe!",
"Informacin del sistema",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
return (Retorno);
}
catch (Exception ex) {
MessageBox.Show(ex.Message,
"Informacin del Sistema",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return (Retorno);
}
}
}
}
}
Lo mejor es que antes de programar podamos hacer nuestros diagramas de clase para tener una visin
mas clara de lo que tenemos que realizar. Para este proyecto ya me he adelantado en el anlisis para que
no tengamos que detenernos en esos aspectos. Se recomienda leer bibliografia sobre UML (Lenguaje
Unificado de Modelado) para entender los diagramas.
Por un momento dejaremos este formulario para hacer algunas adecuaciones a mdiMain. Le
agregaremos un MenuStrip para que quede como se muestra a continuacin:
Los mens del MenuStrip debern ser como se muestra en la siguiente tabla:
Programacin:
Empezamos con mdiMain. Hacemos sobre clic sobre el formulario y escribimos el siguiente cdigo en el
Form_Load:
//Form_Load
this.Text = "Mdulo de Control de Ventas, usuario: " +
frmLogin._NOMBRE + " " +
frmLogin._PATERNO + " " +
frmLogin._MATERNO;
mnuVentas.Enabled = frmLogin._VENTAS;
mnuAdministrar.Enabled = frmLogin._ADMINISTRAR;
mnuReportes.Enabled = frmLogin._REPORTES;
mnuConsultas.Enabled = frmLogin._CONSULTAS;
mnuCatalogos.Enabled = frmLogin._CATALOGOS;
El cdigo anterior se encarga de habilitar o deshabilitar los mens, siempre dependiendo de los permisos
que tenga el usuario que inici sesin en el sistema.
Hacemos doble clic sobre el submen Usuarios del sistema (mnuUsuarios), accedemos a su cdigo y le
ponemos el siguiente:
Forms.frmUsers _frmUsers = new frmUsers();
_frmUsers.MdiParent = this;
_frmUsers.StartPosition = FormStartPosition.Manual;
_frmUsers.Show();
Hacemos doble clic sobre el submen Salir del sistema (mnuSalir) para ponerle el siguiente cdigo:
this.Close();
Lo ms interesante que hemos logrado hasta aqu es la parte de los permisos. Si recordamos lo que
hicimos en frmLogin, en la funcin fnLogin, en la parte en donde le damos los valores para los permisos;
bueno, pues estos permisos se ven reflejados en esta pantalla. De esta manera podemos observar una
manera fcil de lograr que los objetos compartan sus valores y lograr que interactuen entre ellos.
Posteriormente podremos ver mejores muestras de interaccin entre los objetos, por ahora, puedo decir
que hemos aprendido a leer los valores contenidos en las variables public static.
Quiz para muchos es complicado comprender el cdigo aqu expuesto. Mis disculpas a todos aquellos
en quienes no he logrado hacer llegar la idea del cdigo que se presenta aqu. Ni el mas experto de los
programadores naci con el conocimiento, en algunas ocasiones nos vemos en la necesidad de practicar
con el cdigo de otros para poder salir adelante con el trabajo.
Me he dispuesto a preparar este tutorial para que se den cuenta todos los conocimientos que se requieren
para la realizacin de un simple punto de venta.
Ahora seguiremos con frmUsers. El cdigo aqu mostrado es simple aunque algo extenso. En la seccin
de las directivas:
using System.Data.OleDb;
using System.Data;
En la seccin de declaraciones:
//Las variables van aqui
static OleDbConnection cnnUsers;
static OleDbDataAdapter daUsers;
static OleDbCommandBuilder cbUsers;
DataSet dsUsers = new DataSet("dsUsers");
CurrencyManager cmUsers;
//Aqu el Form_Load
this.Closing +=
new System.ComponentModel.
CancelEventHandler(frmUsers_Closing);
cnnUsers = new OleDbConnection(Class.clsMain.CnnStr);
daUsers = new OleDbDataAdapter();
daUsers.SelectCommand = new OleDbCommand("SELECT *" +
" FROM USERS", cnnUsers);
cbUsers = new OleDbCommandBuilder(daUsers);
if (cnnUsers.State == ConnectionState.Open)
cnnUsers.Close();
cnnUsers.Open();
dsUsers.Clear();
daUsers.Fill(dsUsers, "USERS");
txtUSER_LOGIN.DataBindings.Add("Text", dsUsers,
"USERS.USER_NAME");
txtPASSWORD.DataBindings.Add("Text", dsUsers,
"USERS.USER_PASSWORD");
txtPATERNO.DataBindings.Add("Text", dsUsers,
"USERS.PATERNO");
txtMATERNO.DataBindings.Add("Text", dsUsers,
"USERS.MATERNO");
txtNOMBRE.DataBindings.Add("Text", dsUsers,
"USERS.NOMBRE");
chkADMINISTRAR.DataBindings.Add("Checked", dsUsers,
"USERS.ADMINISTRAR", false);
chkVENTAS.DataBindings.Add("Checked", dsUsers,
"USERS.VENTAS", true);
chkREPORTES.DataBindings.Add("Checked", dsUsers,
"USERS.REPORTES", true);
chkCATALOGOS.DataBindings.Add("Checked", dsUsers,
"USERS.CATALOGOS", true);
chkCONSULTAS.DataBindings.Add("Checked", dsUsers,
"USERS.CONSULTAS", true);
chkDESHACER_VENTA.DataBindings.Add("Checked", dsUsers,
"USERS.DESHACER_VENTA", true);
cmUsers = (CurrencyManager)this.BindingContext[dsUsers, "USERS"];
cnnUsers.Close();
En btnNuevo:
//Agregar un registro
cmUsers.AddNew();
En btnCancelar:
//Cancelar
cmUsers.CancelCurrentEdit();
En btnGrabar:
//Grabar
try{
cmUsers.EndCurrentEdit();
if (cnnUsers.State == ConnectionState.Open)
cnnUsers.Close();
cnnUsers.Open();
daUsers.Update(dsUsers, "USERS");
cnnUsers.Close();
}
catch (Exception ex) {
MessageBox.Show(ex.Message + "" + ex.StackTrace);
}
En btnEliminar:
//Eliminar
try{
DialogResult Resp = new DialogResult();
Resp = MessageBox.Show("Desea Eliminar al usuario?",
"Eliminar", MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (Resp == DialogResult.Yes)
{
cmUsers.RemoveAt(cmUsers.Position);
if (cnnUsers.State == ConnectionState.Open)
cnnUsers.Close();
cnnUsers.Open();
daUsers.Update(dsUsers, "USERS");
cnnUsers.Close();
}
}
catch (Exception ex){
MessageBox.Show(ex.Message);
}
Para btnInicio:
//Navegar al 1er registro
cmUsers.Position = 0;
Para btnAnterior:
//Navegar un registro hacia atraz
cmUsers.Position -= 1;
Para btnSiguiente:
//Navergar un registro hacia adelante
cmUsers.Position += 1;
Para btnFinal:
//Navegar al ltimo registro
cmUsers.Position =
cmUsers.Count - 1;
Para btnCerrar:
this.Close();
Antes de continuar, agregamos varias referencias al nuevo proyecto (utilizando el botn derecho del
Mouse sobre References:
Nota: en la imagen se muestran algunos formularios que aun no se han realizado. stos se desarrollarn
posteriormente.
Agregamos las siguientes directivas using (nicamente si no estn), para que quede mas o menos as:
using System.Drawing.Printing;
using System;
using System.Windows.Forms;
using System.Drawing;
namespace Ticket
{
class mPrintDocument
{
//Aqui ir todo el cdigo
}
}
Una vez terminado lo anterior, nos vamos donde dice proTienda_MATRICULA y, con el botn derecho
del mouse, seleccionamos Add Reference como se muestra a continuacin:
Le damos OK.
Nuestro proyecto, finalmente quedar as:
El objetivo principal de la Librera Ticket es poder mandar a la pantalla el ticket correspondiente a la venta,
pero en realidad se podr imprimir prcticamente cualquier texto. En el ejercicio 5 podremos comprobarlo.
Listo!!!!
Lo que vamos a hacer hoy es una pantalla que nos permita buscar productos, que los muestre en la
pantalla y que podamos ver la informacin que se tenga de ellos.
A partir de este momento programaremos para lograr que los objetos (Formularios, Clases, Dll)
interacten entre s. Por ejemplo, lograremos que al momento de generar un ticket de venta la pantalla en
la que se haga el cobro ya sepa la cantidad que se cobrar al cliente en base al folio que tenga el ticket.
Todo esto lo haremos en base a constructores.
Agregaremos varios formularios a nuestro proyecto para que quede como se muestra:
Le deberemos de agregar una Label, un TextBox, un Button y un ListView, segn la siguiente tabla:
Nos vamos directamente al cdigo y tecleamos lo siguiente en la seccin de las directivas using
(nicamente si no est la lnea):
using System.Data.OleDb;
Crearemos el siguiente procedimiento, el cual nos ayudar para poner columnas en el ListView:
private void Encabezados()
{
lvProductos.View = View.Details;
lvProductos.Columns.Add("Clave producto", 0,
HorizontalAlignment.Left);
lvProductos.Columns.Add("Descripcin", 250,
HorizontalAlignment.Left);
lvProductos.Columns.Add("Existencia", 90,
HorizontalAlignment.Right);
lvProductos.Columns.Add("Precio", 90,
HorizontalAlignment.Right);
}
Deber escribirse el cdigo tal y cual se muestra, ya que se tratan de procedimientos creados por
nosotros mismos.
Hacemos soble clic en el boton (btnBuscar) y le agregamos el siguiente cdigo:
ReadData(txtDESC_PRODUCTO.Text);
Justo debajo del constructor que acabamos de agregar, declaramos dos variables:
int varFolio=0;
double varTotal = 0;
Inmediatamente despus del Form_Load, creamos el siguiente procedimiento (Fuera del Form_Load):
void txtEfectivo_TextChanged(object sender, EventArgs e){
try{
txtCambio.Text = String.Format("{0:C}",
(Convert.ToDouble(txtEfectivo.Text) - varTotal));
}
catch (Exception ex){
txtCambio.Text = ex.Message;
}
}
La lnea que est marcada con negritas indica que se crear un procedimiento para cuando una tecla sea
presionada si el TextBox tiene el foco.
Tambin agregamos este otro procedimiento:
private double fnCalculaPago(int prmFolio) {
try {
OleDbConnection _cnnCalculaPago =
new OleDbConnection(Class.clsMain.CnnStr);
_cnnCalculaPago.Open();
OleDbCommand _cmdCalculaPago =
new OleDbCommand("SELECT SUM(CANTIDAD*P_UNITARIO) "+
"FROM DETALLE_VENTAS "+
"WHERE FOLIO="+ prmFolio +"", _cnnCalculaPago);
double _return =
Convert.ToDouble(_cmdCalculaPago.ExecuteScalar());
_cnnCalculaPago.Close();
_cnnCalculaPago.Dispose();
_cmdCalculaPago.Dispose();
return (_return);
}
catch (Exception ex) {
MessageBox.Show(ex.Message,"fnCalculaPago");
return (0);
}
}
OleDbCommand cmdTicket =
new OleDbCommand(varSQL, cnnTicket);
OleDbDataReader drTicket;
drTicket = cmdTicket.ExecuteReader();
while (drTicket.Read()){
DetalleTicket +=
drTicket["DESC_PRODUCTO"].ToString() + "
drTicket["CANTIDAD"].ToString() + "
" +
String.Format("{0:C}",
drTicket["P_UNITARIO"]) + "
" +
String.Format("{0:C}",
drTicket["TOTAL"]) + "\n";
varGranTotal += (double)drTicket["TOTAL"];
}
DetalleTicket +=
"------------------------------\n" +
"TOTAL: " + String.Format("{0:C}",
varGranTotal);
Ticket += DetalleTicket;
mPrintDocument _mPrintDocument =
new mPrintDocument(Ticket);
_mPrintDocument.PrintPreview();
" +
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
Listo,... por el momento solo debemos compilarlo para asegurarnos de que no tenga errores
Solo bastar buscar la ruta de la base de datos entre las ubicaciones de red disponibles y listo.
Cuando entramos, lo primero que vemos es lo siguiente:
Tiene varios mens los cuales nos llevan a diferentes opciones del sistema. Nos centraremos en el de
Ventas:
En este momento podemos ponerle otra cantidad para que, al presionar Enter:
Si elegimos Yes
Es una visin general de lo que lograremos una vez terminado este ejercicio.
Iniciemos de una vez
Vamos a intentar lograr lo imposible, intentaremos entender la mentalidad de un desarrollador profesional,
nos enredaremos la cabeza con cdigo avanzado que probablemente no entenderemos por ms que nos
expliquen. Solo vamos a centrar nuestra atencin en hacer las cosas al pi de la letra y os aseguro que
tendremos xito.
Disearemos frmVentas como se muestra a continuacin:
El cuarto botn solo es para dar una mejor vista, se pone debajo de los otros tres, para efectos prcticos
puede ser omitido.
Agregaremos un constructor, justo debajo del constructor que ofrece predeterminadamente:
public frmVentas(string prmUSER_LOGIN,int prmID_CAJA){
InitializeComponent();
varID_CAJA = prmID_CAJA;
varUSER_LOGIN = prmUSER_LOGIN;
}
La primera variable nos servir para saber el nombre con el que inici sesin el usuario, la segunda es
por que nuestro sistema podra soportar un indefinido nmero de cajas, claro que para este caso solo
ser una.
Ahora pondremos lo siguiente en el Form_Load:
//Form_Load
Headers();
ReadData(varUSER_LOGIN, varID_CAJA);
this.txtCANTIDAD.KeyPress +=
new System.Windows.Forms.
KeyPressEventHandler(this.txtCANTIDAD_KeyPress);
this.txtCANTIDAD.KeyDown +=
new System.Windows.Forms.
KeyEventHandler(this.txtCANTIDAD_KeyDown);
this.txtID_PRODUCTO.KeyPress +=
new System.Windows.Forms.
KeyPressEventHandler(this.txtID_PRODUCTO_KeyPress);
this.txtID_PRODUCTO.KeyDown +=
new System.Windows.Forms.
KeyEventHandler(this.txtID_PRODUCTO_KeyDown);
El cdigo anterior nos sirve para mandar llamar varios procedimientos que son importantes al momento
de que sea llamado el formulario. Claro que es necesario lo siguiente para que lo anterior tenga sentido:
void Headers()
{
//Encabezados del litView
lvVenta.View = View.Details;
lvVenta.Columns.Add("Producto", 100,
HorizontalAlignment.Left);
lvVenta.Columns.Add("Descripcion", 250,
HorizontalAlignment.Left);
lvVenta.Columns.Add("Cant", 75,
HorizontalAlignment.Right);
lvVenta.Columns.Add("Prec", 75,
HorizontalAlignment.Right);
lvVenta.Columns.Add("Iva", 75,
HorizontalAlignment.Right);
lvVenta.Columns.Add("Total", 100,
HorizontalAlignment.Right);
}
El cdigo anterior acta dependiendo del objeto del que se trate. Por ejemplo los que dicen KeyPress,
controlan el momento en que es presionada una tebla sobre el objeto, lo mismo ocurre con KeyDown,
solo que en este caso se trata de teclas especiales como las teclas F1-F12.
void SaveTemp_Ventas(string prmID_PRODUCTO,double prmCANTIDAD) {
double[] varProductDetails = new double[1];
varProductDetails =
FindProductDetails(prmID_PRODUCTO);
double varPRECIO = varProductDetails[0];
try {
if (varPRECIO ==0.0) {
lblMensaje.Text =
"El producto no existe!!!";
}
else {
Temp_Ventas(varUSER_LOGIN , varID_CAJA ,
prmID_PRODUCTO , prmCANTIDAD, varPRECIO);
ReadData(varUSER_LOGIN , varID_CAJA );
}
}
catch (Exception ex) {
MessageBox.Show(ex.Message, "Error");
}
}
drReadData.Close();
cmdReadData.Dispose();
cnnReadData.Close();
cnnReadData.Dispose();
txtGRAND_TOTAL.Text =
String.Format("{0:C}",
varGRAND_TOTAL);
txtIVA.Text =
String.Format("{0:C}", varIVA);
}
catch (Exception ex) {
MessageBox.Show (ex.Message);
}
}
void Temp_Ventas(string prmUSER_LOGIN,int prmID_CAJA,
string prmID_PRODUCTO,double prmCANTIDAD,
double prmPRECIO) {
//Para cargar la venta tenporal
string varSQL = "";
try {
OleDbConnection cnnTempVentas =
new OleDbConnection(Class.clsMain.CnnStr);
if (GetSale(prmUSER_LOGIN, prmID_CAJA,
prmID_PRODUCTO) == 0){
varSQL = "INSERT INTO TEMP_VENTAS(USER_NAME,"+
"ID_PRODUCTO,CANTIDAD,P_UNITARIO,IVA)" +
" VALUES('" + prmUSER_LOGIN + "','" +
prmID_PRODUCTO +
"'," + prmCANTIDAD + "," +
prmPRECIO + ",0)";
}
else {
varSQL = "UPDATE TEMP_VENTAS "+
"SET CANTIDAD = CANTIDAD + "+
prmCANTIDAD +"" +
" WHERE USER_NAME = '"+
prmUSER_LOGIN +"'" +
" AND ID_PRODUCTO = '"+
prmID_PRODUCTO +"'";
}
OleDbCommand cmdTempVentas =
new OleDbCommand(varSQL, cnnTempVentas);
if (cnnTempVentas.State == ConnectionState.Open)
cnnTempVentas.Close();
cnnTempVentas.Open();
cmdTempVentas.ExecuteNonQuery();
cnnTempVentas.Close();
cmdTempVentas.Dispose();
cnnTempVentas.Dispose();
txtID_PRODUCTO.Text = "";
txtCANTIDAD.Text = "1";
}
catch(Exception ex) {
MessageBox.Show(ex.Message,"TempVentas");
}
}
double[] FindProductDetails(string prmID_PRODUCTO){
double[] Retorno = new double[2];
try {
OleDbConnection cnnFindProductDetails =
new OleDbConnection(Class.clsMain.CnnStr);
string varSQL = "SELECT count(*) "+
"FROM CAT_PRODUCTOS "+
"WHERE ID_PRODUCTO = '" +
prmID_PRODUCTO + "'";
OleDbCommand cmdFindProductDetails =
new OleDbCommand();
cmdFindProductDetails.Connection =
cnnFindProductDetails;
cmdFindProductDetails.CommandText = varSQL;
if (cnnFindProductDetails.State == ConnectionState.Open)
cnnFindProductDetails.Close();
cnnFindProductDetails.Open();
if (!(Convert.ToInt32(cmdFindProductDetails.ExecuteScalar()) == 0)) {
varSQL = "SELECT P_U_VENTA "+
" FROM CAT_PRODUCTOS "+
"WHERE ID_PRODUCTO ='" +
prmID_PRODUCTO + "'";
cmdFindProductDetails.CommandText = varSQL;
Retorno[0] = Convert.
ToDouble(cmdFindProductDetails.ExecuteScalar());
varSQL = "SELECT IVA "+
"FROM CAT_PRODUCTOS "+
"WHERE ID_PRODUCTO ='" +
prmID_PRODUCTO + "'";
cmdFindProductDetails.CommandText = varSQL;
Retorno[1] = Convert.
ToDouble(cmdFindProductDetails.ExecuteScalar());
}
else {
Retorno[0] = 0.0;
Retorno[1] = 0.0;
}
cmdFindProductDetails.Dispose();
cnnFindProductDetails.Close();
cnnFindProductDetails.Dispose();
return (Retorno);
}
catch (Exception ex) {
MessageBox.Show(ex.Message,
"FindProductDetails");
return (Retorno);
}
}
double GetSale(string prmUSER_LOGIN,int prmID_CAJA,
string prmID_PRODUCTO){
//Para cargar la venta tenporal
double Retorno;
try {
OleDbConnection cnnGetSale =
new OleDbConnection(Class.clsMain.CnnStr);
string varSQL = "SELECT COUNT(*) FROM TEMP_VENTAS " +
" WHERE USER_NAME = '"+ prmUSER_LOGIN +"' " +
" AND ID_PRODUCTO = '"+ prmID_PRODUCTO +"'";
OleDbCommand cmdGetSale =
new OleDbCommand(varSQL, cnnGetSale);
if (cnnGetSale.State == ConnectionState.Open)
cnnGetSale.Close();
cnnGetSale.Open();
Retorno = Convert.
ToDouble(cmdGetSale.ExecuteScalar());
cmdGetSale.Dispose();
cnnGetSale.Close();
cnnGetSale.Dispose();
return (Retorno);
}
catch (Exception ex){
MessageBox.Show(ex.Message,"GetSale");
return (0);
}
}
private void RealizaVenta() {
if (lvVenta.Items.Count != 0)
{
int varFolio = RealizaVenta(varUSER_LOGIN, varID_CAJA);
if (varFolio != 0)
{
frmCobrar _frmCobrar = new frmCobrar(varFolio);
_frmCobrar.StartPosition = FormStartPosition.CenterScreen;
_frmCobrar.ShowDialog();
}
}
}
Para btnCerrar:
this.Close();
Vamos a suponer que todo lo anterior lo hemos hecho bien; lo que resta es poner en mdiMain el cdigo
correspondiente para mandar llamar al formulario de las ventas. Para conseguirlo deberemos hacer lo
siguiente:
Hacemos doble clic sobre el men Punto de venta:
Nota: Es importante que el equipo en donde vayas a copiar los archivos est instalado el .Net Framework
correspondiente.