VB .NET - Impresion Fiscal

-DarkChaos-

Lanero Reconocido
6 Jun 2005
262
Buenas a todos. Realmente hace semanas que vengo preparando un programa de facturación que me pidieron y me estoy empezando a volver loco! Tengo muchísimos problemas con el tema de la impresora fiscal, no se cómo funciona ni qué hacer. Busqué varios ejemplos pero están todos en VB6 y necesito terminar este laburo cuanto antes porque ya perdí mucho tiempo.

Estoy realmente desesperado. Alguien me podría dar una mano? Les explico:

Tengo una impresora fiscal Epson TM-U220AF. La tengo instalada en mi PC y bajé un ejemplo en VB6 que supuestamente imprime el ticket. No tengo idea cómo hacer para que mi programa imprima desde esta impresora, ya lo tengo 99% terminado, ese 1% que falta es hacer que imprima los tickets y los registre en la impresora fiscal. Obviamente dicha impresora todavía no está inicializada para guardar los datos en la memoria fiscal, pero necesito que haga eso en el momento que esté inicializada.

¿Alguien me puede dar una mano? Se los agradecería de todo corazón! La verdad que ya estoy muy desilusionado con este tema...
 
Buenas a todos. Realmente hace semanas que vengo preparando un programa de facturación que me pidieron y me estoy empezando a volver loco! Tengo muchísimos problemas con el tema de la impresora fiscal, no se cómo funciona ni qué hacer. Busqué varios ejemplos pero están todos en VB6 y necesito terminar este laburo cuanto antes porque ya perdí mucho tiempo.

Estoy realmente desesperado. Alguien me podría dar una mano? Les explico:

Tengo una impresora fiscal Epson TM-U220AF. La tengo instalada en mi PC y bajé un ejemplo en VB6 que supuestamente imprime el ticket. No tengo idea cómo hacer para que mi programa imprima desde esta impresora, ya lo tengo 99% terminado, ese 1% que falta es hacer que imprima los tickets y los registre en la impresora fiscal. Obviamente dicha impresora todavía no está inicializada para guardar los datos en la memoria fiscal, pero necesito que haga eso en el momento que esté inicializada.

¿Alguien me puede dar una mano? Se los agradecería de todo corazón! La verdad que ya estoy muy desilusionado con este tema...


Eso es muy sencillo, lo primero que debes hacer es saber en que puerto esta intalada la impresora, con esta funcion puedes mandar a imprimir

Donde el archivo es un .TXT que creas con un StreamWriter

SW As StreamWriter = New StreamWriter(My.Application.Info.DirectoryPath & "\CarpetaTemporal\ArchivoPrueba .txt")

ahora a la funcion AsciiToPrinter debes mandarle la ruta de archivo , esta impresoras soportan maximo 39 a 40 caracteres por linea, asi que debes tener en cuenta eso.

Cabe mencionar que debes tener bien configurada la impresora y instalados los controladores.

Una vez que temnies la generacion del TXT con la informacion debes cerrar el StreamWriter yuna vez que imprima el Ticket debes eliminar el txt


Public Shared Sub AsciiToPrinter(ByVal Archivo As String, ByVal Impresora As String)

Try
If Not My.Computer.FileSystem.FileExists(Archivo) Then
Throw New GasolutionsException("No existe el archivo:" & Archivo)
Exit Sub
End If
Dim streamToPrint As IO.StreamReader = New IO.StreamReader(Archivo)
Dim pd As TextPrintDocument = New TextPrintDocument(streamToPrint)
Try
Try
pd.PrinterSettings.PrinterName = Impresora
Catch
End Try

pd.Print()
Finally
streamToPrint.Close()
End Try
Catch
Throw
End Try
End Sub
 
xjuanch0x esas impresoras tiene sus propias funciones de impresión en un dll que traen, ya q guardan todo lo facturado en una memoria interna.
 
xjuanch0x esas impresoras tiene sus propias funciones de impresión en un dll que traen, ya q guardan todo lo facturado en una memoria interna.

