Página 1 de 1

Urgente!!! Gravar Arquivo TXT.

Enviado: 19 Jan 2005 14:06
por Singulani
Alô Galera,

Como niguem entendeu minhas dúvidas postadas com uma rotina teste, resolvi postar logo abaixo a rotina original de meu código fonte ok?
O problema é que tudo funciona normalmente mas o arquivo ARQNF_01.TXT é gravado mas sem nenhum registro. O que será que está errado? Porque os registros não estão sendo gravados no arquivo? Qual o comando que eu estou esquecendo? Vejam analize e me ajudem por favor a desvendar este mistério.

Desde já agradeço a todos os colaboradores.

Singulani
sing@click21.com.br

-------- Meu Código Fonte é assim -----------


/* gerando o nome do arquivo */

cArquivo := "ARQ_01.TXT"

/* criando o arquivo */

nHandle := fcreate (cArquivo, FC_NORMAL)

SELECT NOTA

DO while !eof () )

CLIENTES->(DBSEEK(STR(NOTA->CLIENTE,4)))

/* montagem do registro */

cLinha := ""
cLinha += STR(NOTA->NUMERO,6)
cLinha += DTOC(NOTA->DT_NF)
cLinha += CLIENTES->NOME
cLinha += transform(NOTA->TOT_CIPI, "@E 999,999.99")
cLinha += chr(13)+chr(10) // para saltar a Linha

/* para gravar no arquivo txt */

fwrite (nHandle, cLinha, len (cLinha))

dbskip ()

enddo

fclose (nHandle)

---------------------

E AÍ? SERÁ QUE ALGUEM PODE ME DAR UMA RESPOSTA?

gravar em TXT

Enviado: 19 Jan 2005 15:33
por Domenico
Experimenta utilizar a função memowrit(nome do arquivo, varivel)

Com a função memowrit() você não grava linha a linha, armazena tudo em uma varivel e depois você grava.

Re: Urgente!!! Gravar Arquivo TXT.

Enviado: 19 Jan 2005 16:37
por Maligno
Preste mais atenção no código que você está tentando fazer funcionar. O que se refere à criação e gravação do arquivo texto, está tudo certo. Mas...

Ao criar ou abrir um arquivo qualquer, verifique se o processo foi bem sucedido. Não que isso tenha relação com o problema em si, mas certamente isso evitará alguns problemas futuros, principalmente com possíveis bugs.

Você está usando um SEEK no início de uma malha e nem se dá ao trabalho de verificar se a pesquisa foi bem sucedida? Tudo bem: se achar alguma coisa, vai pro arquivo texto. Mas para quê serve o SKIP final se no retorno da malha o SEEK é executado novamente? Leia o NG: o comando SEEK pesquisa a partir do início do arquivo. Ou seja, você estará numa malha sem fim, porquê ele sempre vai encontrar o mesmo registro. Se encontrar.

Mas, se nada foi gravado, certamente foi porque o seu SEEK não encontrou nenhum registro dentro das condições especificadas. Ou a expressão da condição está errada. Verifique.

IMAGINO que você quis fazer o seguinte:

Código: Selecionar todos

cArquivo := "ARQ_01.TXT" 

if (nHandle := fcreate(cArquivo,FC_NORMAL)) != -1
   SELECT NOTA
   CLIENTES->(DBSEEK(STR(NOTA->CLIENTE,4)))
   *
   while CLIENTES->CODIGO == NOTA->CLIENTE
      cLinha := STR(NOTA->NUMERO,6)
      cLinha += DTOC(NOTA->DT_NF)
      cLinha += CLIENTES->NOME 
      cLinha += transform(NOTA->TOT_CIPI, "@E 999,999.99") 
      cLinha += chr(13)+chr(10)
      *
      fwrite(nHandle,cLinha) 
      dbskip() 
   end
   *
   fclose(nHandle)
end
Dica: não use um código de identificação (clientes, fornecedores, etc) numérico. Se você não vai utilizá-lo em cálculos, mantenha-o como caractere. Fica muito mais fácil manipulá-lo e ainda economiza algum código.

A comparação no início da malha é a condição para que ela continue. Se não satisfeita, fim. Apenas corrija (se for o caso) o nome do campo CODIGO no arquivo CLIENTES. Inventei esse nome apenas para você entender o que eu quis dizer.

No demais, uma leitura do código já deve ser o suficiente para entendê-lo. Mas repare na diferença estrutural em comparação com o original. Aliás, repare também que eu apenas previ, mas não tratei os possíveis erros. Isso fica a seu cargo.

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 19 Jan 2005 18:51
por Clipper
Prezado Maligno

