Crear Un Punto de Venta

Crear un punto de venta (1 de 10) Inicio Anterior Siguiente Final Pantalla de inicio de Sesión Creamos un proyecto de Wi

Views 23 Downloads 0 File size 1MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

  • Author / Uploaded
  • Ja Fa
Citation preview

Crear un punto de venta (1 de 10) Inicio Anterior Siguiente Final Pantalla de inicio de Sesión Creamos un proyecto de Windows con el nombre proTienda_MATRICULA. Después creamos una base de datos en Access, la cual deberá llamarse dbTienda_MATRICULA. Esta base de datos debemos ponerla en el directorio Debug de nuestro proyecto. El directorio Debug se encuentra dentro del Directorio Bin, el directorio Bin se encuentra en el directorio en donde creamos nuestro proyecto. En este ejemplo se utilizan imágenes y/o Iconos para darle una mejor presentación al proyecto. No es obligatorio utilizarlos, pero en caso de estar interesado en conseguirlos, puedes intentar descargarlos desde la página de “La Web del Programador”. Antes de realizar cualquier cosa, asegurémonos de organizar nuestro proyecto de la siguiente manera:

Organice su proyecto tal y cual se muestra en la figura, de esta manera evitaremos cometer errores en el momento de programar. Contenido: Diseño de la base de datos Diseño de las pantallas Programación Diseño de la base de datos:

Tenemos 10 tablas. Para la realización de este ejercicio solo utilizaremos la tabla USERS. Como esta es una clase de Lenguaje de programación, omitiremos al máximo las explicaciones relativas a Desarrollo de Base de datos. Solo se hace la aclaración que para los motivos educativos del presente curso, la base de datos aquí mostrada tiene el diseño óptimo.

Antes de continuar, agregamos una referencia a “System.configuration”:

Diseño de las pantallas: Agregamos una clase y dos formularios a nuestro proyecto, como se muestra enseguida:

El formulario Login (frmLogin), debe quedar como se muestra:

Le agregamos dos Labels, Dos TextBox y dos Button. Según la siguiente tabla:

OBJETO PROPEDAD VALOR Label Label TextBox TextBox Button Button Form

Name Name Name Name Name Name Name

lblUSER_NAME lblPASSWORD txtUSER_NAME txtPASSWORD btnOK btnCANCEL frmLogin

Programación: Antes quiero hacer la aclaración de que al formulario mdiMain no se le hará ningún diseño por el momento. Comenzaremos por escribir el código para frmLogin. Estructura del código: //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 Computación 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 } }

La sección de las directivas using, agregaremos la siguiente instrucción:

using System.Data; using System.Data.OleDb;

En la sección 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;

A continuación, en la sección Funciones y Procedimientos agregamos el siguiente código:

private bool fnLogin(string prmUSER_NAME, string prmPASSWORD) { bool Retorno = false; try { string varSQL = "SELECT USERS.USER_NAME, USERS.PATERNO, " + " USERS.MATERNO, USERS.NOMBRE, USERS.VENTAS, " + " USERS.ADMINISTRAR,USERS.REPORTES, " + " USERS.CATALOGOS, USERS.CONSULTAS, " + " USERS.DESHACER_VENTA " + " FROM USERS " + " WHERE USERS.USER_NAME='" + prmUSER_NAME + "' " + " AND USERS.USER_PASSWORD ='" + prmPASSWORD + "'"; OleDbConnection cnnLogin = new OleDbConnection(Class.clsMain.CnnStr); cnnLogin.Open(); OleDbCommand cmdLogin = new OleDbCommand(varSQL, cnnLogin); OleDbDataReader drLogin = cmdLogin.ExecuteReader(); while (drLogin.Read()) { Retorno = true; _USER_NAME = drLogin["USER_NAME"].ToString(); _PATERNO = drLogin["PATERNO"].ToString(); _MATERNO = drLogin["MATERNO"].ToString(); _NOMBRE = drLogin["NOMBRE"].ToString(); _VENTAS = Convert.ToBoolean(drLogin["VENTAS"]); _ADMINISTRAR = Convert.ToBoolean(drLogin["ADMINISTRAR"]); _REPORTES = Convert.ToBoolean(drLogin["REPORTES"]); _CATALOGOS = Convert.ToBoolean(drLogin["CATALOGOS"]); _CONSULTAS = Convert.ToBoolean(drLogin["CONSULTAS"]); _DESHACER_VENTA = Convert.ToBoolean(drLogin["DESHACER_VENTA"]); } drLogin.Close(); cnnLogin.Close(); cmdLogin.Dispose(); return (Retorno); } catch (Exception ex) { MessageBox.Show("fnLogin\n" + ex.Message, "Información del Sistema"); return (Retorno); } }

