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
Moderador: Moderadores
- rosalvo rosa
- Usuário Nível 3

- Mensagens: 156
- Registrado em: 10 Jan 2006 19:21
- Localização: Curitiba - PR
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Função ASCAN com filtro
Para o primeiro caso, eu faria assim:
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.
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
? nNumUm 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.
- rosalvo rosa
- Usuário Nível 3

- Mensagens: 156
- Registrado em: 10 Jan 2006 19:21
- Localização: Curitiba - PR
Re: Função ASCAN com filtro
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 ?
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
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:
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.
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)[]'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!
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!
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Re: Função ASCAN com filtro
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
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)
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

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Re: Função ASCAN com filtro
Olá!
Muito estranha esta questão...
Muito estranha esta questão...
Acho que um laço é o mais indicado. Ficaria até mais legível.Pablo César escreveu:Poderia explicar melhor ? Se você colocar um exemplos de matrizes com seus respectivos valores, iria ajudar também.
[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
- rosalvo rosa
- Usuário Nível 3

- Mensagens: 156
- Registrado em: 10 Jan 2006 19:21
- Localização: Curitiba - PR
Re: Função ASCAN com filtro
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".
Show de bola gente.
Obrigado,
Rosalvo
Essa condição [<qtd_de_elementos>] é que eu não sabia usar.Maligno escreveu:Para usar essa função AScan(), considere:
i := AScan(aMatriz,{|a| <condição> }, [<primeiro_elemento>], [<qtd_de_elementos>])
Este ultimo exemplo então ficou muito bom mesmo. Já me retorna em outra matriz todos os elementos que correspondem a minha premissa.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
Show de bola gente.
Obrigado,
Rosalvo
