Página 1 de 1

Erro: arq txt nao gera CR e LF no final

Enviado: 26 Jun 2010 13:40
por locio
Estou gerando um arquivo para SPED Contabil e ele está dando a mensagem:

Ultima linha da escrituração não termina com os caractere CR (corriage return) e LF (line feed)

Não estou conseguindo resolver via o algoritmo do programa.

Código: Selecionar todos


             SELE CTBSPED
             GO TOP
             set alternate to &arquiv

             vez1 = .t.

             WHILE   !EOF()

                    set console off
                    set alternate on

                    if  vez1
                        vez1 = .f.
                        ?? TRIM(sgcampo)
                    else
                        ?  TRIM(sgcampo)
                    endif

                    set  alternate off
                    set  console on

                    SELE CTBSPED
                    SKIP

             ENDDO
             
             set alternate off

             close alternate

Para resolver estou fazendo o seguinte:

Edito o arq txt
deleto o ultimo caractere da ultima linha
salvo o txt

Valido o SPED Contabil sem problema depois desse procedimento

Ocorre que essa maneira não é legal. Acho estranho pois uso a mesma maneira de gerar txt para os sistemas SEF SEFIP RAIS e CAGED sem problemas.

Alguem pode me ajudar

Grato

Malta Lócio

Re: Erro: arq txt nao gera CR e LF no final

Enviado: 26 Jun 2010 14:13
por alxsts
Olá!
locio escreveu:Ultima linha da escrituração não termina com os caractere CR (corriage return) e LF (line feed)
Normalmente, cada linha de um arquivo texto é terminada pelo par CR + LF (Chr(13) + Chr(10)) e o arquivo é terminado por um Control+Z (Chr(26)).
Você diz que o problema é na última linha. Não sei se é particularidade do layout. Em qualquer dos casos, olhando o teu código, está faltando gravar esses caracteres Acho que o print (?) só envia o LF). Peço licença para otimizar o teu código, já colocando esses caracteres ao final de cada linha:

Código: Selecionar todos

   SELE CTBSPED
   GO TOP
   set alternate to &arquiv

   set console off
   set alternate on

   WHILE   !EOF()

      ?? TRIM(sgcampo) + Chr(13) + Chr(10)

      SKIP

   ENDDO
             
   ?? Chr(26)

   set alternate off
   close alternate
   set console on
Não testei. Se der problema, poste novamente.
Pessoalmente, eu usaria as funções de baixo nível...

Re: Erro: arq txt nao gera CR e LF no final

Enviado: 26 Jun 2010 16:54
por JoséQuintas
Não, o problema é outro.
Quando ao código, NÃO PRECISA, mas eu simplificaria este trecho:

Código: Selecionar todos

if  vez1 
    vez1 = .f. 
    ?? TRIM(sgcampo) 
else 
   ?  TRIM(sgcampo) 
endif 
mudaria para:

Código: Selecionar todos

?? Trim(sgCampo) + Chr(13) + Chr(10)
E ao contrário do indicado, o problema não é acrescentar o Ctrl-Z e sim retirar o Ctrl-Z que é acrescentado por default.
Aqui uso esta função:

Código: Selecionar todos

Function FDelEof(mFile)
Local nHandle := 0
nHandle = fOpen(mFile,2)
fSeek(nHandle,-1,2)
Fwrite(nHandle,"")
fClose(nHandle)
Return NIL
Só comentário: eu nunca usei e nem sabia que existia o "close alternate". Sempre usei "set alternate to".

Re: Erro: arq txt nao gera CR e LF no final

Enviado: 26 Jun 2010 17:11
por lugab
Pessoal, aproveito este tópico para perguntar se algum de vcs possue função pronta, pra retirar o caracteres "quadradinho" da primeira linha dos arquivos TXT que geramos, com intenção de imprimir com Win32Prn ou PrintFileRaw, mas que disponibilizamos antes para ser visualizado na tela.