Hacemos doble click en el botón btnOK y agregamos el siguiente código:

_Logged = fnLogin(txtUSER_NAME.Text, txtPASSWORD.Text); if (Intentos >= 3) { _Logged = false; MessageBox.Show("Demasiados intentos", "Información del sistema"); this.Close(); } if (_Logged) this.Close();

Al botón btnCANCEL, le agregamos lo siguiente:

this.Close();

Ahora agregamos el código de clsMain, que debe quedar como se muestra:

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"+

" de datos no existe!", "Información del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error); } return (Retorno); } catch (Exception ex) { MessageBox.Show(ex.Message,"Información del Sistema", MessageBoxButtons.OK, MessageBoxIcon.Error); return (Retorno); } } } } }

Explicaciones sobre el código:

Generalizando.- Cuando un usuario intente ingresar a nuestra aplicación le aparecerá una pantalla de Login para que intruduzca un nombre de usuario y una contraseña. Solo tendrá 3 oportunidades para ingresar antes de que se cierre la aplicación. Si el usuario ingresa un nombre de usuario y contraseña correctos, entonces entrará al sistema y verá la pantalla principal de la aplicación. Detalladamente.- Lo que hace la aplicación es verificar que el usuario exista en la tabla USERS, si existe significa que puede iniciar sesión 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 aplicación se cerrará. Podemos observar que utilizamos las intrucciones try-catch-finally, estas nos ayudarán para que en el caso de que ocurra un error en nuestra aplicación mientras es ejecutada, no tengamos mayores problemas. Utilizamos la propiedad State de la conexión, esta nos ayuda a saber si la conexión está abierta o cerrara. La utilizamos para evitar el error de intentar abrir una conexión abierta o cerrar una conexión cerrada lo cual es ilógico. La función fnLogin recibe dos parametros (Usuario y Contraseña) y retorna un valor booleano (FalsoVerdadero). La utilizamos para organizar nuestro código de tal manera que al ejecutarse la función podamos saber: True: Puede iniciar sesión y se cargan los datos del usuario a las variables False: No puede iniciar sesión por error/desconocer al escribir su nombre de usuario y contraseña y se le cuenta un intento de acceso. Las variables public static, son variables globales y pueden ser leidas desde cualquier parte de la aplicación con escribir el nombre del objeto, un punto y el nombre de la variable. Por ejemplo, si queremos saber apellido paterno el usuario haríamos lo siguiente: string varPATERNO = Forms.frmLogin._PATERNO;

Crear un punto de venta (2 de 10) Inicio Anterior Siguiente Final Utilidad para configurar la conexión a la base de datos Continuamos con el proyecto proTienda_MATRICULA. Contenido: • Diseño de las pantallas • Programación Diseño de las pantallas:

La aplicación 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 realizarán posteriormente. El nuevo formulario (frmAppConfig), debe quedar como se muestra:

Le agregamos cinco Label, cinco TextBox y tres Button. Según la siguiente tabla:

Programación: Antes quiero hacer la aclaración de que al formulario mdiMain no se le hará ningún diseño por el momento. Comenzaremos por escribir el código para frmAppConfig. Estructura del código: //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 Computación 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 } }

En la sección Declaraciones, agregamos lo siguiente:

Hacemos doble clic al formulario y ponemos el siguiente código en el Form_Load: //Form_Load txtFileName.Text = ConfigurationManager.AppSettings["DataFile1"]; txtNombreNegocio.Text = ConfigurationManager.AppSettings["NombreNegocio"]; txtRFC.Text = ConfigurationManager.AppSettings["RFC"]; txtTelefono.Text = ConfigurationManager.AppSettings["Telefono"]; txtDireccionFiscal.Text = ConfigurationManager.AppSettings["DireccionFiscal"];

