Inicializar Grid Temporária em MVC | Ti Responde 038

No vídeo de hoje, vamos demonstrar em como já trazer uma grid preenchida em MVC, em uma tela com cabeçalho FAKE.

Hoje, a dúvida foi feita pelo grande Claudio, onde ele perguntou como criar uma grid temporária em MVC e já trazer o seu conteúdo preenchido.

Então foi criado um exemplo que utilizando a BUTTONBAR nós preenchemos o conteúdo da grid com um cabeçalho FAKE.

E abaixo o código fonte desenvolvido para exemplificar:

#Include 'Totvs.ch'
#Include 'FWMVCDef.ch'
 
Static cTitle   := "Grupo de Produtos em MVC"
Static cKey     := "FAKE"
Static nTamFake := 15
 
/*/{Protheus.doc} User Function zGrid
Visualizacao de Grupos de Produtos em MVC (com tabela temporaria)
@type  Function
@author Atilio
@since  14/06/2020
@version version
@obs Foi baseado no exemplo de Izac Ciszevski (https://centraldeatendimento.totvs.com/hc/pt-br/articles/360047143634-MP-ADVPL-Criando-uma-tela-MVC-s%C3%B3-com-GRID)
/*/
 
User Function zGrid()
    Local aArea := GetArea()
    Private cAliasTmp := "TMPSBM"
    Private oTempTable
 
    //Cria a temporária
    oTempTable := FWTemporaryTable():New(cAliasTmp)
     
    //Adiciona no array das colunas as que serão incluidas (Nome do Campo, Tipo do Campo, Tamanho, Decimais)
    aFields := {}
    aAdd(aFields, {"XXCODIGO",  "C", TamSX3('BM_GRUPO')[01],   0})
    aAdd(aFields, {"XXDESCRI",  "C", TamSX3('BM_DESC')[01],    0})
    aAdd(aFields, {"XXDATA",    "D", 8,                        0})
     
    //Define as colunas usadas, adiciona indice e cria a temporaria no banco
    oTempTable:SetFields( aFields )
    oTempTable:AddIndex("1", {"XXCODIGO"} )
    oTempTable:Create()
 
    //Executa a inclusao na tela
    FWExecView('GRID Sem Cabeçalho', "VIEWDEF.zGrid", MODEL_OPERATION_INSERT, , { || .T. }, , 30)
 
    //Agora percorre todos os dados digitados
    (cAliasTmp)->(DbGoTop())
    While ! (cAliasTmp)->(EoF())
        MsgInfo("Código: " + (cAliasTmp)->XXCODIGO + ", Descrição: " + (cAliasTmp)->XXDESCRI, "Atenção")
        (cAliasTmp)->(DbSkip())
    EndDo
 
    //Deleta a temporaria
    oTempTable:Delete()
     
    RestArea(aArea)
Return
 
