Hola Claudio Aqui te envio la clase que utilizaron hace unos años atrás en la empresa. Se utilizo el ActiveX de Epson para la TMF
Espero que te sea de utilidad. Saludos José Paez PD: Observandola un poco, podría estar mejar escrita. ;-))) * loImpresora Referencia del Control ActiveX * loDatosCabecera Objeto con datos de la Cabecera del Ticket * loDatosDetalle Objeto (Colección) con datos del Detalle del Ticket * loDatosCFP Objeto (Colección) con datos de la Forma de Pago loControladorFiscal = createobject("ControladorFiscal") loControladorFiscal.Imprimir( loImpresora, loDatosCabecera, loDatosDetalle, loDatosCFP ) Define Class ControladorFiscal As Custom ************************************************************************ * Imprimir ********* Function Imprimir() As Boolean Parameters; oImpresora As Object,; oDatosCabecera As Object,; oDatosDetalle As Object,; oDatosCFP As Object Try *- Especifica el número de puerto a utilizar (Valor por defecto: 1). oImpresora.PortNumber = oConfiguracion.PortNumber *- Realiza la apertura de un ticket fiscal. lOk = oImpresora.OpenTicket("G") && Tipo de almacenamiento de los datos en la memoria: G=Completo; C=Normal If Not lOk Then lOk = .F. This.ErrorAlImprimir("OpenTicket") Endif *- Envia información extra (Usuario) If lOk Then cExtraDescription = "V.: " + Transform( oApp.IdUsuario ) If Not oImpresora.SendExtraDescription(cExtraDescription) Then lOk = .F. This.ErrorAlImprimir("SendExtraDescription") Endif Endif *- Envia información extra (Cuenta del Titular) If lOk Then cExtraDescription = Left(This.ValidarCaracteres("CTA.: " + Upper(Alltrim(oDatosCabecera.Cod_Tit) + " " + Alltrim(oDatosCabecera.Nom_Tit))), 30) If Not oImpresora.SendExtraDescription(cExtraDescription) Then lOk = .F. This.ErrorAlImprimir("SendExtraDescription") Endif Endif *- Envia información del item If lOk Then For Each oDetalle In oDatosDetalle cDescription = Left(This.ValidarCaracteres( Upper(Alltrim(oDetalle.Articulo_Nombre))), 20) Set Decimals To 3 Set Fixed On cQuantity = Chrtran(Transform( oDetalle.Cantidad ), ".", "") Set Fixed Off Set Decimals To 2 Set Fixed On cUnitPrice = Chrtran(Transform(Round(oDetalle.Precio,2)), ".", "") cIVA_Tax = Chrtran(Transform(Round(oDetalle.Tasa_IVA,2)), ".", "") Set Fixed Off cQualifier = "M" cBundle = "" cPorcentualInternalTaxes= "0" cFixesInternalTaxes = "" *- Envía un Item en un ticket fiscal If Not oImpresora.SendTicketItem( cDescription, cQuantity, cUnitPrice, cIVA_Tax, cQualifier, cBundle, cPorcentualInternalTaxes) Then lOk = .F. This.ErrorAlImprimir("SendTicketItem") Exit Endif Next Endif *- Envía el/los pago(s) en un ticket fiscal If lOk Then cPaymentType = "T" For Each oCFP In oDatosCFP cPayment= " " + This.ValidarCaracteres(Upper(Alltrim(oCFP.FP_Nombre))) Set Decimals To 2 Set Fixed On cAmount = Chrtran(Transform(oCFP.Importe), ".", "") Set Fixed Off If Not oImpresora.SendTicketPayment( cPayment, cAmount, cPaymentType ) Then lOk = .F. This.ErrorAlImprimir("SendTicketPayment") Exit Endif Next Endif *- Realiza el cierre de un ticket fiscal. If lOk Then If Not oImpresora.CloseTicket() Then lOk = .F. This.ErrorAlImprimir("CloseTicket") Endif Endif If lOk Then oDatosCabecera.Numero = Val(oImpresora.AnswerField_3) Endif Catch Messagebox("Error:" +Chr(13)+ oImpresora.FiscalStatus +Chr(13)+ oImpresora.PrinterStatus ) Endtry Return lOk Endfunc Function ErrorAlImprimir ( cFuncion As String ) As Boolean Messagebox("Error: " + cFuncion + Chr(13)+ oImpresora.FiscalStatus + Chr(13) + oImpresora.PrinterStatus, 48, "Aviso" ) Endfunc ************************************************************************ * Auditoria *********** Function Auditoria(; oImpresora As Object,; cTipo As String,; cModo As String,; cFechaDesde As String,; cFechaHasta As String ) As Boolean Local; lOk As Boolean Try oImpresora.PortNumber = oConfiguracion.PortNumber lOk = oImpresora.Audit( cTipo, cModo, cFechaDesde, cFechaHasta ) If Not lOk Messagebox("Error: AUDITORIA " +Chr(13)+ oImpresora.FiscalStatus +Chr(13)+ oImpresora.PrinterStatus, 48, "Aviso" ) Endif Catch Messagebox("Error: AUDITORIA " +Chr(13)+ oImpresora.FiscalStatus +Chr(13)+ oImpresora.PrinterStatus, 48, "Aviso" ) Endtry Return lOk Endfunc ************************************************************************ * Cierre_X ********** Function Cierre_X( oImpresora As Object ) As Boolean Local; lOk As Boolean Try oImpresora.PortNumber = oConfiguracion.PortNumber lOk = oImpresora.CloseJournal('X','P') If Not lOk Messagebox("Error: CIERRE_X " +Chr(13)+ oImpresora.FiscalStatus +Chr(13)+ oImpresora.PrinterStatus, 48, "Aviso" ) Endif Catch Messagebox("Error: CIERRE_X " +Chr(13)+ oImpresora.FiscalStatus +Chr(13)+ oImpresora.PrinterStatus, 48, "Aviso" ) Endtry Return lOk Endfunc ************************************************************************ * Cierre_Z ********** Function Cierre_Z( oImpresora As Object ) As Boolean Local; lOk As Boolean Try oImpresora.PortNumber = oConfiguracion.PortNumber lOk = oImpresora.CloseJournal('Z','P') If Not lOk Messagebox("Error: CIERRE_Z " +Chr(13)+ oImpresora.FiscalStatus +Chr(13)+ oImpresora.PrinterStatus, 48, "Aviso" ) Endif Catch Messagebox("Error: CIERRE_Z " +Chr(13)+ oImpresora.FiscalStatus +Chr(13)+ oImpresora.PrinterStatus, 48, "Aviso" ) Endtry Return lOk Endfunc ************************************************************************ * ValidarCaracteres ******************* Function ValidarCaracteres() Lparameters cTexto Local; i As Integer,; cNuevoTexto As String cNuevoTexto = "" For i = 1 To Len( cTexto) cCaracter = Substr( cTexto, i, 1 ) nCodigo = Asc(cCaracter) If Not Between(nCodigo, 0, 128 ) Do Case Case nCodigo = 193 cCaracter = "A" Case nCodigo = 201 cCaracter = "E" Case nCodigo = 205 cCaracter = "I" Case nCodigo = 211 cCaracter = "O" Case nCodigo = 218 cCaracter = "U" Case Inlist( nCodigo, 241, 209 ) cCaracter = "N" Other Case cCaracter = " " Endcase Endif cNuevoTexto = cNuevoTexto + cCaracter Next Return cNuevoTexto Endfunc Enddefine *!* Function OpenTicket(Optional StorageDataType As String) As Boolean *!* Realiza la apertura de un ticket fiscal. *!* Recibe: *!* · Tipo de almacenamiento de los datos en la memoria: G=Completo; C=Normal *!* Function SendExtraDescription(Text As String) As Boolean *!* Envía una línea de descripción extra dentro de un ticket fiscal. *!* Recibe: *!* · Texto a enviar. *!* Function SendTicketItem(Description As String, Quantity As String, UnitPrice As String , IVA_Tax As String, Qualifier As String, Bundle As String , PorcentualInternalTaxes As String, *!* Optional FixesInternalTaxes As String) As Boolean *!* Envía un Item en un ticket fiscal *!* Recibe: *!* · Descripción del artículo. *!* · Cantidad. *!* · Precio unitario. *!* · Tasa de IVA. *!* · Calificador de item: M,m,R,r *!* · Cantidad de cultos *!* · Impuestos internos porcentuales *!* · Impuestos Internos Fijos (opcional) *!* Function SendTicketPayment(Text As String, Amount As String, PaymentType As String) As Boolean *!* Envía un pago en un ticket fiscal *!* Recibe: *!* · Texto descriptivo del pago. *!* · Monto a pagar. *!* · Descripción del pago: T=Pago; t=Reversión del pago; D=Descuento; R=Recargo. *!* Function CloseTicket() As Boolean *!* Realiza el cierre de un ticket fiscal. ----- Original Message ----- From: claudio lopez To: GUFA List Member Sent: Tuesday, November 13, 2007 6:34 PM Subject: [GUFA] (No Subject) Estimada Lista : Tengo que enviar una factura que genero con un sistema de facturacion hecho en Fox a una Tickeadora marca EPSON : La verdad es que no tengo ni la menor idea de como hacerlo. En mi pueblo no tengo colegas para preguntar nada. Agradecería me orienten para ver como hicieron Uds. para lograr dominar ese aparatito infernal que son los controladores fiscales. Atte. Claudio Abel Lopez [EMAIL PROTECTED] ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ Los referentes más importantes en compra/venta de autos se juntaron: Demotores y Yahoo!. Ahora comprar o vender tu auto es más fácil. Visitá http://ar.autos.yahoo.com/