Hacemos doble click en el botón btnOK y agregamos el siguiente código: if (File.Exists(txtFileName.Text)) { System.Configuration.Configuration config = ConfigurationManager. OpenExeConfiguration(ConfigurationUserLevel.None); //Borramos la configuración actual config.AppSettings.Settings.Remove("DataFile1"); config.AppSettings.Settings.Remove("NombreNegocio"); config.AppSettings.Settings.Remove("RFC"); config.AppSettings.Settings.Remove("Telefono"); config.AppSettings.Settings.Remove("DireccionFiscal"); config.Save(ConfigurationSaveMode.Modified); //Force a reload of the changed section. ConfigurationManager.RefreshSection("appSettings"); //Grabamos la configuración nueva config.AppSettings.Settings.Add("DataFile1", txtFileName.Text); config.AppSettings.Settings.Add("NombreNegocio", txtNombreNegocio.Text); config.AppSettings.Settings.Add("RFC", txtRFC.Text); config.AppSettings.Settings.Add("Telefono", txtTelefono.Text); config.AppSettings.Settings.Add("DireccionFiscal", txtDireccionFiscal.Text); // Save the configuration file. config.Save(ConfigurationSaveMode.Modified); //Force a reload of the changed section. ConfigurationManager.RefreshSection("appSettings"); this.Close(); } else { MessageBox.Show("¡El archivo de Base de datos no existe!", "Información del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error); }

Al botón btnCancel, le agregamos lo siguiente: this.Close();

Al botón btnSearch, le ponemos el siguiente código: OpenFileDialog m_OpenFile = new OpenFileDialog(); m_OpenFile.Title = "Buscar Base de datos de Microsoft Access"; m_OpenFile.Filter =

"Todos los archivos(*.*)|*.*|Base de datos Access (*.mdb)|*.mdb"; m_OpenFile.FilterIndex = 2; if (m_OpenFile.ShowDialog() == DialogResult.OK) { txtFileName.Text = m_OpenFile.FileName.ToString(); } else { btnOK.Enabled = false; }

Después abrimos el formulario frmLogin y le agregamos una LinkLabel (lblDataBase), para que el formulario quede como se muestra:

Hacemos soble clic sobre lblDataBase y escribimos el siguiente código: Forms.frmAppConfig _frmAppConfig = new frmAppConfig(); _frmAppConfig.StartPosition = FormStartPosition.CenterScreen; _frmAppConfig.ShowDialog();

De esta manera, cuando se haga clic sobre la etiqueta, se abrirá frmAppConfig. Ahora editamos el código de clsMain, que debe quedar como se muestra (he marcado con negrita la porción de código que fue afectado): using System; using System.Configuration; using System.Windows.Forms; using System.IO; 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"+ " de datos no existe!", "Información del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error); } return (Retorno); } catch (Exception ex) { MessageBox.Show(ex.Message, "Información del Sistema", MessageBoxButtons.OK, MessageBoxIcon.Error); return (Retorno); } } } } }

Explicaciones sobre el código: Generalizando. Nuestra aplicación podrá leer la ruta de la base de datos en tiempo de ejecición. Esto nos da la gran posibilidad de poner nuestra aplicación en red. Esto nos ayudará a que la base de datos pueda estar localizada en cualquier parte de la Computadora o de la Red. Detalladamente. Tenemos un formulario en el cual podemos, mediante un archivo XML, editar la ruta en la cual se encuentra la Base de datos. Utilizamos objetos que nos permiten Explorar los archivos de windows; parecido a si fueramos a abrir un documento de cualquier aplicación de Microsoft Office. Utilizamos un Archivo XML el cual es perfectamente legible a nuestros ojos, editable con cualquier editor de texto y ligero en tamaño. Modificamos la variable CnnStr y la convertimos en Propiedad, eso nos da una posiblidad mayor en cuanto a lo que podemos realizar. La utilización de Propiedades (Properties) en lugar de Campos (Fields) o variables nos permite una mejor administración de código además de que nos acerca mas a la programación Orienntada a Objetos. De hecho, en estos momentos ya hemos realizado este tipo de desarrollo. Hemos creado la clase frmLogin, la cual nos proporciona varias de las características de la programación orientada a objetos.

