En esta ocasión voy a explicar cómo imprimir una factura en formato de Ticket que se hace muy diferente como hicimos la de tamaño carta con DataReport.
Colabora y Suscribete a mi canal de
Antes de llegar a la programación de esta factura debemos agregar algo a la ventana de Configuración y es lo siguiente:
Necesitamos decirle al software que no imprima con una impresora normal sino con una impresora de Ticket para eso agregamos un checkbox a la ventana de configuración.
Ese checkbox tiene por nombre ChkImpresoraTicket
Después de esto agregamos las lineas para que guarde en el archivo INI
Si se nota usamos también una variable global llamada glob_conf_ImpresoraTikets esta variable la agregamos al modulo mod_Conexion junto con las otras variables que ya tenemos hay.
Luego de esto ya estamos listos para comenzar a crear el procedimiento para generar la factura de ticket.
Nos vamos al modulo Mod_Impresiones que es donde tenemos la otra función para Imprimir:
Creamos dos procedimientos y una función:
ImprimirFactura_Ticket, Encabezado_Ticket y AgregarEspacios
El primero va a tener lo siguiente:
Function AgregarEspacios(NumEsp) As String Dim Espacios As String For I = 1 To NumEsp Espacios = Espacios & " " Next I AgregarEspacios = Espacios End Function
La funciona anterior va agregar espacios dependiendo de la cantidad que le indiquemos en el parámetro NumEsp esta funciona la usaremos en el siguiente procedimiento:
Sub Encabezado_Ticket() '------ Espaciado Superior Printer.Print "" Printer.Print "" Printer.Print "" Printer.Print "" Printer.Print "" Printer.Print "" '--- - Ajustes ---- FontSizeTitulo = 11 espaciosTitulo = 15 negritaTitulo = True espacioNit = 23 FontSizeNit = 9 espacioPropietarop = 10 FontSizePropietarop = 9 espacioTelefono = 10 FontSizeTelefono = 9 espacioDireccion = 13 FontSizeDireccion = 9 '--- - fin Ajustes ---- If negritaTitulo = True Then Printer.FontBold = False Printer.FontSize = FontSizeTitulo Printer.Print AgregarEspacios(espaciosTitulo) & Glo_NombreEmpresa '------ Nit If negritaTitulo = True Then Printer.FontBold = False Printer.FontSize = FontSizeNit Printer.Print AgregarEspacios(espacioNit) & "Nit. " & Glo_NitEmpresa '------ Propietario Printer.FontSize = FontSizePropietarop Printer.Print AgregarEspacios(espacioPropietarop) & Glo_PropietarioEmpresa '------ Telefonos Printer.FontSize = FontSizeTelefono Printer.Print AgregarEspacios(espacioTelefono) & "Telefono(s) " & Glo_TelefonoEmpresa '------ Telefonos Printer.FontSize = FontSizeDireccion Printer.Print AgregarEspacios(espacioDireccion) & Glo_DireccionEmpresa End Sub
Este procedimiento lo vamos a usar para varias cosas a medida que continuemos con el curso por ejemplo para los recibos de pagos que llevan el mismo escabezado.
Para imprimir la factura se usa la función Printer.Print que lo que hace es imprimir una linea de texto que se le señala entre comillas ejemplo si quiero imprimir un texto cualquier en la impresora lo hago de la siguiente manera:
Printer.Print "Luis Fernando Martinez" Printer.EndDoc 'Finaliza y envía la impresión
Lo anterior si lo prueba imprime sin ningún problema en la impresora.
Explico varias cosas para que el condigo de Encabezado quede claro:
Printer.FontBold = False (es para poner negrita al texto)
Printer.FontSize = 10 (Determina el tamaño del texto )
para el titulo tengo un condicional el cual determina si el titulo va estar en negrita o no:
If negritaTitulo = True Then Printer.FontBold = False Printer.FontSize = FontSizeTitulo Printer.Print AgregarEspacios(espaciosTitulo) & Glo_NombreEmpresa
En el código anterior estoy poniendo Negrita y de Tamaño 11 (Si miras la variable arriba) luego agrego los espacios con la función AgregarEspacios y luego pongo el nombre de la empresa que ya tenemos guardado en una variable Global.
¿Porque agregar espacios? Pues para centrar el o ubicar mejor un texto si el nombre de la empresa es corto entonces debo agregar mas espacios para que me quede centrado.
El resto de las lineas es igual se le asigna el tamaño del texto y los espacios que lleva.
Y el ultimo procedimiento:
Sub ImprimirFactura_Ticket(N_factura) Dim RecorsetFactura As New ADODB.RecordSet Dim RecosetEncaFact As New ADODB.RecordSet FontSizeEncab = 9 Glo_Num_CajaRegistradora = "Caja Principal" TextoAceptacion = "Aceptación del Cliente" EspaTotalFac = 20 LenNombrPro = 25 'Tamaño del campo nombre del producto EspaPro1 = 0 EspaPro2 = 10 EspaPro3 = 5 EspaPro4 = 10 EspaPro5 = 23 'Espacio titulos detalle factura espacioEnca1 = 0 espacioEnca2 = 3 espacioEnca3 = 4 espacioEnca4 = 4 espacioTd1 = "" espacioTd2 = "" espacioTd3 = "" espacioTd4 = "" For I = 1 To espacioEnca1 espacioTd1 = espacioTd1 & " " Next I For I = 1 To espacioEnca2 espacioTd2 = espacioTd2 & " " Next I For I = 1 To espacioEnca3 espacioTd3 = espacioTd3 & " " Next I For I = 1 To espacioEnca4 espacioTd4 = espacioTd4 & " " Next I TextoTiket1 = "Cod" TextoTiket2 = "Descrip" TextoTiket3 = "Cat" TextoTiket4 = "Valor" TextoTiket5 = "P Total" LineaDivi = "--------------------------------------------------" MensajePersonalizado = " * * * * GRACIAS POR SU COMPRA * * * * " Printer.ScaleMode = 6 'milimetros Printer.ScaleWidth = 58 'Se selecciona la impresora para imprimir For Each prThis In Printers '\\ If the desired one is found If prThis.DeviceName = glob_conf_ImpreFacturacion Then Set Printer = prThis '\\ Stop searching Exit For End If Next prThis 'Datos de la Factura Sql = "Select * From tblVentas as v, tblClientes Where v.IdCliente = tblClientes.IdCliente and v.Num_Factura = " & N_factura Set RecosetEncaFact = ConexionADO.Execute(Sql) If RecosetEncaFact.RecordCount > 0 Then TipoFactura = "Contado" DiasFactura = RecosetEncaFact("Dias") If RecosetEncaFact("TipoFact") <> 0 Then TipoFactura = "Crédito" End If NombreApellidos_cli = RecosetEncaFact("NombreApellidos_cli") Identificacion_cli = RecosetEncaFact("Identificacion_cli") Telefonos_cli = RecosetEncaFact("Telefonos_cli") Direccion_cli = RecosetEncaFact("Direccion_cli") FechaHora = RecosetEncaFact("FechaHora") CampoEfectivo = RecosetEncaFact("Efectivo") CampoCambio = RecosetEncaFact("Cambio") End If Sql = "SELECT tblProductos.CodigoPro, tblProductos.NombrePro, tblDetalle_Venta.Cantidad_dv, tblDetalle_Venta.P_Venta_dv, tblProductos.Impuesto, tblDetalle_Venta.Descuento_dv " _ & " FROM tblProductos INNER JOIN tblDetalle_Venta ON tblProductos.IdProducto = tblDetalle_Venta.IdProducto WHERE tblDetalle_Venta.Num_Factura = " & N_factura Set RecorsetFactura = ConexionADO.Execute(Sql) Call Encabezado_Ticket '------ Espaciado Superior Printer.Print "" Printer.Print "" Printer.Print "" Printer.FontSize = FontSizeEncab Printer.Print "FACTURA DE VENTA No. " & N_factura Printer.Print "TERMINO: " & TipoFactura Printer.Print "CLIENTE: " & Mid(NombreApellidos_cli, 1, 21) Printer.Print "NIT : " & Identificacion_cli Printer.Print "TELÉFONO : " & Telefonos_cli Printer.Print "DIRECCIÓN : " & Direccion_cli Printer.Print "SISTEMA P.O.S: " Printer.Print "FECHA: "; FechaHora Printer.Print "CAJA No: " & Glo_Num_CajaRegistradora Printer.Print LineaDivi '----------------- Detalle de La Factura Printer.FontBold = True Printer.Print espacioTd1 & TextoTiket1 & espacioTd2 & TextoTiket2 & espacioTd3 & TextoTiket3 & espacioTd4 & TextoTiket4 & espacioTd4 & TextoTiket5 Printer.FontBold = False Printer.Print LineaDivi TotalFactura = 0 SubtotalPro = 0 SumaImpuesto = 0 SumDescuento = 0 Do While Not RecorsetFactura.EOF SubtotalPro = 0 Codigo = RecorsetFactura("CodigoPro") If Len(Codigo) > 6 Then Codigo = Mid(Codigo, Len(Codigo) - 5, 6) End If Nombre = RecorsetFactura("NombrePro") Impuesto = RecorsetFactura("Impuesto") Cantidad = RecorsetFactura("Cantidad_dv") Precio = Format(RecorsetFactura("P_Venta_dv"), "currency") DescuentoP = RecorsetFactura("Descuento_dv") SumDescuento = SumDescuento + DescuentoP SubtotalPro = (RecorsetFactura("Cantidad_dv") * RecorsetFactura("P_Venta_dv")) - DescuentoP TotalFactura = TotalFactura + SubtotalPro ImpuestoCal = (Impuesto / 100) + 1 BaseComp = SubtotalPro / ImpuestoCal ImpPro = SubtotalPro - BaseComp SumaImpuesto = SumaImpuesto + ImpPro mtImpuesto = "" If Impuesto > 0 Then mtImpuesto = Impuesto End If 'primera linea Printer.Print _ Tab(EspaPro1); Left(Codigo, 6); _ Tab(EspaPro2); Left(Nombre, LenNombrPro) & Chr(13); 'segunda linea Printer.Print _ Tab(EspaPro3); Cantidad; _ Tab(EspaPro4); Precio; _ Tab(EspaPro5); Format(SubtotalPro, "currency") & " " & mtImpuesto & Chr(13) RecorsetFactura.MoveNext Loop Subtotal = TotalFactura - SumaImpuesto + SumDescuento Printer.Print LineaDivi Printer.Print "SUBTOTAL"; Tab(EspaTotalFac); Format(Subtotal, "currency") Printer.Print LineaDivi Printer.Print "DESCUENTO"; Tab(EspaTotalFac); Format(SumDescuento, "currency") Printer.FontBold = True Printer.Print "TOTAL"; Tab(EspaTotalFac - 1); Format(TotalFactura, "currency") Printer.FontBold = False Printer.Print "EFECTIVO"; Tab(EspaTotalFac); Format(CampoEfectivo, "currency") Printer.Print "CAMBIO"; Tab(EspaTotalFac); Format(CampoCambio, "currency") Printer.Print LineaDivi Printer.Print " " Printer.Print " " Printer.Print "FORMA DE PAGO: "; Tab(22); TipoFactura & ", Dias " & DiasFactura If TipoFactura = "Crédito" Then Printer.Print " " Printer.Print Tab(15); "--------------------------------" Printer.Print Tab(16); TextoAceptacion End If Printer.Print " " Printer.Print " " Printer.Print MensajePersonalizado Printer.Print " " Printer.Print " " Printer.EndDoc 'Finaliza y envia la impresion End Sub
Explicando el código:
La primera parte donde definimos las variables:
FontSizeEncab = 9 Glo_Num_CajaRegistradora = "Caja Principal" TextoAceptacion = "Aceptación del Cliente" EspaTotalFac = 20 LenNombrPro = 25 'Tamaño del campo nombre del producto EspaPro1 = 0 EspaPro2 = 10 EspaPro3 = 5 EspaPro4 = 10 EspaPro5 = 23 'Espacio titulos detalle factura espacioEnca1 = 0 espacioEnca2 = 3 espacioEnca3 = 4 espacioEnca4 = 4 espacioTd1 = "" espacioTd2 = "" espacioTd3 = "" espacioTd4 = "" For I = 1 To espacioEnca1 espacioTd1 = espacioTd1 & " " Next I For I = 1 To espacioEnca2 espacioTd2 = espacioTd2 & " " Next I For I = 1 To espacioEnca3 espacioTd3 = espacioTd3 & " " Next I For I = 1 To espacioEnca4 espacioTd4 = espacioTd4 & " " Next I TextoTiket1 = "Cod" TextoTiket2 = "Descrip" TextoTiket3 = "Cat" TextoTiket4 = "Valor" TextoTiket5 = "P Total" LineaDivi = "--------------------------------------------------" MensajePersonalizado = " * * * * GRACIAS POR SU COMPRA * * * * "
Para estas variables luego crearemos una ventana para que podamos modificarlas a nuestro gusto y guardar esos cambios en un archivo .INF de esa manera no importa si el tamaño del papel es diferente lo podemos cambiar sin problema.
Estas variables definen los espacios y nombre de los títulos de la factura.
Printer.ScaleMode = 6 'milimetros Printer.ScaleWidth = 58
Con estos datos le decimos a Visual Basic en que escala y que tamaño de Papel (Supuestamente) tendrá donde se va a imprimir.
'Se selecciona la impresora para imprimir For Each prThis In Printers '\\ If the desired one is found If prThis.DeviceName = glob_conf_ImpreFacturacion Then Set Printer = prThis '\\ Stop searching Exit For End If Next prThis
En esta parte se define con que impresora se va a imprimir recuerde que en la lección anterior definimos con que impresora se imprimiría la factura y la usamos en este código, se recorren todas las impresoras instaladas y se selecciona. Con esto no importa que la impresora de ticken no este predeterminada este código define la impresora.
'Datos de la Factura Sql = "Select * From tblVentas as v, tblClientes Where v.IdCliente = tblClientes.IdCliente and v.Num_Factura = " & N_factura Set RecosetEncaFact = ConexionADO.Execute(Sql) If RecosetEncaFact.RecordCount > 0 Then TipoFactura = "Contado" DiasFactura = RecosetEncaFact("Dias") If RecosetEncaFact("TipoFact") <> 0 Then TipoFactura = "Crédito" End If NombreApellidos_cli = RecosetEncaFact("NombreApellidos_cli") Identificacion_cli = RecosetEncaFact("Identificacion_cli") Telefonos_cli = RecosetEncaFact("Telefonos_cli") Direccion_cli = RecosetEncaFact("Direccion_cli") FechaHora = RecosetEncaFact("FechaHora") CampoEfectivo = RecosetEncaFact("Efectivo") CampoCambio = RecosetEncaFact("Cambio") End If Sql = "SELECT tblProductos.CodigoPro, tblProductos.NombrePro, tblDetalle_Venta.Cantidad_dv, tblDetalle_Venta.P_Venta_dv, tblProductos.Impuesto, tblDetalle_Venta.Descuento_dv " _ & " FROM tblProductos INNER JOIN tblDetalle_Venta ON tblProductos.IdProducto = tblDetalle_Venta.IdProducto WHERE tblDetalle_Venta.Num_Factura = " & N_factura Set RecorsetFactura = ConexionADO.Execute(Sql)
Ya estos código los usamos para la factura de Carta con estos obtenemos todos los datos de la factura seleccionada.
Call Encabezado_Ticket
Se agrega el Encabezado a la Factura
'------ Espaciado Superior Printer.Print "" Printer.Print "" Printer.Print "" Printer.FontSize = FontSizeEncab Printer.Print "FACTURA DE VENTA No. " & N_factura Printer.Print "TERMINO: " & TipoFactura Printer.Print "CLIENTE: " & Mid(NombreApellidos_cli, 1, 21) Printer.Print "NIT : " & Identificacion_cli Printer.Print "TELÉFONO : " & Telefonos_cli Printer.Print "DIRECCIÓN : " & Direccion_cli Printer.Print "SISTEMA P.O.S: " Printer.Print "FECHA: "; FechaHora Printer.Print "CAJA No: " & Glo_Num_CajaRegistradora Printer.Print LineaDivi '----------------- Detalle de La Factura Printer.FontBold = True Printer.Print espacioTd1 & TextoTiket1 & espacioTd2 & TextoTiket2 & espacioTd3 & TextoTiket3 & espacioTd4 & TextoTiket4 & espacioTd4 & TextoTiket5 Printer.FontBold = False Printer.Print LineaDivi
Luego se imprime el encabezado de la Factura todo lleva un mismo tamaño ya definido por la variable FontSizeEncab
Lo diferente que vemos es que imprimimos una linea esto sigue siendo un texto “—-” para separas las partes de la factura.
TotalFactura = 0 SubtotalPro = 0 SumaImpuesto = 0 SumDescuento = 0 Do While Not RecorsetFactura.EOF SubtotalPro = 0 Codigo = RecorsetFactura("CodigoPro") If Len(Codigo) > 6 Then Codigo = Mid(Codigo, Len(Codigo) - 5, 6) End If Nombre = RecorsetFactura("NombrePro") Impuesto = RecorsetFactura("Impuesto") Cantidad = RecorsetFactura("Cantidad_dv") Precio = Format(RecorsetFactura("P_Venta_dv"), "currency") DescuentoP = RecorsetFactura("Descuento_dv") SumDescuento = SumDescuento + DescuentoP SubtotalPro = (RecorsetFactura("Cantidad_dv") * RecorsetFactura("P_Venta_dv")) - DescuentoP TotalFactura = TotalFactura + SubtotalPro ImpuestoCal = (Impuesto / 100) + 1 BaseComp = SubtotalPro / ImpuestoCal ImpPro = SubtotalPro - BaseComp SumaImpuesto = SumaImpuesto + ImpPro mtImpuesto = "" If Impuesto > 0 Then mtImpuesto = Impuesto End If 'primera linea Printer.Print _ Tab(EspaPro1); Left(Codigo, 6); _ Tab(EspaPro2); Left(Nombre, LenNombrPro) & Chr(13); 'segunda linea Printer.Print _ Tab(EspaPro3); Cantidad; _ Tab(EspaPro4); Precio; _ Tab(EspaPro5); Format(SubtotalPro, "currency") & " " & mtImpuesto & Chr(13) RecorsetFactura.MoveNext Loop
Lo siguiente es es imprimir cada producto lo diferente es que usamos una función nueva Tab (Espacio) que hace esta función como su nombre lo dice agrega un Tab o grupo de espacios. Les dejo de tarea que lo prueben 😉
El resto del código es entendible o lo explicare mejor en el vídeo que pronto estare subiendo.
Por ultimo debemos agregar a Listado de Facturas y a Ventas la variable que define con que tipo de impresora va a imprimir.
En el botón de imprimir en el Formulario de Lista de Facturas el código queda de la siguiente manera:
Private Sub cmdImprimir_Click() Nfactura = msGrid.TextMatrix(msGrid.Row, 1) If Nfactura <> "" Then If glob_conf_ImpresoraTikets = 0 Then Call ImprimirFactura_carta(Nfactura) Else Call ImprimirFactura_Ticket(Nfactura) End If End If End Sub
Si glob_conf_ImpresoraTikets es igual a cero entonces es con la impresora para hojas tamaño Carta o a4 y si es 1 entonces es con la impresora de Tickes.
En el Formulario de Ventas en el procedimiento Finalizar_Guardado_Factura
If glob_conf_ImpresoraTikets = 0 Then Call ImprimirFactura_carta(Num_Factura) Else Call ImprimirFactura_carta(Num_Factura) End If
Para ver como queda la factura debemos escoger la impresora que instala el One Note de Microsoft que lo que hace es darnos una vista previa de la factura.
Cualquier duda o inquietud me escriben a mi correo luisfermartinezricardo@gmail.com
Suscribete a Youtube
Siguenos en Twitter
Siguenos en Facebook