Você está na página 1de 15

MPFormModel

Classe: MPFormModel
Compatvel Pases: Todos
Sistemas Operacionais: Todos
Compatvel s Bases de Dados: Todos
Nvel de Acesso: Nvel 1 (Acesso Clientes)
Idiomas: Portugus, Ingls, Espanhol
Verso P10 R1.4
Descrio
Fornece um objeto com o modelo hierrquico dos campos de edio para o Microsiga Protheus.
Esta classe uma herana da classe modelo FWFormModel, utilizada apenas para facilitar o desenvolvimento
do padro MVC no Protheus.
Essa classe realiza alguns tratamentos que facilitam o desenvolvimento:
- Tratamento da funo Help : No se faz necessrio usar o mtodo SetErrorMessage para informar erros
durante alguma validao, basta usar a funo Help e a classe ir manipul-la para setar os erros no Model
- Criao de variaveis de memria
- Funo de gravao dos dados no dicionrio de dados, ou seja, s necessrio criar a gravao dos dados
manualmente em casos mais complexos
Veja tambm
FWFormCanDel
FWFormCommit
FWFormCancel
FormLoadField
FormLoadGrid
New
Sintaxe
MPFORMMODEL():New(<cID >, <bPre >, <bPost >, <bCommit >, <bCancel >)-> NIL
Descrio
Mtodo construtor da classe
Parmetros
Nome Tipo Descrio Default Obrigatrio Referncia
cID Caracteres Identificador do
modelo
X
bPre Bloco de Cdigo Bloco de cdigo de
pr-validao do
modelo.
O bloco recebe
como parametro o
objeto de Model e
deve retornar um
valor lgico.
Quando houver uma
tentativa de
atualizao de valor
de qualquer
Submodelo o bloco
de cdigo ser
invocado.
Caso o retorno seja
verdadeiro, a
alterao ser
permitida, se
retornar falso no
ser possvel
concluir a alterao
e um erro ser
atribuido ao model,
sendo necessrio
indicar a natureza
do erro atravs da
funo Help.
{|| .T.} X
bPost Bloco de Cdigo Bloco de cdigo de
ps-validao do
modelo, equilave ao
"TUDOOK".
O bloco recebe
como parametro o
objeto de Model e
deve retornar um
valor lgico.
O bloco ser
invocado antes da
persistncia dos
dados para validar o
model.
Caso o retorno seja
verdadeiro e no
haja nenhum
submodelo invalido,
ser feita a
gravao dos
dados.
Se retornar falso
no ser possvel
realizar a gravao
e um erro ser
atribuido ao model,
sendo necessrio
indicar a natureza
do erro atravs da
funo Help.
X
bCommit Bloco de Cdigo Bloco de cdigo de
persistncia dos
dados, ele
invocado pelo
mtodo
CommitData.
O bloco recebe
como parametro o
objeto do Model e
deve realizar a
gravao dos
dados.
{||
FWFORMCOMMIT(
SELF)}
X
bCancel Bloco de Cdigo Bloco de cdigo de
cancelamento da
edio, ele
invocado pelo
mtodo CancelData.
O bloco recebe
como parametro o
objeto do Model.
Quando esse bloco
passado o
tratamento de
numerao
automatica no
mais realizado, a
menos que o bloco
chame a funo
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
Observaes
Se a aplicao uma Function, o identificador (cID) do modelo de dados (Model) pode
ter o mesmo nome da funo principal e esta prtica recomendada para facilitar a
codificao. Por exemplo, se estamos escrevendo a funo XPTO, o identificador (cID) do
modelo de dados (Model) poder ser XPTO.
Se a aplicao uma User Function o identificador (ID) do modelo de dados (Model)
NO pode ter o mesmo nome da funo principal, isso por causa dos pontos de entrada
que j so criados automaticamente quando desenvolvemos uma aplicao 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
Descrio
Mtodo de ativao da classe. Esse mtodo deve ser usado depois
que o objeto j foi completamente definido, pois aps a ativao
no ser mais possvel realizar definies, tais como addField,
addGrid, setActivate e etc..
Quando a classe ativada, os dados do submodelo so carregados.
Parmetros
Nome Tipo Descrio Default Obrigatrio Referncia
lCopy Lgico Informa se o model
deve carregar os
dados do registro
posicionado em
operaes de
incluso.
Essa opo usada
quando
necessrio fazer
uma operao de
cpia.
X

