Function LeRetorno400( Arq_Brd, oDir, gBanco )
************************************************************************
* Fun‡Æo para ler o arqivo de retorno baixado e gravado no disco
************************************************************************
local Bloco   := 400                      ,;
      tBuffer := MemoRead( Arq_Brd )      ,;
      cCount  := MlCount( tBuffer, Bloco ),;
      gCont   := 0

private glinha     := .F.   ,;
        gData_Rec  := date(),;
        gValor_Rec := 0     ,;
        gCheque    := 999999,;
        gOcorr

Linha1    := substr( tBuffer, 1, 400 )
arrLin    := {}
vTemErros := .f.
   
if at( "RETORNO", MemoLine( tBuffer, 40, 1 ) ) == 0
   SN := MsgAlert( 'Este nÆo parece ser um arquivo de retorno! Verifique.  Continua? ',' ATEN€ÇO ! ', {' NÆo ',' Sim '})
   if SN == 1
      return( .t. )
   endif
endif

GravaLin400("Id do registro...............: " , substr(Linha1,001,01), "N0", " ", " ")
GravaLin400("Id do arquivo retorno........: " , substr(Linha1,002,01), "N0", " ", " ")
GravaLin400("Literal......................: " , substr(Linha1,003,07), "C ", " ", " ")
GravaLin400("Codigo do servico............: " , substr(Linha1,010,02), "N0", " ", " ")
GravaLin400("Literal de servico...........: " , substr(Linha1,012,15), "C ", " ", " ")
if vCodBanco == 001                           // B. BRASIL
   GravaLin400("Agencia mantenedora da conta.: " , substr(Linha1,027,05), "NO", " ", " ")
   GravaLin400("C¢digo do cedente............: " , substr(Linha1,032,09), "C ", " ", " ")
   GravaLin400("C¢digo do convenente lider...: " , substr(Linha1,041,06), "NO", " ", " ")
endif

if vCodBanco == 003                           // BASA                               
   GravaLin400("Codigo da empresa............: " , substr(Linha1,027,20), "N0", " ", "*")
endif
if vCodBanco == 237                           // BRADESCO
   GravaLin400("Codigo da empresa............: " , substr(Linha1,027,20), "N0", " ", "*")
endif
if vCodBanco == 341                           // ITAU
   GravaLin400("Agencia mantenedora da conta.: " , substr(Linha1,027,04), "NO", " ", " ")
   GravaLin400("Numero da conta corrente.....: " , substr(Linha1,033,05), "NO", " ", " ")
   GravaLin400("Digito de auto conferencia...: " , substr(Linha1,038,01), "C ", " ", " ")
endif
if vCodBanco == 399                           // HSBC
   GravaLin400("Agencia mantenedora da conta.: " , substr(Linha1,028,04), "NO", " ", " ")
   GravaLin400("Numero da conta corrente.....: " , substr(Linha1,032,13), "NO", " ", " ")
endif
GravaLin400("Nome da empresa..............: " , substr(Linha1,047,30), "C ", " ", "*")
GravaLin400("Numero do banco..............: " , substr(Linha1,077,03), "N0", " ", " ")
GravaLin400("Nome do banco................: " , substr(Linha1,080,15), "C ", " ", " ")
GravaLin400("Data da gravacao.............: " , substr(Linha1,095,06), "D ", " ", "*")
if vCodBanco <> 001                           // B. BRASIL
   GravaLin400("Numero do aviso bancario.....: " , substr(Linha1,109,05), "N0", " ", "*")
endif   
if vCodBanco == 003                           // BASA                               
   GravaLin400("Data do credito..............: " , substr(Linha1,380,06), "D ", " ", "*")
endif   
if vCodBanco == 237                           // BASA                               
   GravaLin400("Data do credito..............: " , substr(Linha1,380,06), "D ", " ", "*")
endif   
if vCodBanco == 341                           // ITAU
   GravaLin400("Data do credito..............: " , substr(Linha1,114,06), "D ", " ", "*")
endif
if vCodBanco == 399                           // HSBC
   GravaLin400("Data do credito..............: " , substr(Linha1,120,06), "D ", " ", "*")
endif

GravaLin400("Numero sequencial do registro: " , substr(Linha1,395,06), "N0", " ", " ")
GravaLin400("Data/hora processamento local: " , dtoc(date())+' as '+time(),"C ", " ", "*")

tBUFFER := StrTran( tBUFFER, chr(13)+chr(10),, 1 )  // Remove o CR e LF
tBUFFER := StrTran( tBUFFER, LINHA1,, 1 )           // Elimina o que j  fez
Linha2  := substr( tBuffer, 1, 400 )                // Pega uma nova cadeia

