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.