recursividade
Moderador: Moderadores
recursividade
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???
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
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
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
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
-
Vagner Almeida
- Usuário Nível 1

- Mensagens: 5
- Registrado em: 06 Set 2009 07:52
- Localização: Santos-SP
Re: recursividade
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
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
-
anacatacombs
- Membro Master

- Mensagens: 472
- Registrado em: 12 Jul 2005 16:53
- Localização: Cianorte-Paraná
- Contato:
Re: recursividade
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:
Deu pra pegar o espírito da coisa?
[]'s
Ana
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.
[]'s
Ana
Re: recursividade
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.
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.
xHarbour 1.2.1 (simplex) + BCC 5.8.2 + Hwgui + SQLRDD
Clipper 5.2e / Blinker 7
Júlio Cézar Elias
e-mail: jelias@tpnet.psi.br
Clipper 5.2e / Blinker 7
Júlio Cézar Elias
e-mail: jelias@tpnet.psi.br
Re: recursividade
Olá,
Pode tentar assim:
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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Re: recursividade
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
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
[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
recursividade
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 !
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.

