Pegar retorno TEF

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Marquin
Usuário Nível 1
Usuário Nível 1
Mensagens: 21
Registrado em: 06 Jul 2004 09:09
Localização: Itumbiara

Pegar retorno TEF

Mensagem por Marquin »

Boa tarde,

Alguem poderia me ajudar referente ao retorno da impressora fiscal. do tipo: se o papel esta pouco ou se o comando não foi executado e etc...

Não estou conseguindo a logica para fazer a pergunta

"a impressora não esta respondendo. Continuar?, { "sim", "não" }"

Obrigados a todos pela atenção

Marquin
Que Deus olhe por todos
Visitante

Mensagem por Visitante »

Nunca trabalhei com impressora fiscal, então...

Vc já testou usar a função IsPrinter() para saber se a impressora está online?

Em impressoras normais e autenticadoras de documentos (que são as que eu costumo a usar) funcionam muito bem...

Um Clip Abraço
josenilson
Usuário Nível 1
Usuário Nível 1
Mensagens: 46
Registrado em: 14 Set 2004 10:58

Mensagem por josenilson »

Qual é a impressora fiscal que vc está usando?

Se for a Bematech, qual é o meio de acesso: mp20drv , bemafi.exe , bematechmonitor?


Pra te ajudar com a impressora, precisamos saber qual é a que vc usa no teu aplicativo.
geraldenaw
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 12 Set 2005 11:27

Re: Pegar retorno TEF

Mensagem por geraldenaw »

Marquin escreveu:Boa tarde,

Alguem poderia me ajudar referente ao retorno da impressora fiscal. do tipo: se o papel esta pouco ou se o comando não foi executado e etc...

Não estou conseguindo a logica para fazer a pergunta

"a impressora não esta respondendo. Continuar?, { "sim", "não" }"

Obrigados a todos pela atenção

Marquin

Boa tarde amigo,

Eu faço a pergunta de acordo com o que a impressora retorna. Primeiro eu preencho uma matriz com os retornos do ecf:

**--- ST1
AADD(aST1,{" 7 Fim de papel ","F"})
AADD(aST1,{" 6 Impressora com pouco papel ","T"})
AADD(aST1,{" 5 Erro no rel¢gio ","F"})
AADD(aST1,{" 4 Impressora em erro ","F"})
AADD(aST1,{" 3 Primeiro dado de CMD nao foi ESC (1Bh) ","F"})
AADD(aST1,{" 2 Comando inexistente ","F"})
AADD(aST1,{" 1 Impressora com Cupom aberto ",""})
AADD(aST1,{" 0 N£mero de parƒmetros de CMD inv lido ","F"})

**--- ST2
AADD(aST2,{" 7 Tipo de parƒmetro de CMD inv lido ","F"})
AADD(aST2,{" 6 Mem¢ria fiscal lotada ","F"})
AADD(aST2,{" 5 Erro na Mem¢ria RAM CMOS nao vol til ","F"})
AADD(aST2,{" 4 Al¡quota nao programada ","F"})
AADD(aST2,{" 3 Capacidade de al¡quotas program veis lotada ","F"})
AADD(aST2,{" 2 Cancelamento nÆo permitido ","F"})
AADD(aST2,{" 1 CGC/IE do propriet rio nao programados ","F"})
AADD(aST2,{" 0 Comando nao executado ","F"})

Depois envio o comando e pego o retorno:

**--- Envia sequencia de bytes para impressora
**************************************************************************************
FUNCTION COMUNICA_COM_ECF(buffer_a_ser_enviado,InicioRetorno,LenRetorno,StringRetorno)
LOCAL nErro:=0
IF UPPER(cMarca_Ecf)==[BEMATECH]

IF cTipoDriver_Ecf==[1]
FWRITE(NUMERO_PORTA, @buffer_a_ser_enviado, LEN(buffer_a_ser_enviado))

ELSEIF cTipoDriver_Ecf==[2]
IF !ECFGRAVAARQ(buffer_a_ser_enviado)
RETURN(.F.)
ENDIF

ELSEIF cTipoDriver_Ecf==[3]
ECFGRAVAARQ(buffer_a_ser_enviado)
!BEMAFI.EXE
ENDIF

