Filtro

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

oliveira
Usuário Nível 1
Usuário Nível 1
Mensagens: 10
Registrado em: 05 Abr 2004 10:06

Filtro

Mensagem 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
Editado pela última vez por Toledo em 04 Jun 2010 19:14, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
oliveira
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Filtro

Mensagem 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?
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
oliveira
Usuário Nível 1
Usuário Nível 1
Mensagens: 10
Registrado em: 05 Abr 2004 10:06

Re: Filtro

Mensagem 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?
oliveira
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Filtro

Mensagem 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
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar do usuário
acelconsultoria
Usuário Nível 3
Usuário Nível 3
Mensagens: 231
Registrado em: 10 Jan 2006 17:05
Localização: Itápolis-SP

Re: Filtro

Mensagem 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
*


Adm. Maickon Sato
Consultoria e Projetos
-------------------------------------------------------
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Filtro

Mensagem 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
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Responder