recursividade

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

fxavierds
Usuário Nível 1
Usuário Nível 1
Mensagens: 23
Registrado em: 18 Jul 2005 18:04

recursividade

Mensagem 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???
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Re: recursividade

Mensagem 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
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Vagner Almeida
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 06 Set 2009 07:52
Localização: Santos-SP

Re: recursividade

Mensagem 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
anacatacombs
Membro Master
Membro Master
Mensagens: 472
Registrado em: 12 Jul 2005 16:53
Localização: Cianorte-Paraná
Contato:

Re: recursividade

Mensagem 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
jelias
Usuário Nível 3
Usuário Nível 3
Mensagens: 260
Registrado em: 27 Ago 2008 11:32
Localização: Minas Gerais

Re: recursividade

Mensagem 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.
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
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: recursividade

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

Re: recursividade

Mensagem 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
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

recursividade

Mensagem 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 !
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.
Responder