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:
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.