** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - impresión de un ticket de venta
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoimpresión de un ticket de venta

 Responder Responder
Autor
Mensaje
GFAP Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 12/Junio/2021
Localización: León Gto. Mex
Estado: Sin conexión
Puntos: 22
Enlace directo a este mensaje Tema: impresión de un ticket de venta
    Enviado: 28/Julio/2021 a las 21:50
Hola buen día. Estoy haciendo un sistema en el que necesito imprimir un Ticket de venta (no se como se llama en España pero es el recibo que te dan las tiendas al comprar algo). Estoy programando en VBA Access. Realicé un informe le di el tamaño necesario etc. El problema es que al imprimir, me deja, al final un buen pedazo de papel en blanco, supongo que respetando un tamaño de papel. La impresora es térmica (POS Printer) e imprimo en un pedazo de rollo térmico.

Algún día, no hace mucho, programé en VBA de Excel un punto de venta y al seleccionar la impresora térmica, automáticamente ponía un tamaño de papel personalizado e imprimía el ticket perfectamente y del tamaño necesario.Yo suponía que en Access pararía lo mismo, pero no fue así.
¿Alguien me puede orientar que puedo hacer?

He buscado la palabra ticket en el foro pero sin éxito.
Gracias de antemano por su ayuda.
GFAP
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14011
Enlace directo a este mensaje Enviado: 28/Julio/2021 a las 23:28
Bájate el programa de consulta del foro off-line, ahí seguro que hay información.

Hace mucho que no toco una impresora de tickets, pero el truco está en abrirla directamente, no a través de un informe, e ir escribiendo las líneas.

La cuchilla de corte es otro tema, que que no quede mucho papel en blanco por detrás el truco estaba en darle la orden de corte dos o tres líneas antes del final del ticket, así se ajustaba el papel al máximo.
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
GFAP Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 12/Junio/2021
Localización: León Gto. Mex
Estado: Sin conexión
Puntos: 22
Enlace directo a este mensaje Enviado: 30/Julio/2021 a las 03:56
Gracias Jesus.
Estoy trabajando con este código:

Private Type DocInfo
    pDocName As String
    pOutputFile As String
    pDatatype As String
End Type

Private Declare PtrSafe Function ClosePrinter Lib "winspool.drv" (ByVal _
   hPrinter As Long) As Long
Private Declare PtrSafe Function EndDocPrinter Lib "winspool.drv" (ByVal _
   hPrinter As Long) As Long
Private Declare PtrSafe Function EndPagePrinter Lib "winspool.drv" (ByVal _
   hPrinter As Long) As Long
Private Declare PtrSafe Function OpenPrinter Lib "winspool.drv" Alias _
   "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, _
    ByVal pDefault As Long) As Long
Private Declare PtrSafe Function StartDocPrinter Lib "winspool.drv" Alias _
   "StartDocPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _
   pDocInfo As DocInfo) As Long
Private Declare PtrSafe Function StartPagePrinter Lib "winspool.drv" (ByVal _
   hPrinter As Long) As Long
Private Declare PtrSafe Function WritePrinter Lib "winspool.drv" (ByVal _
   hPrinter As Long, pBuf As Any, ByVal cdBuf As Long, _
   pcWritten As Long) As Long


Public Function RawPrint(strData As String, ByVal SelectedPrinter As String)

Dim defprt As Printer
Dim lhPrinter As Long
Dim lReturn As Long
Dim lpcWritten As Long
Dim lDoc As Long
Dim sWrittenData As String
Dim mDocInfo As DocInfo
lReturn = OpenPrinter(SelectedPrinter, lhPrinter, 0)

If lReturn = 0 Then
    MsgBox "The Printer is not recognized."
    Exit Function
End If
mDocInfo.pDocName = "ZPl"
mDocInfo.pOutputFile = vbNullString
mDocInfo.pDatatype = vbNullString
lDoc = StartDocPrinter(lhPrinter, 1, mDocInfo)
Call StartPagePrinter(lhPrinter)
sWrittenData = strData
lReturn = WritePrinter(lhPrinter, ByVal sWrittenData, _
Len(sWrittenData), lpcWritten)
lReturn = EndPagePrinter(lhPrinter)
lReturn = EndDocPrinter(lhPrinter)
lReturn = ClosePrinter(lhPrinter)

End Function

Sub x()
    Call RawPrint("esto es una prueba", "\\DESKTOP-76ULVKL\POS58 10.0.0.6")
End Sub


Cuando lo ejecuto no hace nada. No marca error pero no imprime nada.
tuve que modificar lo de ptrsafe para que corra en maquina de 64 bits.
lo corro linea a linea pero desconozco cuál es el error.