Observaes
Este mtodo realiza algumas validaes no preenchimento dos
parametros de operao da classe, gerando uma exceo caso haja
algum problema de configurao.
AddFields
Sintaxe
MPFORMMODEL():AddFields(<cId >, <cOwner >, <oModelStruct >, <bPre >, <bPost >, <bLoad >)-> NIL
Descrio
Adiciona ao modelo um submodelo de edio 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 ento no tem nenhum relacionamento.
Parmetros
Nome Tipo Descrio Default Obrigatrio Referncia
cId Caracteres Identificador do
modelo. O Id ser
solicitado em
diversas operaes
com este
submodelo.
X
cOwner Caracteres Identificador
superior do
submodelo, o
Owner o
submodelo que se
relaciona
diretamente com o
formfield.
X
oModelStruct Objeto Objeto com a
estrutura de dados
do tipo
FWFormModelStruc
t.
X
bPre Bloco de Cdigo Bloco de Cdigo de
pr-validao do
submodelo.
Esse bloco
invocado quando h
uma tentativa de
atribuio de
valores. O bloco
recebe por
parametro o objeto
do
FormField(FWForm
FieldsModel), a
identificao da
ao e a
identificao
do campo que est
sofrendo a
atribuio. As
identificaes que
podem ser
passadas so as
seguintes:
- "CANSETVALUE"
: valida se o
submodelo pode ou
no receber
atribuio 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
lgico, indicando se
a ao pode ou no
ser executada.
Se o retorno for
falso um erro ser
atribuido no Model,
sendo necessrio
indicar a natureza
do erro atravs da
funo Help.
{|| .T.} X
bPost Bloco de Cdigo Bloco de Cdigo de
ps-validao do
submodelo, ele
equivalente ao
"TUDOOK".
O bloco de cdigo
recebe como
parametro o objeto
de model do
FormField(FWForm
FieldsModel) e deve
retornar um valor
lgico.
Este bloco
invocado antes da
persistncia(grava
o) dos dados,
validando o
submodelo .
Se o retorno for
verdadeiro a
gravao ser
realizada se os
demais submodelos
tambm estiverem
validos, do contrrio
um erro ser
atribuido no Model,
sendo necessrio
indicar a natureza
do erro atravs da
funo Help.
{|| .T.} X
bLoad Bloco de Cdigo Bloco de carga dos
dados do
submodelo.
Este bloco ser
invocado durante a
execuo do
mtodo activate
desta classe.
O bloco recebe por
parametro o objeto
de model do
FormField(FWForm
FieldsModel) e um
valor lgico
indicando se uma
operao de cpia.
Espera-se como
retorno um array
com os dados que
sero 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" no pode estar contido no ttulo.', 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',, 'No possvel 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
Observaes
O primeiro SubModelo do Model deve ser, obrigatoriamente, um FormField.
Veja tambm
FWFormModelStruct
FWFormStruct
FWFormFieldModel
AddGrid
Sintaxe
MPFORMMODEL():AddGrid(<cId >, <cOwner >, <oModelStruct >, <bLinePre >, <bLinePost >, <bPre >, <bLinePost >, <bLoad >)-> NIL
Descrio
Adiciona ao modelo um submodelo de edio 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.
Parmetros
Nome Tipo Descrio Default Obrigatrio Referncia
cId Caracteres Identificador do
modelo.
O Id ser solicitado
em diversas
operaes com este
submodelo.
X
cOwner Caracteres Identificador
superior do
submodelo.
O Owner o
submodelo que se
relaciona
diretamente com o
formgrid.
X
oModelStruct Objeto Objeto com a
estrutura de dados
do tipo
FWFormModelStruc
t.
X
bLinePre Bloco de Cdigo Bloco de Cdigo de
pre-edio da linha
do grid.
O bloco invocado
na deleo de linha,
no undelete da linha
e nas tentativas de
atribuio de valor.
Recebe como
parametro o objeto
de modelo do
FormGrid(FWForm
GridModel), o
nmero da linha
atual e a
identificao da
ao.
A Identificao da
ao pode ser um
dos itens abaixo:
- "UNDELETE"
- "DELETE"
- "SETVALUE" :
nesse caso, sero
passados mais trs
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
lgico que indique
se a linha est
valida para
continuar com a
ao.
Se retornar
verdadeiro, executa
a ao do contrrio
atribui um erro ao
Model, sendo
necessrio indicar a
natureza do erro
atravs da funo
Help.
{|| .T.} X
bLinePost Bloco de Cdigo Bloco de cdigo de
ps validao da
linha do grid,
equivale ao
"LINHAOK"
Recebe como
parametro o objeto
de modelo do
FormGrid(FWForm
GridModel) e o
nmero da linha que
est sendo
validada.
O bloco ser
invocado antes da
gravao dos
dados. Espera-se
um retorno lgico do
bloco indicando se a
linha est ou no
valida.
Caso o retorno seja
verdadeiro a
gravao ser
realiza, do contrario
um erro ser
atribuido no Model e
a gravao no ser
realizada, sendo
necessrio indicar a
natureza do erro
atravs da funo
Help.
{|| .T.} X
bPre Bloco de Cdigo Bloco de Cdigo de
pr-validao do
submodelo.
O bloco invocado
na deleo de linha,
no undelete da
linha, na insero
de uma linha e nas
tentativas de
atribuio de valor.
Recebe como
parametro o objeto
de modelo do
FormGrid(FWForm
GridModel), o
nmero da linha
atual e a
identificao da
ao.
A Identificao da
ao pode ser um
dos itens abaixo:
- "UNDELETE"
- "DELETE"
- "ADDLINE" : nesse
caso no ser
passado nada para
o parametro de
numero de linha
- "SETVALUE" :
nesse caso, sero
passados mais trs
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
lgico que indique
se a linha est
valida para
continuar com a
ao.
Se retornar
verdadeiro, a
atualizao
permitida, do
contrrio um erro
ser atribuido no
Model, sendo
necessrio indicar a
natureza do erro
atravs da funo
Help.
{|| .T.} X
bLinePost Bloco de Cdigo Bloco de cdigo de
ps validao da
linha do grid,
equivale ao
"LINHAOK"
Recebe como
parametro o objeto
de modelo do
FormGrid(FWForm
GridModel) e o
nmero da linha que
est sendo
validada.
O bloco ser
invocado antes da
gravao dos dados
e na incluso de
uma linha.
Espera-se um
retorno lgico do
bloco indicando se a
linha est ou no
valida.
Caso o retorno seja
falso um erro ser
atribuido no Model e
a gravao no ser
realizada, sendo
necessrio indicar a
natureza do erro
atravs da funo
Help.
X
bLoad Bloco de Cdigo Bloco de carga dos
dados do
submodelo.
Este bloco ser
invocado durante a
execuo do
mtodo activate
desta classe.
O bloco recebe por
parametro o objeto
de model do
FormGrid(FWForm
GridModel) e um
valor lgico
indicando se uma
operao de cpia.
Espera-se como
retorno um array
com os dados que
sero 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',, 'No possvel alterar linhas do tipo Autor', 1, 0)
EndIf
EndIf

