Filtrar dados de uma grid MVC | Ti Responde 057

No vídeo de hoje vamos demonstrar em como aplicar um filtro em uma grid em MVC.

Essa dúvida foi feita pelo grande José, onde ele perguntou se ao abrir uma tela em MVC, se já seria possível trazer os dados filtrados.

Então montamos um exemplo demonstrando a utilização do método SetLoadFilter.

E abaixo o código fonte desenvolvido para exemplificar:

//Bibliotecas
#Include "TOTVS.ch"
#Include "FWMVCDef.ch"
 
//Variveis Estaticas
Static cTitulo := "Artistas x CDs x Músicas (com Cálculos)"
Static cTabPai := "ZD1"
Static cTabFilho := "ZD2"
Static cTabNeto := "ZD3"
 
/*/{Protheus.doc} User Function zVid0057
Exemplo de Modelo X
@author Daniel Atilio
@since 04/02/2022
@version 1.0
@type function
/*/
 
User Function zVid0057()
    Local aArea   := GetArea()
    Local oBrowse
    Private aRotina := {}
 
    //Definicao do menu
    aRotina := MenuDef()
 
    //Instanciando o browse
    oBrowse := FWMBrowse():New()
    oBrowse:SetAlias(cTabPai)
    oBrowse:SetDescription(cTitulo)
    oBrowse:DisableDetails()
 
    //Ativa a Browse
    oBrowse:Activate()
 
    RestArea(aArea)
Return Nil
 
/*/{Protheus.doc} MenuDef
Menu de opcoes na funcao zVid0057
@author Daniel Atilio
@since 04/02/2022
@version 1.0
@type function
/*/
 
Static Function MenuDef()
    Local aRotina := {}
 
    //Adicionando opcoes do menu
    ADD OPTION aRotina TITLE "Visualizar" ACTION "VIEWDEF.zVid0057" OPERATION 1 ACCESS 0
    ADD OPTION aRotina TITLE "Incluir" ACTION "VIEWDEF.zVid0057" OPERATION 3 ACCESS 0
    ADD OPTION aRotina TITLE "Alterar" ACTION "VIEWDEF.zVid0057" OPERATION 4 ACCESS 0
    ADD OPTION aRotina TITLE "Excluir" ACTION "VIEWDEF.zVid0057" OPERATION 5 ACCESS 0
 
Return aRotina
 
/*/{Protheus.doc} ModelDef
Modelo de dados na funcao zVid0057
@author Daniel Atilio
@since 04/02/2022
@version 1.0
@type function
/*/
 
Static Function ModelDef()
    Local oStruPai := FWFormStruct(1, cTabPai)
    Local oStruFilho := FWFormStruct(1, cTabFilho, { |x| ! Alltrim(x) $ 'ZD2_NOME' })
    Local oStruNeto := FWFormStruct(1, cTabNeto)
    Local aRelFilho := {}
    Local aRelNeto := {}
    Local oModel
    Local bPre := Nil
    Local bPos := Nil
    Local bCommit := Nil
    Local bCancel := Nil
 
 
    //Cria o modelo de dados para cadastro
    oModel := MPFormModel():New("zVid57M", bPre, bPos, bCommit, bCancel)
    oModel:AddFields("ZD1MASTER", /*cOwner*/, oStruPai)
    oModel:AddGrid("ZD2DETAIL","ZD1MASTER",oStruFilho,/*bLinePre*/, /*bLinePost*/,/*bPre - Grid Inteiro*/,/*bPos - Grid Inteiro*/,/*bLoad - Carga do modelo manualmente*/)
    oModel:AddGrid("ZD3DETAIL","ZD2DETAIL",oStruNeto,/*bLinePre*/, /*bLinePost*/,/*bPre - Grid Inteiro*/,/*bPos - Grid Inteiro*/,/*bLoad - Carga do modelo manualmente*/)
    oModel:SetPrimaryKey({})
 
    //Fazendo o relacionamento (pai e filho)
    oStruFilho:SetProperty("ZD2_ARTIST", MODEL_FIELD_OBRIGAT, .F.)
    aAdd(aRelFilho, {"ZD2_FILIAL", "FWxFilial('ZD2')"} )
    aAdd(aRelFilho, {"ZD2_ARTIST", "ZD1_CODIGO"})
    oModel:SetRelation("ZD2DETAIL", aRelFilho, ZD2->(IndexKey(1)))
 
    //Fazendo o relacionamento (filho e neto)
    aAdd(aRelNeto, {"ZD3_FILIAL", "FWxFilial('ZD3')"} )
    aAdd(aRelNeto, {"ZD3_CD", "ZD2_CD"})
    oModel:SetRelation("ZD3DETAIL", aRelNeto, ZD3->(IndexKey(1)))
 
    //Definindo campos unicos da linha
    oModel:GetModel("ZD2DETAIL"):SetUniqueLine({'ZD2_CD'})
    oModel:GetModel("ZD3DETAIL"):SetUniqueLine({'ZD3_MUSICA'})
 
    //Adicionando totalizadores de campos
    oModel:AddCalc('TOTAIS', 'ZD1MASTER', 'ZD2DETAIL', 'ZD2_CD',     'XX_TOTCDS', 'COUNT', , , "Total de CDs:" )
    oModel:AddCalc('TOTAIS', 'ZD2DETAIL', 'ZD3DETAIL', 'ZD3_MUSICA', 'XX_TOTMUS', 'COUNT', , , "Total de Musicas:" )
 
    //Realizando o filtro da grid para trazer apenas músicas com a letra A
    oModel:GetModel("ZD3DETAIL"):SetLoadFilter(, " UPPER(ZD3_MUSICA) LIKE '%A%' " )
 