do while substr( Linha2, 1, 1 ) == "1"
   gOcorr     := "00"
   flag_ocorr := .f.
   ValorLin   := ""
   vTemErros  := .f.
   vBxReceber := .f.
   gCont++

   aadd( arrLin, "+" + replicate( "-", 75 ) )

   GravaLin400("Id do registro................: ", substr(Linha2,001,01), "N0", "###", " ")
   GravaLin400("Tipo de insc. da empresa......: ", substr(Linha2,002,02), "N0", "TpCGCCPF", " ")
   GravaLin400("Num. Insc. da empresa.........: ", substr(Linha2,004,14), "N0", "CGCCPF", " ")
   if vCodBanco == 001                              // B. BRASIL
      GravaLin400("Agencia mantenedora da conta..: ", substr(Linha2,018,05), "C ", " ", " ")
      GravaLin400("Codigo do cedente.............: ", substr(Linha2,023,09), "C ", " ", " ")
      GravaLin400("Num. controle do participante.: ", substr(Linha2,038,25), "C ", "NroBanco", "*")
      GravaLin400("Id. do titulo no banco........: ", substr(Linha2,063,12), "NO", "IdTitBco", "*")      
   endif
   if vCodBanco == 003                              // BASA
      GravaLin400("Id. da empresa cedente no bco.: ", substr(Linha2,021,17), "C ", " ", " ")
      GravaLin400("Num. controle do participante.: ", substr(Linha2,038,25), "C ", "NroBanco", "*")
      GravaLin400("Id. do titulo no banco........: ", substr(Linha2,071,12), "C ", "IdTitBco", " ")
   endif   
   if vCodBanco == 237                              // BRADESCO
      GravaLin400("Id. da empresa cedente no bco.: ", substr(Linha2,021,17), "C ", " ", " ")
      GravaLin400("Num. controle do participante.: ", substr(Linha2,056,07), "C ", "NroBanco", "*")
      GravaLin400("Id. do titulo no banco........: ", substr(Linha2,071,12), "C ", "IdTitBco", " ")
      GravaLin400("Ind. de Credito ou Rateio.....: ", substr(Linha2,105,01), "C ", " ", " ")
      GravaLin400("Carteira......................: ", substr(Linha2,108,01), "N0", " ", " ")
   endif   
   if vCodBanco == 341                              // ITAU
      GravaLin400("Agencia mantenedora da conta..: ", substr(Linha2,018,04), "NO", " ", " ")
      GravaLin400("Numero da conta corrente......: ", substr(Linha2,024,05), "NO", " ", " ")
      GravaLin400("DV da conta ..................: ", substr(Linha2,029,01), "NO", " ", " ")      
      GravaLin400("Nosso numero..................: ", substr(Linha2,038,25), "C ", "NroBanco", "*")      
      GravaLin400("Id. do titulo no banco........: ", substr(Linha2,063,08), "NO", "IdTitBco", " ")      
      GravaLin400("Carteira......................: ", substr(Linha2,083,03), "NO", " ", " ")      
      GravaLin400("Id. do titulo no banco........: ", substr(Linha2,086,08), "NO", " ", " ")      
      GravaLin400("DAC do titulo no banco........: ", substr(Linha2,094,01), "NO", " ", " ")      
      GravaLin400("Codigo da carteira............: ", substr(Linha2,108,01), "C ", " ", " ")            
   endif
   if vCodBanco == 399                              // HSBC
      GravaLin400("Agencia mantenedora da conta..: ", substr(Linha2,019,04), "NO", " ", " ")
      GravaLin400("Numero da conta corrente......: ", substr(Linha2,023,11), "NO", " ", " ")
      GravaLin400("DV da conta ..................: ", substr(Linha2,034,02), "NO", " ", " ")      
      GravaLin400("Nosso numero..................: ", substr(Linha2,038,25), "C ", "NroBanco", "*")      
      GravaLin400("Id. do titulo no banco........: ", substr(Linha2,063,11), "NO", "IdTitBco", " ")      
      GravaLin400("Carteira......................: ", substr(Linha2,108,01), "NO", " ", " ")      
   endif
   
   if vCodBanco == 001                             // B. BRASIL
      vDescOcorr:=Ocorrencias( strzero(vCodBanco,3), substr(Linha2,109,2), substr(Linha2,081,02) )
   endif   

   if vCodBanco == 003                              // BASA
      vDescOcorr:=Ocorrencias( strzero(vCodBanco,3), substr(Linha2,109,2), substr(Linha2,319,10) )
   endif   

   if vCodBanco == 237                              // BRADESCO
      vDescOcorr:=Ocorrencias( strzero(vCodBanco,3), substr(Linha2,109,2), substr(Linha2,319,10) )
   endif   

   if vCodBanco == 341
      do case
         case substr(Linha2,109,2) $ "03/15/16/17/18"
              vDescOcorr:=Ocorrencias( strzero(vCodBanco,3), substr(Linha2,109,2), substr(Linha2,378,08) )
         case substr(Linha2,109,2) $ "57"
              vDescOcorr:=Ocorrencias( strzero(vCodBanco,3), substr(Linha2,109,2), substr(Linha2,302,04) )
         case substr(Linha2,109,2) $ "24/25"    
              vDescOcorr:=Ocorrencias( strzero(vCodBanco,3), substr(Linha2,109,2), substr(Linha2,302,23) )
         otherwise
              vDescOcorr:=Ocorrencias( strzero(vCodBanco,3), substr(Linha2,109,2), substr(Linha2,302,04) )            
      endcase                
   endif

   if vCodBanco == 399                              // HSBC
      vDescOcorr:=Ocorrencias( strzero(vCodBanco,3), substr(Linha2,109,2), substr(Linha2,302,02) )
      do case
         case substr(Linha2,109,2) $ "03"
              vDescOcorr:=Ocorrencias( strzero(vCodBanco,3), substr(Linha2,109,2), substr(Linha2,302,02) )
         case substr(Linha2,109,2) $ "69"
              vDescOcorr:=Ocorrencias( strzero(vCodBanco,3), substr(Linha2,109,2), substr(Linha2,176,12) )
         otherwise
              vDescOcorr:=Ocorrencias( strzero(vCodBanco,3), substr(Linha2,109,2), substr(Linha2,302,02) )            
      endcase                
   endif   

   GravaLin400("Id. da Ocorrencia.............: ", substr(Linha2,109,02), "N0", "vMotivoOcorrencia", "*")

   GravaLin400("Ocorrencias ..................: ", vDescOcorr, "C ", " ", "*")
      
   if vCodBanco == 001                             // B. BRASIL
      GravaLin400("Data do Recebimento...........: ", substr(Linha2,111,06), "D ", "DataRec", "*")
   else
      GravaLin400("Data do Registro no Banco.....: ", substr(Linha2,111,06), "D ", " ", "*")
   endif   
   
   GravaLin400("Num. do Documento.............: ", substr(Linha2,117,10), "C ", " ", "*")
   GravaLin400("Dt. do venc. do titulo........: ", substr(Linha2,147,06), "D ", "DataVenc", "*")
   GravaLin400("Valor do titulo...............: ", substr(Linha2,153,13), "N2", "VlrTit", "*")
   GravaLin400("Banco cobrador................: ", substr(Linha2,166,03), "N0", " ", " ")
   GravaLin400("Agencia cobradora.............: ", substr(Linha2,169,05), "N0", " ", " ")
   if vCodBanco <> 001
      GravaLin400("Despesas de cobranca..........: ", substr(Linha2,176,13), "N2", " ", " ")
   else
      GravaLin400("Data do credito...............: ", substr(Linha2,176,06), "D ", " ", " ")   
   endif
     
   if vCodBanco <> 341 .and. vCodBanco <> 399
      GravaLin400("Outras desp. / Custas processo: ", substr(Linha2,189,13), "N2", " ", " ")
      GravaLin400("Juros operacao em atraso......: ", substr(Linha2,202,13), "N2", " ", " ")
   endif   
   GravaLin400("IOF devido....................: ", substr(Linha2,215,13), "N2", " ", " ")
   GravaLin400("Abatimento concedido..........: ", substr(Linha2,228,13), "N2", " ", " ")
   GravaLin400("Desconto concedido............: ", substr(Linha2,241,13), "N2", " ", " ")
   GravaLin400("Valor pago....................: ", substr(Linha2,254,13), "N2", "ValorRec", "*")
   GravaLin400("Juros de mora.................: ", substr(Linha2,267,13), "N2", " ", " ")
   if vCodBanco <> 341 .and. vCodBanco <> 399
      GravaLin400("Outros creditos...............: ", substr(Linha2,280,13), "N2", " ", " ")
      GravaLin400("Motivo do cod. ocorrencia.....: ", substr(Linha2,295,01), "C ", " ", " ")
   endif   
   if vCodBanco <> 399 .and. vCodBanco <> 001
      GravaLin400("Data do Recebimento...........: ", substr(Linha2,296,06), "D ", "DataRec", "*")
   endif   
   if vCodBanco == 341
      GravaLin400("Codigo da liquidacao..........: ", substr(Linha2,393,02), "N0", " ", "*")	
   endif
   if vCodBanco <> 341 .and. vCodBanco <> 399 .and. vCodBanco <> 001
      GravaLin400("Motivos das rejeicoes.........: ", substr(Linha2,319,10), "N0", "oMotivo", "*")
      subOcorrencia( strzero(vCodBanco,3), substr(Linha2,319,10) )
   endif   
   GravaLin400("Numero do registro............: ", substr(Linha2,395,06), "N0", " ", " ")

   ** Rotina que faz a grava‡Æo e baixa, por isso est  por £ltimo
   do case
      case vCodBanco == 001
           GravaLin400("Nosso Numero..................: ", substr(Linha2,046,17), "C ", "NNumero", "*")
      case vCodBanco == 341    
           GravaLin400("Nosso Numero..................: ", substr(Linha2,038,25), "C ", "NNumero", "*")
      case vCodBanco == 399     
           GravaLin400("Nosso Numero..................: ", substr(Linha2,038,25), "C ", "NNumero", "*")
      otherwise   
           GravaLin400("Nosso Numero..................: ", substr(Linha2,135,12), "C ", "NNumero", "*")
   endcase

   tBUFFER := StrTran( tBUFFER, chr(13)+chr(10),, 1 )  // Remove o CR e LF
   tBUFFER := StrTran( tBUFFER, LINHA2,, 1 )           // Elimina o que j  fez
   Linha2  := Substr ( tBuffer, 1, 400 )               // Pega uma nova cadeia
