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

