Página 1 de 1
Vetor com Filtro
Enviado: 01 Mar 2019 15:11
por asimoes
Prezados,
Existe alguma função que faça um filtro em um vetor, como é feito com o dbf usando set filter ?
Tenho um vetor carregado e desse vetor preciso filtrar alguns elementos por determinada coluna.
Vetor com Filtro
Enviado: 01 Mar 2019 17:52
por Jairo Maia
Olá Alexandre,
Você pode usar FOR EACH também, veja se dá uma ideia:
Código: Selecionar todos
Func Main()
Local aVetores:={}, aFiltro1, aFiltro2
Local nMes3:=3, nMes4:=4
SET CENTURY ON
SET DATE BRIT
AaDd( aVetores, { "", Nil, CToD( "01/03/2019" ), "", Nil } )
AaDd( aVetores, { "", Nil, CToD( "02/04/2019" ), "", Nil } )
AaDd( aVetores, { "", Nil, CToD( "03/03/2019" ), "", Nil } )
AaDd( aVetores, { "", Nil, CToD( "04/04/2019" ), "", Nil } )
aFiltro1:={}
AEval( aVetores, { |x| If( Month( x[3] ) = nMes3, AaDd( aFiltro1, x[3] ), Nil ) } )
aFiltro2:={}
AEval( aVetores, { |x| If( Month( x[3] ) = nMes4, AaDd( aFiltro2, x[3] ), Nil ) } )
Clear Screen
?
? aFiltro1[1]
? aFiltro1[2]
?
? aFiltro2[1]
? aFiltro2[2]
?
Return Nil
Vetor com Filtro
Enviado: 01 Mar 2019 17:53
por asimoes
Acho que consegui algo:
Código: Selecionar todos
aLista := {}
hRecord := {=>}
Hb_HSet( hRecord, "ID", 1)
Hb_HSet( hRecord, "CNPJ_CPF", "21512388220")
Hb_HSet( hRecord, "VALOR", 10.00)
aAdd( aLista, hRecord )
hRecord := {=>}
Hb_HSet( hRecord, "ID", 3)
Hb_HSet( hRecord, "CNPJ_CPF", "21512388220")
Hb_HSet( hRecord, "VALOR", 80.00)
aAdd( aLista, hRecord )
hRecord := {=>}
Hb_HSet( hRecord, "ID", 2)
Hb_HSet( hRecord, "CNPJ_CPF", "21512388220")
Hb_HSet( hRecord, "VALOR", 80.00)
aAdd( aLista, hRecord )
hRecord := {=>}
Hb_HSet( hRecord, "ID", 2)
Hb_HSet( hRecord, "CNPJ_CPF", "21512388220")
Hb_HSet( hRecord, "VALOR", 80.00)
aAdd( aLista, hRecord )
hRecord := {=>}
Hb_HSet( hRecord, "ID", 1)
Hb_HSet( hRecord, "CNPJ_CPF", "21512388220")
Hb_HSet( hRecord, "VALOR", 20.00)
aAdd( aLista, hRecord )
aSort( aLista ,,, {|x,y| x["ID"] < y["ID"] } )
nPos := Hb_aScan( aLista, {| a | a["ID"] = 2 })
For Each oElemento In aLista
If oElemento:__enumIsFirst
oElemento:__enumIndex(nPos)
Endif
If oElemento["ID"] = 2
? Str( oElemento["ID"], 10 ) + " " + Transform( oElemento["VALOR"], "@E 999.99")
Endif
Next
Inkey(0)
Vetor com Filtro
Enviado: 01 Mar 2019 17:59
por asimoes
Vai posicionar no primeiro elemento oElemento:__enumIndex(nPos) que achou, testa se é o mesmo senão sai do for each, posso montar um vetor auxiliar, a mesma ideia sua Jairo usando um aEval
Código: Selecionar todos
For Each oElemento In aLista
If oElemento:__enumIsFirst
oElemento:__enumIndex(nPos)
Endif
If oElemento["ID"] = 2
? Str( oElemento["ID"], 10 ) + " " + Transform( oElemento["VALOR"], "@E 999.99")
Else
Exit
Endif
Next
Vetor com Filtro
Enviado: 01 Mar 2019 18:15
por asimoes
Jairo,
Usando sua dica, pena que não sai como hash table
Código: Selecionar todos
aFiltro1:={}
aEval( aLista, { |x| If( x["ID"] = 2, aAdd( aFiltro1, { x["ID"], X["CNPJ_CPF"], X["VALOR"] } ), Nil ) } )
For Each oElemento In aFiltro1
? Str( oElemento[1], 10 ) + " " + Transform( oElemento[3], "@E 999.99")
Next
Vetor com Filtro
Enviado: 01 Mar 2019 18:24
por asimoes
Agora sim,
Código: Selecionar todos
aFiltro1:={}
aEval( aLista, { |x| If( x["ID"] = 2, ListaAux( aFiltro1, x["ID"], X["CNPJ_CPF"], X["VALOR"] ), Nil ) } )
For Each oElemento In aFiltro1
? Str( oElemento["ID"], 10 ) + " " + Transform( oElemento["VALOR"], "@E 999.99")
Next
FUNCTION ListaAux( aFiltro, nId, cCPF, nValor )
hRecord := Nil
hRecord := {=>}
Hb_HSet( hRecord, "ID", nId)
Hb_HSet( hRecord, "CNPJ_CPF", cCPF)
Hb_HSet( hRecord, "VALOR", nValor)
aAdd( aFiltro, hRecord )
RETURN Nil
Vetor com Filtro
Enviado: 01 Mar 2019 20:31
por Jairo Maia
asimoes escreveu:Jairo,
Usando sua dica, pena que não sai como hash table
Pois é... Apenas como Array mesmo...
asimoes escreveu:Agora sim
Show de bola Alexandre... Confesso que ainda não entendo nada de hash table.
:-Y