enddo

*** Cobrança com registro e sem registro
do while substr( Linha2, 1, 1 ) == "9"
   ** gCont++
   aadd( arrLin, replicate( "-", 75 ) )
   GravaLin400("Id. do registro................................: ", substr(Linha2,001,01), "N0", " ", " ")
   GravaLin400("Id. do retorno.................................: ", substr(Linha2,002,01), "N0", " ", " ")
   GravaLin400("Id. do tipo de registro........................: ", substr(Linha2,003,02), "N0", " ", " ")
   GravaLin400("Codigo do banco................................: ", substr(Linha2,005,03), "N0", " ", " ")
   GravaLin400("Quant. de titulos em cobranca..................: ", substr(Linha2,018,08), "N0", " ", "*")
   GravaLin400("Vlr. total em cobranca.........................: ", substr(Linha2,026,14), "N2", " ", "*")
   GravaLin400("Num. do aviso banc rio.........................: ", substr(Linha2,040,08), "N0", " ", "*")
   GravaLin400("Qt. reg. - Ocorr. 02 - Conf. entradas..........: ", substr(Linha2,058,05), "N0", " ", " ")
   GravaLin400("Vlr reg. - Ocorr. 02 - Conf. entradas..........: ", substr(Linha2,063,12), "N2", " ", " ")
   GravaLin400("Vlr reg. - Ocorr. 06 - Conf. entradas..........: ", substr(Linha2,075,12), "N2", " ", " ")
   GravaLin400("Qt. reg. - Ocorr. 06 - liquidacao..............: ", substr(Linha2,087,05), "N0", " ", " ")
   GravaLin400("Vlr reg. - Ocorr. 06/09/10 - Baixados..........: ", substr(Linha2,092,12), "N2", " ", " ")
   GravaLin400("Qt. reg. - Ocorr. 09 e 10 - Titulos............: ", substr(Linha2,104,05), "N0", " ", " ")
   GravaLin400("Vlr reg. - Ocorr. 09 e 10 - Titulos............: ", substr(Linha2,109,12), "N2", " ", " ")
   GravaLin400("Qt. reg. - Ocorr. 13 - Abat. cancelados........: ", substr(Linha2,121,05), "N0", " ", " ")
   GravaLin400("Vlr reg. - Ocorr. 13 - Abat. cancelados........: ", substr(Linha2,126,12), "N2", " ", " ")
   GravaLin400("Qt. reg. - Ocorr. 14 - Venc. alterados.........: ", substr(Linha2,138,05), "N0", " ", " ")
   GravaLin400("Vlr reg. - Ocorr. 14 - Venc. alterados.........: ", substr(Linha2,143,12), "N2", " ", " ")
   GravaLin400("Qt. reg. - Ocorr. 12 - Abat. concedidos........: ", substr(Linha2,155,05), "N0", " ", " ")
   GravaLin400("Vlr reg. - Ocorr. 12 - Abat. concedidos........: ", substr(Linha2,160,12), "N2", " ", " ")
   GravaLin400("Qt. reg. - Ocorr. 19 - Conf. instrucao protesto: ", substr(Linha2,172,05), "N0", " ", " ")
   GravaLin400("Vlr reg. - Ocorr. 19 - Conf. instrucao protesto: ", substr(Linha2,177,12), "N2", " ", " ")
   GravaLin400("Vlr total dos rateios efetuados................: ", substr(Linha2,363,15), "N2", " ", " ")
   GravaLin400("Qt. total dos rateios efetuados................: ", substr(Linha2,378,08), "N0", " ", " ")
   GravaLin400("Numero do registro.............................: ", substr(Linha2,395,06), "N0", " ", " ")

   tBUFFER := StrTran( tBUFFER, chr(13)+chr(10),, 1 )  // Remove o CR e LF
   tBUFFER := StrTran( tBUFFER, LINHA2,, 1 )           // Elimina o que j  fez
   Linha2  :=  Substr( tBuffer, 1, 400 )               // Pega uma nova cadeia
