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!