Na impressão o quadradinho não aparece, mas na hora da exibição prévia na tela, ele fica la parecendo uma coisa q nós fizemos errada.

O detalhe é que esses arquivos textos não tem largura padrão, podendo ter menos ou mais de 80 colunas

Grato,

gabriel

Re: Erro: arq txt nao gera CR e LF no final

Enviado: 26 Jun 2010 17:32
por JoséQuintas
Qualquer caractere fora dos limites, no Windows é mostrado como o quadradinho ou algo parecido.
Mas no começo eu nunca vi, só no final.
Aqui uso um preview que fiz em VB, e nunca vi em nenhuma posição que não seja o final do arquivo.
Tem também no rebatido, ou num descuido, quando coloca um SAY para uma posição de coluna anterior à atual, que poderia ser considerado rebatido.
Ou algum caractere enviado à impressora, pra configuração especial, tipo Chr(15), talvez isto.
Investigue seu fonte. Talvez SetPrc(0.0)? quem sabe....

Re: Erro: arq txt nao gera CR e LF no final

Enviado: 26 Jun 2010 17:46
por lugab
Entendi, José Quintas.

No meu caso, o código de geração do TXT é o tradicional e + simples possível, sem usar CHR() e com muito cuidado para não sobrepor caracteres..

Código: Selecionar todos

Set device to printer  
Set printer to C:\SIG.TXT

@ l,c    say texto1
@ l+1,c say texto2

Set printer off
Set printer to
Então, provavelmente, é o visualizador que eu uso, q gera o problema.

Alguém pode me indicar um bom visualizador, pois o que eu uso, baixei daqui mesmo do fórum, e não poderia imaginar q poderia ter esse tipo de problema. Como eu sou "fraquinho", eu tendo sempre a achar q sou eu que está fazendo algo errado.

Re: Erro: arq txt nao gera CR e LF no final

Enviado: 26 Jun 2010 22:15
por JoséQuintas
Antes de trocar de visualizador:
Tente abrir o arquivo por algum editor pra verificar se tem algum caractere lá.
Isso vai tirar a dúvida se o problema é seu arquivo ou o visualizador.

Re: Erro: arq txt nao gera CR e LF no final

Enviado: 26 Jun 2010 22:22
por lugab
É verdade, José Quintas.

Eu abri com o edit e não apareceu quadradinho nenhum.

Inexperiència pouca, é bobagem, né ?

É o visualizador mesmo. O bom dele é que tem um monte de recursos, tipo busca de palavras no relatório texto, pra cima e pra baixo...

Re: Erro: arq txt nao gera CR e LF no final

Enviado: 26 Jun 2010 23:29
por Maligno
Um lembrete: alguns leitores suprimem caracteres não legíveis por sua própria conta. Pra ter certeza de que não há nada, abra o arquivo num editor hexa e procure no final do arquivo por algum caractere de valor baixo.

Re: Erro: arq txt nao gera CR e LF no final

Enviado: 27 Jun 2010 10:51
por locio
Gente,

Agradeço a todos. Efetuei as modificações propostas e consegui validar sem precisar usar a "marreta".

Apenas para ilustrar deixo pra vocês abaixo como ficou o codigo.

Código: Selecionar todos


             set console off
     
             SELE CTBSPED
             GO TOP
            
             set alternate to &arquiv
             set alternate on

             WHILE   !EOF()

                    ?? TRIM(sgcampo) + chr(13) + chr(10)

                    SELE CTBSPED
                    SKIP
             ENDDO
  
             set  alternate off
             set alternate to

             set  console on

             fDelEof (arquiv)

Grato a todos.

Malta Lócio

Re: Erro: arq txt nao gera CR e LF no final

Enviado: 25 Fev 2011 16:57
por alcinahelena
José Quintas, Valeu!!!
Sua solução foi muito preciosa. Agora posso sair de férias. Brigadão mess; Deu certíssimo.