Static Function ModelDef()
    Local oModel  As Object
    Local oStrField As Object
    Local oStrGrid As Object
    Local bLoad := {|oModel| fCarrGrid(oModel)}
    Local aGatilhos := {}
    Local nAtual    := 0
 
    //Criamos aqui uma estrutura falsa que sera uma tabela que ficara escondida no cabecalho
    oStrField := FWFormModelStruct():New()
    oStrField:AddTable('' , { 'XXTABKEY' } , cTitle, {|| ''})
    oStrField:AddField('String 01' , 'Campo de texto' , 'XXTABKEY' , 'C' , nTamFake)
 
    //Criamos aqui a estrutura da grid
    oStrGrid := FWFormModelStruct():New() 
    oStrGrid:AddTable(cAliasTmp, {'XXTABKEY', 'XXCODIGO', 'XXDESCRI', 'XXDATA'}, "Temporaria")
      
    //Adiciona os campos da estrutura
    oStrGrid:AddField(;
        "Codigo",;                                                                                  // [01]  C   Titulo do campo
        "Codigo",;                                                                                  // [02]  C   ToolTip do campo
        "XXCODIGO",;                                                                                // [03]  C   Id do Field
        "C",;                                                                                       // [04]  C   Tipo do campo
        04,;                                                                                        // [05]  N   Tamanho do campo
        0,;                                                                                         // [06]  N   Decimal do campo
        Nil,;                                                                                       // [07]  B   Code-block de validação do campo
        Nil,;                                                                                       // [08]  B   Code-block de validação When do campo
        {},;                                                                                        // [09]  A   Lista de valores permitido do campo
        .T.,;                                                                                       // [10]  L   Indica se o campo tem preenchimento obrigatório
        FwBuildFeature( STRUCT_FEATURE_INIPAD, cAliasTmp+"->XXCODIGO" ),;                           // [11]  B   Code-block de inicializacao do campo
        .T.,;                                                                                       // [12]  L   Indica se trata-se de um campo chave
        .F.,;                                                                                       // [13]  L   Indica se o campo pode receber valor em uma operação de update.
        .F.)                                                                                        // [14]  L   Indica se o campo é virtual
    oStrGrid:AddField(;
        "Descricao",;                                                                               // [01]  C   Titulo do campo
        "Descricao",;                                                                               // [02]  C   ToolTip do campo
        "XXDESCRI",;                                                                                // [03]  C   Id do Field
        "C",;                                                                                       // [04]  C   Tipo do campo
        50,;                                                                                        // [05]  N   Tamanho do campo
        0,;                                                                                         // [06]  N   Decimal do campo
        Nil,;                                                                                       // [07]  B   Code-block de validação do campo
        Nil,;                                                                                       // [08]  B   Code-block de validação When do campo
        {},;                                                                                        // [09]  A   Lista de valores permitido do campo
        .T.,;                                                                                       // [10]  L   Indica se o campo tem preenchimento obrigatório
        FwBuildFeature( STRUCT_FEATURE_INIPAD, cAliasTmp+"->XXDESCRI" ),;                           // [11]  B   Code-block de inicializacao do campo
        .F.,;                                                                                       // [12]  L   Indica se trata-se de um campo chave
        .F.,;                                                                                       // [13]  L   Indica se o campo pode receber valor em uma operação de update.
        .F.)                                                                                        // [14]  L   Indica se o campo é virtual
    oStrGrid:AddField(;
        "Data",;                                                                                    // [01]  C   Titulo do campo
        "Data",;                                                                                    // [02]  C   ToolTip do campo
        "XXDATA",;                                                                                  // [03]  C   Id do Field
        "D",;                                                                                       // [04]  C   Tipo do campo
        8,;                                                                                         // [05]  N   Tamanho do campo
        0,;                                                                                         // [06]  N   Decimal do campo
        Nil,;                                                                                       // [07]  B   Code-block de validação do campo
        Nil,;                                                                                       // [08]  B   Code-block de validação When do campo
        {},;                                                                                        // [09]  A   Lista de valores permitido do campo
        .T.,;                                                                                       // [10]  L   Indica se o campo tem preenchimento obrigatório
        FwBuildFeature( STRUCT_FEATURE_INIPAD, cAliasTmp+"->XXDATA" ),;                             // [11]  B   Code-block de inicializacao do campo
        .F.,;                                                                                       // [12]  L   Indica se trata-se de um campo chave
        .F.,;                                                                                       // [13]  L   Indica se o campo pode receber valor em uma operação de update.
        .F.)                                                                                        // [14]  L   Indica se o campo é virtual
 
    //Adicionando um gatilho, do codigo para data
    aAdd(aGatilhos, FWStruTriggger( ;
        "XXCODIGO",;                                //Campo Origem
        "XXDATA",;                                  //Campo Destino
        "u_zGridGat()",;                            //Regra de Preenchimento
        .F.,;                                       //Irá Posicionar?
        "",;                                        //Alias de Posicionamento
        0,;                                         //Índice de Posicionamento
        '',;                                        //Chave de Posicionamento
        NIL,;                                       //Condição para execução do gatilho
        "01");                                      //Sequência do gatilho
    )
 
    //Percorrendo os gatilhos e adicionando na Struct
    For nAtual := 1 To Len(aGatilhos)
        oStrGrid:AddTrigger( ;
            aGatilhos[nAtual][01],; //Campo Origem
            aGatilhos[nAtual][02],; //Campo Destino
            aGatilhos[nAtual][03],; //Bloco de código na validação da execução do gatilho
            aGatilhos[nAtual][04];  //Bloco de código de execução do gatilho
        )
    Next

    //Agora criamos o modelo de dados da nossa tela
    oModel := MPFormModel():New('zGridM')
    oModel:AddFields('CABID', , oStrField, , , bLoad)
    oModel:AddGrid('GRIDID', 'CABID', oStrGrid, /*bLinePre*/, /*bLinePost*/, /*bPre*/, /*bPos*/, bLoad)
    oModel:SetRelation('GRIDID', { { 'XXTABKEY', 'XXTABKEY' } })
    oModel:SetDescription(cTitle)
    oModel:SetPrimaryKey({ 'XXTABKEY' })
 
    //Ao ativar o modelo, irá alterar o campo do cabeçalho mandando o conteúdo FAKE pois é necessário alteração no cabeçalho
    oModel:SetActivate({ | oModel | FwFldPut("XXTABKEY", cKey) })
