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