Importação de Arquivo TXT para DBF

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

UKclipper
Usuário Nível 1
Usuário Nível 1
Mensagens: 27
Registrado em: 13 Fev 2007 16:29

Importação de Arquivo TXT para DBF

Mensagem 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!
Avatar do usuário
Augusto
Usuário Nível 3
Usuário Nível 3
Mensagens: 473
Registrado em: 26 Ago 2003 17:50
Localização: Maricá/RJ
Contato:

Mensagem 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
:xau Fui...
goulart@provsul.com.br

Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
Dércio_Luiz_Zanatta
Usuário Nível 3
Usuário Nível 3
Mensagens: 153
Registrado em: 11 Jan 2006 15:37
Localização: Ibirubá - RS

Mensagem 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.
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

Dércio, isso é gostar de sofrer mesmo hein ?
UKclipper
Usuário Nível 1
Usuário Nível 1
Mensagens: 27
Registrado em: 13 Fev 2007 16:29

Mensagem 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!
Avatar do usuário
Augusto
Usuário Nível 3
Usuário Nível 3
Mensagens: 473
Registrado em: 26 Ago 2003 17:50
Localização: Maricá/RJ
Contato:

Mensagem 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.
:xau Fui...
goulart@provsul.com.br

Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem 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
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)
Avatar do usuário
filizola
Usuário Nível 3
Usuário Nível 3
Mensagens: 421
Registrado em: 19 Ago 2003 20:10
Localização: Belo Horizonte/MG

Mensagem 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.
"Um passo a frente, e já não estará mais no mesmo lugar..."
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem 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
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)
Avatar do usuário
filizola
Usuário Nível 3
Usuário Nível 3
Mensagens: 421
Registrado em: 19 Ago 2003 20:10
Localização: Belo Horizonte/MG

Mensagem 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!"
"Um passo a frente, e já não estará mais no mesmo lugar..."
Dércio_Luiz_Zanatta
Usuário Nível 3
Usuário Nível 3
Mensagens: 153
Registrado em: 11 Jan 2006 15:37
Localização: Ibirubá - RS

Mensagem 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
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Re: Importação de Arquivo TXT para DBF

Mensagem 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.
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem 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.
UKclipper
Usuário Nível 1
Usuário Nível 1
Mensagens: 27
Registrado em: 13 Fev 2007 16:29

Mensagem 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!
Responder