enddo
** Para remover os que nao foram rejeitados
** no caso de ter sido feita a opcao para se ver
** somente os rejeitados
if vVerRejeicao == "X"
   cont_ini := 0   // Linhas do inicio do bloco
   arr_p    := 0
   do while .t.
      ARR_P ++
      ** se o vetor j  foi removido (NIL), sai, pois ele esta no final do array
      if ARR_P > len( arrLin ) .or. arrLin[arr_p] == NIL
         exit
      endif
      ** Achou a marcacao (+---) do inicio do bloco
      if "+---" $ arrLin[ARR_P]
         ARRLIN[arr_p] := substr( ARRLIN[ARR_P], 2 )  // Remove a marcacao
         CONT_INI := ARR_P + 1                        // Pega a proxima posicao do inicio do bloco
      endif
      ** Achou o final do bloco
      ** Se foi "baixado com sucesso", remove o bloco inteiro
      if "!!!" $ arrLin[arr_p]   //  o fim do bloco
         ** Remove os vetores do bloco (do +--- at‚ !!! )
         for cont_del := cont_ini to arr_p
             adel( arrLin, cont_del )         // Remove
         next
         ** Move o ponteiro para o inicio do bloco ( marcado )
         arr_p := cont_ini
      endif
   enddo
endif

if oOcorrencia
   msgalert( "Um ou mais t¡tulos nÆo foram baixados, " +;
             "verifique o arquivo de retorno " + vNomArq +;
             ". Vocˆ poder  baixar manualmente os t¡tulos " +;
             "que nÆo foram baixados aqui, anote seu(s) n£mero(s) " +;
             "e dados, e fa‡a a conferˆncia."  )
endif
if vProcessaRetorno = "X"
   aadd( arrLin, "*** Registros apenas exibidos, nÆo processados! ***" )
endif
if !SendPrint()
   retu(.f.)
endif
LinPrn := 0
@ ++LinPrn, 1 say "Arquivo de retorno...........: " + vNomArq
for arr_p := 1 to len( arrLin )
    ** Se o array for nulo, pula
    if arrLin[arr_p] == NIL
       loop
    endif
    ** Imprime a linha do array
    @ ++LinPrn, 1 say arrLin[arr_p]
next
ClosePrint()

*** Pasta dos arquivos processados ***
SetDirDest := cadbanco->PROCBANCO
do while .t.
   if vProcessaRetorno=" "                        // Se for para processar retorno move os arquivos
      set devi to scree
      ARQBRAD := "BX"+left(alltrim(netname()),5)+right(alltrim(netname()),1)
      if file( ARQBRAD+".MEM" )
         restore from &ARQBRAD additive
      endif
      quadro( '09','10','18','70',' Mover o arquivo - ' + vNomArq,'W+/B')
      @ 11, 12 say "Caminho do reposit¢rio de arquivos processados"
      @ 13, 12 say " Origem: " + alltrim(oDir)
      @ 14, 12 say "Destino: " + SetDirDest
      @ 16, 16 say "          Ü" color "n/b"
      @ 17, 16 say " ßßßßßßßßßß" color "n/b"
      @ 16, 16 say "   Mover  "  color "n/g"
      @ 16, 29 say "          Ü" color "n/b"
      @ 17, 29 say " ßßßßßßßßßß" color "n/b"
      @ 16, 29 say " Cancelar "  color "n/g"
      @ 16, 42 say "         Ü"  color "n/b"
      @ 17, 42 say " ßßßßßßßßß"  color "n/b"
      @ 16, 42 say " Alterar "   color "n/g"
      Cor_Brd := setcolor()
      setcolor( "n/g, w+/R" )
      @ 16, 16 promp "   Mover  "
      @ 16, 29 promp " Cancelar "
      @ 16, 42 promp " Alterar "
      menu to Impr_Brd
      setcolor( Cor_Brd )
      do case
         case Impr_Brd == 1 .and. lastkey() # 27
              SetDirDest := alltrim( SetDirDest )+ vNomArq
              if oOcorrencia
                 if msgalert( "O arquivo " + SetDirDest + " possui rejei‡äes, mover assim mesmo ?",,{' NÆo ',' Sim '} ) == 1
                    exit
                 endif
              endif
              if file( SetDirDest )
                 if msgalert( "O arquivo " + SetDirDest + " existe, posso sobreescreve-lo ?",,{' NÆo ',' Sim '} ) == 1
                    exit
                 endif
              endif
              copy file (Arq_Brd) to (SetDirDest)
              dele file &Arq_Brd
         case Impr_Brd == 3
              oCURSOR := setcursor()
              SET CURSOR ON
              @ 14, 21 get SetDirDest pict "@!" valid( !empty(SetDirDest))
              read
              if alltrim(SetDirDest) == alltrim(oDir)
                 msgalert( "O diret¢rio de destino ("+alltrim(SetDirDest)+") nÆo pode ser"+;
                           " o mesmo diret¢rio de origem ("+alltrim(oDir)+")", "Aten‡Æo!" )
                 Impr_Brd := 3
                 loop
              endif
              setcursor( oCURSOR )
              Impr_Brd := 1
              loop
      endcase
   endif
   exit
enddo
rele CONT_INI, ARR_P  , CONT_INV, LinPrn, oMovRet, move_ret,;
     ARQBRAD , Cor_Brd, Impr_Brd               // Libero as variaveis para nao sobrecarregar
retu(.t.)



Function LeRetorno240( Arq_Brd, oDir, gBanco )
************************************************************************
* Fun‡Æo para ler o arqivo de retorno baixado e gravado no disco
************************************************************************
local Bloco   := 240                      ,;
      tBuffer := MemoRead( Arq_Brd )      ,;
      cCount  := MlCount( tBuffer, Bloco ),;
      gCont   := 0

private glinha     := .F.   ,;
        gData_Rec  := date(),;
        gValor_Rec := 0     ,;
        gCheque    := 999999,;
        gOcorr

Linha1    := substr( tBuffer, 1, 240 )
arrLin    := {}
vTemErros := .f.
   
if gBanco == 001
   if substr(Linha1,143,01) <> "2"
      SN := MsgAlert( 'Este nÆo parece ser um arquivo de retorno! Verifique.  Continua? ',' ATEN€ÇO ! ', {' NÆo ',' Sim '})
      if SN == 1
         return( .t. )
      endif
   endif
