Vetor com Filtro

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

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Vetor com Filtro

Mensagem 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.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Vetor com Filtro

Mensagem 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
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)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Vetor com Filtro

Mensagem 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)
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Vetor com Filtro

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Vetor com Filtro

Mensagem 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
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Vetor com Filtro

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Vetor com Filtro

Mensagem 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
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)
Responder