Página 1 de 1

Usar mais de um SET FILTER

Enviado: 03 Mai 2013 10:01
por Vandi
Bom dia a todos,

Gostaria de saber como fazer para usar dois comandos SET FILTER em um mesmo arquivo.
Por exemplo:

Código: Selecionar todos

        set filter to MVT->nCont == vContaInicial  
        set filter to DTOS(MVT->mData) >= dDatai .AND. DTOS(MVT->mData) <= dDataf
Me parece que o segundo SET FILTER cancela o primeiro.

Como faço para usar os dois filtros no arquivo?

Gilvandi

Usar mais de um SET FILTER

Enviado: 03 Mai 2013 13:02
por lugab
No seu exemplo, acredito que o segundo set filter anulará o primeiro.

Se as condições não forem conflitantes entre sí, vc pode usar todas num set filter único

Código: Selecionar todos

set filter to   MVT->nCont == vContaInicial  .and.  DTOS(MVT->mData) >= dDatai .AND. DTOS(MVT->mData) <= dDataf 

Agora, se as condições forem conflitantes entre sí, nem set filter, nem nada semelhante vai funcionar

Usar mais de um SET FILTER

Enviado: 03 Mai 2013 13:17
por alxsts
Olá!

Somente um filtro pode estar ativo em uma área de trabalho. No entanto, você pode usar operadores .AND. e .OR.:

Código: Selecionar todos

set filter to (MVT->nCont == vContaInicial .AND. (DTOS(MVT->mData) >= dDatai .AND. DTOS(MVT->mData) <= dDataf) )
É sabido que SET FILTER degrada a performance da aplicação. O SET FILTER com avaliação de code blocks fica mais rápido. Veja exemplo:

Código: Selecionar todos

PROCEDURE Main()

   LOCAL cExpr := MakeBlock("MVT->nCont == vContaInicial .AND. (DTOS(MVT->mData) >= dDatai .AND. DTOS(MVT->mData) <= dDataf) )"
   LOCAL bExpr

   DbSetFilter( Eval(bExpr), cExpr )

RETURN
//------------------------------------------------------------------------------
Function MakeBlock( cExpr )

  // Alexandre Santos - 04/06/2007 - 16:11
  // Retornar um code block a partir de uma string fornecida

  Return  &( "{ || " + cExpr + "}" )
//------------------------------------------------------------------------------