Página 1 de 1

recursividade

Enviado: 21 Set 2009 14:05
por fxavierds
Galear aqui estou eu de novo precisando de ajuda...
tenho uma tabela como se fosse um plano de contas
Campo1 -> codigo da conta
Campo2 -> codigo da conta superior


Quero fazer algo assim
while !eof()
mcampo := campo1
pegaconta(campo1)
skip
Enddo

funcao pegaconta(super)
seek (super) // procura os registro que campo2 = super
While campo2 = super
pegaconta(campo2)
Enddo

Como faço para que ele retorne na posicao que estava antes de chamar pegaconta???

Re: recursividade

Enviado: 21 Set 2009 14:53
por billy1943
Simples, meu caro Watson,

Antes de você sair para dar seek em algum arquivo, o que vai mudar completamente a posição do ponteiro do arquivo que está sendo pesquisado, guarde em uma ou mais variáveis de memória a posição do registro atual, assim:

Ex;
.....
select carquivo
set order to ...
go top

do while ! eof()

nposicao := recno()
nordem := indexord() // caso tenha de trocar de índice para a procura

set order to ... // setar o novo índice
seek ...... // chave interna de procura dentro do mesmo arquivo

if ! eof()
tratamento ..... // fazer todo o processamento necessário
endif

go nposicao // volta à posição do ponteiro
set order to nordem //( caso tenha trocado de índice para o tratamento desejado)
dbskip() // avança para o próximo registro pelo índice inicial

enddo

Re: recursividade

Enviado: 30 Set 2009 10:27
por Vagner Almeida
bom dia a todos,

caso eu esteja em um arquivo .dbf, e sem sair dele, preciso pesquisar o campo de um outro arquivo .dbf.

Exemplo: estou no arquivo A.dbf (cadastro de um processo), sendo que o primeiro campo, eu preciso pesquisar e informar através do SAY o nome de um cliente que está em outro arquivo b.dbf (Cadastro de cliente).
eu escrevi, não fechar o arquivo A, pois logo em seguida, o restante dos campos serão todos referentes a este arquivo.
não sei se me expliquei direito.

grato
vagner almeida

Re: recursividade

Enviado: 30 Set 2009 10:36
por anacatacombs
Acho que vc esta falando a respeito de relacionamentos.
Por exemplo:
Banco de dados de clientes: CLIENTE.DBF
cl_codi : Codigo do cliente
cl_vend: Codigo do vendedor
cl_raza : Razao social do cliente

Banco de dados de vendedor : VENDEDOR.DBF
ve_codi : codigo do vendedor
ve_nome : nome do vendedor

vc faz o relacionamento da seguinte forma, considerando que os bancos já estão abertos:

Código: Selecionar todos

SELECT Cliente
bla bla bla bla
// aqui vc coloca seu codigo
SELECT Vendedor
SET ORDER TO 1 // que seria a ordem do codigo do vendedor
SEEK Cliente->CL_VEND // aqui vc esta procurando o codigo do vendedor do cadastro de clientes no banco de dados de vendedor
IF FOUND() // se achou o registro
   @ 10,10 say STRZERO(Cliente->cl_vend,5)+"-"+alltrim(Vendedor->ve_nome)
ENDIF
SELECT Cliente // Retorna o select anterior.
Deu pra pegar o espírito da coisa?

[]'s

Ana

Re: recursividade

Enviado: 30 Set 2009 10:55
por jelias
Amiguinho,

Não sei se entendi corretamente, mais você não precisa fechar um arquivo para que possa realizar uma pesquisa em um campo em outro banco de dados.
Você pode fazer isso da seguinte forma:
sele 1
use fornecedor index fornecedor1,fornecedor2,fornecedor3 SHARED ALIAS AL_FORNE

sele 2
use cidades index cidades1,cidades2 SHARED ALIAS AL_CIDAD

Quando estiver incluindo um fornecedor e desejar confirmar no cadastro da cidade por exemplo, posso fazer da seguinte forma:


sele AL_CIDAD
DBSETORDER(1)
DBSEEK(chave)

sele AL_FORNE
DBAPPEND()
repl ...
repl...
repl...
repl...
repl cidade with AL_CIDAD->nomecidade
DBCOMMIT()
DBUNlOCK()

Sds,
Júlio.

Re: recursividade

Enviado: 30 Set 2009 14:31
por asimoes
Olá,

Pode tentar assim:

Código: Selecionar todos

select dbfpri
set order to x
dbgotop()
do while !eof()
   nPosRecno:=Recno()
   for i:=1 to fcount()
      if fieldname(i) $ "CAMPO1|CAMPO2"
         cCampo:=fieldget(i)
         pegaconta(cCampo)   
      endif
   next
   go nPosRecno
   dbskip() 
enddo

function pegaconta(cCampo)
dbseek(cCampo,.t.)
if found()
   ... faz alguma coisa 
endif
return nil

Re: recursividade

Enviado: 30 Set 2009 21:17
por alxsts
Olá!

Creio que o material já postado pelos colegas é suficiente para esclarecer as dúvidas do OP.
Penso que o título do tópico induz o leitor a pensar em uma coisa e, ao abri-lo, percebe que o assunto é outro. Recursividade é realmente um assunto vasto. Achei um artigo (o link segue abaixo) que diz “A recursividade na programação de computadores envolve a definição de uma função que pode invocar a si própria.”
Se alguém se interessar, acesse http://pt.wikipedia.org/wiki/Recursivid ... %C3%A3o%29

recursividade

Enviado: 28 Out 2009 20:38
por Pablo César
Até agora o autor não se pronunciu, mas acho muito estranho ele estar utilizando recursividade onde não deveria haver. Isso gera um loop infinito. E nesse caso não tem lógica !