Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Tempo aproximado para leitura: 02 min

Descrição:

Fornece um objeto com o modelo hierárquico dos campos de edição para o Microsiga Protheus.
Esta classe é uma herança da classe modelo FWFormModel, utilizada apenas para facilitar o desenvolvimento do padrão MVC no Protheus.
Ela realiza alguns tratamentos que facilitam o desenvolvimento:
- Tratamento da função Help: Não é necessário usar o método SetErrorMessage para informar erros durante alguma validação, basta usar a função Help e a classe irá manipulá-la para setar os erros no Model.
- Criação de variáveis de memória.
- Função de gravação dos dados no dicionário de dados, ou seja, só é necessário criar a gravação dos dados manualmente em casos mais complexos.



Métodos:


New

Sintaxe:
MPFORMMODEL():New(< cID >, < bPre >, < bPost >, < bCommit >, < bCancel >)-> NIL

Descrição:
Método construtor da classe.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatório
cIDCaracteresIdentificador do modelo
X
bPreBloco de CódigoBloco de código de pré-validação do modelo.
O bloco recebe como parâmetro o objeto de Model e deve retornar um valor lógico.
Quando houver uma tentativa de atualização de valor de qualquer Submodelo o bloco de código será invocado.
Se o retorno for verdadeiro, a alteração será permitida, se retornar falso não será possível concluir a alteração e um erro será atribuído ao model, sendo necessário indicar a natureza do erro através da função Help.
{|| .T.}X
bPostBloco de CódigoBloco de código de pós-validação do modelo, equivale ao "TUDOOK".
O bloco recebe como parâmetro o objeto de Model e deve retornar um valor lógico.
O bloco será invocado antes da persistência dos dados para validar o model.
Se o retorno for verdadeiro e não houver nenhum submodelo inválido, será feita a gravação dos dados.
Se retornar falso, não será possível realizar a gravação e um erro será atribuído ao model, sendo necessário indicar a natureza do erro através da função Help.

X
bCommitBloco de CódigoBloco de código de persistência dos dados. Ele é invocado pelo método CommitData.
O bloco recebe como parâmetro o objeto do Model e deve realizar a gravação dos dados.
{|| FWFORMCOMMIT(SELF)}X
bCancelBloco de CódigoBloco de código de cancelamento da edição. Ele é invocado pelo método CancelData.
O bloco recebe como parâmetro o objeto do Model.
Quando esse bloco é passado, o tratamento de numeração automática não é mais realizado, a menos que o bloco chame a função FWFormCancel.
{|| FWFORMCANCEL(SELF)}X


Exemplo:
Static Function ModelDef()
Local oModel := MPFormModel():New('COMP011MODEL', , { |oMdl| COMP011POS( oMdl ) })
Return

Static Function COMP011POS( oModel )
Local nOperation := oModel:GetOperation()
Local lRet := .T.

If nOperation == MODEL_OPERATION_UPDATE
   If Empty( oModel:GetValue( 'ZA0MASTER', 'ZA0_DTAFAL' ) )
      Help( ,, 'HELP',, 'Informe a data', 1, 0)      
      lRet := .F.
   EndIf
EndIf

Return lRet

Observações:
Se a aplicação é uma Function, o identificador (cID) do modelo de dados (Model) pode ter o mesmo nome da função principal e esta prática é recomendada para facilitar a codificação. Por exemplo, se estamos escrevendo a função XPTO, o identificador (cID) do modelo de dados (Model) poderá ser XPTO.
Se a aplicação é uma User Function, o identificador (ID) do modelo de dados (Model) NÃO pode ter o mesmo nome da função principal. Isso ocorre por causa dos pontos de entrada que já são criados automaticamente quando desenvolvemos uma aplicação em MVC.

User Function COMP011_MVC
Local oModel := MPFormModel():New("COMP011")
Return

Function COMP012_MVC
Local oModel := MPFormModel():New("COMP012_MVC")
Return




Activate
Sintaxe:
MPFORMMODEL():Activate(< lCopy >)-> NIL

Descrição:
Método de ativação da classe. Esse método deve ser usado depois que o objeto já foi completamente definido, pois após a ativação não será mais possível realizar definições, tais como addField, addGrid, setActivate e etc..
Quando a classe é ativada, os dados do submodelo são carregados.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatório
lCopyLógicoInforma se o model deve carregar os dados do registro posicionado em operações de inclusão.
Essa opção é usada quando é necessário fazer uma operação de cópia.

X


Observações:
Este método realiza algumas validações no preenchimento dos parâmetros de operação da classe, gerando uma exceção caso haja algum problema de configuração.




AddFields

Sintaxe:
MPFORMMODEL():AddFields(< cId >, < cOwner >, < oModelStruct >, < bPre >, < bPost >, < bLoad >)-> NIL