Return oModel
 
/*/{Protheus.doc} ViewDef
Visualizacao de dados na funcao zVid0057
@author Daniel Atilio
@since 04/02/2022
@version 1.0
@type function
/*/
 
Static Function ViewDef()
    Local oModel     := FWLoadModel("zVid0057")
    Local oStruPai   := FWFormStruct(2, cTabPai)
    Local oStruFilho := FWFormStruct(2, cTabFilho, { |x| ! Alltrim(x) $ 'ZD2_NOME' })
    Local oStruNeto  := FWFormStruct(2, cTabNeto)
    Local oStruTot   := FWCalcStruct(oModel:GetModel('TOTAIS'))
    Local oView
 
    //Cria a visualizacao do cadastro
    oView := FWFormView():New()
    oView:SetModel(oModel)
    oView:AddField("VIEW_ZD1", oStruPai,   "ZD1MASTER")
    oView:AddGrid("VIEW_ZD2",  oStruFilho, "ZD2DETAIL")
    oView:AddGrid("VIEW_ZD3",  oStruNeto,  "ZD3DETAIL")
    oView:AddField("VIEW_TOT", oStruTot,   "TOTAIS")
 
    //Partes da tela
    oView:CreateHorizontalBox("CABEC_PAI", 25)
    oView:CreateHorizontalBox("GRID_FILHO", 30)
    oView:CreateHorizontalBox("GRID_NETO", 30)
    oView:CreateHorizontalBox("ENCH_TOT", 15)
    oView:SetOwnerView("VIEW_ZD1", "CABEC_PAI")
    oView:SetOwnerView("VIEW_ZD2", "GRID_FILHO")
    oView:SetOwnerView("VIEW_ZD3", "GRID_NETO")
    oView:SetOwnerView("VIEW_TOT", "ENCH_TOT")
 
    //Titulos
    oView:EnableTitleView("VIEW_ZD1", "Pai - ZD1 (Artistas)")
    oView:EnableTitleView("VIEW_ZD2", "Filho - ZD2 (CDs)")
    oView:EnableTitleView("VIEW_ZD3", "Neto - ZD3 (Musicas dos CDs)")
 
    //Removendo campos
    oStruFilho:RemoveField("ZD2_ARTIST")
    oStruFilho:RemoveField("ZD2_NOME")
    oStruNeto:RemoveField("ZD3_CD")
 
    //Adicionando campo incremental na grid
    oView:AddIncrementField("VIEW_ZD3", "ZD3_ITEM")
 
Return oView

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. Zé da Capela disse:

    Muito bom artigo. Parabéns!

  2. Dan, bom dia! Seria legal aplicar isto na tela do pedido de venda para mostrar somente itens pendentes de faturamento. Enfim, só uma ideia.

Deixe uma resposta para Robson Luiz Estefani GonçalvesCancelar resposta

Terminal de Informação