No começo imaginei a mesma coisa que você, porém verificando melhor observei que o SEEK está sendo executado no arquivo de clientes para que ele possa pegar o nome do cliente e colocar no arquivo texto, o skip está sendo feito no arquivo de notas, é que ficou meio complicado mesmo, concordo plenamente com você com o uso de um código de verificação, o problema parece ser de lógica e não de uso errado das funções.

Prezado Singulani tente inicialmente fazer o mais fácil possivel e verificar se os registros que você quer estejam sendo integralmente processados.

Até logo.

Marcelo

Enviado: 19 Jan 2005 20:55
por Maligno
Tem razão, Marcelo. A distração foi toda minha. Minhas desculpas ao colega. E esqueça o que eu disse na mensagem anterior, sobre loop infinito.
Mas que a coisa está meio bagunçada e complicada de entender, está.

Agora, para a explicação do porquê não ter gravado nada: só pode ser porque o arquivo NOTA está vazio (literalmente ou pelo efeito de uma filtragem), mesmo levando em conta a rotina original. Se tivesse algum conteúdo, gravaria TODOS os registros do arquivo, a partir do ponteiro (era isso o que deveria fazer?). Na rotina, este arquivo NOTA já chega aberto. Não sei qual é a situação do ponteiro do arquivo. Se foi montado, em algum outro ponto do programa, um SET FILTER ou mesmo um SET ESCOPE, já não dá pra gente saber. Esse ponto é importante e deveria ter sido explicado pelo colega.

No demais, é aquilo que eu tinha dito antes: todo o procedimento de criação de arquivo e gravação em texto já estava correto. Faltava apenas a checagem de erros.

Corrigindo meu código, que acabou ficando parecido com o original:

Código: Selecionar todos

cArquivo := "ARQ_01.TXT"

if (nHandle := fcreate(cArquivo,FC_NORMAL)) != -1
   SELECT NOTA
   *
   while !EoF()
      if !CLIENTES->(DBSEEK(STR(NOTA->CLIENTE,4)))
         // se não encontrar o registro do cliente,...
      end
      *
      cLinha := STR(NOTA->NUMERO,6)
      cLinha += DTOC(NOTA->DT_NF)
      cLinha += CLIENTES->NOME
      cLinha += transform(NOTA->TOT_CIPI, "@E 999,999.99")
      cLinha += chr(13)+chr(10)
      *
      fwrite(nHandle,cLinha)
      dbskip()
   end
   *
   fclose(nHandle)