ELSEIF UPPER(cMarca_Ecf)==[SWEDA]
IF cTipoDriver_Ecf==[1]
set device to printer
set printer to ifsweda
@ prow(),pcol() say buffer_a_ser_enviado
set printer to
set device to screen
ELSEIF cTipoDriver_Ecf==[3]
IF !ECFGRAVAARQ(buffer_a_ser_enviado)
RETURN(.F.)
ENDIF
ENDIF
ELSEIF UPPER(cMarca_Ecf)==[DARUMA]
IF !ECFGRAVAARQ(buffer_a_ser_enviado)
RETURN(.F.)
ENDIF
ENDIF
nErro := VER_STATUS(InicioRetorno,LenRetorno,@StringRetorno)
IF nErro=0
RETURN(.T.)
ELSE
RETURN(.F.)
ENDIF


Depois no Ver_Status do Ecf jogo a mensagem para o operador:
**************************************************************
FUNCTION VER_STATUS(pInicioRetorno,pLenRetorno,pStringRetorno)
LOCAL iArqStatus, iTamArqStatus, iTamArqRetorno
LOCAL ack,st1,st2,Sinal,Letra,nTentativas,H:=0,nRetorno:=0,retecf:=""

pInicioRetorno:=IF(pInicioRetorno==NIL,0,pInicioRetorno)
pLenRetorno :=IF(pLenRetorno==NIL,0,pLenRetorno)
pStringRetorno:=IF(pStringRetorno==NIL,"",pStringRetorno)

nTentativas := 0
Buffer :=" "

IF UPPER(cMarca_Ecf)==[SWEDA]
nRetorno:=0
IF cTipoDriver_Ecf ==[1]
Numero_Porta := fopen("ifsweda.prn")
retecf := freadstr(Numero_Porta,128)
fclose(Numero_Porta)

ELSEIF cTipoDriver_Ecf ==[3]
Numero_Porta := fopen(cEcfDirRet+"\SW_RESP.CMD")
retecf := freadstr(numero_porta,128)
fclose(numero_porta)

ECFDELETAARQ(cEcfDirRet+"\SW_RESP.CMD")
ENDIF

IF EMPTY(retecf)
DIALOGUE({" Falha na Comunica‡Æo com o Ecf! "})
tone(400, 2)
nRetorno:=1
ENDIF

Sinal := SUBST(retecf, 2, 1)
Letra := SUBST(retecf, 3, 1)
aut := SUBST(retecf, 4, 1)
slip := SUBST(retecf, 5, 1)
Bobina:= SUBST(retecf, 6, 1)

IF Sinal == "-"
tone(400, 2)
nRetorno:=1

aMSG:=TRATAMSG(retecf)
IF !EMPTY(aMsg)
DIALOGUE(aMsg)
ENDIF


IF Letra == "P"
MSG:={}
DO CASE
CASE aut = "0"
// AADD(MSG," AUT: H  documento para autenticar ")
CASE aut = "1"
AADD(MSG," AUT: Impressora off-line ")
CASE aut = "2"
AADD(MSG," AUT: Time-out de Transmissao ")
CASE aut = "5"
AADD(MSG," AUT: Sem documento para autenticar ")
CASE aut = "6"
AADD(MSG," AUT: Sem documento ou resposta ")
ENDCASE

DO CASE
CASE slip = "0"
// AADD(MSG," SLIP: H  folha presente ")
CASE slip = "1"
AADD(MSG," SLIP: Impressora off-line ")
CASE slip = "2"
AADD(MSG," SLIP: Time-out de Transmissao ")
CASE slip = "5"
AADD(MSG," SLIP: Sem folha solta presente ")
CASE slip = "6"
AADD(MSG," SLIP: Time-out de recepcao ")
ENDCASE