Descrição:
Adiciona ao modelo um submodelo de edição por campo (FormField).
Um submodelo do tipo Field permite manipular somente um registro por vez. Ele tem um relacionamento do tipo 1xN ou 1x1 com outros SubModelos ou então não tem nenhum relacionamento.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatório
cIdCaracteresIdentificador do modelo. O Id será solicitado em diversas operações com este submodelo.
X
cOwnerCaracteresIdentificador superior do submodelo, o Owner é o submodelo que se relaciona diretamente com o formfield.
X
oModelStructObjetoObjeto com a estrutura de dados do tipo FWFormModelStruct.
X
bPreBloco de CódigoBloco de Código de pré-validação do submodelo.
Esse bloco é invocado quando há uma tentativa de atribuição de valores. O bloco recebe por parâmetro o objeto do FormField(FWFormFieldsModel), a identificação da ação e a identificação do campo que está sofrendo a atribuição. As identificações que podem ser passadas são as seguintes:
- CANSETVALUE: valida se o submodelo pode ou não receber atribuição de valor.
- SETVALUE: valida se o campo do submodelo pode receber aquele valor. Nesse caso, o bloco recebe um quarto parâmetro que contém o valor que está sendo atribuído ao campo.
Para todos os casos, o bloco deve retornar um valor lógico, indicando se a ação pode ou não ser executada.
Se o retorno for falso, um erro será atribuído ao Model, sendo necessário indicar a natureza do erro através da função Help.
{|| .T.}X
bPostBloco de CódigoBloco de Código de pós-validação do submodelo. É equivalente ao "TUDOOK".
O bloco de código recebe como parâmetro o objeto de model do FormField(FWFormFieldsModel) e deve retornar um valor lógico.
Este bloco é invocado antes da persistência (gravação) dos dados, validando o submodelo.
Se o retorno for verdadeiro, a gravação será realizada se os demais submodelos também estiverem válidos, do contrário um erro será atribuído ao Model, sendo necessário indicar a natureza do erro através da função Help.
{|| .T.}X
bLoadBloco de CódigoBloco de carga dos dados do submodelo.
Este bloco será invocado durante a execução do método activate desta classe.
O bloco recebe por parâmetro o objeto de model do FormField(FWFormFieldsModel) e um valor lógico indicando se é uma operação de cópia.
Espera-se como retorno um array com os dados que serão carregados no objeto, o array deve ter a estrutura abaixo:
[1] Array com os dados. A ordem dos dados deve seguir exatamente a mesma ordem dos campos da estrutura de dados
[1][1] ExpX: "Nome"
[1][2] ExpX: "Cidade"
[2] ExpN: Id do registro (RecNo)
{|X,Y| FORMLOADFIELD(X,Y)}X


Exemplo:

Static Function ModelDef()
Local oModel
Local oStruZA1:= FWFormStruct(1,'ZA1')
Local bPre := {|oFieldModel, cAction, cIDField, xValue| validPre(oFieldModel, cAction, cIDField, xValue)}
Local bPos := {|oFieldModel|fieldValidPos(oFieldModel)}
Local bLoad := {|oFieldModel, lCopy| loadField(oFieldModel, lCopy)}


oModel := MPFormModel():New('COMP021')
oModel:addFields('ZA1MASTER',,oStruZA1,bPre,bPos,bLoad)

Return oModel

Static Function fieldValidPos(oFieldModel)
Local lRet := .T.
   
   If "MUSICA" $ Upper(oFieldModel:GetValue("ZA1_TITULO"))
      lRet := .F.      
      Help( ,, 'HELP',, 'O texto "musica" não pode estar contido no título.', 1, 0)      
   EndIf
   
Return lRet

Static Function validPre(oFieldModel, cAction, cIDField, xValue)
Local lRet := .T.

If cAction == "SETVALUE" .And. cIDField == "ZA1_FILIAL"
   lRet := .F.   
   Help( ,, 'HELP',, 'Não possível atribuir valor ao campo Filial.', 1, 0)   
Return

Return lRet

Static Function loadField(oFieldModel, lCopy)
Local aLoad := {}

   aAdd(aLoad, {xFilial("ZA1"), "000001", "Musica 1", Date(), "R"}) //dados
   aAdd(aLoad, 1) //recno
      
Return aLoad

Observações
O primeiro SubModelo do Model deve ser, obrigatoriamente, um FormField.

Veja também
FWFormModelStruct
FWFormStruct
FWFormFieldModel




AddGrid

Sintaxe:
MPFORMMODEL():AddGrid(< cId >, < cOwner >, < oModelStruct >, < bLinePre >, < bLinePost >, < bPre >, < bPost >, < bLoad >)-> NIL

Descrição:
Adiciona ao modelo um submodelo de edição por grid (FormGrid). 
Um submodelo do tipo Grid permite manipular diversos registros por vez. Ele tem um relacionamento do tipo Nx1 ou NxM com outros Submodelos.

Parâmetros:

NomeTipoDescriçãoDefaultObrigatório
cIdCaracteresIdentificador do modelo.
O Id será solicitado em diversas operações com este submodelo.

X
cOwnerCaracteresIdentificador superior do submodelo.
O Owner é o submodelo que se relaciona diretamente com o formgrid.

X
oModelStructObjetoObjeto com a estrutura de dados do tipo FWFormModelStruct.
X
bLinePreBloco de CódigoBloco de Código de pré-edição da linha do grid.
O bloco é invocado na deleção de linha, no undelete da linha e nas tentativas de atribuição de valor.
Recebe como parâmetro o objeto de modelo do FormGrid(FWFormGridModel), o número da linha atual e a identificação da ação.
A Identificação da ação pode ser um dos itens abaixo:
- UNDELETE
- DELETE
- SETVALUE: nesse caso, serão passados mais três parâmetros. O 4º parâmetro é o identificador do campo que está sendo atualizado, o 5º parâmetro é o valor que está sendo atribuído e o 6º parâmetro é o valor que está no campo.
- CANSETVALUE: nesse caso será passado mais um parâmetro. O 4º parâmetro é o identificador do campo que está tentando ser atualizado.
O retorno do bloco deve ser um valor lógico que indique se a linha está valida para continuar com a ação.
Se retornar verdadeiro, executa a ação, se retornar falso, atribui um erro ao Model, sendo necessário indicar a natureza do erro através da função Help.
{|| .T.}X
bLinePostBloco de CódigoBloco de código de pós-validação da linha do grid, equivale ao "LINHAOK".
Recebe como parâmetro o objeto de modelo do FormGrid(FWFormGridModel) e o número da linha que está sendo validada.
O bloco será invocado antes da gravação dos dados. Espera-se um retorno lógico do bloco, indicando se a linha está ou não válida.
Se o retorno for verdadeiro, a gravação será realizada, se for falso, um erro será atribuído ao Model e a gravação não será realizada, sendo necessário indicar a natureza do erro através da função Help.
{|| .T.}X
bPreBloco de CódigoBloco de Código de pré-validação do submodelo.
O bloco é invocado na deleção de linha, no undelete da linha, na inserção de uma linha e nas tentativas de atribuição de valor.
Recebe como parâmetro o objeto de modelo do FormGrid(FWFormGridModel), o número da linha atual e a identificação da ação.
A Identificação da ação pode ser um dos itens abaixo:
- UNDELETE
- DELETE
- ADDLINE: nesse caso, nada será passado para o parâmetro de número de linha.
- SETVALUE: nesse caso, serão passados mais três parâmetros. O 4º parâmetro é o identificador do campo que está sendo atualizado, o 5º parâmetro é o valor que está sendo atribuído e o 6º parâmetro é o valor que está no campo.
- CANSETVALUE: nesse caso, será passado mais um parâmetro. O 4º parâmetro é o identificador do campo que está tentando ser atualizado.
O retorno do bloco deve ser um valor lógico que indique se a linha está válida para continuar com a ação.
Se retornar verdadeiro, a atualização é permitida, se retornar falso, um erro será atribuído ao Model, sendo necessário indicar a natureza do erro através da função Help.
{|| .T.}X
bPostBloco de CódigoCódigo de pós-validação do submodelo, ele é equivalente ao "TUDOOK".
O bloco de código recebe como parâmetro o objeto de model do Grid (FWFormGridModel) e deve retornar um valor lógico.
Este bloco é invocado antes da persistência (gravação) dos dados, validando o submodelo .
Se o retorno for verdadeiro a gravação será realizada se os demais submodelos também estiverem válidos, do contrário um erro será atribuído no modelo, sendo necessário indicar a natureza do erro através da função Help.

X
bLoadBloco de CódigoBloco de carga dos dados do submodelo.
Este bloco será invocado durante a execução do método activate desta classe.
O bloco recebe por parâmetro o objeto de model do FormGrid(FWFormGridModel) e um valor lógico indicando se é uma operação de cópia.
Espera-se como retorno um array com os dados que serão carregados no objeto. O array deve ter a estrutura abaixo:
[n]
[n][1] ExpN: Id do registro (RecNo)
[n][2] Array com os dados, os dados devem seguir exatamente a mesma ordem da estrutura de dados
{|X,Y| FORMLOADGRID(X,Y)}X

 

Exemplo:
Static Function ModelDef()
Local oModel
Local oStruZA1:= FWFormStruct(1,'ZA1')
Local oStruZA2 := FWFormStruct( 1, 'ZA2')
Local bLinePre := {|oGridModel, nLine, cAction, cIDField, xValue, xCurrentValue| linePreGrid(oGridModel, nLine, cAction, cIDField, xValue, xCurrentValue)}
Local bLoad := {|oGridModel, lCopy| loadGrid(oGridModel, lCopy)}

oModel := MPFormModel():New('COMP021')
oModel:AddFields('ZA1MASTER',,oStruZA1)
oModel:AddGrid( 'ZA2DETAIL', 'ZA1MASTER', oStruZA2, bLinePre, , , ,bLoad)
Return oModel

Static Function loadGrid(oGridModel, lCopy)
Local aLoad := {}

   aAdd(aLoad,{0,{xFilial("ZA2"), "000001", "01", "000100","AUTOR1","AUTOR"}})
   aAdd(aLoad,{0,{xFilial("ZA2"), "000001", "02", "000102","AUTOR2","AUTOR"}})
   aAdd(aLoad,{0,{xFilial("ZA2"), "000001", "03", "000104","AUTOR3","AUTOR"}})
   aAdd(aLoad,{0,{xFilial("ZA2"), "000001", "04", "000105","AUTOR4","AUTOR"}})
   aAdd(aLoad,{0,{xFilial("ZA2"), "000001", "05", "000106","AUTOR5","AUTOR"}})

Return aLoad

Static Function linePreGrid(oGridModel, nLine, cAction, cIDField, xValue, xCurrentValue)
Local lRet := .T.   

   If cAction == "SETVALUE"
      If oGridModel:GetValue("ZA2_TIPO") == "AUTOR"
         lRet := .F.         
         Help( ,, 'HELP',, 'Não é possível alterar linhas do tipo Autor', 1, 0)
      EndIf
   EndIf
   
Return lRet


Observações:
O Model deve sempre iniciar com um submodelo do tipo Field

Veja também:
FWFormGridModel
FWFormModelStruct




GetWhenFields

Sintaxe:
MPFORMMODEL():GetWhenFields(< cIdForm >)-> aRet

Descrição:
Retorna array com os campos que precisam ser avaliados no When

Parâmetros:


NomeTipoDescriçãoDefaultObrigatórioReferência

cIdFormCaracteresIdentificador do modelo
X

 

Retorno:
aRet Array unidimensional com os campos que precisam ser avaliados no When




DeActivate
Sintaxe:
MPFORMMODEL():DeActivate()-> NIL

Descrição:
Método de desativação da classe. Quando a classe é desativada, os dados do submodelo são perdidos e o objeto passa a aceitar novamente os métodos de parametrização, tais como addField, setActivate e etc.

Este método deve ser utilizado para reparametrizar a classe ou para reinicializar o preenchimento do submodelo.




SetVldActivate
Sintaxe:
MPFORMMODEL():SetVldActivate(< bBloco >)-> NIL

Descrição:
Seta um bloco que será chamado antes do Activate do model. Ele pode ser utilizado para inibir a inicialização do model. Se o retorno for negativo, uma exceção de usuário será gerada. O code-block recebe como parâmetro o objeto model.

Parâmetros:


NomeTipoDescriçãoDefaultObrigatórioReferência

bBlocoBloco de CódigoCode-Block a ser chamado
X


Exemplo:

   bBloco := {|oModel| MinhaFunc(oModel)}
   oModel:SetVldActivate(bBloco)

Veja também:
CanActivate




SetPost

Sintaxe:
MPFORMMODEL():SetPost(< bBloco >, [ lAcumula ])-> NIL

Descrição:
Seta um bloco que será chamado para de validação do submodelo.

Parâmetros:


NomeTipoDescriçãoDefaultObrigatórioReferência

bBlocoBloco de CódigoCode-Block a ser chamado
X

lAcumulaLógicoSe verdadeiro, não substitui o bloco de post anterior, e sim
adiciona a validação no final.
.F.




 
SetPre
Sintaxe:
MPFORMMODEL():SetPre(< bBloco >, [ lAcumula ])-> NIL


Descrição:
Seta um bloco que será chamado para a pré-validação do submodelo.

Parâmetros:


NomeTipoDescriçãoDefaultObrigatórioReferência

bBlocoBloco de CódigoCode-Block a ser chamado.
X

lAcumulaLógicoSe verdadeiro, não substitui o bloco anterior, e sim
adiciona a validação no final.
.F.



Templatedocumentos


HTML
<style>
div.theme-default .ia-splitter #main {
    margin-left: 0px;
}
.ia-fixed-sidebar, .ia-splitter-left {
    display: none;
}
#main {
    padding-left: 10px;
    padding-right: 10px;
    overflow-x: hidden;
}

.aui-header-primary .aui-nav,  .aui-page-panel {
    margin-left: 0px !important;
}
.aui-header-primary .aui-nav {
    margin-left: 0px !important;
}
</style>