end
[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 20 Jan 2005 02:35
por evolver
Evolver de volta na área usando uma porcaria dum modem pctel...

Bem, quanto a compreender o código pra mim foi fácil uma vez que sou acostumado a escrever código assim...

Tente apagar o arquivo ARQ_01.TXT com ferase antes de criar

Crie o arquivo com outros nomes.

Verifique com ferror se está sendo criado normalmente o arquivo.

Use o valor de criação de arquivo (freate(arquivo,0)) diretamente ao invés de usando o valor FC_NORMAL.

Tente usar um go top nas notas pois o ponteiro de arquivo pode estar no final do arquivo o que geraria um arquivo vazio. Verifique se a rotina que seleciona quais notas apareceriam está correta pois ele pode estar selecionando nota nenhuma o que ocasionaria erro.

Enviado: 20 Jan 2005 18:43
por ZeroCool®
:!:
vou trazer pra empresa amanhã um sistema que gera um txt e funcionou legalzim... vc poderá usar de exemplo, ou se basear nele... amanhã eu trago !!!! e posto, né... :P

[]´s
ZeroCool®

pra mim, funfa direitim !

Enviado: 21 Jan 2005 09:33
por ZeroCool®
vamos ver se te encaixa, né...
vai ficar meio longo...
** CABEÇALHO INICIAL... NADA A VER AINDA **
telar := savescreen(00,00,24,79)
@ 06,15 to 16,37
use canal index canal.ntx
dbedit(07,16,15,36,{"CANAL"})
if lastkey() = 27
close databases
restscreen(00,00,24,79,telar)
return
endif
e_cod := codigo
e_cred := canal
close databases
restscreen(00,00,24,79,telar)
if lastkey() = 27
close databases
restscreen(00,00,24,79,telar)
return
endif

** COMECEI AQUI O PROCESSO **

c_normal()
set console off
set printer on
set printer to c.txt
? e_cred
? dtoc(c_data)
set printer to
set printer off
set console on
set device to screen
f_mes := month(c_data)
f_ano := year(c_data)
centro("RELATORIO DE COMISSAO DO MES",04)
c_erro()
pos := 0
delete file c:\comissao\fechamto.dbf ** SEMPRE APAGO A BASE DE DADOS ANTIGA **
use comissao index comixd.ntx new
dbgotop()
copy structure to fechamto ** CRIO DE NOVO A BASE ESPELHO PARA TRABALHAR SEGURO **

** PREENCHIMENTO DO ARQUIVO ESPELHO COM OS DADOS A SEREM EXPORTADOS. AQUI VC MUDA DE ACORDO COM AS CONDIÇÕES QUE VC VAI PRECISAR. NO MEU CASO ERA O APENAS OS DADOS DO MES E ANO CORRENTE **

do while !eof()
pos++
if ((month(comissao->data) = f_mes) .and. (year(comissao->data) = f_ano))
use fechamto new
append blank
replace fechamto->data with comissao->data
replace fechamto->inscricao with comissao->inscricao
replace fechamto->telefone with comissao->telefone
replace fechamto->planoatual with comissao->planoatual
replace fechamto->apaatual with comissao->apaatual
replace fechamto->serialatua with comissao->serialatua
replace fechamto->nota with comissao->nota
replace fechamto->notamae with comissao->notamae
replace fechamto->planonovo with comissao->planonovo
replace fechamto->apanovo with comissao->apanovo
replace fechamto->serialnovo with comissao->serialnovo
replace fechamto->brindei with comissao->brindei
replace fechamto->brindet with comissao->brindet
replace fechamto->desconto with comissao->desconto
replace fechamto->apanosso with comissao->apanosso
replace fechamto->tipocomiss with comissao->tipocomiss
replace fechamto->observacao with comissao->observacao
replace fechamto->gerado with comissao->gerado
replace fechamto->vendedor with comissao->vendedor

close fechamto
endif

** FUNÇÃOZINHA PRA MOSTRAR A PORCENTAGEM DA EXPORTAÇÃO NA TELA... **

select comissao
percent3 := ltrim(str((pos/lastrec()) * 100))
@ 18,03 clear to 20,39
@ 18,03 to 20,39
@ 19,04 say "Gerando Arquivo..." + percent3 + "% concluido" ** ACABA AQUI A FUNÇÃO DA PORCENTAGEM ... **
dbskip()
enddo
close databases
set console off
set console on
delete file c:\comissao\relat\comparc.txt
delete file c:\comissao\fechai.ntx

** MUDO O DESTINO PARA UM ARQUIVO, COMO SE FOSSE UMA IMPRESSORA ***

set console off
set printer on
set printer to c:\comissao\relat\comparc.txt
use fechamto.dbf
index on data to fechai.ntx
close databases

** NO MEU CASO, CRIEI ESSE CABEÇALHO NO ARQUIVO, JÁ SEPARADO POR VIRGULAS, COM OS CAMPOS. PRA IMPORTAR NO EXCEL DEPOIS FICA TETA !!! **

? "DATA,INSCRICAO,TELEFONE,PLANO ATUAL,APARELHO ATUAL,SERIA ATUAL,NOTA,NOTA MAE,PLANO NOVO,APARELHO NOVO,SERIAL NOVO,INSCRICAO BRINDE, TELEFONE BRINDE, DESCONTO, APARELHO DA SERCOMTEL ?,COMISSAO,OBSERVACAO,JÁ GERADO ?, VENDEDOR"

** ABRO O ARQUIVO ESPELHO, QUE TEM APENAS OS DADOS QUE PASSARAM PELA CONDIÇÃO LÁ EM CIMA **

use fechamto.dbf index fechai
do while !eof()

** "IMPRIMO ELE INTEIRO PRO ARQUIVO. AÍ OS NOMES SÃO OS NOMES DOS CAMPOS DO MEU DBF, ONDE ENTRE CADA UM, COLOCO UMA ",". FIZ COM "," O SEPARADOS... AI VC MUDA PRO QUE QUISER... **


? data,",",inscricao,",",telefone,",",planoatual,",",apaatual,",",serialatua,",",nota;
,",",notamae,",",planonovo,",",apanovo,",",serialnovo,",",brindei,",",brindet;
,",",desconto,",",apanosso,",",tipocomiss,",",observacao,",",gerado,",",vendedor
dbskip()
enddo
set printer to
set printer off
set console on
public relcom := 1
do calcula.prg
delete file c:\comissao\fechamto.dbf
restscreen(00,00,24,79,telar)

return
** ACABOU... O PROPRIO DBSKIP() PULA DE LINHA AUTOMATICAMENTE NO ARQUIVO TXT FINAL. BOA SORTE E QQUER COISA, AVISA NÓIZ !!!


[]´s
ZeroCool®

- Edited by Evolver - Quando colocar códigos longos use a tag QUOTE, o botão pra usar está entre os botões na janela de edição do post. Obrigado

Enviado: 21 Jan 2005 10:55
por lima
Caro colega,
Antes da linha
fwrite (nHandle, cLinha, len (cLinha))
coloque
fseek(nHandle,0,2)
ficando assim

....
fseek(nHandle,0,2)
fwrite (nHandle, cLinha)
....

Até +

LIMA :cool: