Gravação de arquivo TXT

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

reinaldo
Usuário Nível 3
Usuário Nível 3
Mensagens: 105
Registrado em: 02 Mai 2005 13:08
Localização: santos/sp

Gravação de arquivo TXT

Mensagem por reinaldo »

Olá amigos

Há anos gravo arquivos TXT para a NFPaulista e nunca tive problema. Sempre fiz assim:

Código: Selecionar todos

utf8=""
tr="|"
SET DEVICE TO PRINT
SET PRINTER TO nfp.txt
@PROW(),   0 SAY UTF8+"10"+tr+"1,00"+tr+"02223344000124"+tr+DTOC(vdatamin)+tr+dtoc(vdATAmax)
Grava o arquivo nfp.txt em UTF-8 certinho.

Recentemente comecei a gravar arquivos TXT para NFEletronica e está acontecendo um problema intrigante.
Faço da mesma maneira, assim:

Código: Selecionar todos

SET DEVICE TO PRINT
SET PRINTER TO NFE.txt

TR="|"
UTF8=""

@PROW(),  0 SAY UTF8+"NOTAFISCAL"+tr+"1"
@PROW()+1,0 SAY "A"+tr+"2.00"+tr+"NFe"
Acontece que está gravando 2 caracteres estranhos no inicio da 1a. linha e está dando erro na importação pelo SEFAZ. (2 quadrados)
Estranho é que dei CTRL C no Bloco de Notas para vcs verem e não sairam, mas eles estão lá

NOTAFISCAL|1
A|2.00|NFe

Espero contar com ajuda de vcs pois os clientes estão reclamando já que estão tendo que editar o arquivo e retirar
esses caracteres.

Obrigado

Reinaldo
Editado pela última vez por Toledo em 26 Jan 2011 18:50, em um total de 2 vezes.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
SandroBelarmino
Usuário Nível 3
Usuário Nível 3
Mensagens: 464
Registrado em: 04 Set 2007 16:11
Localização: Pedreira-SP

Re: GRAVAÇÃO DE ARQUIVO TXT

Mensagem por SandroBelarmino »

Experimente usar a função fwrite() para gerar o arquivo TXT, voce vai encontar vários exemplos aqui no fórum.
PS. Continue usando as variáveis utf para o início da primeira linha e a tr para o separador dos campos.
Alessandro R Belarmino
Clipper 5.2e - Blinker 7 - DBFNTX / DBFCDX
"Quem trabalha muito erra muito, quem trabalha pouco erra pouco, quem não trabalha não erra e quem não erra é promovido !!!!"
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Gravação de arquivo TXT

Mensagem por gvc »

Use um editor que tenha recurso de mostrar o arquivo em hexadecial (dump de arquivo) para verificar quais são esses caracteres.

Se for para posicionar o cursor/cabeça de impressão vc pode usar SetPrc(0,0) para limpar a informação de última posição de impressão que fica na memória do micro.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
reinaldo
Usuário Nível 3
Usuário Nível 3
Mensagens: 105
Registrado em: 02 Mai 2005 13:08
Localização: santos/sp

Re: Gravação de arquivo TXT

Mensagem por reinaldo »

Olá amigos. Obrigado pelas respostas.
Vou estudar a função FWRITE. Acredito que com ela não vou ter problemas. Mas preciso desvendar esse mistério.
Descobri uma coisa:
O caracter estranho é este:
Ele é usado pela impressora para coisas tipo condensação, 8 lpp, etc.
Como esse problema não acontece sempre, é possível que seja alguma sujeira de alguma impressão anterior,
ou qualquer coisa do tipo

Reinaldo
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Re: Gravação de arquivo TXT

Mensagem por billy1943 »

Usando as funções FCREATE, FWRITE e FCLOSE não precisa se preocupar com UTFs e outras particularidades.

Para o caso da Nota Fiscal Paulista, um esquema genérico seria:

************************************
nome_arqui := { definir o nome que o arquivo a ser enviado tomará.
eu uso a forma: 11010131.txt onde -> 11 = ano, 01 = mes, 01 = dia inicial, 31 dia final}

separa := "|" // caracter 124
crlf := chr(13) + chr(10) // controle de carriage return e line feed
saidanf := fcreate(nome_arqui,0) // cria o arquivo de saida

fwrite(saidanf," .................. " + separa) // entre as aspas colocar o string necessário sem acentos ou cedilhas

ou

fwrite(saidanf,campo + separa) // colocar o nome do campo de formato caractere, esse campo não pode conter
// caracteres especiais

no final de cada registro:

fwrite(saidanf,crlf) // fecha a linha e avança para a próxima


no final de tudo:

fclose(saidanf) // fecha o arquivo
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: Gravação de arquivo TXT

Mensagem por asimoes »

Pode usar também: (strfile - função da ca-tools)

StrFile(" .................. " + separa + crlf,nome_arqui,.T.)
ou
StrFile(campo + separa + crlf,nome_arqui,.T.)
¦ Add to the end of a file:

? STRFILE("ABCDEFGH", "TEST.TXT", .T.) // Result: 8

¦ A file with drive and path designations, result: 10:

? STRFILE("0123456789", "C:\TEXT\TEST.TXT", .T.)

¦ Data in an existing file is overwritten from position 20 with
a designated string:

? STRFILE("NANTUCKET", "TEST.TXT", .T., 20) // Result: 9

¦ A 5-character string is written starting at position 10 in an
existing file 20-characters long. Since the final parameter is
specified as .T. once, and specified as .F. once, you see different
results:

? STRFILE(REPLICATE("X", 20), "TEST.TXT")
? STRFILE("AAAAA", "TEST.TXT", .T., 10, .F // "XXXXXXXXXXAAAAAXXXXX"
? STRFILE("AAAAA", "TEST.TXT", .T., 10, .T // "XXXXXXXXXXAAAAA"
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
DLZ
Usuário Nível 3
Usuário Nível 3
Mensagens: 184
Registrado em: 09 Jun 2008 10:09
Localização: Ibirubá - RS - Brasil

Re: Gravação de arquivo TXT

Mensagem por DLZ »

Acredito que a solução mais simples seja colocar um SETPRC(0,0) DEPOIS DO SET DEVICE TO TEXTO
reinaldo
Usuário Nível 3
Usuário Nível 3
Mensagens: 105
Registrado em: 02 Mai 2005 13:08
Localização: santos/sp

Re: Gravação de arquivo TXT

Mensagem por reinaldo »

Coloquei o SETPRC(0,0) e parece que funcionou. Pelo menos gravei varios arquivos e o erro não ocorreu.
Obrigado a todos. vou estudar as outras idéias. Um serão úteis

Reinaldo
beltrani_mi
Usuário Nível 1
Usuário Nível 1
Mensagens: 21
Registrado em: 10 Fev 2011 17:07
Localização: São Paulo

Re: Gravação de arquivo TXT

Mensagem por beltrani_mi »

Boa tarde a todos !

Fazia tempo que não entrava aqui no forum... Tive que criar até um novo usuário.

Não sei se poderia postar isso aqui, pois é uma pergunta sobre geração de arquivos usando "set device to printer" e o "set printer to arquivo".

O problema é que preciso gerar arquivos com os nomes gravados em letras minusculas (especificamente para gerar XML). Quando gero o arquivo, o sistema grava o nome do arquivo em maiusculo.

Alguem tem alguma solução ?


Sem mais

Grato
reinaldo
Usuário Nível 3
Usuário Nível 3
Mensagens: 105
Registrado em: 02 Mai 2005 13:08
Localização: santos/sp

Re: Gravação de arquivo TXT

Mensagem por reinaldo »

Realmente, fiz um teste e gravou em letras maiusculas.
Tenho certeza que algum dos colegas vai resolver isso.
Aproveitando, como é que vc grava arquivo XML ? Também estou precisando disso.
Não só gravar mas tb ler um arquivo XML

Reinaldo
beltrani_mi
Usuário Nível 1
Usuário Nível 1
Mensagens: 21
Registrado em: 10 Fev 2011 17:07
Localização: São Paulo

Re: Gravação de arquivo TXT

Mensagem por beltrani_mi »

E aí Reinaldo, td bom ?

Bom, para gerar um XML eu faço o seguinte:

arquivo=´teste.xml´
setprc(0,0)
set devi to prin
set prin to &arquivo
@ prow(),0 say <tag>+campo+´</tag>
@ prow()+1,0 say <tag>+campo+´</tag>
@ prow()+1,0 say ...
set prin to
set devi to scre

Para vc ler um XML, primeiro vc verifica qual o tamanho da maior linha do XML. Em seguida, cria um dbf temporario com um campo do tamanho da linha e grava nele cada linha usando o append from arquivo sdf.

Em seguida, é só ler cada registro desse dbf temporario e pegar o conteudo entre as tags.

Se não me engano aqui no site tem algumas dicas sobre o assunto pesquisando por XML.


Espero ter ajudado.

Sem mais


Grato

Ademir.
Lukas Lima Souza
Usuário Nível 1
Usuário Nível 1
Mensagens: 1
Registrado em: 26 Nov 2018 15:41
Localização: Parnaíba/PI

Gravação de arquivo TXT

Mensagem por Lukas Lima Souza »

gerar arquivo txt com 'insert into'

Código: Selecionar todos

#include "fileio.ch"
#include "dbstruct.ch"
#include "hbclass.ch"

procedure Main()

    public banco_a_icmuf
    public cont := LASTREC()
    public contt
    public files
    public nomeDoCampoDBD
    public i

    SET CENTURY on
    SET DEVICE TO PRINT
    SET PRINT ON
    SET DATE FORMAT "yyyy-mm-dd"
    SET TIME FORMAT  "HH:MM:SS" 
    SET PRINTER TO arquivo.txt
    setFAttr("arquivo.txt", FC_NORMAL)
    USE a_icmuf
    
    banco_a_icmuf := a_icmuf->(DBSTRUCT())
    LIST "insert into a_icmuf (C_PRODUTO, C_UF, C_PCFP, C_ICMS, C_CST, C_DTATUAL, C_HRATUAL) values ("+C_PRODUTO+",'"+C_UF+"',"+Alltrim(Str(C_PCFP))+","+Alltrim(Str(C_ICMS))+",'"+C_CST+"','"+TRANSFORM(C_DTATUAL, "@D")+"','"+TRANSFORM(C_HRATUAL, "@R")+"');" off
    
    return
Editado pela última vez por Toledo em 26 Nov 2018 16:15, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Responder