else   
   if at( "RETORNO", MemoLine( tBuffer, 240, 1 ) ) == 0
      SN := MsgAlert( 'Este nÆo parece ser um arquivo de retorno! Verifique.  Continua? ',' ATEN€ÇO ! ', {' NÆo ',' Sim '})
      if SN == 1
         return( .t. )
      endif
   endif   
endif

if substr(Linha1,001,03) <> strzero (gBanco,3)
   SN := MsgAlert( 'Este arquivo nÆo parece ser do banco ' + strzero (gBanco,3) + '! Verifique.  Continua? ',' ATEN€ÇO ! ', {' NÆo ',' Sim '})
   if SN == 1
      return( .t. )
   endif
endif

GravaLin400("Codigo do Banco..............: " , substr(Linha1,001,03), "N0", " ", "*")
GravaLin400("Lote de servi‡o..............: " , substr(Linha1,004,04), "N0", " ", " ")
GravaLin400("Id do registro...............: " , substr(Linha1,008,01), "N0", " ", " ")
GravaLin400("Tipo inscri‡Æo da Empresa....: " , substr(Linha1,018,01), "N0", " ", " ")
GravaLin400("N£mero inscri‡Æo da empresa..: " , substr(Linha1,019,14), "N0", " ", " ")
GravaLin400("Codigo do convenio no banco..: " , substr(Linha1,033,20), "C ", " ", " ")
GravaLin400("Agencia mantenedora da conta.: " , substr(Linha1,053,05), "NO", " ", " ")
GravaLin400("DV da Agencia................: " , substr(Linha1,058,01), "C ", " ", " ")
GravaLin400("Numero da conta corrente.....: " , substr(Linha1,059,12), "NO", " ", " ")
GravaLin400("Digito da conta corrente.....: " , substr(Linha1,071,01), "C ", " ", " ")
GravaLin400("Nome da empresa..............: " , substr(Linha1,073,30), "C ", " ", "*")
GravaLin400("Nome do banco................: " , substr(Linha1,103,30), "C ", " ", "*")
GravaLin400("Data da gera‡Æo..............: " , substr(Linha1,144,08), "D ", " ", "*")
GravaLin400("Hora da gera‡Æo..............: " , substr(Linha1,152,06), "C ", " ", "*")
GravaLin400("Numero sequencial do registro: " , substr(Linha1,158,06), "N0", " ", "*")
GravaLin400("Numero da versÆo do layout...: " , substr(Linha1,164,03), "N0", " ", "*")

cIDreg     := Substr (tBUFFER,8,1)
cSegm      := Substr (tBUFFER,14,1)
Do While cIDreg <> "3" 
   tBUFFER := StrTran( tBUFFER, chr(13)+chr(10),, 1 )  // Remove o CR e LF
   tBUFFER := StrTran( tBUFFER, LINHA1,, 1 )           // Elimina o que j  fez
   Linha1  := substr ( tBuffer, 1, 240 )               // Pega uma nova cadeia   
   cIDreg  := Substr ( tBUFFER, 8, 1)
   cSegm   := Substr ( tBUFFER,14, 1)
   if len(Linha1) <> 240
      return (.t.)
   endif   
EndDo

*** Faz o agrupamento dos registros "T" e "U" concatenando os dois

tBUFFER := StrTran( tBUFFER, chr(13)+chr(10),, 1 )  // Remove o CR e LF
tBUFFER := StrTran( tBUFFER, LINHA1,, 1 )           // Elimina o que j  fez
Linha2  := Linha1+substr( tBuffer, 1, 240 )         // Agrupa os dois pr¢ximos registros tipo 3
linha1  := substr ( tBuffer, 1, 240 ) 
cIDreg  := Substr ( tBUFFER, 8,1)
cSegm   := Substr ( tBUFFER,14,1)

