Página 1 de 1

Função ASCAN com filtro

Enviado: 18 Abr 2011 12:45
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

Função ASCAN com filtro

Enviado: 18 Abr 2011 17:47
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.

Re: Função ASCAN com filtro

Enviado: 18 Abr 2011 18:13
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 ?

Re: Função ASCAN com filtro

Enviado: 18 Abr 2011 18:32
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.

Re: Função ASCAN com filtro

Enviado: 18 Abr 2011 18:34
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

Re: Função ASCAN com filtro

Enviado: 18 Abr 2011 18:35
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.

Re: Função ASCAN com filtro

Enviado: 18 Abr 2011 22:55
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