Urgente!!! Gravar Arquivo TXT.
Moderador: Moderadores
Urgente!!! Gravar Arquivo TXT.
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?
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?
-
Domenico
- Usuário Nível 1

- Mensagens: 41
- Registrado em: 02 Out 2004 16:03
- Localização: São Paulo
- Contato:
gravar em TXT
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.
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.
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:
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
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)
endA 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
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
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
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
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:
[]'s
Maligno
http://www.buzinello.com/prg
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)
endMaligno
http://www.buzinello.com/prg
-
evolver
- Membro Master

- Mensagens: 189
- Registrado em: 28 Ago 2004 01:02
- Localização: Cruz Alta - RS
- Contato:
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.
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.
Sergio "Evolver" Fagundes
CURVE-SE DIANTE DE MIM SER INSIGNIFICANTE, POIS EU SOU ROOT
Só respondo em PVT perguntas relativas ao que eu faço. Qualquer outra dúvida favor postar no fórum.
Peço aos veteranos que antes de responder a uma pergunta repetida dêem uma pesquisada e instruam a quem perguntou a fazer o mesmo.
CURVE-SE DIANTE DE MIM SER INSIGNIFICANTE, POIS EU SOU ROOT
Só respondo em PVT perguntas relativas ao que eu faço. Qualquer outra dúvida favor postar no fórum.
Peço aos veteranos que antes de responder a uma pergunta repetida dêem uma pesquisada e instruam a quem perguntou a fazer o mesmo.
pra mim, funfa direitim !
vamos ver se te encaixa, né...
vai ficar meio longo...
** CABEÇALHO INICIAL... NADA A VER AINDA **
[]´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
vai ficar meio longo...
** CABEÇALHO INICIAL... NADA A VER AINDA **
** ACABOU... O PROPRIO DBSKIP() PULA DE LINHA AUTOMATICAMENTE NO ARQUIVO TXT FINAL. BOA SORTE E QQUER COISA, AVISA NÓIZ !!!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
[]´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
