Como filtrar um FWmBrowse logo ao abrir através de um ParamBox

No artigo de hoje, vamos demonstrar em como criar uma pergunta logo ao abrir um browse para filtrar as informações.

Para fazermos esse procedimento, o primeiro passo é na criação do nosso FWmBrowse, nós acionarmos uma função para montar o filtro, que chamamos de fMontaFilt. Ela irá abrir uma tela de parâmetros, então logo ao abrir a rotina, será exibido uma tela similar a abaixo:

Tela de parâmetros

 

Se a tela for cancelada, nenhum filtro será aplicado. Porém, se a tela for confirmada, será aberto o browse com o filtro aplicado:

Exemplo de browse com filtro aplicado

 

Abaixo o código fonte de exemplo:

//Bibliotecas
#Include "Totvs.ch"
#Include "FWMVCDef.ch"

//Variveis Estaticas
Static cTitulo := "Artistas"
Static cAliasMVC := "ZD1"

/*/{Protheus.doc} User Function zMVC01
Cadastro de Artistas
@author Daniel Atilio
@since 21/01/2022
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

User Function zMVC01()
	Local aArea   := GetArea()
	Local oBrowse
	Private aRotina := {}

	//Definicao do menu
	aRotina := MenuDef()

	//Instanciando o browse
	oBrowse := FWMBrowse():New()
	oBrowse:SetAlias(cAliasMVC)
	oBrowse:SetDescription(cTitulo)
	oBrowse:DisableDetails()

    //Filtrando o browse
    cFiltro := fMontaFilt()
    If ! Empty(cFiltro)
        oBrowse:SetFilterDefault(cFiltro)
    EndIf

	//Ativa a Browse
	oBrowse:Activate()

	RestArea(aArea)
Return Nil

/*/{Protheus.doc} MenuDef
Menu de opcoes na funcao zMVC01
@author Daniel Atilio
@since 21/01/2022
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

Static Function MenuDef()
	Local aRotina := {}

	//Adicionando opcoes do menu
	ADD OPTION aRotina TITLE "Visualizar" ACTION "VIEWDEF.zMVC01" OPERATION 1 ACCESS 0
	ADD OPTION aRotina TITLE "Incluir" ACTION "VIEWDEF.zMVC01" OPERATION 3 ACCESS 0
	ADD OPTION aRotina TITLE "Alterar" ACTION "VIEWDEF.zMVC01" OPERATION 4 ACCESS 0
	ADD OPTION aRotina TITLE "Excluir" ACTION "VIEWDEF.zMVC01" OPERATION 5 ACCESS 0

Return aRotina

User Function z01Menu()
Return MenuDef()

/*/{Protheus.doc} ModelDef
Modelo de dados na funcao zMVC01
@author Daniel Atilio
@since 21/01/2022
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

Static Function ModelDef()
	Local oStruct := FWFormStruct(1, cAliasMVC)
	Local oModel
	Local bPre := Nil
	Local bPos := Nil
	Local bCommit := Nil
	Local bCancel := Nil

	//oStruct:SetProperty('ZD1_DTFORM', MODEL_FIELD_INIT, FwBuildFeature(STRUCT_FEATURE_INIPAD, 'Date()'))
	oStruct:SetProperty('ZD1_DTFORM', MODEL_FIELD_INIT, FwBuildFeature(STRUCT_FEATURE_INIPAD, 'dDataBase'))
	//oStruct:SetProperty('ZD1_DTFORM', MODEL_FIELD_INIT, FwBuildFeature(STRUCT_FEATURE_INIPAD, 'sToD("20221101")'))


	//Cria o modelo de dados para cadastro
	oModel := MPFormModel():New("zMVC01M", bPre, bPos, bCommit, bCancel)
	oModel:AddFields("ZD1MASTER", /*cOwner*/, oStruct)
	oModel:SetDescription("Modelo de dados - " + cTitulo)
	oModel:GetModel("ZD1MASTER"):SetDescription( "Dados de - " + cTitulo)
	oModel:SetPrimaryKey({})
Return oModel

User Function z01Model()
Return ModelDef()

/*/{Protheus.doc} ViewDef
Visualizacao de dados na funcao zMVC01
@author Daniel Atilio
@since 21/01/2022
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

Static Function ViewDef()
	Local oModel := FWLoadModel("zMVC01")
	Local oStruct := FWFormStruct(2, cAliasMVC)
	Local oView

	//Cria a visualizacao do cadastro
	oView := FWFormView():New()
	oView:SetModel(oModel)
	oView:AddField("VIEW_ZD1", oStruct, "ZD1MASTER")
	oView:CreateHorizontalBox("TELA" , 100 )
	oView:SetOwnerView("VIEW_ZD1", "TELA")

Return oView


/*/{Protheus.doc} fMontaFilt
Função que abre a tela de parâmetros para montagem de filtro no browse
@author Atilio
@since 07/02/2023
@version 1.0
/*/
   
Static Function fMontaFilt()
    Local aArea     := FWGetArea()
    Local cFiltro   := ""
    Local aPergs    := {}
    Local cCodDe    := Space(TamSX3('ZD1_CODIGO')[01])
    Local cCodAt    := StrTran(cCodDe, ' ', 'Z')
    Local dDataDe   := FirstDate(MonthSub(Date(), 1))
    Local dDataAte  := Date()
   
    //Adiciona os parâmetros que serão exibidos    
    aAdd(aPergs, {1, "Código De",  cCodDe,   "", ".T.", "", ".T.", 60, .F.})
    aAdd(aPergs, {1, "Código Até", cCodAt,   "", ".T.", "", ".T.", 60, .T.})
    aAdd(aPergs, {1, "Data De",    dDataDe,  "", ".T.", "", ".T.", 80, .T.})
    aAdd(aPergs, {1, "Data Até",   dDataAte, "", ".T.", "", ".T.", 80, .T.})
       
    //Se a pergunta for confirmada
    If ParamBox(aPergs, "Informe os parâmetros", , , , , , , , , .F., .F.)
        //Filtro da Código De
        If ! Empty(MV_PAR01)
            cFiltro += "ZD1->ZD1_CODIGO >= '" + MV_PAR01 + "'"
        EndIf
   
        //Filtro do Código Até
        If ! Empty(MV_PAR02)
            If ! Empty(cFiltro)
                cFiltro += " .And. "
            EndIf
            cFiltro += "ZD1->ZD1_CODIGO <= '" + MV_PAR02 + "'"
        EndIf
   
        //Filtro da Data De
        If ! Empty(MV_PAR03)
            If ! Empty(cFiltro)
                cFiltro += " .And. "
            EndIf
            cFiltro += "ZD1->ZD1_DTFORM >= sToD('" + dToS(MV_PAR03) + "')"
        EndIf
   
        //Filtro da Data Até
        If ! Empty(MV_PAR04)
            If ! Empty(cFiltro)
                cFiltro += " .And. "
            EndIf
            cFiltro += "ZD1->ZD1_DTFORM <= sToD('" + dToS(MV_PAR04) + "')"
        EndIf
    EndIf
   
    FWRestArea(aArea)
Return cFiltro

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.

Deixe uma resposta

Terminal de Informação