Os propongo un código para imprimir directamente en la impresora con Access y que a mi me da muy buenos resultados, en el ejemplo vamos a imprimir el tÃpico ticket de mostrador.
Vamos a comentar las diferentes partes del código y al final te lo pongo todo unido:
Como es normal, al principio de código declaramos todas las variables que van a intervenir en la función:
Function ImprimeTicket()
On Error GoTo hayerror
Dim SqlA As String, RstA As DAO.Recordset, NumeroArchivo As Long, DImpIva As Double, DBase As Double
Dim rst1 As DAO.Recordset, DDto As Double, DIva As Double, DSuma As Double, DImpDto As DoubleAhora abrimos los recordset para recuperar los datos de las tablas o consultas, en nuestro caso son dos:
- rst1: para la suma de la factura.
- RstA: donde recuperamos los datos propios de una factura en concreto, en nuestro caso la que coincida con la que tenemos en el formulario abierto.
Set rst1 = CurrentDb.OpenRecordset("Select Suma From SumaFacturaDirecta")
SqlA = "Select * from OrigenFacturasInforme Where idfactura =" & Me.IdFactura
Set RstA = CurrentDb.OpenRecordset(SqlA, dbOpenDynaset)Ahora, si se cumple la condición, asignamos los valores a las variables:
If RstA.BOF = False Then
NumeroArchivo = FreeFile
DDto = RstA!DtoGral
DIva = RstA!IVA
DSuma = Round(rst1("Suma"), 2)
DImpDto = DSuma * DDto / 100
DBase = DSuma - DImpDto
DImpIva = Round(DBase * DIva / 100, 2)Ahora abrimos el puerto donde queramos imprimir, en el LPT1, COM1, COM2, etc.:
Open "COM1" For Output As #NumeroArchivo
En caso de querer imprimir en una impresora de red:
Open "\\NOMBRE-RED\NOMBRE-IMPRESORA" For Output As #NumeroArchivo
Aquà reseñar que en las propiedades de la impresora de red tiene que estar marcada la opción "Imprimir utilizando la cola..." ya que de otra manera no me imprimÃa.
Luego imprimimos el cuerpo del Ticket puede ser algo asÃ, todo completoquedarÃa asÃ:
Function ImprimeTicket()
On Error GoTo hayerror
Dim SqlA As String, RstA As DAO.Recordset, NumeroArchivo As Long, DImpIva As Double, DBase As Double
Dim rst1 As DAO.Recordset, DDto As Double, DIva As Double, DSuma As Double, DImpDto As Double
Set rst1 = CurrentDb.OpenRecordset("Select Suma From SumaFacturaDirecta")
SqlA = "Select * from OrigenFacturasInforme Where idfactura =" & Me.IdFactura
Set RstA = CurrentDb.OpenRecordset(SqlA, dbOpenDynaset)
If RstA.BOF = False Then
NumeroArchivo = FreeFile
DDto = RstA!DtoGral
DIva = RstA!IVA
DSuma = Round(rst1("Suma"), 2)
DImpDto = DSuma * DDto / 100
DBase = DSuma - DImpDto
DImpIva = Round(DBase * DIva / 100, 2)
Open "COM1" For Output As #NumeroArchivo
Print #NumeroArchivo, "NOMBRE EMPRESA"
Print #NumeroArchivo, "DIRECCION EMPRESA"
Print #NumeroArchivo, "POBLACION EMPRESA"
Print #NumeroArchivo, "Tlfs: 666 666 666 - 777 777 777"
Print #NumeroArchivo, "CIF: B123456789"
Print #NumeroArchivo, "---------------------------------------"
Print #NumeroArchivo, RstA("NomCli")
Print #NumeroArchivo, Nz(RstA("Direccion"), "")
Print #NumeroArchivo, Nz(RstA("CodPos"), ""); Spc(1); Nz(RstA("localidad"), "")
Print #NumeroArchivo, "NIF:"; Nz(RstA("Cif"), ""); Spc(1); "Cliente Nro:"; RstA("CodCli")
Print #NumeroArchivo, "---------------------------------------"
Print #NumeroArchivo, "Fecha:"; RstA("Fecha"); "Factura Nro:"; RstA("NroFactura")
Print #NumeroArchivo, "======================================="
Print #NumeroArchivo, " T I C K E T "
Print #NumeroArchivo, "======================================="
Print #NumeroArchivo, "Cant Descripcion Precio TOTAL"
Print #NumeroArchivo, "---------------------------------------"
Do While RstA.EOF = False
Print #NumeroArchivo, RstA("Cantidad"); Spc(2); RstA("Producto")
Print #NumeroArchivo, Spc(6); Nz(RstA("CodProducto"), " "); Spc(8); Nz(Round(RstA("Precio"), 2), ""); Spc(3); Nz(Round(RstA("Importe"), 2), "")
RstA.MoveNext
Loop
Print #NumeroArchivo,
Print #NumeroArchivo,
Print #NumeroArchivo,
Print #NumeroArchivo, " Subtotal:"; Spc(7); DSuma
Print #NumeroArchivo, " Dto. "; DDto; "%"; Spc(9); DImpDto
Print #NumeroArchivo, " Base Imponible:"; Spc(1); DBase
Print #NumeroArchivo, " IVA: "; DIva; "%"; Spc(7); DImpIva
Print #NumeroArchivo, " TOTAL:"; Spc(10); DBase + DImpIva; "Eur"
Print #NumeroArchivo,
Print #NumeroArchivo,
Print #NumeroArchivo,
Print #NumeroArchivo,
Print #NumeroArchivo,
Print #NumeroArchivo,
Print #NumeroArchivo,
Close #NumeroArchivo ' Cierra el archivo.
Else
MsgBox "No hay Registros", vbExclamation + vbOKOnly, "Aviso"
End If
RstA.Close
Set RstA = Nothing
rst1.Close: Set rst1 = Nothing
DoCmd.Close acForm, "VerImprimirFacturaDirecta"
Form_frmFacturaDirecta.Visible = True
Salir:
Exit Function
hayerror:
MsgBox Err.Description
Resume Salir
End Function

