Função ASCAN com filtro

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
rosalvo rosa
Usuário Nível 3
Usuário Nível 3
Mensagens: 156
Registrado em: 10 Jan 2006 19:21
Localização: Curitiba - PR

Função ASCAN com filtro

Mensagem por rosalvo rosa »

Olá Pessoal !

Estrou precisando usar a função ASCAN com alugmas premissas. Como que poderia fazer ?
ex:
nNum:= Ascan(aMatriz,{|x| x[1] == nProcura})
onde eu queria que nNum fosse maior que 5 por exemplo.

Como eu estou trabalhando dentro da matriz, eu preciso que me retorne o nProcura desde que ele seja maior do que 5 por ex.


For Z:= 1 To Len(mLancLc)
nVlrSm:= 0.00
nNum:= Ascan(aLancLc,{|x| x[3] == mLancLc[Z][3]})
Aqui eu preciso que retorne o próximo Z que tenha valor igual a mLancLc[Z][3], sem fazer um novo for, que ficasse tudo na mesma linha.


.....
Next

Teria como colocar dentro da função ASCAN um filtro ?

A quem me ajudar agradeço.

Rosalvo
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á

Função ASCAN com filtro

Mensagem por Pablo César »

Para o primeiro caso, eu faria assim:

Código: Selecionar todos

nNum:=0
nProcura=30
aMatriz:={{10,40,30,60,20},{"dez","vinte","trinta","quarenta","cinquenta"},{date()-1,date()-2,date()-3,date()-4,date()-5}}
FOR i=1 TO LEN(aMatriz[1])
    IF aMatriz[1,i]=nProcura .AND. i>2 // aqui fiz maior que 2 em lugar de 5
       nNum:=i
    ENDIF
NEXT
? nNum
Não entendí o segundo, a variável nVlrSm não está sendo testada. Poderia explicar melhor ? Se você colocar um exemplos de matrizes com seus respectivos valores, iria ajudar também.
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.
Avatar do usuário
rosalvo rosa
Usuário Nível 3
Usuário Nível 3
Mensagens: 156
Registrado em: 10 Jan 2006 19:21
Localização: Curitiba - PR

Re: Função ASCAN com filtro

Mensagem por rosalvo rosa »

Como vai Pablo? Tudo bem?

O seu exemplo está perfeito, mas eu gostaria de fazer essa busca pela função ASCAN numa linha só.
A variável nVlrSm desconsidere, deixei por engano.

tipo assim:

nNum:= Ascan(aMatriz,{|x| x[1] == (nProcura, valid nProcura > 5)})

que não é o caso pois isso não funciona.

Será que existe uma forma ?
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Função ASCAN com filtro

Mensagem por Maligno »

Para usar essa função AScan(), considere:

i := AScan(aMatriz,{|a| <condição> }, [<primeiro_elemento>], [<qtd_de_elementos>])

O seu problema, ao que parece, está em montar a <condição>. Simples: se for feito um código "exandido", como o Pablo descreveu, você terá um IF. AScan() "varre" a matriz da mesma forma que o código dele. A sua <condição> é exatamente como aquele IF. Nada mais. Apenas adapte-o para se encaixar no bloco de código de AScan(). Exemplo tosco baseado na sua premissa inicial e presumindo que aMatriz seja bidimensional:

Código: Selecionar todos

nNum := 9 // o número que busca
i := AScan(aMatriz,{|a|a[1] = nNum}, 5+1)
A cada iteração o bloco de código será avaliado contra a sub-matriz a. Iniciamos a busca a partir do sexto elemento, uma vez que foi isso que informou em sua primeira mensagem. Se existir, ele pára e retorna o índice i com a posição do elemento encontrado. Caso contrário, i será zero.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Re: Função ASCAN com filtro

Mensagem por Jairo Maia »

Olá,

Tente para retornar a posição no primeiro exemplo, fazer o seguinte:
nNum:= Ascan(aMatriz,{|x| If( nProcura > 5 .And. x[1] == nProcura, .t. , .f. )})

Para o segundo exemplo, tente jogar o reslultado num outro bloco, e trablhe com o bloco filtrado:

aResult:={} // necessita declarar antes
Ascan(aLancLc,{|x,y| If( x[3] == mLancLc[y][3], AADD(aResult, x[3]) , Nil) })

Voce terá os valores em aResult

For Z =1 To Len(aResult)

// Seu tratamento para o resultado...

Next

Veja se vai funcionar

Abraços
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Função ASCAN com filtro

Mensagem por alxsts »

Olá!

Muito estranha esta questão...
Pablo César escreveu:Poderia explicar melhor ? Se você colocar um exemplos de matrizes com seus respectivos valores, iria ajudar também.
Acho que um laço é o mais indicado. Ficaria até mais legível.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
rosalvo rosa
Usuário Nível 3
Usuário Nível 3
Mensagens: 156
Registrado em: 10 Jan 2006 19:21
Localização: Curitiba - PR

Re: Função ASCAN com filtro

Mensagem por rosalvo rosa »

A minha dificuldade era justamente montar o bloco de código com a funçaõ ASCAN sem ter fazer um "FOR NEXT" dentro de outro "FOR NEXT".
Maligno escreveu:Para usar essa função AScan(), considere:
i := AScan(aMatriz,{|a| <condição> }, [<primeiro_elemento>], [<qtd_de_elementos>])
Essa condição [<qtd_de_elementos>] é que eu não sabia usar.
Jairo Maia escreveu: aResult:={} // necessita declarar antes
Ascan(aLancLc,{|x,y| If( x[3] == mLancLc[y][3], AADD(aResult, x[3]) , Nil) })
Voce terá os valores em aResult
Este ultimo exemplo então ficou muito bom mesmo. Já me retorna em outra matriz todos os elementos que correspondem a minha premissa.

Show de bola gente.

Obrigado,

Rosalvo
Responder