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.
Muito bom artigo. Parabéns!
Opa, eu que agradeço pelo comentário.
Um grande abraço.
Dan, bom dia! Seria legal aplicar isto na tela do pedido de venda para mostrar somente itens pendentes de faturamento. Enfim, só uma ideia.
Fala Robson, primeiramente obrigado pelo comentário.
Sim, é uma ótima ideia, se um dia a TOTVS Matriz converter a MATA410 para MVC, daria para tentar utilizar esse métodos através de pontos de entrada.
Ou daria também para criar um fonte em MVC do zero com a SC5 e SC6 (similar ao que fizemos nesse artigo: https://terminaldeinformacao.com/2022/07/18/duas-grids-para-um-cabecalho-em-mvc-ti-responde-014/ )
Um grande abraço.