tickets en access
Buenos dias:
He creado un archivo de texto para emitir tickets y lo envio al COM2 (puerto de la impresora de tickets), sin embargo, no lo imprime, tan solo una página del mismo carácter.
Me han comentado que, tal vez, haya que ampliarlo con el código de la impresora.
¿Alguien conoce más del tema?
Gracias
He creado un archivo de texto para emitir tickets
No se que quieres decir con ésto:
He creado un archivo de texto para emitir tickets y lo envio al COM2me puedes dar más detalles pata intentar ayudarte?
Más información
Vamos a ver, và el artÃculo publcado en esta misma web.
Open "C:\ARQUEO\ToysFarma\TICKET" For Output As #NumeroArchivo
'Open "COM2" For Output As #NumeroArchivo
Con el segundo Open envias a la impresora de tickets, con el pimer Open, se crea un archivo de texto en el pc. Bie, lo hice asà para formatearlo según mis necesidades, pero, al cambiar a la segunda opción:
Open "COM2" For Output As #NumeroArchivo
que se supone envia el archivo de texto al puerto de la impresora, tan solo se imprime un carácter "muchas" veces.
Me han hecho dos comentarios al respecto:
1- poner código para que la impresora IDENTIFIQUE el archivo que le envio, lo cuál no tiene sentido porque, de esta forma, si cambias la impresora, has de cambiar esto
2- modificar el puerto del pc (¿velocidad?, me lo confirma mañana)
El caso es que NO puedo modificar NADA de la impresora, porque, otro programa la usa y NO funcionarÃa.
Hay algo que se escapa a mis conocimientos
¿Te lo he aclarado?
Gracias por contestar
Victoria
Solución?
Hola Victoria ¿has podido solucionar ese problema?