Abrindo uma tela em MVC dentro de outra tela em MVC (usando FWExecView) | Ti Responde 0216

No vídeo de hoje, vamos demonstrar em como ajustar um comportamento de que, ao acionar a FWExecView de uma tela A dentro de uma tela B, o sistema acaba abrindo outra tela de browse.

A dúvida de hoje, nos perguntaram, se ao criar uma tabela customizada, e criar uma rotina em MVC, acionar ela via FWExecView na rotina CRMA980 (cadastro de clientes), por qual motivo, ele abria o browse dessa rotina customizada após confirmar a operação.

 

Pensando nisso, montamos um exemplo, onde vamos mostrar em como tratar isso, encapsulando a chamada do FWExecView dentro de uma Dialog através do carregamento do bInit dela.

 

Segue abaixo o vídeo exemplificando:

 

E abaixo o código fonte desenvolvido:

/*
    Tabela: 
        Z39 - Clientes x Dias de Entrega
    Índices:
        1 - Z39_FILIAL + Z39_CLICOD + Z39_CLILOJ + Z39_DIASEM 
    Campos
        Z39_FILIAL - padrão do sistema
        Z39_CLICOD - código do cliente (mesmo tamanho do A1_COD)
        Z39_CLILOJ - loja do cliente (mesmo tamanho do A1_LOJA)
        Z39_DIASEM - número do dia da semana, tamanho 2, como caractere
        Z39_DESCRI - nome do dia da semana (Segunda, Terca, etc), tamanho 10, como caractere
        Z39_ENTREG - lógico define se tem entrega no dia (true) ou não (false)
        Z39_HORINI - hora inicial para entregar no cliente, como caractere, máscara @R 99:99
        Z39_HORFIM - hora máxima para entregar no cliente, como caractere, máscara @R 99:99
*/


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

//Variveis Estaticas
Static cTitulo    := "Clientes x Dias de Entrega"
Static cCamposChv := "Z39_CLICOD;Z39_CLILOJ;"
Static cTabPai    := "Z39"

/*/{Protheus.doc} User Function zVid0216
Clientes x Dias de Entrega
@author Atilio
@since 01/10/2024
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

User Function zVid0216()
	Local aArea   := FWGetArea()
	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()

	FWRestArea(aArea)
Return Nil

/*/{Protheus.doc} MenuDef
Menu de opcoes na funcao zVid0216
@author Atilio
@since 01/10/2024
@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.zVid0216" OPERATION 1 ACCESS 0
	ADD OPTION aRotina TITLE "Alterar" ACTION "VIEWDEF.zVid0216" OPERATION 4 ACCESS 0

Return aRotina

/*/{Protheus.doc} ModelDef
Modelo de dados na funcao zVid0216
@author Atilio
@since 01/10/2024
@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, {|cCampo| Alltrim(cCampo) $ cCamposChv})
	Local oStruFilho := FWFormStruct(1, cTabPai)
	Local aRelation := {}
	Local oModel
	Local bPre := Nil
	Local bPos := Nil
	Local bCancel := Nil


	//Cria o modelo de dados para cadastro
	oModel := MPFormModel():New("zVid216M", bPre, bPos, /*bCommit*/, bCancel)
	oModel:AddFields("Z39MASTER", /*cOwner*/, oStruPai)
	oModel:AddGrid("Z39DETAIL","Z39MASTER",oStruFilho,/*bLinePre*/, /*bLinePost*/,/*bPre - Grid Inteiro*/,/*bPos - Grid Inteiro*/,/*bLoad - Carga do modelo manualmente*/)
	oModel:SetDescription("Modelo de dados - " + cTitulo)
	oModel:GetModel("Z39MASTER"):SetDescription( "Dados de - " + cTitulo)
	oModel:GetModel("Z39DETAIL"):SetDescription( "Grid de - " + cTitulo)
	oModel:SetPrimaryKey({})

	//Fazendo o relacionamento
	aAdd(aRelation, {"Z39_FILIAL", "FWxFilial('Z39')"} )
	aAdd(aRelation, {"Z39_CLICOD", "Z39_CLICOD"})
	aAdd(aRelation, {"Z39_CLILOJ", "Z39_CLILOJ"})
	oModel:SetRelation("Z39DETAIL", aRelation, Z39->(IndexKey(1)))

    //Desativando a exclusão e inclusão de linhas
    oModel:GetModel("Z39DETAIL"):SetNoDeleteLine(.T.)
    oModel:GetModel("Z39DETAIL"):SetNoInsertLine(.T.)

Return oModel

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

