No vídeo de hoje, vamos demonstrar em como ter duas grids para um cabeçalho em uma tela em MVC.
Hoje, a dúvida foi feita pelo grande Rogério, onde ele tinha uma dúvida, em como montar uma tela em MVC com duas grids para um cabeçalho.
Com isso em mente, fiz um vídeo explicando como fazer os relations e os box na ViewDef.
E abaixo o código fonte desenvolvido para exemplificar:
//Bibliotecas
#Include "Totvs.ch"
#Include "FWMVCDef.ch"
//Variveis Estaticas
Static cTitulo := "Visualização Pedidos x Itens x Liberações"
Static cTabPai := "SC5"
Static cTabFilho1 := "SC6"
Static cTabFilho2 := "SC9"
/*/{Protheus.doc} User Function zVid0014
Visualização Pedidos x Itens x Liberações
@author Daniel Atilio
@since 15/07/2021
@version 1.0
/*/
User Function zVid0014()
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()
//Adicionando as Legendas
oBrowse:AddLegend("Empty(SC5->C5_LIBEROK).And.Empty(SC5->C5_NOTA) .And. Empty(SC5->C5_BLQ)" , 'ENABLE' , "Pedido em Aberto" )
oBrowse:AddLegend("!Empty(SC5->C5_NOTA).Or.SC5->C5_LIBEROK=='E' .And. Empty(SC5->C5_BLQ)" , 'DISABLE' , "Pedido Encerrado" )
oBrowse:AddLegend("!Empty(SC5->C5_LIBEROK).And.Empty(SC5->C5_NOTA).And. Empty(SC5->C5_BLQ)" , 'BR_AMARELO' , "Pedido Liberado" )
oBrowse:AddLegend("SC5->C5_BLQ == '1'" , 'BR_AZUL' , "Pedido Bloquedo por regra" )
oBrowse:AddLegend("SC5->C5_BLQ == '2'" , 'BR_LARANJA' , "Pedido Bloquedo por verba" )
//Ativa a Browse
oBrowse:Activate()
RestArea(aArea)
Return Nil
Static Function MenuDef()
Local aRotina := {}
//Adicionando opcoes do menu
ADD OPTION aRotina TITLE "Visualizar" ACTION "VIEWDEF.zVid0014" OPERATION 1 ACCESS 0
Return aRotina
Static Function ModelDef()
Local oStrPai := FWFormStruct(1, cTabPai)
Local oStrFilho1 := FWFormStruct(1, cTabFilho1, {|cCampo| .Not. Alltrim(cCampo) $ "C6_CODINF;C6_INFAD;"})
Local oStrFilho2 := FWFormStruct(1, cTabFilho2)
Local aRelation := {}
Local aRelation2 := {}
Local oModel
Local bPre := Nil
Local bPos := Nil
Local bCommit := Nil
Local bCancel := Nil
//Cria o modelo de dados para cadastro
oModel := MPFormModel():New("zVid0014M", bPre, bPos, bCommit, bCancel)
oModel:AddFields("SC5MASTER", /*cOwner*/, oStrPai)
oModel:AddGrid("SC6DETAIL","SC5MASTER",oStrFilho1,/*bLinePre*/, /*bLinePost*/,/*bPre - Grid Inteiro*/,/*bPos - Grid Inteiro*/,/*bLoad - Carga do modelo manualmente*/)
oModel:AddGrid("SC9DETAIL","SC5MASTER",oStrFilho2,/*bLinePre*/, /*bLinePost*/,/*bPre - Grid Inteiro*/,/*bPos - Grid Inteiro*/,/*bLoad - Carga do modelo manualmente*/)
oModel:SetDescription("Modelo de dados - " + cTitulo)
oModel:GetModel("SC5MASTER"):SetDescription( "Dados de - " + cTitulo)
oModel:GetModel("SC6DETAIL"):SetDescription( "Grid SC6 de - " + cTitulo)
oModel:GetModel("SC9DETAIL"):SetDescription( "Grid SC9 de - " + cTitulo)
oModel:SetPrimaryKey({"C5_FILIAL", "C5_NUM"})
//Fazendo o relacionamento
aAdd(aRelation, {"C6_FILIAL", "FWxFilial('SC6')"} )
aAdd(aRelation, {"C6_NUM", "C5_NUM"})
oModel:SetRelation("SC6DETAIL", aRelation, SC6->(IndexKey(1)))
aAdd(aRelation2, {"C9_FILIAL", "FWxFilial('SC9')"} )
aAdd(aRelation2, {"C9_PEDIDO", "C5_NUM"})
oModel:SetRelation("SC9DETAIL", aRelation2, SC9->(IndexKey(1)))
Return oModel
Static Function ViewDef()
Local oModel := FWLoadModel("zVid0014")
Local oStrPai := FWFormStruct(2, cTabPai)
Local oStrFilho1 := FWFormStruct(2, cTabFilho1, {|cCampo| .Not. Alltrim(cCampo) $ "C6_CODINF;C6_INFAD;"})
Local oStrFilho2 := FWFormStruct(2, cTabFilho2)
Local oView
//Cria a visualizacao do cadastro
oView := FWFormView():New()
oView:SetModel(oModel)
//Adicionando os campos do cabeçalho
oView:AddField("VIEW_SC5", oStrPai, "SC5MASTER")
oView:EnableTitleView("VIEW_SC5", "Cabeçalho do Pedido (SC5)")
//Grids dos filhos
oView:AddGrid("VIEW_SC6", oStrFilho1, "SC6DETAIL")
oView:AddGrid("VIEW_SC9", oStrFilho2, "SC9DETAIL")
//Setando o dimensionamento de tamanho
oView:CreateHorizontalBox('SUPERIOR', 50)
oView:CreateHorizontalBox('INFERIOR', 50)
//Criando a folder dos produtos (filhos)
oView:CreateFolder('PASTA_FILHOS', 'INFERIOR')
oView:AddSheet('PASTA_FILHOS', 'ABA_FILHO01', "Produtos Vendidos (SC6)")
oView:AddSheet('PASTA_FILHOS', 'ABA_FILHO02', "Liberações (SC9)")
//Criando os vinculos onde serão mostrado os dados
oView:CreateHorizontalBox('ITENS_FILHO01', 100,,, 'PASTA_FILHOS', 'ABA_FILHO01' )
oView:CreateHorizontalBox('ITENS_FILHO02', 100,,, 'PASTA_FILHOS', 'ABA_FILHO02' )
//Amarrando a view com as box
oView:SetOwnerView('VIEW_SC5', 'SUPERIOR')
oView:SetOwnerView('VIEW_SC6', 'ITENS_FILHO01')
oView:SetOwnerView('VIEW_SC9', 'ITENS_FILHO02')
//Removendo campos
oStrFilho1:RemoveField("C6_FILIAL")
oStrFilho1:RemoveField("C6_NUM")
oStrFilho2:RemoveField("C9_FILIAL")
oStrFilho2:RemoveField("C9_PEDIDO")
//Adicionando campo incremental na grid
oView:AddIncrementField("VIEW_SC6", "C6_ITEM")
oView:AddIncrementField("VIEW_SC9", "C9_ITEM")
Return oView
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Boa tarde.
Peguei esse seu fonte e compilei em uma base teste na versão 2210. Ele abre o browse, posiciono nos pedidos mas quando clico em visualizar nada acontece. Apenas rola um rapido refresh que reposiciona o foco e mais nada.
Bom dia Mauricio, tudo joia?
Dê uma olhada nesse artigo – https://terminaldeinformacao.com/2021/01/06/o-que-pode-ser-quando-botoes-nao-funcionam-em-mvc/
Nele explicamos o que causa esse comportamento dos botões não funcionarem em browses em MVC.
Um grande abraço.