Return oModel
 
Static Function ViewDef()
    Local oView    As Object
    Local oModel   As Object
    Local oStrCab  As Object
    Local oStrGrid As Object
 
    //Criamos agora a estrtutura falsa do cabeçalho na visualização dos dados
    oStrCab := FWFormViewStruct():New()
    oStrCab:AddField('XXTABKEY' , '01' , 'String 01' , 'Campo de texto', , 'C')
 
    //Agora a estrutura da Grid
    oStrGrid := FWFormViewStruct():New()
  
    //Adicionando campos da estrutura
    oStrGrid:AddField(;
        "XXCODIGO",;                // [01]  C   Nome do Campo
        "01",;                      // [02]  C   Ordem
        "Codigo",;                  // [03]  C   Titulo do campo
        "Codigo",;                  // [04]  C   Descricao do campo
        Nil,;                       // [05]  A   Array com Help
        "C",;                       // [06]  C   Tipo do campo
        "@!",;                      // [07]  C   Picture
        Nil,;                       // [08]  B   Bloco de PictTre Var
        Nil,;                       // [09]  C   Consulta F3
        .T.,;                       // [10]  L   Indica se o campo é alteravel
        Nil,;                       // [11]  C   Pasta do campo
        Nil,;                       // [12]  C   Agrupamento do campo
        Nil,;                       // [13]  A   Lista de valores permitido do campo (Combo)
        Nil,;                       // [14]  N   Tamanho maximo da maior opção do combo
        Nil,;                       // [15]  C   Inicializador de Browse
        Nil,;                       // [16]  L   Indica se o campo é virtual
        Nil,;                       // [17]  C   Picture Variavel
        Nil)                        // [18]  L   Indica pulo de linha após o campo
    oStrGrid:AddField(;
        "XXDESCRI",;                // [01]  C   Nome do Campo
        "02",;                      // [02]  C   Ordem
        "Descricao",;               // [03]  C   Titulo do campo
        "Descricao",;               // [04]  C   Descricao do campo
        Nil,;                       // [05]  A   Array com Help
        "C",;                       // [06]  C   Tipo do campo
        "@!",;                      // [07]  C   Picture
        Nil,;                       // [08]  B   Bloco de PictTre Var
        Nil,;                       // [09]  C   Consulta F3
        .T.,;                       // [10]  L   Indica se o campo é alteravel
        Nil,;                       // [11]  C   Pasta do campo
        Nil,;                       // [12]  C   Agrupamento do campo
        Nil,;                       // [13]  A   Lista de valores permitido do campo (Combo)
        Nil,;                       // [14]  N   Tamanho maximo da maior opção do combo
        Nil,;                       // [15]  C   Inicializador de Browse
        Nil,;                       // [16]  L   Indica se o campo é virtual
        Nil,;                       // [17]  C   Picture Variavel
        Nil)                        // [18]  L   Indica pulo de linha após o campo
    oStrGrid:AddField(;
        "XXDATA",;                  // [01]  C   Nome do Campo
        "03",;                      // [02]  C   Ordem
        "Data",;                    // [03]  C   Titulo do campo
        "Data",;                    // [04]  C   Descricao do campo
        Nil,;                       // [05]  A   Array com Help
        "D",;                       // [06]  C   Tipo do campo
        "@!",;                      // [07]  C   Picture
        Nil,;                       // [08]  B   Bloco de PictTre Var
        Nil,;                       // [09]  C   Consulta F3
        .T.,;                       // [10]  L   Indica se o campo é alteravel
        Nil,;                       // [11]  C   Pasta do campo
        Nil,;                       // [12]  C   Agrupamento do campo
        Nil,;                       // [13]  A   Lista de valores permitido do campo (Combo)
        Nil,;                       // [14]  N   Tamanho maximo da maior opção do combo
        Nil,;                       // [15]  C   Inicializador de Browse
        Nil,;                       // [16]  L   Indica se o campo é virtual
        Nil,;                       // [17]  C   Picture Variavel
        Nil)                        // [18]  L   Indica pulo de linha após o campo
 
    //Carrega o ModelDef
    oModel  := FWLoadModel('zGrid')
 
    //Agora na visualização, carrega o modelo, define o cabeçalho e a grid, e no cabeçalho coloca 0% de visualização, e na grid coloca 100%
    oView := FwFormView():New()
    oView:SetModel(oModel)
    oView:AddField('CAB', oStrCab, 'CABID')
    oView:AddGrid('GRID', oStrGrid, 'GRIDID')
    oView:CreateHorizontalBox('TOHID', 0)
    oView:CreateHorizontalBox('TOSHOW', 100)
    oView:SetOwnerView('CAB' , 'TOHID')
    oView:SetOwnerView('GRID', 'TOSHOW')
    oView:SetDescription(cTitle)
