Versões comparadas
Chave
- Esta linha foi adicionada.
- Esta linha foi removida.
- A formatação mudou.
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:
Nome | Tipo | Descrição | Default | Obrigatório |
---|---|---|---|---|
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 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 |
bPost | Bloco de Código | Bloco 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 | |
bCommit | Bloco de Código | Bloco 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 |
bCancel | Bloco de Código | Bloco 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:
Nome | Tipo | Descrição | Default | Obrigatório |
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 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:
Nome | Tipo | Descrição | Default | Obrigatório |
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 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 |
bPost | Bloco de Código | Bloco 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 |
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 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:
Nome | Tipo | Descrição | Default | Obrigatório |
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 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 |
bLinePost | Bloco de Código | Bloco 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 |
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 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 |
bPost | Bloco de Código | Có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 | |
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 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:
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.
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:
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 ])-> 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. |
SetPre
Sintaxe:
MPFORMMODEL():SetPre(< bBloco >, [ lAcumula ])-> 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. |
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> |