Curso de Software de Ventas Pt 41 Factura de Ticket

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

Total Page Visits: 19973 - Today Page Visits: 2

Deja una respuesta