Return oView

//Função acionada no bLoad, por se tratar de uma temporária com cabeçalho fake, foi usado FWLoadByAlias para carregar o default e depois adicionar via ponto de entrada
Static Function fCarrGrid(oSubModel)
    Local aReg  := {}
    
    If ( oSubModel:GetId() == "GRIDID" )
        aReg := FWLoadByAlias(oSubModel,oTempTable:GetAlias(),oTempTable:GetRealName())
    Else
        aReg := {{cKey},0}  
    EndIf
Return aReg

/*/{Protheus.doc} User Function zGridGat
Função que será acionada pelo gatilho do campo código para o campo data
@type  Function
@author Atilio
@since 26/05/2022
/*/

User Function zGridGat()
    Local aArea      := FWGetArea()
    Local dDtRetorno := Date()

    FWRestArea(aArea)
Return dDtRetorno


/*/{Protheus.doc} User Function zGridM
Ponto de entrada zGridM
@author Atilio
@since 27/05/2022
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
     *-------------------------------------------------*
     Por se tratar de um p.e. em MVC, salve o nome do 
     arquivo diferente, por exemplo, zGridM_pe.prw 
     *-----------------------------------------------*
     A documentacao de como fazer o p.e. esta disponivel em https://tdn.totvs.com/pages/releaseview.action?pageId=208345968 
@see http://autumncodemaker.com
/*/

User Function zGridM()
	Local aArea := FWGetArea()
	Local aParam := PARAMIXB 
	Local xRet := .T.
	Local oObj := Nil
	Local cIdPonto := ""
	Local cIdModel := ""
    Local nLinha
    Local oModel
    Local oModelGrid
    Local oView
	
	//Se tiver parametros
	If aParam != Nil
		
		//Pega informacoes dos parametros
		oObj := aParam[1]
		cIdPonto := aParam[2]
		cIdModel := aParam[3]
		
		//Após carregar toda a tela e estar na adição de botões
		If cIdPonto == "BUTTONBAR"
			xRet := {}

            //Intercepta o Model, a Grid e a View
            oModel      := FWModelActive()
            oModelGrid  := oModel:GetModel("GRIDID")
            oView        := FWViewActive()

            //Limpando a grid
            If oModelGrid:CanClearData()
                oModelGrid:ClearData()
            EndIf
            
            //Percorrendo 5 linhas
            For nLinha := 1 To 5
                oModelGrid:AddLine()
                oModelGrid:GoLine(nLinha)
                oModelGrid:LoadValue("XXCODIGO", "GRP" + cValToChar(nLinha))
                oModelGrid:LoadValue("XXDESCRI", "Grupo teste " + cValToChar(nLinha))
                oModelGrid:LoadValue("XXDATA",   DaySub(Date(), nLinha))
            Next

            //Posiciona na linha 1
            oModelGrid:GoLine(1)
            oView:Refresh()

		EndIf
		
	EndIf
	
	FWRestArea(aArea)
Return xRet

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta