Estou com uma duvida que acredito ser simples mas estou com dificuldade.
Tenho um FWMBrowse com os dados de uma tabela especifica "Z01".
Eu inicio o browse com um filtro padrão e o usuário ainda pode criar outros filtros.
Gostaria de colocar um botão para fazer um processamento somente dos registros que estão sendo exibidos no browse.
Como faço um laço pegando só os registros filtrados pelo usuário?
Se eu faço um "While Z01->(!Eof())" pega a tabela interira.
Leandro,
Você pode obter o objeto do filtro do seu browse através do método FwFilter da classe FwMBrowse. Este método irá retornar um objeto da classe FwFilter.
Tendo o objeto do filtro, você pode consultar quais filtros estão aplicados, visualizar as expressões do filtro, entre outras ações.
Exemplo:
oFilter := oBrowse:FwFilter()
// Irá retornar a expressão ADVPL do(s) filtro(s) utilizado(s), exemplo: '(ZV1->ZV1_BAIXA <> "X" ) .And. (ZV1->ZV1_BAIXA $ " /N" )'
cExpression := oFilter:GetExprADVPL()
// Aplica o filtro do browse na tabela ZV1
ZV1->(DbSetFilter({ || &cExpression }, cExpression))
ZV1->(DbGoTop())
While(!ZV1->(EoF()))
// Navega pela tabela ZV1 já filtrada igual ao browse
ZV1->(DbSkip())
EndDo
// Limpa o filtro aplicado na tabela ZV1
ZV1->(DbClearFilter())
Observação: Ao utilizar comando DbSetFilter na área desejada, após o processamento dos dados, é importante sempre usar o comando DbClearFilter para limpeza do filtro e impedir possíveis inconsistências devido ao filtro aplicado anteriormente.
Para maiores informações, consulte a documentação da classe FwFilter: https://tdn.totvs.com/display/public/framework/FWFilter
Era exatamente isso que precisava.
Muito obrigado!
Olá pessoal, aproveitando esta pergunta ainda.
Alguém sabe se teria como eu pegar o filtro aplicado no browse em uma rotina padrão? Sem ser em um browse customizado, por exemplo, no cadastro de produtos (MATA010) que é um FWMBrowse, coloquei uma customização no Outras Ações e gostaria de pegar o que o usuário filtrou, tentei com dbfilter() na SB1, mas não trouxe.
1 curtida