No artigo de hoje, vamos demonstrar em como acionar uma função logo após abrir a tela em MVC com o método SetAfterViewActivate.
Essa dica foi enviada pelo meu amigo Milton Camara, onde ele comentou da possibilidade de acionar uma determinada funcionalidade logo após abrir a tela em MVC.
No passado até montamos um artigo sobre isso, mas na ocasião mostramos em como fazer utilizando ponto de entrada (veja mais em – Inicializar Grid Temporária em MVC | Ti Responde 038).
Dessa vez, o que fizemos foi, na nossa ViewDef acionar uma função, que chamamos de fInclLinha. Nessa função, se for inclusão, basicamente preenchemos a grid automaticamente, gerando o resultado similar ao abaixo:

Grid já preenchida após abrir a tela
Com isso em mente, você pode acionar suas customizações que quer, logo após a abertura da tela.
Abaixo o código fonte montado para o exemplo descrito acima.
//Bibliotecas
#Include "Totvs.ch"
#Include "FWMVCDef.ch"
//Variveis Estaticas
Static cTitulo := "Cadastro de CDs"
Static cTabPai := "ZD2"
Static cTabFilho := "ZD3"
/*/{Protheus.doc} User Function zMVC02
CDs
@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 zMVC02()
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 zMVC02
@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.zMVC02" OPERATION 1 ACCESS 0
ADD OPTION aRotina TITLE "Incluir" ACTION "VIEWDEF.zMVC02" OPERATION 3 ACCESS 0
ADD OPTION aRotina TITLE "Alterar" ACTION "VIEWDEF.zMVC02" OPERATION 4 ACCESS 0
ADD OPTION aRotina TITLE "Excluir" ACTION "VIEWDEF.zMVC02" OPERATION 5 ACCESS 0
Return aRotina
User Function z02Menu()
Return MenuDef()
/*/{Protheus.doc} ModelDef
Modelo de dados na funcao zMVC02
@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 oStruPai := FWFormStruct(1, cTabPai)
Local oStruFilho := FWFormStruct(1, cTabFilho)
Local aRelation := {}
Local oModel
Local bPre := Nil
Local bPos := Nil
Local bCommit := Nil
Local bCancel := Nil
//Cria o modelo de dados para cadastro
oModel := MPFormModel():New("zMVC02M", bPre, bPos, bCommit, bCancel)
oModel:AddFields("ZD2MASTER", /*cOwner*/, oStruPai)
oModel:AddGrid("ZD3DETAIL","ZD2MASTER",oStruFilho,/*bLinePre*/, /*bLinePost*/,/*bPre - Grid Inteiro*/,/*bPos - Grid Inteiro*/,/*bLoad - Carga do modelo manualmente*/)
oModel:SetDescription("Modelo de dados - " + cTitulo)
oModel:GetModel("ZD2MASTER"):SetDescription( "Dados de - " + cTitulo)
oModel:GetModel("ZD3DETAIL"):SetDescription( "Grid de - " + cTitulo)
oModel:SetPrimaryKey({})
//Fazendo o relacionamento
aAdd(aRelation, {"ZD3_FILIAL", "FWxFilial('ZD3')"} )
aAdd(aRelation, {"ZD3_CD", "ZD2_CD"})
oModel:SetRelation("ZD3DETAIL", aRelation, ZD3->(IndexKey(1)))
//Definindo campos unicos da linha
oModel:GetModel("ZD3DETAIL"):SetUniqueLine({'ZD3_MUSICA'})
Return oModel
/*/{Protheus.doc} ViewDef
Visualizacao de dados na funcao zMVC02
@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("zMVC02")
Local oStruPai := FWFormStruct(2, cTabPai)
Local oStruFilho := FWFormStruct(2, cTabFilho)
Local oView
//Cria a visualizacao do cadastro
oView := FWFormView():New()
oView:SetModel(oModel)
oView:AddField("VIEW_ZD2", oStruPai, "ZD2MASTER")
oView:AddGrid("VIEW_ZD3", oStruFilho, "ZD3DETAIL")
//Partes da tela
oView:CreateHorizontalBox("CABEC", 30)
oView:CreateHorizontalBox("GRID", 70)
oView:SetOwnerView("VIEW_ZD2", "CABEC")
oView:SetOwnerView("VIEW_ZD3", "GRID")
//Titulos
oView:EnableTitleView("VIEW_ZD2", "Cabecalho - ZD2 (CDs)")
oView:EnableTitleView("VIEW_ZD3", "Grid - ZD3 (Musicas dos CDs)")
//Removendo campos
oStruFilho:RemoveField("ZD3_CD")
//Adicionando campo incremental na grid
oView:AddIncrementField("VIEW_ZD3", "ZD3_ITEM")
//Define uma ação logo após abrir a tela
oView:SetAfterViewActivate({|| fInclLinha()})
Return oView
Static Function fInclLinha()
Local lContinua := .T.
Local oModel := FWModelActive()
Local nOper := oModel:GetOperation()
Local oView := FWViewActive()
Local oModelGrid := oModel:GetModel("ZD3DETAIL")
Local nLinhas := 12
Local nLinAtu := 0
//Se for inclusão
If nOper == 3
//Limpando a grid
If oModelGrid:CanClearData()
oModelGrid:ClearData()
EndIf
//Percorrendo as linhas e adicionano na grid
For nLinAtu := 1 To nLinhas
oModelGrid:AddLine()
oModelGrid:GoLine(nLinAtu)
oModelGrid:LoadValue("ZD3_MUSICA", "Faixa de número " + cValToChar(nLinAtu))
Next
//Posiciona na linha 1
oModelGrid:GoLine(1)
oView:Refresh()
EndIf
Return lContinua
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Bom dia Daniel, tudo bem?
Segui o seu exemplo, mas quando tento incluir o registro, ele só salva a primeira linha preenchida no banco de dados, ele salva as outras linhas, mas em branco, consegue me ajudar?
Bom dia Iuri, tudo joia graças a Deus e você?
Que estranho, depois me passe a versão que esta usando do Protheus e da LIB, que vamos tentar simular aqui também.
Duas alternativas que você pode tentar fazer, é usar SetValue no lugar de LoadValue. E a segunda, é dar RecLock na tabela, gravar as informações e ai ao invés de acionar o “Incluir” direto no menuDef, você adiciona alguma opção como “Novo Registro”, e deixa o número como 04, e é nele que vai acionar o RecLock e já trazer os dados preenchidos.
Tenha uma ótima e abençoada sexta feira.
Um forte abraço.
Tudo tranquilo, graças a Deus.
Deu certo aqui, o problema que eu estava tendo era erro no modelo 2 MVC que não tinha percebido.
Muito obrigado e um ótimo final de semana.
Amém, bom dia Iuri.
Opa, nós que agradecemos pelo feedback.
Tenha uma ótima e abençoada semana.
Um forte abraço.