DO CASE
CASE Bobina = "0"
//AADD(MSG," Bobina: Impressora tem papel ")
CASE Bobina = "1"
AADD(MSG," Bobina: Impressora off-line ")
CASE Bobina = "2"
AADD(MSG," Bobina: Time-out de Transmissao ")
CASE Bobina = "3"
AADD(MSG," Bobina: Sem papel, lado Jornal ")
CASE Bobina = "4"
AADD(MSG," Bobina: Sem papel, lado cupom ")
CASE Bobina = "5"
AADD(MSG," Bobina: Sem papel, cupom e jornal ")
CASE Bobina = "6"
AADD(MSG," Bobina: Time-out de recepcao ")
ENDCASE
DIALOGUE(MSG)
ENDIF

ELSEIF Sinal == "+"
nRetorno:=0
IF Letra == [G]
IF Bobina == "0"
//DIALOGUE({" Gaveta Aberta "})
ELSEIF Bobina == "1"
//DIALOGUE({" Gaveta Fechada "})
ENDIF
ELSEIF Letra==[C]

ENDIF

IF TEM_LETRA(Letra)
pStringRetorno:= SUBST(RetEcf,4,AT("}",RetEcf)-1)
ELSE
pStringRetorno:= SUBST(RetEcf,3,AT("}",RetEcf)-1)
ENDIF
pStringRetorno:= SUBST(pStringRetorno,pInicioRetorno,pLenRetorno)


ENDIF
RETURN(nRetorno)
ELSE
IF UPPER(cMarca_Ecf)==[BEMATECH]
IF cTipoDriver_Ecf==[1] // Usando Driver Dos
PROCESSO(@H,"Lendo status da impressora...")

**--- Pega ack
ack := ""
fread(Numero_Porta, @Buffer, 1 )
ack := asc(Buffer)

**--- Pega ST1
st1 := ""
fread(Numero_Porta, @Buffer, 1 )
st1 := ASC(Buffer)

**--- Pega ST2
st2 := ""
fread(Numero_Porta, @Buffer, 1 )
st2 := ASC(Buffer)

**--- Pega String de Retorno
**--------------------------
pStringRetorno := ""
for x:= 1 to pLenRetorno
fread( Numero_Porta, @Buffer, 1 )
if Buffer = "," .OR. Buffer = "" .OR. Buffer = " " .OR. ASC(Buffer)=0
EXIT
else
pStringRetorno += Buffer
endif
next x

ELSEIF cTipoDriver_Ecf==[2] .OR. cTipoDriver_Ecf==[3] // Usando Comunica‡Æo direta
DO WHILE .T.
IF FILE(cEcfDirRet+"\STATUS.TXT" ) .AND. FREADSTR(FILE( cEcfDirRet+"\STATUS.TXT" ) ) <> "0"
iArqStatus := FOpen( cEcfDirRet+"\STATUS.TXT" )
iTamArqStatus := FSeek( iArqStatus, 0, 2 )
FClose( iArqStatus )

iArqStatus := FOpen( cEcfDirRet+"\STATUS.TXT" )
sRetorno := " "
sDadosStatus:= ""
For x := 1 to iTamArqStatus
FRead( iArqStatus, @sRetorno, 1 )
sDadosStatus = sDadosStatus + sRetorno
Next
FClose( iArqStatus )

IF EMPTY(sDadosStatus)
LOOP
ENDIF

sinal := sdadosstatus
**--- Pega ACK
ack := ""
IF cTipoDriver_Ecf==[2]
ack := SUBST(sDadosStatus,1,AT(",",sDadosStatus)-1)
sDadosStatus:=SUBST(sDadosStatus,AT(",",sDadosStatus)+1)
ELSE
ack := SUBST(sDadosStatus,1,3)
sDadosStatus:=SUBST(sDadosStatus,4)
ENDIF

**--- Pega ST1
st1 := ""
IF cTipoDriver_Ecf==[2]
st1 := SUBST(sDadosStatus,1,AT(",",sDadosStatus)-1)
sDadosStatus:=SUBST(sDadosStatus,AT(",",sDadosStatus)+1)
ELSE
st1 := SUBST(sDadosStatus,1,3)
sDadosStatus:=SUBST(sDadosStatus,4)
ENDIF

