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:
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