Eso es cierto, donde trabajo tenemos un software montado en Peru, el cual lleva un resgitro de las impresiones que se hacen en dicha impresora, para posteriormente ser auditadas por la SUNAT (Peru) y esta operacion es transparente al usuario, la impresora se encarga de llevar un registro de los documentos impresos, ya sea en una cinta de auditoria ó en un chip, es mas esta impresoras por lo general deben estar selladas y no ser abiertas sin autorizacion (En Peru la SUNAT lo hace).
 
Eso es cierto, donde trabajo tenemos un software montado en Peru, el cual lleva un resgitro de las impresiones que se hacen en dicha impresora, para posteriormente ser auditadas por la SUNAT (Peru) y esta operacion es transparente al usuario, la impresora se encarga de llevar un registro de los documentos impresos, ya sea en una cinta de auditoria ó en un chip, es mas esta impresoras por lo general deben estar selladas y no ser abiertas sin autorizacion (En Peru la SUNAT lo hace).

si sr. asi es. yo desarrolle una aplicación en el Venezuela y pues me toco hacer de toco para pode imprimir en esas impresoras.. al final los de soporte de Epson me pasaron unos dll y a pund ade prueba y error logre hacer q imprimiera.. esas son con chip... es oblicacion por el SENIAT (Venezuela) como al Dian aquí en Colombia.

así que le aconsejo al LANero DarkChaos- se coloque en contacto con ellos, el que le vendió esa impresora debe tener el contacto.... o en la misma pagina de Epson.

exitos..
 
Muchísimas gracias a todos!! Realmente sus respuestas me abrieron la cabeza... Perdón que no haya respondido antes, no es que no haya estado pendiente del hilo, sino que se me quemó la fuente de mi PC y hasta el día de hoy no pude repararla.

Voy a probar ponerme en contacto con el soporte técnico de Epson para ver qué me dicen. Por las dudas no me cierren el post, por si sale alguna duda o, en caso que pueda lograrlo me gustaría compartir la solución. He visto muchos de estos hilos en miles de foros y nadie sabe exactamente cómo realizar una operación transparente de forma tal que quede registrado en la memoria fiscal de la impresora (como dijeron antes, efectivamente tiene un chip que viene con un precinto de seguridad) y que imprima el ticket.

Les aclaro que la impresora, como también dijeron en los mensajes anteriores, viene con un sistema de seguridad que solo puede ser activado por personal calificado al inicializar la impresora y habilitarla para el registro de ventas. Lo que yo necesito hacer en este preciso instante es solo que imprima de la misma forma que lo hará cuando esté inicializada.

Gracias totales! Y los mantengo al tanto... Son unos genios!! =D
 
Gente, disculpen el doble post. Acabo de conseguir el OCX de Epson con todas las funciones, pero todavía no logro hacerlo funcionar. No logro comprender, a pesar todo, cómo funcionan este tipo de impresoras.

Ya agregué el OCX como referencia de mi proyecto en VB .Net y tengo acceso a las funciones, pero dónde debería poner el código? En algún lado encontré esto como ejemplo:

Código:
Dim sCmd AsString
Dim sCmdExt AsString
Dim bAnswer AsBoolean
'---------------------------
' Ticket-Factura
'---------------------------
'Open
sCmd = Chr$(&HB) + Chr$(&H1)
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmd)
sCmdExt = Chr$(&H0) + Chr$(&H0)
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmdExt)
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("Nombre Comprador #1")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("Nombre Comprador #2")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("Domicilio Comprador #1")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("Domicilio Comprador #2")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("Domicilio Comprador #3")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("T")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("30614104712")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("I")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("L¡nea de Remitos #1")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("L¡nea de Remitos #2")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("")
If bAnswer Then bAnswer = Me.EpsonFP.SendCommand
Call FPDelay
IfMe.EpsonFP.ReturnCode <> 0 Then ShowMsg
PublicSub FPDelay()
'
' Delay Sequence
'
Dim Start1 AsSingle
Start1 = Timer '
DoWhileMe.EpsonFP.State = EFP_S_Busy
DoWhile Timer < Start1 + 0.125 ' Timer delay
DoEvents
If Start1 > Timer Then' This is to
ExitDo' compensate for the
EndIf' AM to PM change
Loop
Loop'
EndSub