Return lRet
Observaes
O Model deve sempre iniciar com um submodelo do tipo Field
Veja tambm
FWFormGridModel
FWFormModelStruct
GetWhenFields
Sintaxe
MPFORMMODEL():GetWhenFields(<cIdForm >)-> aRet
Descrio
Retorna array com os campos que precisam ser avaliados no When
Parmetros
Nome Tipo Descrio Default Obrigatrio Referncia
cIdForm Caracteres Identificador do
modelo
X

Retorno
aRet Array unidimensional com os campos que precisam ser avaliados no When
DeActivate
Sintaxe
MPFORMMODEL():DeActivate()-> NIL
Descrio
Mtodo de desativao da classe. Quando a classe desativada, os dados
do submodelo so perdidos e o objeto passa a aceitar novamente
os mtodos de parametrizao, tais como addField, setActivate e etc.
Este mtodo deve ser utilizado para reparametrizar a classe ou para
reinicializar o preenchimento do submodelo.
SetVldActivate
Sintaxe
MPFORMMODEL():SetVldActivate(<bBloco >)-> NIL
Descrio
Seta um bloco que ser chamado antes do Activate do model. Ele pode
Ser utilizado para inibir a inicializao do model. Se o retorno for negativo
uma exceo de usurio ser gerada. O code-block recebe como parametro
o objeto model.
Parmetros
Nome Tipo Descrio Default Obrigatrio Referncia
bBloco Bloco de Cdigo Code-Block a ser
chamado
X

Exemplo
bBloco := {|oModel| MinhaFunc(oModel)}
oModel:SetVldActivate(bBloco)
Veja tambm
CanActivate
SetPost
Sintaxe
MPFORMMODEL():SetPost(<bBloco >, [ lAcumula ])-> NIL
Descrio
Seta um bloco que ser chamado para de validao do submodelo
Parmetros
Nome Tipo Descrio Default Obrigatrio Referncia
bBloco Bloco de Cdigo Code-Block a ser
chamado
X
lAcumula Lgico Se verdadeiro no
substitui o bloco de
post anterior, e sim
adiciona a validao
no final
.F.

SetPre
Sintaxe
MPFORMMODEL():SetPre(<bBloco >, [ lAcumula ])-> NIL
Descrio
Seta um bloco que ser chamado para a pr validao do submodelo
Parmetros
Nome Tipo Descrio Default Obrigatrio Referncia
bBloco Bloco de Cdigo Code-Block a ser
chamado
X
lAcumula Lgico Se verdadeiro no
substitui o bloco
anterior, e sim
adiciona a validao
no final
.F.