Olá pessoal…
Na aula de hoje vou mostrar como criar um cadastro de uma tabela temporária (utilizando DbUseArea) em MVC.
Abaixo o código fonte.
//Bibliotecas
#Include 'Protheus.ch'
#Include 'FWMVCDef.ch'
//Variáveis Estáticas
Static cTitulo := "Temporária"
/*/{Protheus.doc} zTmpCad
Exemplo de Modelo 1 com tabela temporária
@author Atilio
@since 22/04/2017
@version 1.0
@return Nil, Função não tem retorno
@example
u_zTmpCad()
/*/
User Function zTmpCad()
Local aArea := GetArea()
Local oBrowse
Local cFunBkp := FunName()
Local cArquivo := "\teste"+GetDBExtension()
Local cArqs := ""
Local aStrut := {}
Local aBrowse := {}
Local aSeek := {}
Local aIndex := {}
Private cAliasTmp := "CADTMP"
//Pode se usar também a FWTemporaryTable
//Criando a estrutura que terá na tabela
aAdd(aStrut, {"TMP_COD", "C", 06, 0} )
aAdd(aStrut, {"TMP_DES", "C", 50, 0} )
aAdd(aStrut, {"TMP_VAL", "N", 10, 2} )
aAdd(aStrut, {"TMP_DAT", "D", 08, 0} )
//Se o arquivo dbf / ctree existir, usa ele
If Select(cAliasTmp) == 0
If File(cArquivo)
DbUseArea(.T., "DBFCDX", cArquivo, cAliasTmp, .T., .F.)
//Senão, cria uma temporária
Else
//Criando a temporária
cArqs := CriaTrab( aStrut, .T. )
DbUseArea(.T., "DBFCDX", cArqs, cAliasTmp, .T., .F.)
MsgInfo("Arquivo criado '"+cArqs+GetDBExtension()+"'", "Atenção")
EndIf
EndIf
//Definindo as colunas que serão usadas no browse
aAdd(aBrowse, {"Codigo", "TMP_COD", "C", 06, 0, "@!"})
aAdd(aBrowse, {"Descricao", "TMP_DES", "C", 50, 0, "@!"})
aAdd(aBrowse, {"Valor", "TMP_VAL", "N", 10, 0, "@E 9,999,999.99"})
aAdd(aBrowse, {"Data", "TMP_DAT", "D", 08, 0, "@D"})
SetFunName("zTmpCad")
aAdd(aIndex, "TMP_COD" )
//Criando o browse da temporária
oBrowse := FWMBrowse():New()
oBrowse:SetAlias(cAliasTmp)
oBrowse:SetQueryIndex(aIndex)
oBrowse:SetTemporary(.T.)
oBrowse:SetFields(aBrowse)
oBrowse:DisableDetails()
oBrowse:SetDescription(cTitulo)
oBrowse:Activate()
SetFunName(cFunBkp)
RestArea(aArea)
Return Nil
/*---------------------------------------------------------------------*
| Func: MenuDef |
| Desc: Criação do menu MVC |
*---------------------------------------------------------------------*/
Static Function MenuDef()
Local aRot := {}
//Adicionando opções
ADD OPTION aRot TITLE 'Visualizar' ACTION 'VIEWDEF.zTmpCad' OPERATION MODEL_OPERATION_VIEW ACCESS 0 //OPERATION 1
ADD OPTION aRot TITLE 'Incluir' ACTION 'VIEWDEF.zTmpCad' OPERATION MODEL_OPERATION_INSERT ACCESS 0 //OPERATION 3
ADD OPTION aRot TITLE 'Alterar' ACTION 'VIEWDEF.zTmpCad' OPERATION MODEL_OPERATION_UPDATE ACCESS 0 //OPERATION 4
ADD OPTION aRot TITLE 'Excluir' ACTION 'VIEWDEF.zTmpCad' OPERATION MODEL_OPERATION_DELETE ACCESS 0 //OPERATION 5
Return aRot
/*---------------------------------------------------------------------*
| Func: ModelDef |
| Desc: Criação do modelo de dados MVC |
*---------------------------------------------------------------------*/
Static Function ModelDef()
//Criação do objeto do modelo de dados
Local oModel := Nil
//Criação da estrutura de dados utilizada na interface
Local oStTMP := FWFormModelStruct():New()
oStTMP:AddTable(cAliasTmp, {'TMP_COD', 'TMP_DES', 'TMP_VAL', 'TMP_DAT'}, "Temporaria")
//Adiciona os campos da estrutura
oStTmp:AddField(;
"Codigo",; // [01] C Titulo do campo
"Codigo",; // [02] C ToolTip do campo
"TMP_COD",; // [03] C Id do Field
"C",; // [04] C Tipo do campo
06,; // [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, "Iif(!INCLUI,"+cAliasTmp+"->TMP_COD,'')" ),; // [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
oStTmp:AddField(;
"Descricao",; // [01] C Titulo do campo
"Descricao",; // [02] C ToolTip do campo
"TMP_DES",; // [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, "Iif(!INCLUI,"+cAliasTmp+"->TMP_DES,'')" ),; // [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
oStTmp:AddField(;
"Valor",; // [01] C Titulo do campo
"Valor",; // [02] C ToolTip do campo
"TMP_VAL",; // [03] C Id do Field
"N",; // [04] C Tipo do campo
10,; // [05] N Tamanho do campo
02,; // [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
.F.,; // [10] L Indica se o campo tem preenchimento obrigatório
FwBuildFeature( STRUCT_FEATURE_INIPAD, "Iif(!INCLUI,"+cAliasTmp+"->TMP_VAL,'')" ),; // [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
oStTmp:AddField(;
"Data",; // [01] C Titulo do campo
"Data",; // [02] C ToolTip do campo
"TMP_DAT",; // [03] C Id do Field
"D",; // [04] C Tipo do campo
08,; // [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
.F.,; // [10] L Indica se o campo tem preenchimento obrigatório
FwBuildFeature( STRUCT_FEATURE_INIPAD, "Iif(!INCLUI,"+cAliasTmp+"->TMP_DAT,'')" ),; // [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
//Instanciando o modelo, não é recomendado colocar nome da user function (por causa do u_), respeitando 10 caracteres
oModel := MPFormModel():New("zTmpCadM",/*bPre*/, /*bPos*/,/*bCommit*/,/*bCancel*/)
//Atribuindo formulários para o modelo
oModel:AddFields("FORMTMP",/*cOwner*/,oStTMP)
//Setando a chave primária da rotina
oModel:SetPrimaryKey({'TMP_COD'})
//Adicionando descrição ao modelo
oModel:SetDescription("Modelo de Dados do Cadastro "+cTitulo)
//Setando a descrição do formulário
oModel:GetModel("FORMTMP"):SetDescription("Formulário do Cadastro "+cTitulo)
Return oModel
/*---------------------------------------------------------------------*
| Func: ViewDef |
| Desc: Criação da visão MVC |
*---------------------------------------------------------------------*/
Static Function ViewDef()
Local aStruTMP := (cAliasTmp)->(DbStruct())
Local oModel := FWLoadModel("zTmpCad")
Local oStTMP := FWFormViewStruct():New()
Local oView := Nil
//Adicionando campos da estrutura
oStTmp:AddField(;
"TMP_COD",; // [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
Iif(INCLUI, .T., .F.),; // [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
oStTmp:AddField(;
"TMP_DES",; // [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
oStTmp:AddField(;
"TMP_VAL",; // [01] C Nome do Campo
"03",; // [02] C Ordem
"Valor",; // [03] C Titulo do campo
"Valor",; // [04] C Descricao do campo
Nil,; // [05] A Array com Help
"N",; // [06] C Tipo do campo
"@E 9,999,999.99",; // [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
oStTmp:AddField(;
"TMP_DAT",; // [01] C Nome do Campo
"04",; // [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
"@D",; // [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
//Criando a view que será o retorno da função e setando o modelo da rotina
oView := FWFormView():New()
oView:SetModel(oModel)
//Atribuindo formulários para interface
oView:AddField("VIEW_TMP", oStTMP, "FORMTMP")
//Criando um container com nome tela com 100%
oView:CreateHorizontalBox("TELA",100)
//Colocando título do formulário
oView:EnableTitleView('VIEW_TMP', 'Dados - '+cTitulo )
//Força o fechamento da janela na confirmação
oView:SetCloseOnOk({||.T.})
//O formulário da interface será colocado dentro do container
oView:SetOwnerView("VIEW_TMP","TELA")
Return oView
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Boa Tarde Dan,
Peguei o código que voce disponibilizou para testar aqui e não deu certo, na tela do Browse abre a tela mas somente com o botão Imprimir Browse, olhando o video e o código percebi que na view esta com a 2 linha diferente do código disponibilizado, eu alterei mas também não deu certo.
Porque eu queria usar este seu exemplo: Tenho uma tabela de cadastro mas fora dos padrões do Protheus mas em Sql e se este codigo desse certo ia tentar mudar a tabela para ver se funciona.
Bom dia Wanderson, tudo joia?
No caso, da parte dos botões não aparecerem, dê uma olhada nesse artigo: https://terminaldeinformacao.com/2021/01/06/o-que-pode-ser-quando-botoes-nao-funcionam-em-mvc/
Já do fonte, esse é um exemplo um pouco antigo que deve funcionar ainda, mas se puder, utilize FWTemporaryTable para criar a tabela temporária no sistema.
Grande abraço.