tampoco estoy seguro si este código funciona con puertos USB. Y por más que bueco no encuentro nada.
GFAP
Arriba
GFAP Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 12/Junio/2021
Localización: León Gto. Mex
Estado: Sin conexión
Puntos: 22
Enlace directo a este mensaje Enviado: 30/Julio/2021 a las 04:07
También intenté con este otro código sin obtener algún resultado:

Sub imprimeDirecto()
    Open "\\DESKTOP-76ULVKL\POS58 10.0.0.6" For Output As #1
    Print #1, "Hola"
    Print #1, Chr$(12)
    Close #1
End Sub

ni con este:

Sub imprimeDirecto()
    Open "USB001" For Output As #1
    Chr$(12) genera un salto de página
    Print #1, "Hola"
    Print #1, Chr$(12)
    Close #1
End Sub

¿con la api de windows es posible mandar al puerto USB? ¿Debe funcionar cualquier impresora con esa api?
Lo malo es que en todos los lugares donde busco dan terminado el tema con alguno de estos códigos. como si en realidad funcionaran. ¿estaré haciendo algo mal?
GFAP
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14011
Enlace directo a este mensaje Enviado: 30/Julio/2021 a las 09:05
Esto último es el camino a seguir ... he buscado lo que tenía en un programa antediluviano ... no es que esté muy depurado pero funciona:

Dim ImpresoraTickets As String
.
.
ImpresoraTickets = "LPT3"    'era por puerto serie, puede ser LPT1, USB0001 - hay que buscar el nombre del puerto en la definición de la impresora


Private Sub Abrir_cajon()
'Open "LPT1" For Output As #1
    Open ImpresoraTickets For Output As #1
    Print #1, Chr$(27); Chr$(112); Chr$(1); Chr$(255); Chr$(255);
    Close #1
End Sub


- esto imprimía las líneas del tocket

Open ImpresoraTickets For Output As #1
Print #1, Chr$(27); "@";

For Contador1 = 1 To Contador
    Print #1, Chr$(27); "!"; Chr$(56); Matriz(Contador1, 1)
    Print #1, Chr$(27); "e"; Chr$(2); Chr$(27); "!"; Chr$(1); Chr$(27); "a"; Chr$(2); Matriz(Contador1, 2)
    Print #1, Chr$(27); "a"; Chr$(2); Matriz(Contador1, 3)
    Print #1, Chr$(27); "a"; Chr$(0); "Cli: "; Matriz(Contador1, 4)
    Print #1, ">> "; Matriz(Contador1, 5)
    Print #1, "   "; Matriz(Contador1, 6);
    Print #1, Chr$(27); "J"; Chr$(10)
    Print #1, Chr$(&H1D); "V"; Chr$(0)
    Print #1, Chr$(27); "e"; Chr$(1);
Next

Print #1, Chr$(27); "d"; Chr$(5)
Print #1, Chr$(&H1D); "V"; Chr$(0)
Close #1


Editado por Mihura - 30/Julio/2021 a las 09:05
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
GFAP Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 12/Junio/2021
Localización: León Gto. Mex
Estado: Sin conexión
Puntos: 22
Enlace directo a este mensaje Enviado: 02/Agosto/2021 a las 08:44
Hola Jesús, sigo intentando. Me di cuenta que me lo manda a un archivo llamado USB001 en "documentos" y como trabajo en otra carpeta no lo había visto.
intente con USB1 e igual.
Ahora intente redireccionar un puerto LPT1 con NET USE LPT1: \\DESKTOP-76ULVKL\POS58 /PERSISTENT:YES pero marca error en: Open "LPT1" For Output As #1

Caramba tiene que haber algo

Gracias por atenderme
GFAP
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14011
Enlace directo a este mensaje Enviado: 08/Agosto/2021 a las 20:06
Perdón por la demora pero estuve desconectado unos días.

Yo he usado las siguientes maneras de escribir directamente en la impresora:
Open "Lpt1" For Output As #1
Open "USB0001" For Output As #1
Open "\\PC1\Nombre impresora" As #1

A tener en cuenta:
- a la hora de escribir hay que incluir el carácter de escape dónde corresponda @+I = Chr$(27) + "I"
- USB0001 es EXACTAMENTE el nombre del puerto que tiene asignado la impresora
- en la tercera opción, lo que se hace es compartir una impresora en windows y usar el nombre EXACTO con el la que la vemos entrando a través del entorno de red