do while cIDREG == "3" 
   gOcorr     := "00"
   flag_ocorr := .f.
   ValorLin   := ""
   vTemErros  := .f.
   vBxReceber := .f.
   gCont++
   
   aadd( arrLin, "+" + replicate( "-", 75 ) )

   *** Faz o tratamento dos campos do Registro "T"

   *** Primeiro verifica se o titulo nÆo teve nenhum tipo de ocorrencia
   *** para identificar se poder  ser baixado ou nÆo --> vBxReceber = .t.
   vOcorrencia   :=substr(Linha2,016,02)
   vSubOcorrencia:=substr(Linha2,214,10)
   
   vDescOcorr := Ocorrencias( strzero(vCodBanco,3), vOcorrencia, vSubOcorrencia )

   GravaLin400("Lote de servi‡o...............: ", substr(Linha2,004,07), "N0", " ", " ")
   GravaLin400("Tipo de registro..............: ", substr(Linha2,008,01), "C ", " ", " ")
   GravaLin400("Cod. Movimento de Retorno.....: ", substr(Linha2,016,02), "N0", "vMotivoOcorrencia", "*")
   GravaLin400("Agencia mantenedora da conta..: ", substr(Linha2,018,05), "NO", " ", " ")
   GravaLin400("DV da agencia.................: ", substr(Linha2,023,01), "NO", " ", " ")      
   if vCodBanco == 104
      GravaLin400("Codigo do convenio ...........: ", substr(Linha2,024,06), "NO", " ", "*")
   else   
      GravaLin400("Numero da conta corrente......: ", substr(Linha2,024,12), "NO", " ", "*")
      GravaLin400("DV da conta ..................: ", substr(Linha2,036,01), "NO", " ", "*")      
   endif   

   GravaLin400("Codigo da Carteira ...........: ", substr(Linha2,058,01), "N0", " ", " ")         
   if vCodBanco == 104
      GravaLin400("Numero do documento de cobr...: ", substr(Linha2,059,11), "C ", " ", " ")      
   else   
      GravaLin400("Numero do documento de cobr...: ", substr(Linha2,059,15), "C ", " ", " ")      
   endif   
   GravaLin400("Data de vencimento do titulo..: ", substr(Linha2,074,08), "D ", " ", "*")            
   GravaLin400("Valor do titulo...............: ", substr(Linha2,082,15), "N2", "VlrTit", "*")
   GravaLin400("Banco cobrador................: ", substr(Linha2,097,03), "N0", " ", " ")
   GravaLin400("Agencia cobradora.............: ", substr(Linha2,100,05), "N0", " ", " ")
   GravaLin400("Id. do titulo na Empresa......: ", substr(Linha2,106,25), "C ", " ", " ")      
   GravaLin400("Tipo do sacado................: ", substr(Linha2,131,02), "N0", " ", " ")      
   GravaLin400("Numero de Inscricao do sacado.: ", substr(Linha2,134,15), "N0", " ", "*")      
   GravaLin400("Nome..........................: ", substr(Linha2,149,40), "C ", " ", " ")      
   GravaLin400("Numero do contrato da Op.Cred.: ", substr(Linha2,189,10), "N0", " ", " ")      
   GravaLin400("Valor da tarifa/Custas........: ", substr(Linha2,214,15), "N2", " ", " ")      
   GravaLin400("Id. da Ocorrencia.............: ", substr(Linha2,214,10), "N0", "oMotivo", " ")

   *** Faz o tratamento dos campos do Registro "U"

   GravaLin400("Valor de Juros/Multa/Encargos.: ", substr(Linha2,258,15), "N2", " ", "*")      
   GravaLin400("Valor de Desconto concedido...: ", substr(Linha2,273,15), "N2", " ", " ")      
   GravaLin400("Valor de Abatimento concedido.: ", substr(Linha2,288,15), "N2", " ", " ")      
   GravaLin400("Valor do IOF..................: ", substr(Linha2,303,15), "N2", " ", " ")
   GravaLin400("Valor pago pelo Sacado........: ", substr(Linha2,318,15), "N2", "ValorRec", "*")
   GravaLin400("Valor Liquido a creditar......: ", substr(Linha2,333,15), "N2", " ", "*")
   GravaLin400("Valor de outras despesas......: ", substr(Linha2,348,15), "N2", " ", " ")
   GravaLin400("Valor de outros creditos......: ", substr(Linha2,363,15), "N2", " ", " ")
   GravaLin400("Data da ocorrencia............: ", substr(Linha2,378,08), "D ", "DataRec", "*")
   GravaLin400("Data da efetivacao do credito.: ", substr(Linha2,303,15), "D ", " ", " ")
   GravaLin400("Cod. ocorrencia do sacado.....: ", substr(Linha2,394,04), "C ", " ", " ")
   GravaLin400("Data da ocorrencia do sacado..: ", substr(Linha2,398,08), "D ", " ", " ")
   GravaLin400("Valor do ocorrencia sacado....: ", substr(Linha2,406,15), "N2", " ", " ")
   GravaLin400("Complemento da ocorrencia.....: ", substr(Linha2,421,30), "C ", " ", " ")
   GravaLin400("Cod. Banco Correspondente.....: ", substr(Linha2,451,03), "N0", " ", " ") 
   GravaLin400("Ocorrencias ..................: ", vDescOcorr, "C ", " ", "*")

   ** Rotina que faz a grava‡Æo e baixa, por isso est  por £ltimo

   if vCodBanco == 104
      GravaLin400("Nosso numero..................: ", substr(Linha2,042,15), "C ", "NNumero", "*")      
   else
      GravaLin400("Nosso numero..................: ", substr(Linha2,038,20), "C ", "NNumero", "*")      
   endif   
   	
   tBUFFER := StrTran( tBUFFER, chr(13)+chr(10),, 1 )  // Remove o CR e LF
   tBUFFER := StrTran( tBUFFER, LINHA1,, 1 )           // Elimina o que j  fez
   Linha1  := substr ( tBuffer, 1, 240 )               // Agrupa os dois pr¢ximos registros tipo 3
   cIDreg  := Substr ( tBUFFER, 8,1)
   cSegm   := Substr ( tBUFFER,14,1)

   If cIDreg <> "3"
      exit
   endif        

   tBUFFER := StrTran( tBUFFER, chr(13)+chr(10),, 1 )  // Remove o CR e LF
   tBUFFER := StrTran( tBUFFER, LINHA1,, 1 )           // Elimina o que j  fez
   Linha2  := Linha1+substr( tBuffer, 1, 240 )         // Agrupa os dois pr¢ximos registros tipo 3
   Linha1  := substr ( tBuffer, 1, 240 )
   cIDreg  := Substr ( tBUFFER, 8,1)
   cSegm   := Substr ( tBUFFER,14,1)

enddo

*** Fazer tratamento do trailer de lote

tBUFFER := StrTran( tBUFFER, chr(13)+chr(10),, 1 )  // Remove o CR e LF
tBUFFER := StrTran( tBUFFER, LINHA1,, 1 )           // Elimina o que j  fez

Linha2  := substr ( tBuffer, 1, 240 )               // Pega uma nova cadeia   
Linha1  := substr ( tBuffer, 1, 240 )               // Pega uma nova cadeia   
cIDreg  := Substr ( tBUFFER, 8,1)
cSegm   := Substr ( tBUFFER, 14,1)

aadd( arrLin, replicate( "-", 75 ) )
GravaLin400("Codigo do banco na compensacao.................: ", substr(Linha2,001,03), "N0", " ", " ")
GravaLin400("Lote de servi‡o................................: ", substr(Linha2,004,04), "N0", " ", " ")
GravaLin400("Id. do tipo de registro........................: ", substr(Linha2,008,01), "N0", " ", " ")
GravaLin400("Quant. de registros no lote....................: ", substr(Linha2,018,06), "N0", " ", " ")
GravaLin400("Quant. de titulos em cobranca simples..........: ", substr(Linha2,024,06), "N0", " ", " ")
GravaLin400("Valor total dos titulos em carteira............: ", substr(Linha2,030,17), "N2", " ", " ")
GravaLin400("Quant. de titulos em cobranca vinculada........: ", substr(Linha2,047,06), "N0", " ", " ")
GravaLin400("Valor total dos titulos em cart.vinculada......: ", substr(Linha2,053,17), "N2", " ", " ")
GravaLin400("Quant. de titulos em cobranca caucionada.......: ", substr(Linha2,070,06), "N0", " ", " ")
GravaLin400("Valor total dos titulos em cart.caucionada.....: ", substr(Linha2,076,17), "N2", " ", " ")
GravaLin400("Quant. de titulos em cobranca descontada.......: ", substr(Linha2,093,06), "N0", " ", " ")
GravaLin400("Valor total dos titulos em cart.vinculada......: ", substr(Linha2,099,17), "N2", " ", " ")
GravaLin400("Numero do aviso de lancamento..................: ", substr(Linha2,116,08), "C ", " ", " ")

*** Fazer tratamento do trailer de arquivo

tBUFFER := StrTran( tBUFFER, chr(13)+chr(10),, 1 )  // Remove o CR e LF
tBUFFER := StrTran( tBUFFER, LINHA1,, 1 )           // Elimina o que j  fez

