Como filtrar os itens de um browse via AdvPL

Hoje vou mostrar como filtrar os itens de um cadastro pelo browse aberto.

Se você já precisou pegar o browse padrão, e realizar filtros nos registros, hoje vou mostrar duas formas de se fazer, uma mais nova e uma da maneira clássica.

Em ambos os exemplos, pense no contexto em que você precisa filtrar automaticamente o browse, após a inclusão ou alteração de algum registro.

O que devemos fazer, é seja em ponto de entrada, ou alguma outra forma, interceptar a tela, e assim aplicar os filtros desejados.

Usando FWmBrwActive (FWMBrowse / MVC):

//Monta o filtro
cCondicao := "SB1->B1_TIPO == 'PA'"

//Intercepta o FWMBrowse e executa o filtro
oBrowse := FWmBrwActive()
oBrowse:SetFilterDefault(cCondicao)
oBrowse:oBrowse:Refresh()

Usando GetObjBrow (mBrowse clássico):

//Monta o Filtro
cCondicao := " UC_CODIGO == '000001' "

//Intercepta o mBrowse e executa o filtro
oBrowse := GetObjBrow()
oBrowse:SetFilterDefault(cCondicao)
oBrowse:Refresh()

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

4 Responses

  1. Henrique Sciascio disse:

    Boa tarde Tudo bem?
    Gostaria de saber se é possível fazer um Browse com base em uma tabela temporária com condições SQL, fiz uma tela Mod. 2 em MVC e gostaria de filtrar para aparecer somente 1 registro com os campos do cabeçalho para o usuário entrar e acho que um dos jeitos “mais fáceis” de fazer isso é com SQL (DISTINCT).
    Agradeço desde já qualquer link ou qualquer ajuda!

    • Henrique Sciascio disse:

      Bem, gostaria de deixar documentado que não consegui achar um meio de uma tabela temporária com SQL para ativação do Browse, porem consegui fazer algo para solucionar meu problema e para fins de documentação gostaria de deixar documentado o que fiz para resolver para caso alguém tenha o mesmo problema.
      a melhor solução que usei e deu certo foi fazer um filtro mesmo no Browse com SetFilterDefault pegando apenas o campo XXX_ITEM com = ‘0001’, ai ele aparece apenas o primeiro registro do grid mas quando você entra no registro ele aparece o grid inteiro, esta dando certo pra mim atualmente.

      • Bom dia Henrique, tudo joia?

        Opa, obrigado pelo feedback.

        Só se atente ao que enviamos no outro comentário, caso o usuário exclua o item ‘0001’, crie algum mecanismo para que o item 0002 se torne o 0001 e assim por diante.

        Ou efetue a tratativa de subQuery buscando os RecNo conforme o link que enviamos.

        Um grande abraço.

    • Bom dia Henrique, tudo joia graças a Deus e você?

      Teria algumas formas, abaixo vou detalhar duas.

      Forma 1 – Filtrando pelo campo de item
      a. Se sua tabela tiver algum campo sequencial, tipo item (igual C7_ITEM)
      b. Ai você da um SetFilterDefault filtrando o primeiro registro dela
      c. Por exemplo, supondo que o campo tenha tamanho 3, você coloca “CAMPO_ITEM == ‘001’” no seu filtro
      d. Obs.: Adicione alguma tratativa para impedir que o usuário apague o registro ‘001’ ou se ele apagar, para que você transforme o próximo item ‘002’ em ‘001’, senão o registro não vai ser exibido no browse

      Forma 2 – Fazendo uma SubQuery buscando um RecNo da Tabela
      a. Caso sua tabela não tenha campo de item, ou nela o usuário utilizar bastante a rotina de exclusão
      b. Ai você pode montar alguma lógica com MAX ou MIN ou subquery pegando o primeiro ou o último recno de um grupo de registros (se for por exemplo, do pedido de compras, é do C7_NUM)
      c. Nesse link tem um exemplo – https://terminaldeinformacao.com/2018/01/30/como-deixar-apenas-uma-linha-por-pedido-browse-pedido-de-compras/

      Um grande abraço.

      Se você achou esse comentário útil, considere em apoiar o nosso projeto se tornando um Assinante Premium, saiba mais em https://terminaldeinformacao.com/assinatura

Deixe uma resposta

Terminal de Informação