Página 1 de 1
Importação de Arquivo TXT para DBF
Enviado: 14 Mar 2007 08:55
por UKclipper
Olá, pessoal!
Tenho um arquivo TXT contendo os dados de batidas de ponto de funcionários já delimiitadas. Sei o tamanho de cada campo na linha e sei que cada linha corresponde a um registro.
Alguém tem idéia de como fazer para abrir e ler linha a linha do TXT até o final do arquivo para importar isso tudo para um arquivo DBF?
Como tenho mais perguntado do que dado sugestões neste fórum, prometo que, assim que meus sistemas de Gestão Empresarial e Depto. Pessoal estiverem prontos, eu os ponho aqui no fórum, tá?
Valeu!
Enviado: 14 Mar 2007 09:05
por Augusto
Parceiro...
A primeira coisa que deve fazer é criar o DBF com a estrutura igual a que vc tem no TXT, respeitando o tipo de cada campo que irá receber os dados. Feito isso...
Código: Selecionar todos
use SEU_DBF
append from SEU_TXT delimited
close data
return
Enviado: 15 Mar 2007 14:34
por Dércio_Luiz_Zanatta
Eu faço um pouquinho diferente que o amigo, mas da no mesmo.
Eu crio um Dbf com um único campo Char com o tamanho do registro no arquivo texto. Depois uso o APPEND FROM;
USE ARQIMP
APPEND FROM "TEXTO.TXT" ALL SDF
Depois disso leio o ARQIMP de "cabo a rabo" e vou pegando as informações com a função SUBSTR().
Espero ter ajudado.
Enviado: 15 Mar 2007 16:45
por Grings
Dércio, isso é gostar de sofrer mesmo hein ?
Enviado: 15 Mar 2007 17:04
por UKclipper
Amigos
Eu não posso gravar tudo sobre o DBF que já tenho. Isso apagaria os dados que os usuários já modificaram no DBF.
Cheguei até a pensar em criar um DBF vazio, preenchê-lo e, depois, com esse DBF preenchido atualizar o DBF que já tenho. Mas costumo usar o menor número de arquivos possível.
O que eu preciso é ler o arquivo texto da primeira até a última linha, sendo que cada linha será gravada como um novo registro no DBF se o registro já não existir.
Sei que existem funções do próprio Clipper que possibilitam essa leitura linha-a-linha, mas não lembro quais são.
E Dércio, ão entendi. A sintaxe do SUBSTR não é
SUBSTR(<VARIAVEL>,<POSICAO_INICIAL>, <POSICAO_FINAL>?
Como você consegue ler o arquivo de cabo a rabo assim? Você pode postar aqui no fórum um trechinho do código?
Valeu, gente!
Enviado: 15 Mar 2007 17:10
por Augusto
UKclipper escreveu:Cheguei até a pensar em criar um DBF vazio, preenchê-lo e, depois, com esse DBF preenchido atualizar o DBF que já tenho.
Até onde eu conheço o Clipper, se a sua "origem" é um TXT... não tem jeito... é isso que terá de ser feito... (usando a rotina que te passei)
Vamos ver se algum parceiro com mais conhecimento que eu (o que não é difícil) tem uma solução que atenda a sua necessidade efetiva.
Enviado: 15 Mar 2007 17:16
por Clipper
Usando a idéia do Dércio :
Código: Selecionar todos
SELE 1
USE CADASTRO INDE CADASTRO
SELE 2
USE ARQIMP
APPEND FROM "TEXTO.TXT" ALL SDF
DBGOTOP()
DO WHIL .NOT. EOF()
KKCOD=SUBSTR(CAMPO,1,6) // pega o código
KKNOM=SUBSTR(CAMPO,7,40) // pega o nome
KKEND=SUBSTR(47,50) // pega o endereço
KKCID=SUBSTR(97,30) // pega a cidade
SELE CADASTRO
DBSEEK(KKCOD)
IF FOUND()
DBAPPEND()
REPLACE CODIGO WITH KKCOD
REPLACE NOME WITH KKNOM
REPLACE ENDERECO WITH KKEND
REPLACE CIDADE WITH KKCID
ENDIF
SELE ARQIMP
SKIP
ENDDO
DBCLOSEALL()
Até logo.
Marcelo
Enviado: 15 Mar 2007 20:39
por filizola
"Eu não posso gravar tudo sobre o DBF que já tenho. Isso apagaria os dados que os usuários já modificaram no DBF. "
mas o append from nao ira sobrepor os dados ja existentes no arquivo e sim agregar os novos registros a este arquivo.
Enviado: 15 Mar 2007 20:45
por Clipper
O problema é que ele não quer importar tudo, ele quer apenas o que não exista no DBF de destino.
Até logo.
Marcelo
Enviado: 15 Mar 2007 21:54
por filizola
"Olá, pessoal!
Tenho um arquivo TXT contendo os dados de batidas de ponto de funcionários já delimiitadas. Sei o tamanho de cada campo na linha e sei que cada linha corresponde a um registro.
Alguém tem idéia de como fazer para abrir e ler linha a linha do TXT até o final do arquivo para importar isso tudo para um arquivo DBF?
Como tenho mais perguntado do que dado sugestões neste fórum, prometo que, assim que meus sistemas de Gestão Empresarial e Depto. Pessoal estiverem prontos, eu os ponho aqui no fórum, tá?
Valeu!"
Enviado: 16 Mar 2007 08:29
por Dércio_Luiz_Zanatta
O usuário CLIPPER postou muito bem o código da maneira que eu uso.
Desta maneira vc não estará importando(APPEND FROM) diretamente na sua tabela de dados, mas sim em uma tabela auxiliar com um único campo Char. Depois vc vai ler esta tabela auxiliar e gravar cfe desejado na sua tabela definitiva. Ta bem claro na postagem do colega CLIPPER.
Existe uma forma de ler um arquivo texto sem usar uma tabela DBF auxiliar. Trata-se dos comandos FOPEN(),FSEEK(),FREAD(),FCLOSE().. etc.. do próprio clipper, porém é muito mais complicado ( ai sim é que é gostar de sofrer ehehe).
Um grande abraço.
Dércio Zanatta
Re: Importação de Arquivo TXT para DBF
Enviado: 16 Mar 2007 09:05
por leandrolinauer
UKclipper escreveu:Olá, pessoal!
Tenho um arquivo TXT contendo os dados de batidas de ponto de funcionários já delimiitadas. Sei o tamanho de cada campo na linha e sei que cada linha corresponde a um registro.
Alguém tem idéia de como fazer para abrir e ler linha a linha do TXT até o final do arquivo para importar isso tudo para um arquivo DBF?
Como tenho mais perguntado do que dado sugestões neste fórum, prometo que, assim que meus sistemas de Gestão Empresarial e Depto. Pessoal estiverem prontos, eu os ponho aqui no fórum, tá?
Valeu!
Olá caro UKclipper.
Eu utilizo as funções do clipper de abertura de arquivos texto FOPEN()(),FSEEK(),FREAD(),FCLOSE(), faço remessas e retornos MATRIZ <-> FILIAL através de arquivos TXT, os quais leios e importo diretamente para dentro do DBF. Abaixo o exemplo de geração e importação de um arquivo.
//GERAÇÃO
Código: Selecionar todos
Static Procedure GRemessaZ
aFile:=wDirG+"Z"+aN_REM+"."+wExt //NOME DO ARQUIVO
DbSelectArea("CDES1000")
DbSeek(kA) //KA É A VARIAVEL ALTERAdo
Set Device To Print
Set Printer To &aFile.+wExt
@ PRow(),00 Say "I-CDES1000Z"+aN_REM+DtoC(Date())+Time()+StrZero(Val(wCod),4)+wEmpr+Repl(" ",117)+StrZero(PRow()+1,4)
While !Eof().And.P_REM==kA
ShowWaitProc(.T.)
If CDES1000->N_REM==aN_REM //se pertencer a remessa
@ PRow()+1,00 Say "M-CDES1000"+CONTA+N_DOC+DtoC(D_EMI)+StrZero(V_DES,18,2)+DtoC(D_VEN)+C_CX+DtoC(D_CX)+;
DtoC(D_PAGO)+StrZero(V_PAGO,18,2)+P_CONTA+OBS+N_REM+kG+kG+OPER+StrZero(PRow()+1,4)
EndIf
DbSkip(1)
End
@ PRow()+1,00 Say "F-CDES1000"+wVersao //fim do arquivo
//IMPORTAÇÃO DO MESMO
Código: Selecionar todos
Static Procedure PRemessaZ
Private lProcessa:=.F.,xRemessa:=.F.
Declare aNFiles[ADir(wDirR+"Z*."+wExt)] //achei o arquivo 1 ou mais
ADir(wDirR+"Z*."+wExt,aNFiles) //classifico em ordem para fazer em ordem
ASort(aNFiles)
aFile:=FOpen(wDirR+aNFiles[1])
wComando:=FReadStr(aFile,10) //posiciono no primeiro comando
FSeek(aFile,10,0)
aNRet:=FreadStr(aFile,8) //nome da remessa
aNDia:=CtoD(FReadStr(aFile,10)) //dia
aNTim:=FreadStr(aFile,8) //hora
FSeek(aFile,36,0)
aNFil:=FreadStr(aFile,4) //numero filial
FSeek(aFile,203,0) //posiciono para o segundo comando
wComando:=FReadStr(aFile,10) //comando
xRemessa:=VPRetorno(@aNRet,wExt) //gravo a remessa que esta fazendo
If StrZero(Val(wCod),4)==aNFil.And.xRemessa=.T. //se for da loja certa
If wComando=="M-CDES1000" //se o comando é o inicio dos dados do arquivo
While .T.
ShowWaitProc() //barra de progressao
x_CONTA:=FReadStr(aFile,10) //leio e passo para variaveis
x_N_DOC:=FReadStr(aFile,10)
x_D_EMI:=CtoD(FReadStr(aFile,10))
//CtoD(FReadStr(aFile,2)+"/"+FReadStr(aFile,2)+"/"+FReadStr(aFile,4))
If !CDES1000->(DbSeek(x_CONTA+x_N_DOC+DtoS(x_D_EMI))) //procuro
CDES1000->(DbAppend()) //se não acho crio com dados principais
CDES1000->CONTA:=x_CONTA
CDES1000->N_DOC:=x_N_DOC
CDES1000->D_EMI:=x_D_EMI
CDES1000->(DbCommitAll())
EndIf
While CDES1000->(!RLock())
ShowMessage(,,{"Aguardando libera‡Æo do registro de despesa."},1)
End
//se achado ou não leio o arquivo e gravo direto dentro do campo dbf
CDES1000->V_DES :=Val(FReadStr(aFile,18))
CDES1000->D_VEN :=CtoD(FReadStr(aFile,10))
CDES1000->C_CX :=FReadStr(aFile,02)
CDES1000->D_CX :=CtoD(FReadStr(aFile,10))
CDES1000->D_PAGO :=CtoD(FReadStr(aFile,10))
CDES1000->V_PAGO :=Val(FReadStr(aFile,18))
CDES1000->P_CONTA:=FReadStr(aFile,10)
CDES1000->OBS :=FReadStr(aFile,60)
CDES1000->N_REM :=FReadStr(aFile,07)
CDES1000->O_PROC :=FReadStr(aFile,01)
CDES1000->P_REM :=FReadStr(aFile,01)
CDES1000->OPER :=FReadStr(aFile,10)
CDES1000->(DbCommitAll())
CDES1000->(DbUnLock())
FSeek(aFile,6,1) //posicionou //aqui //fim da primeira linha posiciono novamente
wComando:=FReadStr(aFile,10) // pego o comando
If wComando=="F-CDES1000" //verifico se for o fim ultima linha
lProcessa:=wProcessa:=.T. //saio
Exit
EndIf
End //senão volto ao while e continuo lendo porque é a proxima linha de dados
ElseIf wComando=="F-CDES1000" //se for fim
lProcessa:=wProcessa:=.T. //saio
EndIf
ElseIf StrZero(Val(wCod),4)#aNFil //se não é desta loja é de outra não processo para não dar lixo
ShowMessage(,,{"Arquivo retorno a processar ‚ da",""+wEmpr+"..."},0)
ElseIf xRemessa=.F.
lProcessa:=.F.
Else //se o aruqivo não andou no comando corretamente o arquivo esta com falha
ShowMessage(,,{"Arquivo a Ser Processado","NÆo Est Correto, Verifique!"},0)
EndIf
FClose(aFile) //fecho
If lProcessa=.T. //se processado corretamente elimino da lista o txt
ShowWait(,,"Processamento Conclu¡do Com Sucesso...")
GvRetorno(@aNRet,@aNDia,@aNTim) //gravo o retorno com sucesso
If File(wDirR+Left(aNFiles[1],8)+"."+pExt) //renomeio
FErase(wDirR+Left(aNFiles[1],8)+"."+Left(pExt,2)+"1") //se tiver outro iigual
FRename(wDirR+Left(aNFiles[1],8)+"."+pExt,wDirR+Left(aNFiles[1],8)+"."+Left(pExt,2)+"1")
EndIf
FRename(wDirR+Left(aNFiles[1],8)+"."+wExt,wDirR+Left(aNFiles[1],8)+"."+pExt) //renomeio
CloseWindow()
EndIf
Return lProcessa //fim do processo
//////////////////
Estes acima, é de um arquivo apenas, trabalhoso montar e alinhar o processamento mas funciona perfeitamente, agora estou pensando em gerar em formato CVS para importação, mas vai levar um tempão, hehehe. Se alguem ja souber como fazer poste para nós aprendermos a fazer tbem.
Um abraço, espero ter ajudado na medida do possível.
Enviado: 16 Mar 2007 10:50
por Grings
Já que é para não usar arquivos e passar trabalho, o melhor é ler o arquivo sequencialmente e exportar para um array depois comparar os dados com o dbf e atualizar o que quizer.
Enviado: 19 Mar 2007 08:02
por UKclipper
Olá, pessoal!
Usando o código postado pelo usuário CLIPPER deu tudo certo. Agora é só o usuário do sistema verificar as batidas de ponto dos funcionários com os atestados e saídas autorizadas.
Valeu, mesmo!