Linha2  := substr ( tBuffer, 1, 240 )               // Pega uma nova cadeia   
cIDreg  := Substr ( tBUFFER, 8,1)
cSegm   := Substr ( tBUFFER, 14,1)

aadd( arrLin, replicate( "-", 75 ) )
GravaLin400("Codigo do Banco na compensacao.................: ", substr(Linha2,001,03), "N0", " ", " ")
GravaLin400("Lote de servi‡o................................: ", substr(Linha2,004,04), "N0", " ", " ")
GravaLin400("Tipo de registro...............................: ", substr(Linha2,008,01), "N0", " ", " ")
GravaLin400("Quantidade de lotes no arquivo.................: ", substr(Linha2,018,06), "N0", " ", " ")
GravaLin400("Quantidade de registros do arquivo.............: ", substr(Linha2,024,06), "N0", " ", " ")
GravaLin400("Quantidade de contas p/Conc. (Lotes)...........: ", substr(Linha2,030,06), "N0", " ", " ")

** Para remover os que nao foram rejeitados
** no caso de ter sido feita a opcao para se ver
** somente os rejeitados
if vVerRejeicao == "X"
   cont_ini := 0   // Linhas do inicio do bloco
   arr_p    := 0
   do while .t.
      ARR_P ++
      ** se o vetor j  foi removido (NIL), sai, pois ele est  no final do array

      if ARR_P > len( arrLin ) .or. arrLin[arr_p] == NIL
         exit
      endif
      ** Achou a marcacao (+---) do inicio do bloco
      if "+---" $ arrLin[ARR_P]
         ARRLIN[arr_p] := substr( ARRLIN[ARR_P], 2 )  // Remove a marcacao
         CONT_INI := ARR_P + 1                        // Pega a proxima posicao do inicio do bloco
      endif
      ** Achou o final do bloco
      ** Se foi "baixado com sucesso", remove o bloco inteiro
      if "!!!" $ arrLin[arr_p]   //  o fim do bloco
         ** Remove os vetores do bloco (do +--- at‚ !!! )
         for cont_del := cont_ini to arr_p
             adel( arrLin, cont_del )         // Remove
         next
         ** Move o ponteiro para o inicio do bloco ( marcado )
         arr_p := cont_ini
      endif
   enddo
endif

if oOcorrencia
   msgalert( "Um ou mais t¡tulos nÆo foram baixados, " +;
             "verifique o arquivo de retorno " + vNomArq +;  
             ". Vocˆ poder  baixar manualmente os t¡tulos " +;
             "que nÆo foram baixados aqui, anote seu(s) n£mero(s) " +;
             "e dados, e fa‡a a conferˆncia."  )
endif
if vProcessaRetorno = "X"
   aadd( arrLin, "*** Registros apenas exibidos, nÆo processados! ***" )
endif
if !SendPrint()
   retu(.f.)
endif
LinPrn := 0
@ ++LinPrn, 1 say "Arquivo de retorno...........: " + vNomArq
for arr_p := 1 to len( arrLin )
    ** Se o array for nulo, pula
    if arrLin[arr_p] == NIL
       loop
    endif
    ** Imprime a linha do array
    @ ++LinPrn, 1 say arrLin[arr_p]
next
ClosePrint()

*** Pasta dos arquivos processados ***
SetDirDest := cadbanco->PROCBANCO
do while .t.
   if vProcessaRetorno=" "                        // Se for para processar retorno move os arquivos
      set devi to scree
      ARQBRAD := "BX"+left(alltrim(netname()),5)+right(alltrim(netname()),1)
      if file( ARQBRAD+".MEM" )
         restore from &ARQBRAD additive
      endif
      quadro( '09','10','18','70',' Mover o arquivo - ' + vNomArq,'W+/B')
      @ 11, 12 say "Caminho do reposit¢rio de arquivos processados"
      @ 13, 12 say " Origem: " + alltrim(oDir)
      @ 14, 12 say "Destino: " + SetDirDest
      @ 16, 16 say "          Ü" color "n/b"
      @ 17, 16 say " ßßßßßßßßßß" color "n/b"
      @ 16, 16 say "   Mover  "  color "n/g"
      @ 16, 29 say "          Ü" color "n/b"
      @ 17, 29 say " ßßßßßßßßßß" color "n/b"
      @ 16, 29 say " Cancelar "  color "n/g"
      @ 16, 42 say "         Ü"  color "n/b"
      @ 17, 42 say " ßßßßßßßßß"  color "n/b"
      @ 16, 42 say " Alterar "   color "n/g"
      Cor_Brd := setcolor()
      setcolor( "n/g, w+/R" )
      @ 16, 16 promp "   Mover  "
      @ 16, 29 promp " Cancelar "
      @ 16, 42 promp " Alterar "
      menu to Impr_Brd
      setcolor( Cor_Brd )
      do case
         case Impr_Brd == 1 .and. lastkey() # 27
              SetDirDest := alltrim( SetDirDest ) + vNomArq
              if oOcorrencia
                 if msgalert( "O arquivo " + SetDirDest + " possui rejei‡äes, mover assim mesmo ?",,{' NÆo ',' Sim '} ) == 1
                    exit
                 endif
              endif
              if file( SetDirDest )
                 if msgalert( "O arquivo " + SetDirDest + " existe, posso sobreescreve-lo ?",,{' NÆo ',' Sim '} ) == 1
                    exit
                 endif
              endif
              copy file (Arq_Brd) to (SetDirDest)
              dele file &Arq_Brd
         case Impr_Brd == 3
              oCURSOR := setcursor()
              SET CURSOR ON
              @ 14, 21 get SetDirDest pict "@!" valid( !empty(SetDirDest))
              read
              if alltrim(SetDirDest) == alltrim(oDir)
                 msgalert( "O diret¢rio de destino ("+alltrim(SetDirDest)+") nÆo pode ser"+;
                           " o mesmo diret¢rio de origem ("+alltrim(oDir)+")", "Aten‡Æo!" )
                 Impr_Brd := 3
                 loop
              endif
              setcursor( oCURSOR )
              Impr_Brd := 1
              loop
      endcase
   endif
   exit
enddo
rele CONT_INI, ARR_P  , CONT_INV, LinPrn, oMovRet, move_ret,;
     ARQBRAD , Cor_Brd, Impr_Brd                // Libero as variaveis para nao sobrecarregar
retu(.t.)


