Página 2 de 3

Migração de dados entre Arrays e BDs

Enviado: 20 Mai 2012 10:47
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

Migração de dados entre Arrays e BDs

Enviado: 20 Mai 2012 10:52
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

Migração de dados entre Arrays e BDs

Enviado: 20 Mai 2012 11:04
por rochinha
Amiguinhos,

Esta galéra PC Toledo é muito ativa, Parabéns.

Migração de dados entre Arrays e BDs

Enviado: 20 Mai 2012 14:34
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

Migração de dados entre Arrays e BDs

Enviado: 21 Mai 2012 01:54
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á.

Migração de dados entre Arrays e BDs

Enviado: 07 Out 2014 08:01
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

Migração de dados entre Arrays e BDs

Enviado: 07 Out 2014 17:29
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?

Migração de dados entre Arrays e BDs

Enviado: 07 Out 2014 23:44
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).

Migração de dados entre Arrays e BDs

Enviado: 08 Out 2014 02:44
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

Migração de dados entre Arrays e BDs

Enviado: 09 Out 2014 07:16
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

Migração de dados entre Arrays e BDs

Enviado: 09 Out 2014 12:31
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.

Migração de dados entre Arrays e BDs

Enviado: 11 Out 2014 08:18
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

Migração de dados entre Arrays e BDs

Enviado: 11 Out 2014 10:00
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().

Migração de dados entre Arrays e BDs

Enviado: 12 Out 2014 08:38
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

Migração de dados entre Arrays e BDs

Enviado: 12 Out 2014 11:57
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