Página 1 de 1

Filtro

Enviado: 20 Jan 2010 15:19
por oliveira
Boa tarde Amigos(as)

Estou com problemas na rotina com set filter

Clipper5.2e
Indices NTX (competicao, rodada, data)

Pra vcs entenderem

Usuario preenche um dos 3 campos e a rotina faz o filtro

campos na base de dados
Competicao C 3
Rodada C 2
Data D

variveis
Var_competicao
Var_rodada
Var_data

vejam como esta o filtro na rotina

Código: Selecionar todos

IF (EMPTY(Var_competicao))
  condicao1:='competicao <> SPACE(3)'
ELSE
  condicao1:= 'competicao = Var_competicao'
ENDIF 
*
IF (EMPTY(Var_rodada))
  condicao2:='rodada <> SPACE(2)'
ELSE
  condicao2:= 'rodada = Var_rodada'
ENDIF 
*
IF (EMPTY(Var_data))
  condicao3:= 'data <> CTOD(" / / ")'
ELSE
  condicao3:= 'data = Var_data'
ENDIF 
*
SET FILTER TO &condicao1 .AND. &condicao2 .AND. &condicao3
*
Podem ve ajudar

Fico no aguardo

Clodoaldo

Re: Filtro

Enviado: 20 Jan 2010 16:36
por gvc
Vc esta colocando que se a não entrar com a informação da rodada, só aparecerão os registro que tiverem rodada registrada.
O mesmo para competição.
Tb tem que ou ele apresenta os lançamentos na data solicitada ou os registro que tem data registrada.

É isso?

Vc esta usando isso para um relatório?

Re: Filtro

Enviado: 21 Jan 2010 17:19
por oliveira
Boa Tarde

preciso fazer este filtro pq carrego todos os registros numa tabela

e se o usuario kerer ele podera fazer um filtro

entenderam?

Re: Filtro

Enviado: 21 Jan 2010 18:47
por gvc
Pelo que vc postou inicialmente o usuário preenche um dos campos.
Vc pode usar o dbsetfilter tb.

Código: Selecionar todos

// The example demonstrates the effect of a filter condition

PROCEDURE Main
USE Customer
INDEX ON Upper(LastName) TO Cust01

GO TOP
? Recno(), Lastname              // result: 28 Abbey

DbSetFilter( {|| Upper(LastName) > "L" },  'Upper(LastName) > "L"'   )

GO TOP
? Recno(), Lastname              // result: 182 MacDonald
? DbFilter()                     // result: Upper(LastName) > "L"

CLOSE Customer
RETURN

Re: Filtro

Enviado: 25 Jan 2010 11:11
por acelconsultoria
Oliveira...

Eu utilizo em um dos relatórios do meu sistema, uma rotina de filtro semelhante a que vc necessita. Eu peguei seu código e fiz uma pequena alteração.

Código: Selecionar todos


filtro := space(100)

IF !(EMPTY(Var_competicao))
  condicao1:= 'competicao = Var_competicao'
ENDIF
*
IF !(EMPTY(Var_rodada))
  condicao2:= '.AND. rodada = Var_rodada'
ENDIF
*
IF !(EMPTY(Var_data))
  condicao3:= '.AND. data = Var_data'
ENDIF

filtro := condicao1 + condicao2 + condicao3
*
SET FILTER TO &filtro
*



Re: Filtro

Enviado: 25 Jan 2010 14:29
por gvc
Bom, só para elencar uma solução:
Se vc usar Clipper 5.3x ou xHarbour dá para usar o SET SCOPE para gerar o filtro, mas teria que usar a chave de indexação.
Com o CDX tb desse 2 acima, dá para gerar indices temporários com filtro. Daí o tempo é da montagem do indice, depois é um "tapa" para trabalhar.

Criar arquivo temporário não ajuda vc pelo que entendi, pois uma mudança no dbf original não vai aparecer no dbf temporário.

Se o filtro é para relatório, eu faço a filtragem dos dados dentro do sistema e não por set filter.

Código: Selecionar todos

while !cadastro->eof()

   if !empty(condic1) .and. cadastro->nome # condic1
      cadastro->(dbskip())
      loop
   end

   if !empty(condic2) .and. cadastro->cidade # condic1
      cadastro->(dbskip())
      loop
   end

...

   cadastro->(dbskip())
end