Yo desde la distancia, y el tiempo que hace que no me 'pego' con una ... mucho más no te puede decir



Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
GFAP Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 12/Junio/2021
Localización: León Gto. Mex
Estado: Sin conexión
Puntos: 22
Enlace directo a este mensaje Enviado: 04/Septiembre/2021 a las 00:02
Hola Jesús. Resolví parcialmente el problema dando de alta una impresora genérica de texto. El problema es que solo imprime texto y ni el tamaño de la letra he podido modificar. Pero como buen informático he de ganar esta batalla. Ahora la tengo pausada pero en unos días continúo con los intentos. Te agradezco la atención que me has brindado, y cuando tenga algo te escribo para contarte. Si tu encuentras algo que creas me sirve, ¿me lo haces saber? Gracias.
GFAP
Arriba
GFAP Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 12/Junio/2021
Localización: León Gto. Mex
Estado: Sin conexión
Puntos: 22
Enlace directo a este mensaje Enviado: 04/Septiembre/2021 a las 00:10
De tu última aportación, el problema es que me crea un archivo llamado USB001 (de tipo texto) y en el escribe líneas como las siguientes:
@!8hola1
e!ahola2
ahola3
a Cli: hola4
>> hola5
   hola6J

V
ed
V
Que son los textos y "comandos escape" que deberían llegar a la impresora pero en lugar de eso llegan al archivo de texto.

Y no logro que llegue a la impresora.
GFAP
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14011
Enlace directo a este mensaje Enviado: 04/Septiembre/2021 a las 10:04
Publicado originalmente por GFAP GFAP escribió:

... Resolví parcialmente el problema dando de alta una impresora genérica de texto. El problema es que solo imprime texto y ni el tamaño de la letra he podido modificar. ....

¡Agrrrr! ... faltaba eso, ni me acordaba de que había que hacerlo ...  OuchOuchOuchOuch

El tamaño de letra lo tienes que cambiar con los códigos de escape de la impresora, estos suelen ser los mismos para todas las impresoras.

Y sí ... si sigues con ello lo conseguirás ...
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
GFAP Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 12/Junio/2021
Localización: León Gto. Mex
Estado: Sin conexión
Puntos: 22
Enlace directo a este mensaje Enviado: 29/Noviembre/2021 a las 08:45
Hola Jesús, después de dejar por un tiempo de intentarlo ayer me metí y por fin logre hacer lo que necesitaba. La solución la comparto para que otros la puedan tomar de aquí.

Esto sirve para impresoras GPrint China y creo que también las xPrint
En access o Excel en algún modulo:

Sub yy()
    Open "\\DESKTOP-66ULVKK\POS58" For Output As #1
    Print #1, Chr$(27) & Chr$(64)                   ' Reinicializa Impresora
    Print #1, Chr$(29); Chr$(33); Chr$(17)          ' Para Titulo
    Print #1, "RWJ SA DE CV"
    Print #1, Chr$(27) & Chr$(64)                   ' Tamaño por default
    Print #1, "Calle Oro 205"
    Print #1, "Colonia Leon II"
    Print #1, "Leon Guanajuato"
    Print #1, "--------------------------------"
    Print #1, "Cantidad / Producto"
    Print #1, "                  PU   /   Total"
    Print #1, "--------------------------------"
    Print #1, " 2 Coca cola Ligth 1 litro"
    Print #1, "            20.50       $ 41.00 "
    Print #1, Chr$(10)                            'Salto de línea
    Print #1, Chr$(29); Chr$(33); Chr$(1)        'Otro tamaño de letra
    Print #1, " TOTAL $ 41.00 "
    Print #1, Chr$(27) & Chr$(64)                 'Configuración inicial
    Print #1, Chr$(10)
    Close #1
End Sub

"\\DESKTOP-66ULVKK\POS58" ===>   Nombre de la computadora (DESKTOP-66ULVKK) y de la impresora (POS58)

La impresora ¡¡¡¡ TIENE QUE ESTAR COMPARTIDA !!!! eso me fallaba
debe estar en el puerto USB correcto (Propiedades de impresión) (panel control => Dispositivos e impresoras => La impresora que usas, en mi caso POS58 click derecho => propiedades de impresora => Puerto y también uso compartido ahí mismo.
GFAP
Arriba
GFAP Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 12/Junio/2021
Localización: León Gto. Mex
Estado: Sin conexión
Puntos: 22
Enlace directo a este mensaje Enviado: 29/Noviembre/2021 a las 08:50
ahhh y no es necesario imprimir en una impresora Genérica.

Jesus, gracias por haber sido paciente conmigo y por tu ayuda.
De verdad lo aprecio.

Gonzalo

Se Puede cerrar el Hilo.
GFAP
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14011
Enlace directo a este mensaje Enviado: 29/Noviembre/2021 a las 09:07
Gracias a ti por la respuesta.

Un saludo.
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable