Migração de dados entre Arrays e BDs

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Migração de dados entre Arrays e BDs

Mensagem por Jairo Maia »

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.

Código: Selecionar todos

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 do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Migração de dados entre Arrays e BDs

Mensagem por rochinha »

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:

Código: Selecionar todos

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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Migração de dados entre Arrays e BDs

Mensagem por rochinha »

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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Migração de dados entre Arrays e BDs

Mensagem por Jairo Maia »

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:

Código: Selecionar todos

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 do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Migração de dados entre Arrays e BDs

Mensagem por rochinha »

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 [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Francisco Diniz
Usuário Nível 1
Usuário Nível 1
Mensagens: 22
Registrado em: 13 Fev 2012 23:05
Localização: Marília/ SP

Migração de dados entre Arrays e BDs

Mensagem por Francisco Diniz »

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
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Migração de dados entre Arrays e BDs

Mensagem por Jairo Maia »

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)
Francisco Diniz
Usuário Nível 1
Usuário Nível 1
Mensagens: 22
Registrado em: 13 Fev 2012 23:05
Localização: Marília/ SP

Migração de dados entre Arrays e BDs

Mensagem por Francisco Diniz »

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).
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Migração de dados entre Arrays e BDs

Mensagem por alxsts »

Olá!

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

Código: Selecionar todos

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)
Francisco Diniz
Usuário Nível 1
Usuário Nível 1
Mensagens: 22
Registrado em: 13 Fev 2012 23:05
Localização: Marília/ SP

Migração de dados entre Arrays e BDs

Mensagem por Francisco Diniz »

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
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Migração de dados entre Arrays e BDs

Mensagem por alxsts »

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)
Francisco Diniz
Usuário Nível 1
Usuário Nível 1
Mensagens: 22
Registrado em: 13 Fev 2012 23:05
Localização: Marília/ SP

Migração de dados entre Arrays e BDs

Mensagem por Francisco Diniz »

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
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Migração de dados entre Arrays e BDs

Mensagem por Jairo Maia »

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:

Código: Selecionar todos

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)
Francisco Diniz
Usuário Nível 1
Usuário Nível 1
Mensagens: 22
Registrado em: 13 Fev 2012 23:05
Localização: Marília/ SP

Migração de dados entre Arrays e BDs

Mensagem por Francisco Diniz »

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
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Migração de dados entre Arrays e BDs

Mensagem por Jairo Maia »

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:

Código: Selecionar todos

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)
Responder