Classe: MPFormModel


Compatível Países:Todos
Sistemas Operacionais:Todos
Compatível às Bases de Dados:Todos
Nível de Acesso:Nível 1 (Acesso Clientes)
Idiomas:Português, Inglês, Espanhol
VersãoP10 R1.4


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.

Essa classe realiza alguns tratamentos que facilitam o desenvolvimento:
- Tratamento da função Help : Não se faz 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 variaveis 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


Veja também

FWFormCanDel
FWFormCommit
FWFormCancel
FormLoadField
FormLoadGrid

New

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

Descrição
Método construtor da classe


Parâmetros


NomeTipoDescriçãoDefaultObrigatórioReferência
cIDCaracteresIdentificador do modelo
X
bPreBloco de CódigoBloco de código de pré-validação do modelo.
O bloco recebe como parametro 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.
Caso o retorno seja verdadeiro, a alteração será permitida, se retornar falso não será possível concluir a alteração e um erro será atribuido 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, equilave ao "TUDOOK".
O bloco recebe como parametro 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.
Caso o retorno seja verdadeiro e não haja nenhum submodelo invalido, será feita a gravação dos dados.
Se retornar falso não será possível realizar a gravação e um erro será atribuido 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 parametro 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 parametro o objeto do Model.
Quando esse bloco é passado o tratamento de numeração automatica 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 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órioReferência
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
parametros 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órioReferência
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
parametro 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 parametro que contem o valor que está sendo atribuido 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á atribuido no 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, ele é equivalente ao "TUDOOK".
O bloco de código recebe como parametro 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 validos, do contrário um erro será atribuido no 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 parametro 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 objetp, 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 >, <bLinePost >, <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órioReferência
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 pre-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 parametro 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 parametros. O 4º parametro é o identificador do campo que está sendo atualizado,
o 5º parametro é o valor que está sendo atribuido e o 6º parametro é o valor que está atualmente no campo.
- "CANSETVALUE" : nesse caso será passado mais um parametro. O 4º parametro é 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 do contrário 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 parametro 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 valida.
Caso o retorno seja verdadeiro a gravação será realiza, do contrario um erro será atribuido no 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 parametro 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 não será passado nada para o parametro de numero de linha
- "SETVALUE" : nesse caso, serão passados mais três parametros. O 4º parametro é o identificador do campo que está sendo atualizado,
o 5º parametro é o valor que está sendo atribuido e o 6º parametro é o valor que está atualmente no campo.
- "CANSETVALUE" : nesse caso será passado mais um parametro. O 4º parametro é 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, a atualização é permitida, do contrário um erro será atribuido no 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 parametro 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 e na inclusão de uma linha.
Espera-se um retorno lógico do bloco indicando se a linha está ou não valida.
Caso o retorno seja falso um erro será atribuido no Model e a gravação não será realizada, 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 parametro 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 parametro
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 ], [lFreeBlock])-> 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.

lFreeBlockLógico

Se verdadeiro, o bloco passado no primeiro parâmetro será executado
diretamente, sem nenhuma tratativa interna do MVC

.F.


 
SetPre

Sintaxe
MPFORMMODEL():SetPre(<bBloco >, [ lAcumula ], [lFreeBlock])-> 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.

lFreeBlockLógico

Se verdadeiro, o bloco passado no primeiro parâmetro será executado
diretamente, sem nenhuma tratativa interna do MVC

.F.



 
  • Sem rótulos

2 Comentários

  1. Usuário desconhecido (everson.almeida)

    Boa tarde,

    No parametro bLoad do método ADDGRID() consta o seguinte:

    n][1] ExpN: Id do registro (RecNo)

    Qual seria a finalidade desse parametro na estrutura do array que é devolvido após a montagem do mesmo?

  2. Usuário desconhecido (everson.almeida)

    Bom dia,

    Descobri que o parametro que mencionei acima realiza o link com o registro do banco e assim quando houver cópia, ele não fará uma cópia e sim atualizará o registro como se fosse uma alteração.

    Por favor, documentar esse cenário para que fique claro a finalidade do atributo dentro do array daquele parametro.

    Obrigado!