El tema es que cuando pongo el "Me.EpsonFP" no me da la posibilidad de utilizar el AddDataField. Dónde se supone que debiera ir este código? Supongo que debe ir en el botón que realizará la opción de imprimir.

Más allá de eso, ¿cómo hago que la impresora comience a imprimir? Porque nunca manda la orden. Estoy algo desorientado. Tengo éste código creado, voy bien encaminado o está todo mal?

Código:
        Dim a As New EpsonFPHostControl

        a.CommPort = TxCommPort.Com1
        a.BaudRate = TxBaudRate.br9600
        a.ProtocolType = TxProtocolType.protocol_Extended

        a.OpenPort()

        a.AddDataField("EJEMPLO LINEA 1")
        a.AddDataField("EJEMPLO LINEA 2")
        
        'Aca faltaria algo que diera la orden de imprimir

        a.ClosePort()

Muchas gracias de antemano, nuevamente... Un abrazo.
 
Gente, disculpen el doble post. Acabo de conseguir el OCX de Epson con todas las funciones, pero todavía no logro hacerlo funcionar. No logro comprender, a pesar todo, cómo funcionan este tipo de impresoras.

Ya agregué el OCX como referencia de mi proyecto en VB .Net y tengo acceso a las funciones, pero dónde debería poner el código? En algún lado encontré esto como ejemplo:

Código:
Dim sCmd AsString
Dim sCmdExt AsString
Dim bAnswer AsBoolean
'---------------------------
' Ticket-Factura
'---------------------------
'Open
sCmd = Chr$(&HB) + Chr$(&H1)
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmd)
sCmdExt = Chr$(&H0) + Chr$(&H0)
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField(sCmdExt)
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("Nombre Comprador #1")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("Nombre Comprador #2")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("Domicilio Comprador #1")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("Domicilio Comprador #2")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("Domicilio Comprador #3")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("T")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("30614104712")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("I")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("L¡nea de Remitos #1")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("L¡nea de Remitos #2")
If bAnswer Then bAnswer = Me.EpsonFP.AddDataField("")
If bAnswer Then bAnswer = Me.EpsonFP.SendCommand
Call FPDelay
IfMe.EpsonFP.ReturnCode <> 0 Then ShowMsg
PublicSub FPDelay()
'
' Delay Sequence
'
Dim Start1 AsSingle
Start1 = Timer '
DoWhileMe.EpsonFP.State = EFP_S_Busy
DoWhile Timer < Start1 + 0.125 ' Timer delay
DoEvents
If Start1 > Timer Then' This is to
ExitDo' compensate for the
EndIf' AM to PM change
Loop
Loop'
EndSub
El tema es que cuando pongo el "Me.EpsonFP" no me da la posibilidad de utilizar el AddDataField. Dónde se supone que debiera ir este código? Supongo que debe ir en el botón que realizará la opción de imprimir.

Más allá de eso, ¿cómo hago que la impresora comience a imprimir? Porque nunca manda la orden. Estoy algo desorientado. Tengo éste código creado, voy bien encaminado o está todo mal?

Código:
        Dim a As New EpsonFPHostControl

        a.CommPort = TxCommPort.Com1
        a.BaudRate = TxBaudRate.br9600
        a.ProtocolType = TxProtocolType.protocol_Extended

        a.OpenPort()

        a.AddDataField("EJEMPLO LINEA 1")
        a.AddDataField("EJEMPLO LINEA 2")
        
        'Aca faltaria algo que diera la orden de imprimir

        a.ClosePort()
Muchas gracias de antemano, nuevamente... Un abrazo.

Veo que conseguiste el ocx para vb.net, quería saber donde lo conseguiste o si me lo puedes pasar por mail (mi correo es meliv1984@hotmail.com)... La verdad es que lo ando buscando porque estoy como vos, tengo todo hecho solo me falta la parte de prgamación del fiscal...
Muchas Gracias