Clipper On Line • Ver Tópico - Migração de dados entre Arrays e BDs

Migração de dados entre Arrays e BDs

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

Migração de dados entre Arrays e BDs

Mensagempor Jairo Maia » 20 Mai 2012 10:47

Olá Francisco,

Tente com a alteração abaixo: Passei as linhas 15, 16 e 17 do seu código para o inicio do laço "j". Veja se é isso.
if fx1<>0                    // esta rotina será executada se fx1 # 0 
  k:=fx1-9               // k assume 9 valores anterioress a fx1
  for j:=k to fx1     
    select bde
    dbappend()
    select bp
    for r:= 1 to 15  // 15 valores possíveis existentes em BP
      vLr:="F" + alltrim(str(r))  // vLr assume bde >> f1 f2 ... f15
      select bp
      go j
      for m:= 1 to 25  // esta rotina localiza os correspondentes F1 com N1 F2 com N2 etc.
        if bp->&vLr = m  // macro assume bp >> bp->f1,bp->f2 ...bp->f15
          bdN:="N" + alltrim(str(m))  //bdN assume os campos de bde >> N1, N2, ...,N25
          replace bde->&bdN with 1   // na existência do correspondente o campo N assume valor 1
        endif
      next
    next
  next
endif
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Migração de dados entre Arrays e BDs

Mensagempor rochinha » 20 Mai 2012 10:52

Amiguinho,

Este registro zerado causa algum problema?

Senão deixe-o, mas o correto seria verificar passo-a-passo como são gerados os numeros que voce manipula nos ifs:

Além disto até que se encontre o problema coloque um escape como abaixo:
if fx1<>0                    // esta rotina será executada se fx1 # 0 
   k:=fx1-9               // k assume 9 valores anterioress a fx1
   for j:=k to fx1

        ? "for j:=k to fx1", j // ***** TRACANDO A ROTA *****
        if j > 10
           exit
        endif

        for r:= 1 to 15  // 15 valores possíveis existentes em BP

             ? "for r:= 1 to 15", r // ***** TRACANDO A ROTA *****

             vLr:="F" + alltrim(str(r))  // vLr assume bde >> f1 f2 ... f15
             select bp
             go j
             for m:= 1 to 25  // esta rotina localiza os correspondentes F1 com N1 F2 com N2 etc.
                  if bp->&vLr = m  // macro assume bp >> bp->f1,bp->f2 ...bp->f15
                     bdN:="N" + alltrim(str(m))  //bdN assume os campos de bde >> N1, N2, ...,N25
                     replace bde->&bdN with 1   // na existência do correspondente o campo N assume valor 1
                  endif
             next
        next
        select bde
        dbappend()
        select bp
   next
endif
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Migração de dados entre Arrays e BDs

Mensagempor rochinha » 20 Mai 2012 11:04

Amiguinhos,

Esta galéra PC Toledo é muito ativa, Parabéns.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Migração de dados entre Arrays e BDs

Mensagempor Jairo Maia » 20 Mai 2012 14:34

Olá Rochinha,

Mas analisando seu post, percebi que nem a solução que propus, nem a sua irá resolver o problema. Veja que no código que ele postou, o aliás bde já chega com um AppenBlank() que ele cria antes da entrada nesta seção.

No caso da minha proposta, será gerado um registro em branco adicional, e no caso da sua proposta, o laço não passa por ela se for maior que 10. Vou propor uma outra solução usando a sua idéia, mas alterando a posição:
if fx1<>0                    // esta rotina será executada se fx1 # 0 
  k:=fx1-9               // k assume 9 valores anterioress a fx1
  for j:=k to fx1     
    for r:= 1 to 15  // 15 valores possíveis existentes em BP
      vLr:="F" + alltrim(str(r))  // vLr assume bde >> f1 f2 ... f15
      select bp
      go j
      for m:= 1 to 25  // esta rotina localiza os correspondentes F1 com N1 F2 com N2 etc.
        if bp->&vLr = m  // macro assume bp >> bp->f1,bp->f2 ...bp->f15
          bdN:="N" + alltrim(str(m))  //bdN assume os campos de bde >> N1, N2, ...,N25
          replace bde->&bdN with 1   // na existência do correspondente o campo N assume valor 1
        endif
      next
    next
   
    If j < 10  // aqui, se j = 10 mais nada a fazer, e sai no próximo loop...
      select bde
      dbappend()
      select bp
    Endi

  next
endif
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Migração de dados entre Arrays e BDs

Mensagempor rochinha » 21 Mai 2012 01:54

Amiguinho,

Pelo menos são mais cabeças pensando, néh, as vezes a solução é uma pequena coisa, um nada na verdade, mas quando se trata de laços aninhados um simples erro em um causa um caos nos outros.

A gente chega lá.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Migração de dados entre Arrays e BDs

Mensagempor Francisco Diniz » 07 Out 2014 08:01

Bom dia Pessoal.

Estes dias estava com este mesmo problema para resolver já em um outro sistema que estou desenvolvendo. É uma situação parecida, só que de um Bd para outro, o que difere é que o Primeiro BD com 15 campos( bdMatriz) terá sua imagem passada para o 2o BD com 99 campos (bdClass) porém de forma classificada onde os números não indicados no bdMatriz serão preenchidos com zero no bdClass:

bdMatriz >> registro cole1 cole2 cole3 cole4 cole5 cole6 ... cole15
... 45 1 16 3 5 99 16
estes dados coletados deverão ser passados para o bdClass classificados em ordem crescente que devem ficar assim

bdClass >> registro cclas1 cclas2 cclas3 cclas4 cclas5 cclas6 ... cclas16 cclas17 ...cclas99
... 1 0 3 0 5 0 16 0 99

Qual o processo mais curto para se obter esta classificação ? Os senhores têm alguma sugestão?

Obrigado e fiquem na paz.

Francisco
Francisco Diniz
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 22
Data de registro: 13 Fev 2012 22:05
Cidade/Estado: Marília/ SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Migração de dados entre Arrays e BDs

Mensagempor Jairo Maia » 07 Out 2014 17:29

Olá Francisco,

Tenho a impressão que não ficou claro o que você quer com os 2 arquivos. Me parece que você não está falando em consulta relacional, mas sim, sincronizar campos entre arquivos, e diferenciar informações se um não está contemplado no outro. Mas da minha parte confesso que não entendi o que você quer... Se não for uma dificuldade somente minha, você poderia tentar nos esclarecer melhor?
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Migração de dados entre Arrays e BDs

Mensagempor Francisco Diniz » 07 Out 2014 23:44

Boa Noite Pessoal
Boa noite Jairo.

O que estou tentando fazer é simples, porém da maneira que estou fazendo o prg fica longo demais. É assim:
>. Tenho dois bancos de dados, um deles eu chamo de Bdmatriz e o outro de bdClass. O bdMatriz será copiado no bdClass.
O bdMatriz possue 15 campos numéricos em cada registro ( 1450 registros) e que de forma desarranjada podem conter valores de 1 a 99, ou seja, num universo de 99 números o bdClass possue 15 números deste universo e não repetidos por registro.
Já o bdClass possue a mesma quantidade de registro que o bdMatriz, porém com 99 campos. Os registros com os respectivos campos deste bancos serão preenchidos com os quinze números extraídos do bdMatriz, nos locais (campos) correspondentes a grandeza numérica existente nos campos do bdMatriz. Os campos que não tem correspondência com os campos do bdMatriz ficam com valor zero ( 0 ).
Isto na verdade é classificar os 15 números de cada registro do bdMatriz no bdCalss de forma ordenada e dentro dos campos correspondentes ao valor numérico existente nos campos do bdMatriz. (99 campos).
Francisco Diniz
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 22
Data de registro: 13 Fev 2012 22:05
Cidade/Estado: Marília/ SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Migração de dados entre Arrays e BDs

Mensagempor alxsts » 08 Out 2014 02:44

Olá!

Não sei se entendi a questão mas, veja se o código abaixo atende. Não compilei nem testei.
FUNCTION Teste()

   LOCAL aRecord, nVal, nPos

   use bdclass shared new
   use bdmatriz shared new
   
   bdmatriz->( dbGoTop() )
   
   WHILE bdmatriz->( ! Eof() )
   
      aRecord := AFill( Array( 99 ), 0 )
      
      FOR nPos := 1 TO 15
         nVal := bdmatriz->( FieldGet( nPos ) )
         aRecord[ nVal ] := nVal
      NEXT
      
      bdclass->( dbAppend() )
      
      AEval( aRecord, { | nVal, nPosition| bdclass->( FieldPut( nPosition, nVal ) ) } )
      
      bdmatriz->( dbSkip() )
   ENDDO
   
   dbCloseAll()

RETURN NIL
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Migração de dados entre Arrays e BDs

Mensagempor Francisco Diniz » 09 Out 2014 07:16

Bom dia.

Vou tentar esta sugestão, porém não entendi a passagem que vc menciona, talvez por nunca ter utilizado a função AEVALL(), pode me esclarecer ? :
O que faz esta barra vertical antes do nVal ?
AEval( aRecord, { | nVal, nPosition| bdclass->( FieldPut( nPosition, nVal ) ) } )

Abraços
Francisco Diniz
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 22
Data de registro: 13 Fev 2012 22:05
Cidade/Estado: Marília/ SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Migração de dados entre Arrays e BDs

Mensagempor alxsts » 09 Out 2014 12:31

Olá!
Francisco Diniz escreveu:O que faz esta barra vertical antes do nVal ?
AEval( aRecord, { | nVal, nPosition| bdclass->( FieldPut( nPosition, nVal ) ) } )

