----- Original Message -----From: HQ SistemasTo: ifclipper@...Sent: Wednesday, October 01, 2008 1:43 PMSubject: RE: [ifclipper] Una mano... por favor...
Ricardo , una maravilla mañana me pongo a probar.
Gustavo Gabriele PD : Hay una caja de Alfajores Habanna y una de habanet esperado que digas donde los mando
De:
ifclipper@gruposyah [mailto:oo.com.ar ifclipper@gruposyah ] En nombre de Ricardo Sassyoo.com.ar
Enviado el: Miércoles, 01 de Octubre de 2008 12:02 a.m.
Para:ifclipper@gruposyah oo.com.ar
Asunto: RE: [ifclipper] Una mano... por favor...
Bueno... aqui voy con la explicación del modo spool, aclarando que desde el punto de vista "legal" dicho modo de trabajo sólo se "aceptaría" en aquellos comercios que por su naturaleza está exceptuados de respetar la famosa concomitancia.
.. (¿alguien la respeta?).
El modo "spool" de las impresoras Hasar es un modo de trabajo donde la impresora está todo el tiempo "viendo" lo que le tiran dentro de una carpeta predeterminada y tratando de procesar en forma batch los archivos que se colocan en dicha carpeta.
Si la impresora "encuentra" un archivo interpretable (desde el punto de vista de la impresora o sea con comandos fiscales) lo procesa y devuelve el resultado de ese proceso en otra carpeta predeterminada, con el mismo nombre del archivo de entrada pero con la extensión ".ANS" (de "answer... ¿vieron?).
En otras palabras, la impresora esta a la espera de que desde nuestro aplicacativo generemos un archivo plano con la secuencia de comandos a ejecutar y le copiemos ese archivo a la carpeta donde "ella" está esperando.
El modo spool se poner en marcha ejecutando el programa WSPOOLER.EXE que es parte de los programas y drivers que se pueden bajar de la página de Hasar.
Este programa abre una sesión de DOS (que luego podemos minimizar) y queda en ejecución permanente hasta que lo cancelemos con CTRL-C.
Vamos a un ejemplo totalmente funcional para comprender los parámetros que necesita este programa:
WSPOOLER -p1 -v57600 -l -n -sC:\FISCAL\ENTRADA -aC:\FISCAL\ SALIDA
"-p" es el parámetro donde le indicamos al programa cuál es el puertoCOM a abrir para comunicarse con la impreosa.
"-v" es el parámetro donde le indicamos al programa cuál es la velocidad con que operaremos dicho puerto. Esta velocidad debe coincidir con la seteada en la impresora mediante el utilitario Pruf.
"-l" (ojo... ele de lagarto y no i de inútil) sirve para que el programa vaya generando un archivo log que nos puede servir hipotéticamente para detectar errores de comandos o de funcionamiento. Este archivo log se llama -por defecto- "spooler.log" y contiene información muy interesante para ver por qué a veces nos equivocamos en la sintáxis de un comando fiscal o por qué la impresora se niega a ejecutar un comando que creemos que está bien.
Este un ejemplo del contenido (acumulativo) de spooler.log:
30/09-23:04:20: **START SPOOLER**
30/09-23:04:20: A abrir COM1
30/09-23:04:21: Comando completado: *
30/09-23:04:21: Comando completado: *
30/09-23:04:21: Comando completado: D| |0.0|C|0
30/09-23:04:21: Comando completado: E
30/09-23:04:21: Comando completado: J
"-n" sirve para que en el archivo de respuestas que nos devuelve el programa spooler cada linea de respuestas esté encabezada por el comando que le dió origen.
Esto sirve para poder interpretar mejor ese archivo de respuestas y saber qué nos fué "contestando" la impresora por cada comando que le enviamos.
"-s" es el parámetro que sirve para indicarle al programa spooler cuál es la carpeta donde tiene que estar "a la escucha".
Cualquier archivo que "caiga" es esa carpeta será procesado y posteriormente borrado en forma automática por el programa spooler.exe.
"-a" es el parámetro donde le pido al programa spooler que me devuelva los resultados de la impresora fiscal.
Continuando con el ejemplo, si a la carpeta c:\fiscal\entrada le "tiro" un archivo denominado "99XZC208.FIS" (archivo que obviamente contiene una colección de comandos fiscales para -por ejemplo- emitir una factura), la respuesta de la impresora quedará en C:\FISCAL\SALIDA, en un archivo denominado "99XZC208.ANS".
Es responsabilidad de nuestros aplicativos revisar ese archivo de salida para cerciorarnos que la impresión finalizó correctamente y poder recuperar datos que sean necesarios para actualizar nuestras propias bases de datos.
En mi caso, por ejemplo, tomo de ese archivo el nro. de comprobante emitido, el punto de venta y el monto de iva total, para poder actualizar las bases del sistema en corcondancia con lo emitido por la impresora fiscal.
Los comandos que se le envian a la impresora son EXACTAMENTE LOS MISMOS que usamos habitualmente en el modo de trabajo normal.
Para los que hayan tomado el ejemplo de codificación Clipper que ofrece Hasar, cada linea de este archivo es el contenido de la variable "s" de los ejemplos.
Este es un ejemplo de archivo de comandos para emitir una factura "A":
bEmpresa Equis S.A.30702383923ICDomicilio.. .
@AS
BItem Uno1.01.021.0M0.00b
BItem Dos1.01.010.5M0.00b
CPSubtotal0
DEfectivo100.00T0
E
La primera linea carga los datos del cliente.
La segunda linea abre el comprobante factura "A",
La tercera y cuarta lineas cargan items de venta con distintas tasas de iva.
La quinta linea pide e imprime un subtotal.
La sexta linea es la del pago.
La séptima linea es la del cierre de comprobante.
Si miran con atención verán que el primer caracter es la representación ascii del comando fiscal.
Obviamente lo que aquí se ve como un símbolo raro es la representación del caracter CHR(28) que se utiliza como separador de campos.
Si todo está bien, la impresora nos devolverá un archivo con estas respuestas (siempre en relación el ejemplo de factura "A" de arriba):
b|1100000010000000|0000011000000000
@|1100000010000000|0011011000000000 |00000049
B|1100000010000000|0011011000000000
B|1100000010000000|0011011000000000
C|1100000010000000|0011011000000000 |2.0000|2. 32|0.32|0. 00|0.00|0. 00
D|1100000010000000|0011011000000000 |-97.68
E|1100000010000000|0000011000000000 |00000049| 1|2369-080096660 8
Entonces simplemente hay que leer este archivo plano y en base al primer caracter ir interpretando y rescatando los datos que nos interesan.
Por ejemplo de la linea "E" yo saco el nro. de comprobante otorgado y el nro. de cai y de la linea "C" saco los totales de iva acumulados.
El contenido de cada linea de respuesta es posicionalmente hablando EXACTAMENTE lo que figura en el manual como respuesta a cada comando.
Para facilitar la intepretación de las respuestas, el programa spooler reemplaza el caracter CHR(28) por el caracter "|" (pipe) como separador de campos.
RESUMEN:
1º) Genero un archivo ascii con la colección de comandos necesarios para una tarea determinada (emitir factura "A", pedir un cierre "Z", etc.) y copiarlo a la carpeta de entrada del spooler.
Si se trabaja desde varios puestos de trabajo simultáneos con una única impresora fiscal es conveniente que el nombre del archivo sea en parte relacionado con el puesto de trabajo y en parte al azar.
2º) Esperar alrededor de 20 segundos hasta que la impresora finaliza la impresión y luego leer el archivo de respuestas (mismo nombre que el de entrada pero con extensión ".ANS").
3º) Interpretar el archivo leido y en base a eso interactuar con el aplicativo propio.
VENTAJAS:
1º) Se puede operar la impresora fiscal desde varios puestos de trabajo simultáneamente, con solo tener acceso desde nuestra pc "facturadora" a las carpetas de spool de la pc donde físicamente está conectada la impresora fiscal... que es donde está corriendo el programa spooler.exe.
2º) Nuestro aplicativo se desentiende de abrir y cerrar puertos, setear velocidades y toda la cháchara del hardware. Simplemente le enviamos a la carpeta de spool los comandos a ejecutar.
3º) La operación del aplicactivo es más veloz porque no tiene que esperar la respuesta individual a cada comando sino que lee todo junto, al final y desde un archivo plano.
4º) Como de la parte del hardware se encarga el programa spooler.exe, no importa en qué lenguaje programemos siempre que seamos capaces de generar un archivo plano con los comandos y copiarlo a otra carpeta.
5º) En escenarios de Terminal Server o VPN podemos facturar en las sucursales SIN NINGUN ESFUERZO Y SIN RENEGAR CON EL HARDWARE, usando los programas y archivos que están en el servidor central (esto es maravilloso !!!).
EJEMPLO DE CODIFICACION:
Acá transcibo un ejemplo de cómo abro un loop esperando el archivo de respuestas de la respuesta de la impresora (en forma exclusiva para asegurarme que no falta nada) y luego interpreto ese archivo.
FUNCTION spoolmanager(cTipoDocum)
IF EMPTY(cSpoolDir) .OR. EMPTY(cAnswerDir)
ALERT('FALTA DEFINIR CARPETAS SPOOL FISCAL')
RETURN(.F.)
ENDIF
COPY FILE (cArchSpool) TO (cSpoolDir+cFileSPool)
PONER_MJE(24,"Recuperando Datos Finales... Espere un momento." )
INKEY(10)
********** ACA LEER RESULTADOS Y ASIGNAR nTic
cArchAnswer := ALLTRIM(cAnswerDir+cFileAnswer)
nCantLineas := 0
nIntentos := 20
nTic := 0
DO WHILE nIntentos > 0
IF FILE(cArchAnswer)
DO WHILE FT_FUSE(cArchAnswer,16)<1
ENDDO
FT_FGOTOP()
DO WHILE !FT_FEOF()
++nCantLineas
AADD(aLineasLeidas,FT_FREADLN( ))
FT_FSKIP()
ENDDO
FT_FUSE()
FOR I=1 TO nCantLineas
DO CASE
CASE cTipoDocum=='FACTURA'
IF LEFT(aLineasLeidas[I],1)='E'
nTic := VAL(SUBST(aLineasLeidas[I],37, 8)) //LINEA DE CIERRE DE COMPROBANTE (comando 'E')
cCai1 := (SUBST(aLineasLeidas[I],48,15) ) //LINEA DE CIERRE DE COMPROBANTE (comando 'E')
ENDIF
IF LEFT(aLineasLeidas[I],1)='C'
nTotalZZ := VAL(TOMAMEDIO(aLineasLeidas[ I],'|',4) ) //LINEA DE SUBTOTAL (comando 'C')
nIvaZZ := VAL(TOMAMEDIO(aLineasLeidas[ I],'|',5) ) //LINEA DE SUBTOTAL (comando 'C')
ENDIF
CASE cTipoDocum=='CREDITO'
IF LEFT(aLineasLeidas[I],1)=''
nTic := VAL(SUBST(aLineasLeidas[I],37, 8)) //LINEA DE CIERRE DE COMPROBANTE (comando 'E')
cCai1 := (SUBST(aLineasLeidas[I],48,15) ) //LINEA DE CIERRE DE COMPROBANTE (comando 'E')
ENDIF
IF LEFT(aLineasLeidas[I],1)='p'
nIvaZZ += VAL(TOMAMEDIO(aLineasLeidas[ I],'|',5) ) //LINEA DE SUBTOTAL
nTotalZZ += VAL(TOMAMEDIO(aLineasLeidas[ I],'|',8) ) //LINEA DE SUBTOTAL
ENDIF
IF LEFT(aLineasLeidas[I],1)='q'
nIvaZZ += VAL(TOMAMEDIO(aLineasLeidas[ I],'|',5) ) //LINEA DE SUBTOTAL
ENDIF
ENDCASE
NEXT
FERASE(cArchAnswer)
FERASE(cArchSpool)
EXIT
ENDIF
INKEY(.5)
nIntentos := nIntentos - 1
IF nIntentos = 0
IF ALERT('ESPERANDO RESPUESTA IMPRESORA FISCAL...;¨CONTINUA?',{'SI',' NO'}) < 2
nIntentos := 10
ENDIF
ENDIF
ENDDO
RETURN(.T.)
Espero haber sido claro.
Saludos...
Ricardo Sassy
8 29/09/2008, you wrote:Ricardo : Si no es mucha molestia, me anoto para tu explicación y desde ya muchas gracias
Gustavo Gabriele
De:
ifclipper@gruposyah [mailto:ifclipper@oo.com.ar gruposyahoo. ] En nombre de Ricardo Sassycom.ar
Enviado el: Lunes, 29 de Septiembre de 2008 10:04 p.m.
Para:ifclipper@gruposyah oo.com.ar
Asunto: RE: [ifclipper] Una mano... por favor...
Si alguien necesita una explicación del modo spool me avisan.
Es muy fácil y hay que desentenderse de la apertura del puerto y todo eso.
Solamente enviar los comandos relacionados conel documento a imprimir o la consulta que se le quiera efectuar a la impresora.
Saludos...
Ricardo Sassy
At 19:26 29/09/2008, you wrote:Mario : , alli Ricardo tiro una pista para utilizar la impresora en modo spooll del c2w, Igualmente muchas gracias
Gustavo
De:
ifclipper@gruposyah [mailto:ifclipper@oo.com.ar gruposyahoo. ] En nombre de mariomansilla@com.ar arnet.com. ar
Enviado el: Lunes, 29 de Septiembre de 2008 05:36 p.m.
Para:ifclipper@gruposyah oo.com.ar
Asunto: RE: [ifclipper] Una mano... por favor...
Hola Gustavo :
El ejemplo esta hecho para Hmg oficial , si tees util lo mismo te lo envio .
Saludos .
Mario Mansilla
> Mario : Disculpa la intromison en el tema, es que tengo el mismo problema.
> Tengo dearrollado un modulo de facturación en clipper52 funcionando
> correctamente y debi migrar el sistema , para lo cual utilice la
> herramienta
> de Ciro C2W, pero no puedo hacer funcionarla impresora. Me fui guiando
> con las instrucciones bajas de Hasar pero no hay caso.
> Podrias mandar un ejemplo , desde ya muchas gracias
>
>Gustavo Gabriele
>
> _____
>
>
De:ifclipper@gruposyah [mailto:ifclipper@oo.com.ar gruposyahoo. ] Encom.ar
> nombre de mariomansilla@arnet.com. ar
> Enviado el: Lunes, 29 de Septiembre de 2008 01:32 p.m.
> Para:ifclipper@gruposyah oo.com.ar
> Asunto: Re: [ifclipper] Una mano... por favor...
>
> Hola Ricardo :
> Disculpas recien hoy veo tu mensaje , yo pude
> hacer funcionar las impresoras fiscales hasar con la winfis32.dll y las
> epson con las ocx de epson , pero con HMG oficial .
> Aun no he tenido tiempo de probar las ocx de hasar .
> Cualquier cosa avisame .
> Saludos .
> Mario Mansilla
>
>
>
>
>> HolaEduardo .
>> Te agradezco la info.
>> Estoy usando ooHg + Harbour 1.0.
>> El problema que acabo de descubrir es que no puedo acceder a ninguna
>> dll.
>> Probé un ejemplo básico con una dll que tiene funciones que te devuelven
>> el
>> nro. de serie del disco y tampoco funciona.
>> EL programa ejecuta sin errores pero alga pasa que no anda.
>> Inclusive si le cambioel nombre a la dll tampo saltan errores asi que
>> tiene que ser algo muy elemental.
>>
>>
>
Desde ya gracias...
>> ¿Alquien probó acceder a la impresora usando los controles ocx?.
>>
>> Saludos...
>> Ricardo Sassy
>>
>> At 18:58 27/09/2008, you wrote:
>>>Ricardo
>>>
>>>En puertosur estamos armando una clase fiscal para xHarbour consola.
>>>No tengo idea si va a funcionar con Harbour.
>>>Solo te puedo decir q ayer la hice andar pero con xHarbour 1.00
>>> compilacion de
>>>PuertoSur.
>>>Otra version no me funciono. No tengo ni idea de como es el estado de
>>> Harbour
>>>y la compativilidad.
>>>
>>>Direcciones de correo electrónico del grupo
>>>
>>> Enlace relacionado: http://www.puertosur.org
>>> Enviar mensaje: PuertoSur@gruposyahoo.com.ar
>>> Suscribirse: PuertoSur-subscribe@gruposyahoo. com.ar
>>> Cancelar suscripción: PuertoSur-unsubscribe@gruposyahoo. com.ar
>>> Propietario: PuertoSur-owner@gruposyahoo. com.ar
>>>
>>>On Sat, 27 Sep 2008 18:01:01 -0300, Ricardo Sassy wrote
>>> > Hola Juan Carlos
>>> > Uso Harbour 1.0 en modo consola.
>>> > No tengo ningún warning ni nada raro en la compilación.
>>> > El exe se genera normalmente y su ejecución no produce erorres de
>>> ningún tipo.
>>> > Incluso intenté algo tan básico como esto:
>>> > cInfo := CallDll ( "VersionDLLFiscal" , "WINFIS32.DLL" )
>>> > alert(cInfo)
>>> > y devuelve un string vacio.
>>> >
>>> > Evidentemente me falta hacer algo que desconozco.
>>> > Por las dudas... ¿que fecha y tamaño tiene la winfis32.dll que estás
>>> usando?.
>>> > Estoy usando una del 01/12/2005 de 61440 bytes.
>>> > ¿Será que tengo una dll equivocada?.
>>> >
>>> > Saludos y gracias...
>>> > Ricardo Sassy
>>> >
>>> > At 14:13 27/09/2008, you wrote:
>>> >
>>>--
>>>Eduardo Rizzolo
>>> Eldorado, Misiones Argentina
>>> INF 0023
>>> Correo principal y Msn Hotmail:fullpaint@pinturas- misioneras. com.ar
>>> skype:fullpaint1
>>> ICQ:39280741
>>> www.creacionistas.com -> Que lindo cuentito nos contaron!!
>>> www.puertosur.org
>>>
>>>
>>>--------------------- --------- ------
>>>
>>>Enlaces a Yahoo! Grupos
>>>
>>>
>>>
>>>
>>
>>
>
>
Este mensaje ha sido verificado por el E-mail Protegido. Antivirus actualizado en 01/10/2008 / Versión: 0.93.1/8366