Static Function ViewDef()
	Local oModel     := FWLoadModel("zVid0216")
	Local oStruPai   := FWFormStruct(2, cTabPai, {|cCampo| Alltrim(cCampo) $ cCamposChv})
	Local oStruFilho := FWFormStruct(2, cTabPai, {|cCampo| ! Alltrim(cCampo) $ cCamposChv})
	Local oView

	//Cria a visualizacao do cadastro
	oView := FWFormView():New()
	oView:SetModel(oModel)
	oView:AddField("VIEW_Z39", oStruPai, "Z39MASTER")
	oView:AddGrid("GRID_Z39",  oStruFilho,  "Z39DETAIL")

	//Partes da tela
	oView:CreateHorizontalBox("CABEC", 30)
	oView:CreateHorizontalBox("GRID", 70)
	oView:SetOwnerView("VIEW_Z39", "CABEC")
	oView:SetOwnerView("GRID_Z39", "GRID")

	//Titulos
	oView:EnableTitleView("VIEW_Z39", "Cabecalho - Z39")
	oView:EnableTitleView("GRID_Z39", "Grid - Z39")

	//Adicionando campo incremental na grid
	oView:AddIncrementField("GRID_Z39", "Z39_DIASEM")

Return oView

/*/{Protheus.doc} User Function z216Alt
Função para acionar a alteração do vínculo do cliente com os dias
@type  Function
@author Atilio
@since 01/10/2024
/*/

User Function z216Alt()
    Local aArea     := FWGetArea()
    Local cFunBkp   := FunName()
    Local cCliente  := SA1->A1_COD
    Local cLoja     := SA1->A1_LOJA
    Local nDia      := 0
    Local cDia      := ""
    Local cDescri   := ""
    Local aTamanho := MsAdvSize()
    Local nJanLarg := aTamanho[5]
    Local nJanAltu := aTamanho[6]
    Local oDlgTemp
    Local bInit := {||}
    Private aRotina := {}

    DbSelectArea("Z39")
    Z39->(DbSetOrder(1)) // Z39_FILIAL + Z39_CLICOD + Z39_CLILOJ + Z39_DIASEM 

    //Percorre os dias da semana
    For nDia := 1 To 7
        cDia    := StrZero(nDia, 2)
        cDescri := DiaSemana( , , nDia)

        //Se o dia atual não foi encontrado para esse cliente
        If ! Z39->(MsSeek(FWxFilial("Z39") + cCliente + cLoja + cDia))
            
            //Cria o registro
            RecLock("Z39", .T.)
                Z39->Z39_FILIAL := FWxFilial("Z39")
                Z39->Z39_CLICOD := cCliente
                Z39->Z39_CLILOJ := cLoja
                Z39->Z39_DIASEM := cDia
                Z39->Z39_DESCRI := cDescri
                Z39->Z39_ENTREG := .F.
                Z39->Z39_HORINI := ""
                Z39->Z39_HORFIM := ""
            Z39->(MsUnlock())
        EndIf
    Next

    //Se acionar assim, ele abre a tela do browse
    //FWExecView('Clientes x Dias de Entrega', 'zVid0216', MODEL_OPERATION_UPDATE, /*oDlg*/, {|| .T.}, {|| .T.})

    //Cria a janela temporária
    oDlgTemp := TDialog():New(0, 0, nJanAltu, nJanLarg, cTitulo, , , , , CLR_BLACK, RGB(250, 250, 250), , , .T.)

        //Define o bloco ao inicilizar a tela para acionar a rotina para cadastrar cliente x dias de entrega e em seguida depois que confirmar, encerrar a dialog
        SetFunName("zVid0216")    
        bInit := {|| FWExecView('Clientes x Dias de Entrega', 'zVid0216', MODEL_OPERATION_UPDATE, /*oDlg*/, {|| .T.}, {|| .T.}), oDlgTemp:End() }
        SetFunName(cFunBkp)

    //Ativa a janela temporária e aciona o bloco de inicialização
    oDlgTemp:Activate(, , , .T., {|| .T.}, , bInit )

    FWRestArea(aArea)
Return


/*/{Protheus.doc} User Function CRM980MDEF
Adiciona outras ações na tela de clientes
@type  Function
@author Atilio
@since 01/10/2024
/*/

User Function CRM980MDEF()
    Local aArea      := FWGetArea()
    Local aNovBotoes := {}

    //Adiciona as opções novas
    ADD OPTION aNovBotoes TITLE "* Clientes x Dias de Entrega" ACTION "u_z216Alt()" OPERATION 8 ACCESS 0

    FWRestArea(aArea)
Return aNovBotoes

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