A função AEval() executa um code block uma única vez para cada elemento de um array (ou os especificados pelos parâmetros nStart e/ou nCount e passa automaticamente para este code block o conteúdo e posição do elemento do array que está sendo tratado no momento. Na sintaxe de definição de um code block, os pipes ( | ) são obrigatórios e indicam o início e fim da área de parâmetros, parâmetros estes que podem ser opcionais.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Migração de dados entre Arrays e BDs

Mensagempor Francisco Diniz » 11 Out 2014 08:18

Mestre, Bom dia

Desculpe, mas fiquei travado nesta função aeval(). Já procurei na NET e não encontro exemplos desta função em clipper.
No seu exemplo:
>> AEval( aRecord, { | nVal, nPosition | bdclass->( FieldPut( nPosition, nVal ) ) } )
o nPosittion não ficou claro, veja como ficou meu descritivo do progama>>

// bp é o banco pricipal de dados formado com quinze campos ( bpa1, bpa2 ... bpa15) numéricos de 2 dígitos //podendo conter 0 a 99
// bcl é outro banco contendo 100 campos (bpc1, bpc2, bpl3 ... bpc100) que deverá conter para cada registro
// correspondente ao bp (banco principal) os valores deste banco no local campo correspondente
// se no registro 190 do bp houver o número 56, no reg 190 do bcl o número 56 será alocado no campo bpc56

do while bp->(!eof())
afill(coPs(25),0)
bp->(dbgotop())
for nPos:= 1 to 15
nVal:=bp->(fieldGet(nPos))
coPs[nVal] := nVal
next

bce->(dbapend())

// estou travado aqui >> ( nPosition ? >> não entendi))
AEval(coPs,{|nVal, nPosition|bce->(fieldput(nPosition,nVal))})

bp->(dbSkip())

enddo
dbcloseall()
return nil

Abraços e bom sábado
Francisco Diniz
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 22
Data de registro: 13 Fev 2012 22:05
Cidade/Estado: Marília/ SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Migração de dados entre Arrays e BDs

Mensagempor Jairo Maia » 11 Out 2014 10:00

Olá Francisco,

Eu continuo com dificuldade em entender o que você precisa, e esse laço FOR/NEXT do seu exemplo me complicou mais ainda. Mas no caso do exemplo do Alexandre, nPosition é o número do campo a ser alterado/gravado. Exemplo:
bdclass->( FieldPut( NúmeroDoCampo, ValorASerGravado )
e que é retornado pela pesquisa executado pela AEval().
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Migração de dados entre Arrays e BDs

Mensagempor Francisco Diniz » 12 Out 2014 08:38

Bom dia

Para esclarecer melhor, a coisa é assim:

Cinco departamentos técnico enviam mensalmente a coleta de dados para análise estatística na central de operação. Estes dados são coletados através de uma planilha excel que é convertida em um banco de dados utilizado por clipper, que recebe o nome de BPTEC e o alias Bp

O banco principal que eu chamo no alias de Bp é assim formado:

conbp......Bpa1...Bpa2....Bpa3....Bpa4........Bpa12...Bpa13....Bpa14.....Bpa15
145.........15...... 22......35........6...........89.......12.........1............65
146.........56.......12......9........78...........65.......71........16............34

Conbp >> é uma seqüência numérica que vai de 1 até a ocorrência mais recente ( 6756)
Bpa1 até Bpa15 são os campos que compõem o banco principal que tem valores compreendidos entre 1 a 99 e não se repetem em cada registro.

Eu necessito transportar estes dados para outro banco de dados com 99 campos denominado BPCL com seu alias bcl, que nada mais é que o espelho do Bp, porém com seus valores devidamente alocados nos campos correspondentes.

conbc......Bcp1........Bcp9........Bcp12.....Bcp13.......Bcp15........bcp65.........Bcp99
145..........1............0............12..........0............15............65.............0
146..........0............9............12..........0.............0.............65.............0

Conbc >> é espelho de conbp
Bcp1 até bcp99 são os campos que compõem o banco de dados BPCL

Eu obtenho isto através de loopings “ for - next “ , mas da forma que faço fica um prg muito grande. O que eu gostaria era de resumir este programa em uma forma mais simples.
Espero ter sido claro.

Bom domingo a todos e fiquem na paz
Francisco Diniz
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 22
Data de registro: 13 Fev 2012 22:05
Cidade/Estado: Marília/ SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

Migração de dados entre Arrays e BDs

Mensagempor Jairo Maia » 12 Out 2014 11:57

Olá Francisco,

Agora sim! Desenhando ficou fácil! :%

Não usei o exemplo do colega Alexandre Santos (que aliás já havia entendido antes), preferi fazer de um modo que acho que ficou mais fácil de você entender, e que tenho mais facilidade em usar Matrizes.

Veja se esse exemplo vai funcionar:
Function Main()

   Local x, aRecord, nVal, nPos
   
   /*
      Ajuste o tamanho dos campos do arquivo BCE.DBF.
      Usei 8 para conbc e 2 para os demais...
   */
   //If !File( "BCE.DBF" )
    aEstruDBF := {}
    AaDd( aEstruDBF, {"conbc"  ,"N", 8, 0} )
    For x=1 To 99
     AaDd( aEstruDBF, {"bcp"+Hb_NToS( x ),"N", 2, 0} )
    Next
    DBCreate( "BCE.DBF", aEstruDBF )
   //EndIf

   Use bp Shared New
   Use bce Shared New
   
   Select( "bp" )
   
   bp->( dbGoTop() )
   
   While bp->( !Eof() )
   
    aRecord := {}
    For x = 1 To 16
     Private cCampo := Field( x )  // pega o nome do campo
     AaDd( aRecord, &cCampo. )     // salva o conteudo do campo em aRecord
    Next
     
    bce->( dbAppend() )
    For x = 1 To 16
     If x = 1
      bce->( FieldPut( 1, aRecord[ 1 ] ) )  // salva o campo conbc
     ElseIf aRecord[ x ] > 0
      bce->( FieldPut( aRecord[ x ] + 1, aRecord[ x ] ) )
     EndIf
    Next
     
    bp->( dbSkip() )

   EndDo
   
   dbCloseAll()

Return Nil
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Anterior Próximo



Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro