Página 1 de 1

Gravação de arquivo TXT

Enviado: 26 Jan 2011 15:27
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

Re: GRAVAÇÃO DE ARQUIVO TXT

Enviado: 26 Jan 2011 16:14
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.

Re: Gravação de arquivo TXT

Enviado: 26 Jan 2011 23:00
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.

Re: Gravação de arquivo TXT

Enviado: 27 Jan 2011 08:44
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

Re: Gravação de arquivo TXT

Enviado: 27 Jan 2011 11:32
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

Re: Gravação de arquivo TXT

Enviado: 27 Jan 2011 12:00
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"

Re: Gravação de arquivo TXT

Enviado: 27 Jan 2011 13:34
por DLZ
Acredito que a solução mais simples seja colocar um SETPRC(0,0) DEPOIS DO SET DEVICE TO TEXTO

Re: Gravação de arquivo TXT

Enviado: 27 Jan 2011 14:35
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

Re: Gravação de arquivo TXT

Enviado: 10 Fev 2011 17:17
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

Re: Gravação de arquivo TXT

Enviado: 10 Fev 2011 18:54
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

Re: Gravação de arquivo TXT

Enviado: 10 Fev 2011 21:07
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.

Gravação de arquivo TXT

Enviado: 26 Nov 2018 15:45
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