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ão | P10 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
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
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cID | Caracteres | Identificador do modelo | X | ||
bPre | Bloco de Código | Bloco 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 | |
bPost | Bloco de Código | Bloco 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 | ||
bCommit | Bloco de Código | Bloco 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 | |
bCancel | Bloco de Código | Bloco 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.
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
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
lCopy | Lógico | Informa 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.
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.
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
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cId | Caracteres | Identificador do modelo. O Id será solicitado em diversas operações 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 FWFormModelStruct. | X | ||
bPre | Bloco de Código | Bloco 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 | |
bPost | Bloco de Código | Bloco 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 | |
bLoad | Bloco de Código | Bloco 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.
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
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cId | Caracteres | Identificador do modelo. O Id será solicitado em diversas operações 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 FWFormModelStruct. | X | ||
bLinePre | Bloco de Código | Bloco 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 | |
bLinePost | Bloco de Código | Bloco 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 | |
bPre | Bloco de Código | Bloco 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 | |
bLinePost | Bloco de Código | Bloco 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 | ||
bLoad | Bloco de Código | Bloco 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
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Identificador 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.
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.
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
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
bBloco | Bloco de Código | Code-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
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
bBloco | Bloco de Código | Code-Block a ser chamado | X | ||
lAcumula | Lógico | Se verdadeiro não substitui o bloco de post anterior, e sim adiciona a validação no final | .F. | ||
lFreeBlock | Lógico | Se verdadeiro, o bloco passado no primeiro parâmetro será executado | .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
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
bBloco | Bloco de Código | Code-Block a ser chamado | X | ||
lAcumula | Lógico | Se verdadeiro não substitui o bloco anterior, e sim adiciona a validação no final | .F. | ||
lFreeBlock | Lógico | Se verdadeiro, o bloco passado no primeiro parâmetro será executado | .F. |
Visão Geral
Import HTML Content
Conteúdo das Ferramentas
Tarefas
2 Comentários
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?
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!