**--- Pega ST2
st2 := ""
IF cTipoDriver_Ecf==[2]
st2 := SUBST(sDadosStatus,1,AT(CHR(13)+CHR(10),sDadosStatus)-1)
sDadosStatus:=SUBST(sDadosStatus,AT(CHR(13)+CHR(10),sDadosStatus)+1)
ELSE
st2 := SUBST(sDadosStatus,1,3)
sDadosStatus:=SUBST(sDadosStatus,4)
ENDIF

ack := val(ack)
st1 := val(st1)
st2 := val(st2)

IF File (cEcfDirRet+"\RETORNO.TXT" )
iArqRetorno := FOpen( cEcfDirRet+"\RETORNO.TXT" )
iTamArqRetorno := FSeek( iArqRetorno, 0, 2 )
FClose( iArqRetorno )
iArqRetorno := FOpen( cEcfDirRet+"\RETORNO.TXT" )
sRetorno := " "
sDadosRetorno := ""

For x := 1 to iTamArqRetorno
FRead( iArqRetorno, @sRetorno, 1 )
sDadosRetorno = sDadosRetorno + sRetorno
Next
pStringRetorno := sDadosRetorno
FClose( iArqRetorno )
//delete file( cEcfDirRet+"\RETORNO.TXT" )
ENDIF
EXIT
ENDIF
ENDDO
ENDIF
ELSEIF UPPER(cMarca_Ecf)==[DARUMA]
nTamanhoRetorno:=0
DO WHILE nTamanhoRetorno==0
PROCESSO(@H,"Lendo Conte£do do Arquivo...")
nHandle :=FOPEN("C:\DARUMA.RET")
nTamanhoRetorno:=FSEEK(nHandle,0,FS_END)
FCLOSE(nHandle)
ENDDO

/* Pega o retorno da impressora */
nHandle:=FOPEN("C:\DARUMA.RET")

nPosRetorno:=0
cRetornoCMD:=" "
cAuxiliar :=" "
IF nTamanhoRetorno > 0
FOR nPosRetorno:=1 TO nTamanhoRetorno-1
FREAD(nHandle,@cAuxiliar,1)
IF cAuxiliar <> CHR(13)
cRetornoCMD:=cRetornoCMD+cAuxiliar
ENDIF
NEXT
ENDIF
FCLOSE(nHandle)

cRetornoCMD := ALLTRIM(cRetornoCMD)
pStringRetorno:= SUBST(STRTRAN(cRetornoCMD,";"),13)

**-- Pega ACK
ack:=" "
ack:=SUBST(cRetornoCMD,5,3)

**-- Pega ST1
st1:=" "
st1:=SUBST(cRetornoCMD,9,3)

**-- Pega ST2
st2:=" "
st2:=SUBST(cRetornoCMD,13,3)

ack:=val(ack)
st1:=val(st1)
st2:=val(st2)
ENDIF

RESULT := ""

aMsg := {" Aten‡Æo ",;
" "}

***--- Verificando ack
IF ack<>6
AADD(aMsg,"Erro de Comunica‡ao o ECF retornou ACK="+alltrim(str(ack))+" ")
RESULT+="P"
ENDIF

***--- Verificando o st1
FOR I:=1 TO LEN(aBits)
IF ST1 >= aBits
IF ST1 <> 2
AADD(aMsg,aST1[I,1])
ENDIF
ST1 -= aBits
RESULT+=aST1[I,2]
ENDIF
NEXT

***---- Verificando o ST2
FOR I:=1 TO LEN(aBits)
IF ST2 >= aBits
AADD(aMsg,aST2[I,1])
ST2 -= aBits
RESULT+=aST2[I,2]
ENDIF
NEXT

IF LEN(aMsg)>2
DIALOGUE(aMsg)
IF EMPTY(RESULT)
nRetorno:=0
ELSE
IF "F" $ RESULT ; nRetorno:=1 ; ENDIF
IF "P" $ RESULT ; nRetorno:=9 ; ENDIF
ENDIF
ECFERROR(aMsg,ack,st1,st2)
ENDIF
ENDIF
RETURN(nRetorno)

Espero que tenha ajudado. Qualquer dúvida entre em contato pelo msn geraldo_p_franca@hotmail.com ou skype gpfranca.
Geraldo Pereira França
Programador Clipper, Delphi e Java
Skype: gpfranca
Responder