También creamos la clase clsMain

Lo mejor es que antes de programar podamos hacer nuestros diagramas de clase para tener una visión mas clara de lo que tenemos que realizar. Para este proyecto ya me he adelantado en el análisis para que no tengamos que detenernos en esos aspectos. Se recomienda leer bibliografia sobre UML (Lenguaje Unificado de Modelado) para entender los diagramas.

Crear un punto de venta (3 de 10) Inicio Anterior Siguiente Final Pantalla para administrar los usuarios del sistema Continuamos con el proyecto proTienda_MATRICULA. Contenido: • Diseño de las pantallas • Programación Recordemos que en el primer ejercicio creamos un formulario para que los usuarios inicien sesión en la aplicación. En esta ocasión crearemos un formulario que nos permita administrar a los usuarios que tengan derecho a los recursos del sistema. Diseño de las Pantallas: Agregaremos un formulario al cual nombraremos frmUsers. A continuación agregaremos un ToolStrip al formulario recién creado, Etiquetas, Cajas de Texto y casillas de verificación como se muestra a continuación. El formulario frmUsers, deberá quedar como se muestra:

Según la información de la siguiente tabla:

Los botones del ToolStrip (barUsers), de izquierda a derecha:

Por un momento dejaremos este formulario para hacer algunas adecuaciones a mdiMain. Le agregaremos un MenuStrip para que quede como se muestra a continuación:

Según la información de la siguiente tabla:

Los menús del MenuStrip deberán ser como se muestra en la siguiente tabla:

Al menú mnuArchivo se le agregarán tres submenús, como se muestra en la siguiente imagen:

Según la información de la siguiente tabla:

Al menú mnuAdministrar se le agregará un submenú, como se muestra en la siguiente imagen:

Según la información de la siguiente tabla:

Programación: Empezamos con mdiMain. Hacemos sobre clic sobre el formulario y escribimos el siguiente código en el Form_Load: //Form_Load this.Text = "Módulo 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 código anterior se encarga de habilitar o deshabilitar los menús, siempre dependiendo de los permisos que tenga el usuario que inició sesión en el sistema. Hacemos doble clic sobre el submenú “Usuarios del sistema” (mnuUsuarios), accedemos a su código 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 código: this.Close();

Lo más interesante que hemos logrado hasta aquí es la parte de los permisos. Si recordamos lo que hicimos en frmLogin, en la función 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 fácil de lograr que los objetos compartan sus valores y lograr que interactuen entre ellos. Posteriormente podremos ver mejores muestras de interacción 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 código aquí expuesto. Mis disculpas a todos aquellos en quienes no he logrado hacer llegar la idea del código 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 código 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 realización de un simple punto de venta. Ahora seguiremos con frmUsers. El código aquí mostrado es simple aunque algo extenso. En la sección de las directivas: using System.Data.OleDb; using System.Data;

En la sección 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();

teclear el siguiente código, tal como se muestra: void frmUsers_Closing(object sender, System.ComponentModel.CancelEventArgs e){ try{ if (cnnUsers.State == ConnectionState.Open) cnnUsers.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } }

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();

Hasta aquí llegamos.

Crear un punto de venta (4 de 10) Inicio Anterior Siguiente Final

Creación de una Librería de Clases (Dll) El objetivo de este ejercicio es mostrar al alumno la manera de crear sus propias Librerías de Clases. Nos ubicamos en la parte en donde dice Solution „proTienda_MATRICULA‟ y con el botón derecho seleccionamos “Add>New Project...”

Creamos una librería de clase llamada Ticket:

Borramos la clase que nos ofrece por defecto:

Agregamos una nueva clase llamada mPrintDocument:

Antes de continuar, agregamos varias referencias al nuevo proyecto (utilizando el botón derecho del Mouse sobre “References”:

Una para System.Drawing

Y otra para System.Windows.Forms: Nuestro proyecto quedará así:

Nota: en la imagen se muestran algunos formularios que aun no se han realizado. Éstos se desarrollarán posteriormente. Agregamos las siguientes directivas using (únicamente si no están), 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 código } }

En la parte que dice “Aquí irá todo el código” poner lo siguiente: //Aqui irá todo el código /// /// Punto de entrada de la clase /// ///