Crear un punto de venta (7 de 10)

InicioAnteriorSiguienteFinal

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

28 comentarios:

  1. Disculpa, estoy llevando acabo el proyecto pero al momento de compilar en este paso, sale un error:

    Error 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.

    ResponderEliminar
  2. Hey, disculpa pero a mi me pasa lo mismo en ese paso me sale lo siguiente

    No 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...

    ResponderEliminar
  3. Hay que poner como public la clase Ticket :)

    ResponderEliminar
  4. A mi también me sale ese mensaje, amigo explica como hay que poner public la clase Ticket.

    ResponderEliminar
  5. Agregué:
    *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.

    ResponderEliminar
  6. 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"

    espero su ayuda

    ResponderEliminar
  7. 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 ........

    ResponderEliminar
  8. a mi en todos los formularios me sale este error

    El nombre 'Class' no existe en el contexto actual

    donde se declaro esto o que porque me sale el error en todos los formularios???????????????????

    ResponderEliminar
  9. REFERENCIA CIRCULAR
    "SELECT LEFT(DESC_PRODUCTO,10) as DESC_PRODUCTO," +
    " CANTIDAD,P_UNITARIO,TOTAL" +
    " FROM vVENTAS WHERE FOLIO=" + prmFOLIO + "";

    ResponderEliminar
  10. REFERENCIA CIRCULAR
    "SELECT LEFT(DESC_PRODUCTO,10) as DESC_PRODUCTO," +
    " CANTIDAD,P_UNITARIO,TOTAL" +
    " FROM VENTAS WHERE FOLIO=" + prmFOLIO + "";

    ResponderEliminar
  11. 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.
    esto 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.

    ResponderEliminar
  12. Muchas gracias!!!

    Animo 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

    ResponderEliminar
  13. Con lo que nos proporcionas es mas que suficiente tyrodeveloper.Muchas Gracias , Yo contesto sus dudas es bueno contribuir csaludos desde ITESI.

    ResponderEliminar
  14. Agregué:
    *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.

    ResponderEliminar
  15. 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
    FROM VENTAS INNER JOIN (CAT_PRODUCTOS INNER JOIN DETALLE_VENTAS ON CAT_PRODUCTOS.ID_PRODUCTO=DETALLE_VENTAS.ID_PRODUCTO) ON VENTAS.FOLIO=DETALLE_VENTAS.FOLIO;

    ResponderEliminar
    Respuestas
    1. 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?

      Eliminar
  16. Hola disculpa si me pueden ayudar tengo el mismo error.. Como coloco como public la clase ticket? agradeceria la ayuda..

    ResponderEliminar
  17. tambien 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..

    ResponderEliminar
  18. yo tambien tengo problemas y se que hice todo bien
    me 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

    ResponderEliminar
    Respuestas
    1. tienes que poner publica la clase de mPrintDocument
      lo 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
      {

      Eliminar
  19. tengo el mismo error alguien que pueda ayudar o que ya lo soluciono mi correo es max.power.idjcs@gmail.com

    ResponderEliminar
  20. Alguien me podria facilitar la base de datos??

    S_Juanito@outlook.com

    ResponderEliminar
  21. Estimado

    has 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

    ResponderEliminar
  22. Hola quisiera saber como puedo agregar un codigo para poder hacer el corte de caja.
    gracias

    ResponderEliminar
  23. 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

    ResponderEliminar
  24. Hola 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.
    Alguna pista para resolverla muchas gracias

    ResponderEliminar
  25. 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();

    El SELECT me lanza un error de una referencia circular a DESC_PRODUCTO!

    ResponderEliminar