Function GravaLin400( strLin, ValorLin, tTipoDado, tCampo, tFlag )
************************************************************************
* Grava as linhas de retorno
* StrLIN    = String com o rotulo da linha (o que ‚ a linha)
* ValorLIN  = Valor a ser processado
* tTipoDado = Tipo do dado : Caractere = "C "
*                            Numerico  = "Nx" -> N = Numerico, x = Casas decimais
*                            Data      = "D "
* tCampo = Campo a ser gravado
* tFlag  = "*" - Mostra na tela/relatorio, " " - Nao mostra
*
************************************************************************
local AreaGrv := alias(),;
      Busca_c, xTipo, xLinha, zTam, zValor, rValor
static oGrava := .T.    // permitir a gravacao conforme a identificacao da ocorrencia

*** Monta a linha no formato especificado
xTipo      := substr( tTipoDado, 1, 1 )
xLinha     := alltrim( ValorLin )
xTemMotivo := .f.

** Dar uma olhada nos dois case abaixo - acho que podem ser agrupados

do case
   case  xTipo == "N"                                // ‚ num‚rico
        zTam   := val( substr( tTipoDado, 2, 1 ) )   // pega a quant. de casas decimais
        zValor := str2real( xLinha, zTam )           // transforma em valores com casas decimais
        rValor := str( zValor )

   case xTipo  == "D"                                // ‚ data
        if len(xLinha) == 8
           zValor := cTod( substr(xLinha,1,2)+"/"+;  // monta a data
                           substr(xLinha,3,2)+"/"+;
                           substr(xLinha,5,4))
        else                   
           zValor := cTod( substr(xLinha,1,2)+"/"+;   // monta a data
                           substr(xLinha,3,2)+"/"+;
                           substr(xLinha,5,2))
        endif
        rValor := dtoc( zValor )
   otherwise                                         // ‚ string
        zValor := alltrim( xLinha )                  // fica como est 
        rValor := alltrim( ValorLin )
endcase

if tFlag == "*"
   aadd( arrLin, strLin + " " + rValor )
endif

sele RECEBER
set order to 8

*** Pega os valores dos campos
do case
   case tCampo == "NroBanco"             // "NroBanco"
        gNroBanco := ValorLin

   case tCampo == "NNumero"
        gNNumero := right(zValor,12)
        seek gNNumero
        if found()
           Igual_Var()
           gLinha := .t.
        else
           aadd( arrLin, "  100 --> ERRO: NAO BAIXADO! PROVAVELMENTE O TITULO NAO EXISTE!")
           oOcorrencia := .t.
           glinha      := .f.
        endif

   case tCampo == "ValorRec"
        gValor_Rec := zValor

   case tCampo == "DataRec"
        gData_Rec := zValor

   case tCampo == "vMotivoOcorrencia"
        gOcorr := strzero(zValor,2)
        if vBxReceber
           oGrava := .t.
        else
           oGrava := .f.
        endif   

   case tCampo == "###"
        glinha := .f.

endcase

** Houve algum motivo de rejeicao

if CNAB400
*  if (val(substr(Linha2,319,10)) > 0) .and. (substr( Linha2, 1, 1 ) == "1") .and. (oGrava == .f.)
   if ( vTemErros ) .and. (substr( Linha2, 1, 1 ) == "1") .and. (oGrava == .f.)
      // 1¦ condicao -> Possui motivos de rejeicao
      // 2¦ condicao -> ‚ registro do tipo 1
      // oGrava -> Identificacao da ocorrencia NÇO ‚ 06 ou 15 ou 17
      xTemMotivo  := .t.
      oOcorrencia := .t.
   endif
else
   if (val(substr(Linha2,214,10)) > 0) .and. (substr( Linha2, 8, 1 ) == "3") .and. (oGrava == .f.)
      // 1¦ condicao -> Possui motivos de rejeicao
      // 2¦ condicao -> ‚ registro do tipo 1
      // oGrava -> Identificacao da ocorrencia NÇO ‚ 06 ou 15 ou 17
      xTemMotivo  := .t.
      oOcorrencia := .t.
   endif
endif   
*** Se foi encontrato do registro no Receber baixa o titulo ***

if gLinha                                        // Ok! pode processar
   if RegLock( .t. )
      if empty(vData_Rec) .and. vValor_Rec == 0  // verifica se j  foi pago
         do case
            case vProcessaRetorno = " "  .and. (xTemMotivo == .f.) .and. (oGrava == .t.)  // ‚ para gravar
                 // pProcessa -> Pode pocessar
                 // xTemMotivo -> NAO tem motivo de rejeicao
                 // oGrava -> Identificacao da ocorrencia ‚ 06 ou 15 ou 17
                 p_cliente (receber->cod_cli, .f.)
                 aadd( arrLin, "  000 --> Baixado com sucesso !!! Codigo da Conta="+receber->COD_CONTA + " - Cliente: "+cadcli->cliente  )    // mensagem
                 repla AuxNroBCO  with NROBANCO  ,; // Grava Nosso Numero no Auxiliar
                       NROBANCO   with spac(12)  ,; // Apaga o Nosso Numero por causa de boleto duplicados pelo banco
                       DATA_REC   with gDATA_REC ,; // grava a data de recebimento
                       VALOR_REC  with gVALOR_REC,; // grava o valor recebido
                       BANCO      with vCODBANCO ,; // grava o banco
                       CHEQUE     with gCHEQUE   ,; // grava o cheque
                       COD_REC1   with vCOD_PAG  ,;
                       VLR_REC1   with gVALOR_REC,;
                       OBS        with "*Bx. autom. retorno" + iif(!empty(OBS), " / ", "")+ alltrim(OBS)
                 AuditAlt(procname())
            case vProcessaRetorno = "X"
                 aadd( arrLin, "  105 --> Marcacao para nao processar ativa."  )
            case xTemMotivo == .t.
                 aadd( arrLin, "  103 --> Nao baixado! Houve motivo para rejeicao..."  )
                 oOcorrencia := .t.
         endcase
      else                                       // O t¡tulo j  foi baixado
         aadd( arrLin, "  101 --> Registro j  baixado! VERIFIQUE!"  )  // mensagem
         oOcorrencia := .t.
      endif
      xTemMotivo := .f.
      unlock
   else
      aadd( arrLin, "  199 --> ERRO: Falha no travamento do registro! Execute novamente."  )
      oOcorrencia := .t.
   endif
   glinha := .f.
endif
return(.t.)
