Inicio | Anterior | Siguiente | Final |
Pantalla para cobrar e imprimir el ticket de venta
Tenemos un formulario llamado frmCobrar, nos centraremos en él para lograr nuestro objetivo.
Deberemos diseñarlo como se muestra:

Agregamos tres Label, tres TextBox y un Button. Según la siguiente tabla:

Para lograr que tome el tamaño adecuado, diseñar al gusto
En donde las directivas using, poner una más:
using System.Data.OleDb;
Localizamos el constructor, debe ser uno idéntico al que se muestra:
public frmCobrar()
{
InitializeComponent();
}
Nosotros agregaremos uno más:
public frmCobrar(int prmFolio){
InitializeComponent();
varFolio = prmFolio;
}
Justo debajo del constructor que acabamos de agregar, declaramos dos variables:
int varFolio=0;
double varTotal = 0;
Damos doble clic en el formulario y ponemos lo siguiente dentro del Form_Load:
//Form_Load
this.txtEfectivo.TextChanged +=
new EventHandler(txtEfectivo_TextChanged);
varTotal = fnCalculaPago(varFolio);
txtTotal.Text = String.Format("{0:C}", varTotal);
Inmediatamente después 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 línea que está marcada con negritas indica que se creará un procedimiento para cuando una tecla sea presionada si el TextBox tiene el foco.
También 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);
}
}
Hacemos soble clic sobre el botón (btnOk) y ponemos el siguiente código:
if (txtEfectivo.Text != ""){
DialogResult _Resp = new DialogResult();
_Resp = MessageBox.Show("¿Desea imprimir el ticket?",
"Ticket", MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (_Resp == DialogResult.Yes){
//Imprmmir el ticket
GenerarTicket(varFolio);
this.Close();
}
else{
this.Close();
}
}
else {
MessageBox.Show("Debe introducir una cantidad",
"Faltan datos");
}
Ahora cramos el procedimiento que nos mostrará el ticket de venta:
Ojo, para que este funcione deberemos haber hecho bién el ejercicio de la Dll.
private void GenerarTicket(int prmFOLIO) {
try{
string Ticket = "Nombre de la tienda: UAMCAV\n" +
"RFC:XXXXXX\n" +
"------------------------------\n" +
"ARTICULO CANT PRECIO TOTAL\n" +
"------------------------------\n";
string varSQL =
"SELECT LEFT(DESC_PRODUCTO,10) as DESC_PRODUCTO," +
" CANTIDAD,P_UNITARIO,TOTAL" +
" FROM vVENTAS WHERE FOLIO=" + prmFOLIO + "";
string DetalleTicket = "";
double varGranTotal = 0;
OleDbConnection cnnTicket =
new OleDbConnection(Class.clsMain.CnnStr);
cnnTicket.Open();
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
Disculpa, estoy llevando acabo el proyecto pero al momento de compilar en este paso, sale un error:
ResponderEliminarError 1 The type or namespace name 'mPrintDocument' could not be found (are you missing a using directive or an assembly reference?)
no tengo idea cual sea la razon ya que el paso anteriorlo lleve acabo ya 3 veces para agregar correctamente la referencia a el proyecto Ticket :S ojala me pudieras ayudar gracias.
Hey, disculpa pero a mi me pasa lo mismo en ese paso me sale lo siguiente
ResponderEliminarNo se puede encontrar el tipo o el nombre de espacio de nombres 'mPrintDocument'(¿falta una directiva using o una referencia de ensamblado?)
Te agradecería y me explicaras la solución...
Hay que poner como public la clase Ticket :)
ResponderEliminarA mi también me sale ese mensaje, amigo explica como hay que poner public la clase Ticket.
ResponderEliminarAgregué:
ResponderEliminar*Como pública la clase (public class mPrintDocument).
Agregué:
*using Ticket;
Pero no imprime.
No existe en la descripción de la base de datos una tabla vVENTAS :
"SELECT LEFT(DESC_PRODUCTO,10) as DESC_PRODUCTO," +
" CANTIDAD,P_UNITARIO,TOTAL" +
" FROM vVENTAS WHERE FOLIO=" + prmFOLIO + "";
Espero lo resuelvan.
alguien sabe como configurar el fnçLogin es que cuando quiero entrar a lo de usuarios para que me abra el mdiMain me dice que "no se han especificado valores para algunos parametros requeridos"
ResponderEliminarespero su ayuda
si using Ticket; se debe aregar al frmcobrar para que te compile correctamente bueno gracias mi correo es richardt_2000@hotmail.com y agradesco por el tutorial ........
ResponderEliminara mi en todos los formularios me sale este error
ResponderEliminarEl nombre 'Class' no existe en el contexto actual
donde se declaro esto o que porque me sale el error en todos los formularios???????????????????
REFERENCIA CIRCULAR
ResponderEliminar"SELECT LEFT(DESC_PRODUCTO,10) as DESC_PRODUCTO," +
" CANTIDAD,P_UNITARIO,TOTAL" +
" FROM vVENTAS WHERE FOLIO=" + prmFOLIO + "";
REFERENCIA CIRCULAR
ResponderEliminar"SELECT LEFT(DESC_PRODUCTO,10) as DESC_PRODUCTO," +
" CANTIDAD,P_UNITARIO,TOTAL" +
" FROM VENTAS WHERE FOLIO=" + prmFOLIO + "";
Si Tienen Este error: "Especified Cast Is Not Valid" en el metodo Generar_ticket El error esta en el tipo de datos q le tienen configurado a la columna p_unitario,Total ahi esta el error si es acceses pongan el tipo de dato a numero y si es en sql server como Float para que puedan imprimir el ticket.
ResponderEliminaresto me tenia investigando mucho porque ya tenia un mes y no podia imprimirlo saludos, cualquier cosa, escriban aqui sus preguntas y se las contesto. no soy el autor del tutorial soy un seguidor.
Muchas gracias!!!
ResponderEliminarAnimo a todos los demás, contesten las dudas que vayan surgiendo. Lamentablemente a mi no me es posible contestar todo pues tengo mucho trabajo
Saludos
Con lo que nos proporcionas es mas que suficiente tyrodeveloper.Muchas Gracias , Yo contesto sus dudas es bueno contribuir csaludos desde ITESI.
ResponderEliminarITESI rules
EliminarAgregué:
ResponderEliminar*Como pública la clase (public class mPrintDocument).
Agregué:
*using Ticket;
Pero no imprime.
No existe en la descripción de la base de datos una tabla vVENTAS :
"SELECT LEFT(DESC_PRODUCTO,10) as DESC_PRODUCTO," +
" CANTIDAD,P_UNITARIO,TOTAL" +
" FROM vVENTAS WHERE FOLIO=" + prmFOLIO + "";
Espero lo resuelvan.
SELECT DETALLE_VENTAS.FOLIO, DETALLE_VENTAS.ID_PRODUCTO, DETALLE_VENTAS.CANTIDAD, DETALLE_VENTAS.P_UNITARIO, DETALLE_VENTAS.IVA*DETALLE_VENTAS.P_UNITARIO AS IVA, DETALLE_VENTAS.CANTIDAD*DETALLE_VENTAS.P_UNITARIO AS TOTAL, CAT_PRODUCTOS.DESC_PRODUCTO, VENTAS.USER_NAME, LEFT(VENTAS.FECHA,10) AS FECHA
ResponderEliminarFROM VENTAS INNER JOIN (CAT_PRODUCTOS INNER JOIN DETALLE_VENTAS ON CAT_PRODUCTOS.ID_PRODUCTO=DETALLE_VENTAS.ID_PRODUCTO) ON VENTAS.FOLIO=DETALLE_VENTAS.FOLIO;
Usé este pedazo de código pero la factura solo me está imprimiendo los strings por defecto, no me imprime los tickets que se generan de las consultas, me puedes ayudar?
EliminarHola disculpa si me pueden ayudar tengo el mismo error.. Como coloco como public la clase ticket? agradeceria la ayuda..
ResponderEliminartambien tengo problemas con mPrintDocument, no se que hacer trate de realizar lo que mencionan mas arriba pero me fue imposible me decia que no tenia permisos para acceder a la clase algo así.. agradecería la ayuda nuevamente..
ResponderEliminaryo tambien tengo problemas y se que hice todo bien
ResponderEliminarme aparece el mismo error que a todos y cuando pongo using Ticket;
me aparece el error que dice que no es accesible debido a su nivel de proteccion favor si alguien me puede ayudar se lo agradeceria mucho
mi mail es alanderretche arroba gmail.com
tienes que poner publica la clase de mPrintDocument
Eliminarlo que debes hacer es ir al proyecto de ticket y abrir la clase mPrintDocument en esa localizas
namespace Ticket
{
class mPrintDocument
{
donde dice class debes de poner public class deberia quedar algo asi
namespace Ticket
{
public class mPrintDocument
{
tengo el mismo error alguien que pueda ayudar o que ya lo soluciono mi correo es max.power.idjcs@gmail.com
ResponderEliminarAlguien me podria facilitar la base de datos??
ResponderEliminarS_Juanito@outlook.com
Estimado
ResponderEliminarhas visto el problema de
Error 1 No se puede encontrar el tipo o el nombre de espacio de nombres 'mPrintDocument' (¿falta una directiva using o una referencia de ensamblado?)
es el unico inconveniente ocurrido hasta el momento
saludos
Hola quisiera saber como puedo agregar un codigo para poder hacer el corte de caja.
ResponderEliminargracias
hola hice todo el procedimiento paso por paso y el unico error que me marca es el siguiente Class.clsMain.CnnStr no existe en el contexto actual, quisiera que me diga que solucion haria y aparte que codigo lleva la clase setting. de antemano muchas gracias muy buen tutorial.. adjunto mi correo mart@live.com.mx
ResponderEliminarHola muy buen trabajo te felicito. Ahorita estoy atorado en la REFERENCIA CIRCULAR no he podido salir de ahi pero de todo lo demas ya quedo al 100.
ResponderEliminarAlguna pista para resolverla muchas gracias
string varSQL =
ResponderEliminar"SELECT LEFT(DESC_PRODUCTO,10) as DESC_PRODUCTO," +
" CANTIDAD,P_UNITARIO,TOTAL" +
" FROM vVENTAS WHERE FOLIO=" + prmFOLIO + "";
string DetalleTicket = "";
double varGranTotal = 0;
OleDbConnection cnnTicket =
new OleDbConnection(Class.clsMain.CnnStr);
cnnTicket.Open();
OleDbCommand cmdTicket =
new OleDbCommand(varSQL, cnnTicket);
OleDbDataReader drTicket;
drTicket = cmdTicket.ExecuteReader();
El SELECT me lanza un error de una referencia circular a DESC_PRODUCTO!