Márcio, segue abaixo uma função que criei para tratar o arquivo de retorno do ACBrNFeMonitor, mas como eu uso MiniGui, tive que fazer algumas alterações, que não testei, mas acho que vai funcionar no Clipper, somente dê uma olhada nas variáveis que estão com mais de 10 caracteres, que não é aceito pelo Clipper.
Código: Selecionar todos
FUNC ESP_RET(v_pro)
LOCAL ret:=.T.,nContador:=0
PRIV v_aOk:={}
DO WHILE !FILE(cArqSAI)
nContador+=1
inkey(.5)
IF nContador>120
msgNFE:="COMUNICACAO COM SEFAZ;Favor verificar se sua Conexão com a Internet esta ativa."
IF ALERT(msgNFE,{"Tentar Novamente","Cancelar"})==1
nContador=0
LOOP
ELSE
if file(cArqENT)
delete file (cArqENT)
endif
AADD(v_aOk,.F.)
AADD(v_aOk,"99-Falta de Comunicacao")
RETU (v_aOk)
ENDIF
ENDIF
ENDDO
nFileHandle = FOPEN( cArqSAI )
nFileSize = FSEEK( nFileHandle, 0, 2 )
FSEEK( nFileHandle, 0, 0 )
nBytesRead = 0
aLinha = ReadLin( nFileSize )
FCLOSE( nFileHandle )
IF LEN(aLinha)>0
v_l:=aLinha[1]
IF "OK:" $ v_l
IF v_pro="AdicionarNFe"
v_chv:=RIGHT(ALLTRIM(v_l),52)
AADD(v_aOk,.T.)
AADD(v_aOk,LEFT(v_chv,44))
ENDIF
IF v_pro="StatusServico"
AADD(v_aOk,.T.)
ENDIF
IF v_pro="ConsultarNFe"
AADD(v_aOk,.T.)
FOR vli=1 TO LEN(aLinha)
v_l:=aLinha[vli]
IF LEFT(v_l,6)="CStat="
AADD(v_aOk,"CStat="+ALLTRIM(SUBS(v_l,7)))
ENDIF
IF LEFT(v_l,8)="XMotivo="
AADD(v_aOk,"XMotivo="+ALLTRIM(SUBS(v_l,9)))
ENDIF
IF LEFT(v_l,9)="DhRecbto="
AADD(v_aOk,"DhRecbto="+ALLTRIM(SUBS(v_l,10)))
ENDIF
IF LEFT(v_l,6)="NProt="
AADD(v_aOk,"NProt="+ALLTRIM(SUBS(v_l,7)))
ENDIF
IF LEFT(v_l,7)="DigVal="
AADD(v_aOk,"DigVal="+ALLTRIM(SUBS(v_l,8)))
ENDIF
NEXT
ENDIF
IF v_pro="CancelarNFe"
IF "Rejeição:" $ v_l
AADD(v_aOk,.F.)
FOR vli=1 TO LEN(aLinha)
v_l:=aLinha[vli]
IF LEFT(v_l,6)="CStat="
AADD(v_aOk,"Código = "+ALLTRIM(SUBS(v_l,7)))
ENDIF
IF LEFT(v_l,8)="XMotivo="
AADD(v_aOk,"Motivo = "+ALLTRIM(SUBS(v_l,9)))
ENDIF
NEXT
ELSE
AADD(v_aOk,.T.)
FOR vli=1 TO LEN(aLinha)
v_l:=aLinha[vli]
IF LEFT(v_l,6)="CStat="
AADD(v_aOk,"CStat="+ALLTRIM(SUBS(v_l,7)))
ENDIF
IF LEFT(v_l,8)="XMotivo="
AADD(v_aOk,"XMotivo="+ALLTRIM(SUBS(v_l,9)))
ENDIF
IF LEFT(v_l,9)="DhRecbto="
AADD(v_aOk,"DhRecbto="+ALLTRIM(SUBS(v_l,10)))
ENDIF
IF LEFT(v_l,6)="NProt="
AADD(v_aOk,"NProt="+ALLTRIM(SUBS(v_l,7)))
ENDIF
IF LEFT(v_l,7)="DigVal="
AADD(v_aOk,"DigVal="+ALLTRIM(SUBS(v_l,8)))
ENDIF
NEXT
ENDIF
ENDIF
IF v_pro="EnviarLoteNFe"
AADD(v_aOk,.T.)
vTag=1
vNRec=""
FOR vli=14 TO LEN(aLinha)
v_l:=aLinha[vli]
IF LEFT(v_l,5)="NRec="
vNRec=ALLTRIM(SUBS(v_l,6))
AADD(v_aOk,vNRec)
ENDIF
IF LEFT(v_l,6)="CStat="
IF vTag>2
AADD(v_aOk,"CStat="+ALLTRIM(SUBS(v_l,7)))
ELSE
vTag+=1
ENDIF
ENDIF
IF LEFT(v_l,8)="XMotivo="
IF vTag>2
AADD(v_aOk,"XMotivo="+ALLTRIM(SUBS(v_l,9)))
ELSE
vTag+=1
ENDIF
ENDIF
IF LEFT(v_l,9)="DhRecbto="
IF vTag>2
AADD(v_aOk,"DhRecbto="+ALLTRIM(SUBS(v_l,10)))
ELSE
vTag+=1
ENDIF
ENDIF
IF LEFT(v_l,4)="[NFE"
v_temp=STRTRAN(SUBS(v_l,5),"]","")
v_n_nfe:=STRZERO(VAL(v_temp),6)
AADD(v_aOk,"NFE"+v_n_nfe)
ENDIF
IF LEFT(v_l,6)="NProt="
AADD(v_aOk,"NProt="+ALLTRIM(SUBS(v_l,7)))
ENDIF
IF LEFT(v_l,7)="DigVal="
AADD(v_aOk,"DigVal="+ALLTRIM(SUBS(v_l,8)))
ENDIF
NEXT
ENDIF
ELSE
AADD(v_aOk,.F.)
FOR vli=1 TO LEN(aLinha)
AADD(v_aOk,aLinha[vli])
NEXT
ENDIF
ELSE
AADD(v_aOk,.F.)
AADD(v_aOk,"98-Arquivo de retorno vazio")
ENDIF
IF FILE(cArqSAI)
DELETE FILE (cArqSAI)
ENDIF
RETU v_aOk
FUNCTION ReadLin(nFileSize)
PRIV v_L:={}
cAccumText:=""
DO WHILE nBytesRead<=nFileSize
cSingle = FREADSTR( nFileHandle, 1 )
nBytesRead = nBytesRead + 1
IF cSingle = CHR(13)
cSingle = FREADSTR( nFileHandle, 1 )
nBytesRead = nBytesRead + 1
IF cSingle = CHR(10)
cSingle = FREADSTR( nFileHandle, 1 )
nBytesRead = nBytesRead + 1
IF !(cSingle = CHR(26) .OR. ASC(cSingle) = 0)
FSEEK( nFileHandle, -1, 1 )
nBytesRead = nBytesRead - 1
ENDIF
ELSE
IF !(cSingle = CHR(26) .OR. ASC(cSingle) = 0)
FSEEK( nFileHandle, -1, 1 )
nBytesRead = nBytesRead - 1
ENDIF
ENDIF
AADD(v_L,cAccumText)
cSingle = ""
cAccumText = ""
ELSE
cAccumText = cAccumText + cSingle
ENDIF
ENDDO
RETURN v_L
Declarar as seguintes variáveis:
Código: Selecionar todos
Private cArqENT:="C:\ACBrNFeMonitor\ENTNFE.TXT"
Private cArqSAI:="C:\ACBrNFeMonitor\SAINFE.TXT"
Exemplo de uso:
Código: Selecionar todos
aOk2=ESP_RET("ConsultarNFe")
IF aOk2[1]
FOR v_i=2 TO LEN(aOk2)
IF LEFT(aOk2[v_i],6)="CStat="
vSCAL5_40:=SUBS(aOk2[v_i],7)
ENDIF
IF LEFT(aOk2[v_i],8)="XMotivo="
vSCAL5_32:=SUBS(aOk2[v_i],9)
ENDIF
IF LEFT(aOk2[v_i],9)="DhRecbto="
vSCAL5_42:=SUBS(aOk2[v_i],10)
ENDIF
IF LEFT(aOk2[v_i],6)="NProt="
vSCAL5_34:=SUBS(aOk2[v_i],7)
ENDIF
IF LEFT(aOk2[v_i],7)="DigVal="
vSCAL5_43:=SUBS(aOk2[v_i],8)
ENDIF
NEXT
//AQUI GRAVA OS DADOS NO DBF
ELSE
vMsg:="Ocorreu um Erro da Consulta!"
FOR i=2 TO LEN(aOk2)
vMsg+=";"+aOk2[i]
NEXT
TONE(1000)
ALERT(vMsg)
ENDIF
Esta minha função também está bem focada para o meu sistema, então vai servir apenas como base para você.
Abraços,