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 | Todas |
Esta classe permite o encapsulamento das regras de negócio baseadas em Submodelos,
Estrutura de Dados e validações em código. Por conta disto cria um ambiente
padronizado, extensível a diversas midias e propício a reutilização de código.
O Model é composto basicamente por Submodelos. Um SubModelo representa uma entidade
e permite manipular registros. Existem basicamente dois tipos de Submodelo, o
formfield e o formgrid. O primeiro permite manipular somente um registro por vez
e o segundo permite manipular vários registros ao mesmo tempo.
A regra de negócio pode definir os seguintes itens:
- Submodelos de edição, tais como FormField(edição de apenas uma linha) e
FormGrid(edição de várias linhas)
- Regras de Dependência entre os Submodelos
- Validação de Campos
- Validação de Submodelo
- Validação Geral
- Persistência(gravação) dos dados
- Estrutura de Dados para os submodelos
O Model é totalmente segregado, ele pode ser usado em uma interface ou pode
ser usado em WebServices, Rotinas Automáticas ou outras opções sem interação
visual com o usuário.
Como o Model é separado da interface, não é permitido usar nenhum componente
de interface no código, tais como Alert, MsgAlert e etc.. A única exceção à regra
é a função Help. O MVC trata essa função e quando a mesma é usada no Model
e não há interface, a mensagem de erro fica guardada no model e pode ser acessada
usando o método GetErrorMessage()
Submodelos:
FWFormGridModel
FWFormFieldsModel
Estrutura de Dados:
FWFormModelStruct
FWFormStruct
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 do método SetErrorMessage. | {|| .T.} | ||
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 do método SetErrorMessage. | {|| .T.} | ||
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. | 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. | X |
Static Function ModelDef()
Local oModel := FWFormModel():New('COMP011MODEL', , { |oMdl| COMP011POS( oMdl ) }, {|oModel| commit()},{|oModel| cancel()})
Return
Static Function COMP011POS( oModel )
Local nOperation := oModel:GetOperation()
Local lRet := .T.
If nOperation == MODEL_OPERATION_UPDATE
If Empty( oModel:GetValue( 'ZA0MASTER', 'ZA0_DTAFAL' ) )
oModel:SetErrorMessage('ZA0MASTER', 'ZA0_DTAFAL' , 'ZA0MASTER' , 'ZA0_DTAFAL' , "Erro", 'Data incorreta', 'Informe a data')
lRet := .F.
EndIf
EndIf
Return lRet
Static Function commit()
Return
Static Function cancel()
Return
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 := FWFormModel():New("COMP011",,,{|oModel| commit()},{|oModel| cancel()})
Return
Function COMP012_MVC
Local oModel := FWFormModel():New("COMP012_MVC",,,{|oModel| commit()},{|oModel| cancel()})
Return
Método setErrorMessage
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.
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. | .F. |
parametros de operação da classe, gerando uma exceção caso haja
algum problema de configuração.
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.
O Objeto não pode ter sido desativado.
Importante chamar principalmente quando instanciamos o mesmo em loop.
O objetivo é mostrado em diversos operações, tais como web services,
relatórios e schemas (xsd).
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cDescription | Caracteres | Descrição do objetivo do modelo | X |
no método SetDescription.
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.
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. | "" | ||
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 do método SetErrorMessage. | {|| .T.} | ||
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 do método SetErrorMessage. | {|| .T.} | ||
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] "Nome" [1][2] "Cidade" [2] ExpN: Id do registro (RecNo) |
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 := FWFormModel():New('COMP021',,,{|oModel| commit()},{|oModel| cancel()})
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.
oFieldModel:GetModel():SetErrorMessage('ZA1MASTER', "ZA1_TITULO" , 'ZA1MASTER' , 'ZA1_TITULO' , "Erro", 'Título incorreto', 'O texto "musica" não pode estar contido no título.')
EndIf
Return lRet
Static Function validPre(oFieldModel, cAction, cIDField, xValue)
Local lRet := .T.
If cAction == "SETVALUE" .And. cIDField == "ZA1_FILIAL"
lRet := .F.
oFieldModel:GetModel():SetErrorMessage('ZA1MASTER', "ZA1_FILIAL" , 'ZA1MASTER' , 'ZA1_FILIAL' , "Erro", 'Filial', 'Não possível atribuir valor ao campo Filial.')
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
Static Function commit()
Return
Static Function cancel()
Return
O primeiro SubModelo do Model deve ser, obrigatoriamente, um FormField.
FWFormModelStruct
FWFormStruct
FWFormFieldModel
Método SetErrorMessage
Um submodelo do tipo Grid permite manipular diversos registros por
vez. Ele tem um relacionamento do tipo Nx1 ou NxM com outros Submodelos.
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 do método SetErrorMessage. | {|| .T.} | ||
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 do método SetErrorMessage. | {|| .T.} | ||
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, executa a ação do contrário atribui um erro ao Model, sendo necessário indicar a natureza do erro através do método SetErrorMessage. O bloco de código recebe como parametro o objeto de modelo do FormGrid(FWFormGridModel) e deve retornar um valor lógico. Este bloco é invocado em toda tentativa de atualização dos valores do submodelo. Se o retorno do bloco for verdadeiro a atualização é permitida, do contrário um erro será atribuido no Model, sendo necessário indicar a natureza do erro através do método SetErrorMessage. | {|| .T.} | ||
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 FormGrid(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 do bloco 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 do método SetErrorMessage. | {|| .T.} | ||
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 | {|| {} } |
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 := FWFormModel():New('COMP021',,,{|oModel| commit()},{|oModel| cancel()})
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.
oGridModel:GetModel():SetErrorMessage('ZA2DETAIL', 'ZA2_TIPO' , 'ZA2DETAIL' , 'ZA2_TIPO' , 'Erro', 'Não é possível alterar linhas do tipo Autor', '')
EndIf
EndIf
Return lRet
Static Function commit()
Return
Static Function cancel()
Return
O Model deve sempre iniciar com um submodelo do tipo Field
Método SetErrorMessage
FWFormGridModel
FWFormModelStruct
um submodelo do tipo grid. Esse submodelo deve ser usado para
fazer calculos, por exemplo, pode-se criar um calc para somar a coluna
valor total do item, tendo assim o total de todos os itens.
Pode-se criar um calc do tipo média e fazer a média das quantidades
de um grid, por exemplo.
O submodelo calc suporta diversos campos de calculo, precisando ter
no minimo 1 e no máximo N. Ou seja, pode-se criar um calc "TOTAIS"
e dentro dele criar dois campos calculado, um para o total e outro para
a média.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cId | Caracteres | Identificador do submodelo. O Id será solicitado em diversas operações. | X | ||
cOwner | Caracteres | Identificador owner do submodelo. Esse ID correponde ao owner do grid usado como base para o submodelo calc. | X | ||
cIdForm | Caracteres | Identificador do submodelo do tipo grid que será a base para os calculos. | X | ||
cIdField | Caracteres | Identificador do campo que será a base do calculo. | X | ||
cIdCalc | Caracteres | Identificador para o campo que será calculado. | X | ||
cOperation | Caracteres | Identificador da operação a ser realizada ( SUM, COUNT, AVERAGE, FORMULA ) | "SUM" | ||
bCond | Bloco de Código | Bloco de código referente a condicão para avaliação do campo calculado. Recebe como parametro o objeto do model(FwFormModel) e deve retornar um valor lógico. Se o retorno for verdadeiro, executa a operação para o campo calculado. | |||
bInitValue | Bloco de Código | Bloco de codigo para com o valor inicial para o campo calculado. Recebe como parametro o objeto do modelo e deve retornar o valor inicial. | |||
cTitle | Caracteres | Titulo do campo calculado. | CIDCALC | ||
bFormula | Bloco de Código | Formula a ser utilizada quando o parametro operacao é do tipo FORMULA. Recebe como parametros: - o objeto do model (FwFormModel) - o valor da atual do campo calculado - o conteudo do campo do submodelo Grid - campo logico indicando se é uma execuçao de soma (.T.) ou subtracao (.F.). O valor retornado será atribuido ao campo calculado. Exemplo: {|oModel,nTotalAtual,xValor,lSomando| Calculo(oModel,nTotalAtual,xValor,lSomando)} | X | ||
nTamanho | Numérico | Tamanho do campo calculado, se nao for informado usa o tamanho do campo base. | X | ||
nDecimal | Numérico | Numero de casas decimais do campo calculado, se nao for informado usa o tamanho do decimal do campo base. | X |
Static Function ModelDef()
// Cria a estrutura a ser usada no Modelo de Dados
Local oStruZA1 := FWFormStruct( 1, 'ZA1')
Local oStruZA2 := FWFormStruct( 1, 'ZA2')
Local oModel
oModel := FWFormModel():New( 'COMP022M',,,{|oModel| commit()},{|oModel| cancel()})
oModel:AddFields( 'ZA1MASTER', , oStruZA1)
oModel:AddGrid( 'ZA2DETAIL', 'ZA1MASTER', oStruZA2)
oModel:AddCalc( 'COMP022CALC1', 'ZA1MASTER', 'ZA2DETAIL', 'ZA2_AUTOR', 'ZA2__TOT01', 'COUNT', { | oMld | COMP022CAL( oMld, .T. ) },,'Total Pares' )
oModel:AddCalc( 'COMP022CALC1', 'ZA1MASTER', 'ZA2DETAIL', 'ZA2_AUTOR', 'ZA2__TOT02', 'COUNT', { | oMld | COMP022CAL( oMld, .F. ) },,'Total Impares' )
oModel:SetRelation( 'ZA2DETAIL', { { 'ZA2_FILIAL', 'xFilial( "ZA2" ) ' } , { 'ZA2_MUSICA', 'ZA1_MUSICA' } } , ZA2->( IndexKey( 1 ) ) )
oModel:SetDescription( 'Modelo de Musicas' )
oModel:GetModel( 'ZA1MASTER' ):SetDescription( 'Dados da Musica' )
oModel:GetModel( 'ZA2DETAIL' ):SetDescription( 'Dados do Autor' )
Return oModel
Static Function COMP022CAL( oModel, lPar )
Local lRet := .T.
If lPar
lRet := ( Mod( Val( oModel:GetValue( 'ZA2DETAIL', 'ZA2_AUTOR' ) ) , 2 ) == 0 )
Else
lRet := ( Mod( Val( oModel:GetValue( 'ZA2DETAIL', 'ZA2_AUTOR' ) ) , 2 ) <> 0 )
EndIf
Return lRet
Static Function commit()
Return
Static Function cancel()
Return
Um submodelo de calc somente pode ser criado abaixo de um submodelo do tipo grid
preenchimento de um campo depende do preenchimento de outro.
Por exemplo, podemos definir que o campo Código da Loja só pode ser
preenchido após o preenchimento do campo Código do Cliente.
A regra pode ser criada com campos do mesmo submodelo ou com campos de submodelos diferentes.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIDSubModel | Caracteres | Identificador do submodelo do campo receptor | X | ||
cIDField | Caracteres | Identificador do campo receptor | X | ||
cIDTargetSubModel | Caracteres | Identificador do submodelo do campo disparador | X | ||
cIDFieldTarget | Caracteres | Identificador do campo disparador | "" | ||
nType | Numérico | Identificador da operacao de relacionamento. Existem três opções: Tipo 1 - Pré Validação: Adiciona uma relação de dependência entre os campos, impedindo a atribuição de valor caso os campos de dependência não tenham valor atribuído. Por exemplo, o preenchimento do campo Código da Loja só pode ser preenchido após o preenchimento do campo Código do Cliente. Tipo 2 - Pós Validação: Adiciona uma relação de dependência entre o receptor e o disparador, provocando uma reavaliação em caso de atualização do campo receptor. Por exemplo, após o preenchimento do campo Código da Loja a validação é reavaliado caso o Código do Cliente seja alterado. Tipo 3 - Ambas : Aplica a pré e a pós validação simultaneamente. | 3 |
//campo Loja dependendo do preenchimento do campo Cliente
oModel:AddRules( 'ZA1MASTER', 'A1_LOJA', 'ZA1MASTER', 'A1_CLIENTE', 3)
//Campo autor do submodelo GRID depende do preenchimento do campo data do submodelo FIELD
oModel:AddRules( 'ZA2DETAIL', 'ZA2_AUTOR', 'ZA1MASTER', 'ZA1_DATA', 3)
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cId | Caracteres | Identificador do modelo de proprietário, caso não seja passado esse parametro o método irá retornar os filhos do modelo |
[n][1] Tipo do objeto FIELD ou GRID
[n][2] Id do objeto
[n][3] Objeto do modelo (FWFormFieldModel ou FWFormGridModel)
[n][4] Array com a estrutura dos filhos no mesmo formato
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cId | Caracteres | Identificador do modelo ou de um submodelo |
[n][1] Tipo do objeto FIELD ou GRID
[n][2] Id do objeto
[n][3] Objeto do modelo (FWFormFieldModel ou FWFormGridModel)
[n][4] Array com a estrutura dos filhos no mesmo formato
o objeto do submodelo, podendo ser do tipo FWFormFieldsModel ou
FWFormGridModel
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cId | Caracteres | Id do objeto. Se não informado será retornado o próprio model. |
FWFormGridModel). Se o cID for vazio, retorna o próprio model.
se o objeto esta ativado ( Activate ) ou não (deactivate). Quando o objeto esta desativado ou a operação é de inclusão
uma folha de dados em branco é fornecida.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
lDetail | Lógico | Indica se o xml gerado deve incluir as tags de detalhamento dos dados. Aconselha-se a evitar o detalhamento dos dados, uma vez que eles estão contido no Schema do XML ( GetXMLSchema ). | .F. | ||
nOperation | Numérico | Indica a operação que será indicada na exportação do XML | ::NOPERATION | ||
lXSL | Lógico | Informe se o layout deve ser gerado | .F. | ||
lVirtual | Lógico | Indica se os campos virtuais devem estar contidos no xml gerado | .T. | ||
lDeleted | Lógico | Indica se as linhas deletadas dos grids devem estar contidas no xml gerado | .T. | ||
lEmpty | Lógico | Indica se gera xml com campos nao obrigatorios vazios (utilizado na geracao do XSLT) | .F. | ||
lDefinition | Lógico | Indica se gera xml com a definicao (tratamento para o E4X do javascript utilizado no BPM) | .T. | ||
cXMLFile | Caracteres | Nome do arquivo XML a ser gerado com path (default StartPath). Se este parametro for informado a geracao sera em arquivo automaticamente | "" |
se o objeto esta ativado ( Activate ) ou não (deactivate). Quando o objeto esta desativado ou a operação é de inclusão
uma folha de dados em branco é fornecida.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
lDetail | Lógico | Indica se deve incluir as tags de detalhamento dos dados | .F. | ||
nOperation | Numérico | Indica a operação que será indicada na exportação | ::NOPERATION | ||
lVirtual | Lógico | Indica se os campos virtuais devem estar contidos | .T. | ||
lDeleted | Lógico | Indica se as linhas deletadas dos grids devem estar contidas | .T. | ||
lEmpty | Lógico | Indica se gera com campos nao obrigatorios vazios | .F. |
validações em lista, as validações de tamanho e tipo de dados e os campos de preenchimento obrigatório.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
lVirtual | Lógico | Informa se os campos virtuais devem ser adicionados no schema | .T. | ||
lTypeDef | Lógico | Informa se a definição dos campos devem ser adicionadas. Isto é importante quando o arquivo é gerado com mais de um modelo. | .T. | ||
lOnlyStruct | Lógico | Informa se somente a estrutura do schema deve ser gerada. Neste caso, os campos obrigatório não são exportados | .F. |
layout de exibição dos elementos do XML.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cID | Caracteres | Identificação dos dados do layout | X |
chave primária contidas no XML fornecido como parametro.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cXML | Caracteres | XML com os dados do modelo | X |
[1] ExpN: Codigo da Operacao
[2] Array com os dados da Primary Key
contida no XML fornecido como parametro.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cXML | Caracteres | XML com os dados do modelo | X |
dos dados contidos no XML fornecido, porém não efetua a gravação dos dados
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cXML | Caracteres | XML com do modelo e os dados | X | ||
lForce | Lógico | Força a carga dos dados sem validar o modelo. | .F. |
::MODELXML := oModel:LoadXMLData(::ModelXML)
If oModel:VldData()
oModel:CommitData()
::lOk := .T.
Else
::lOk := .F.
aError := oModel:GetErrorMessage()
SetSoapFault(aError[MODEL_MSGERR_IDFORM]+":"+;
aError[MODEL_MSGERR_IDFIELD]+":"+;
aError[MODEL_MSGERR_IDFORMERR]+":"+;
aError[MODEL_MSGERR_IDFIELDERR]+":"+;
aError[MODEL_MSGERR_ID],;
aError[MODEL_MSGERR_MESSAGE]+"/"+aError[MODEL_MSGERR_SOLUCTION])
lRetorno := .F.
EndIf
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
bLoadXML | Bloco de Código | Bloco de código que recebe o modelo por parametro e espera como retorno um XML com os dados baseado no modelo | X |
Caso o objeto não possa receber dados um erro pode ser gerado ( SetErrorMessage ) ou uma exceção de usuário ( queda do sistema ).
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Codigo do submodelo do Modelo que terá uma atribuicao | X | ||
cIdField | Caracteres | Codigo/Nome do atributo da folha de dados | X | ||
xValue | Qualquer | Valor a ser atribuido | X |
de função ( CallStack ). Diferentemente do metodo SetValue, este método não executa a validação do campo, mas fornece
todas as indicações de que ele foi atualizado. Ele é muito utíl quando dentro de uma validação de campo, necessitamos
alterar valores de outros campos, sem que isto implique em valida-los.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Codigo do submodelo do Modelo que terá uma atribuicao | X | ||
cIdField | Caracteres | Codigo/Nome do atributo da folha de dados | X | ||
xValue | Qualquer | Valor a ser atribuido | X |
dados garantida. Este método verifica se todos os elementos da estrutura do modelo estão validos e executa o code-block
de pos-validação de cada um deles, bem como o code-block de validação final do modelo. O objeto é considerado valido
se todas as validações retornarem verdadeiro, caso contrário um erro ( SetErrorMessage ) será gerado.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIDModel | Caracteres | ID inicial que se deve fazer a validação, no caso que se queira validar uma parte do model, passando esse parametro o metodo ira validar o modelo passado e seus filhos, e não irá setar o modelo geral como validado. | "" | ||
lVldOwner | Lógico | Verifica se será validado o ID do model e seus filhos (.T.) ou se será validado apenas o contexto do ID (.F.) | .T. | X |
A gravação não é feita diretamente por esta classe, mas sim, pelo code-block informado no método new. Este método
apenas assegura que todos os procedimentos necessários para gravar os dados do objeto modelo foram cumpridos.
todos os procedimentos necessários ao cancelamento da gravação do objeto modelo foram cumpridos e invoca o code-block
configurado no método new.
evento que a provocou.
O controle de mensagens de erro do modelo, permite identificar o Id´s do submodelo e campo de origem do erro e qual
Id do subdmodelo e campo que provocou o erro. Isto significa que caso um erro seja gerado por um gatilho de campo
este possa ser identificado.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Id do subdmodelo em validação | |||
cIdField | Caracteres | Id do campo do submodelo em validação | |||
cIdFormErr | Caracteres | Id do submodelo em que ocorreu o erro | |||
cIdFieldErr | Caracteres | Id do campo do submodelo em que ocorreu o erro | |||
cId | Caracteres | Id da mensagem de help | |||
cMessage | Caracteres | Mensagem de erro | |||
cSoluction | Caracteres | Mensagem de solução | |||
xValue | Qualquer | Valor especificado do campo | |||
xOldValue | Qualquer | Valor anterior do campo |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
lClear | Lógico | Indica se a mensagem de erro deve ser limpa apos o retorno | .F. |
[1] ExpC: Id do submodelo de origem
[2] ExpC: Id do campo de origem
[3] ExpC: Id do submodelo de erro
[4] ExpC: Id do campo de erro
[5] ExpC: Id do erro
[6] ExpC: mensagem do erro
[7] ExpC: mensagem da solução
[8] ExpX: Valor atribuido
[9] ExpX: Valor anterior
GetErrorMsgText
Disponível a partir da LibLabel 20210104
Sintaxe
FWFORMMODEL():GetErrorMsgText([ lClear ], [cSeparator])-> cErrorMsgText
Descrição
Fornece as mesmas informações de GetErrorMessage só que no formato Texto.
Parâmetros
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
lClear | Lógico | Indica se a mensagem de erro deve ser limpa apos o retorno | .F. | ||
cSeparator | Caracter | Indica o separador usado na mensagem de texto | CRLF |
Retorno
cErrorMsgText Texto com a informação do erro no seguinte formato:
Erro: valor + cSeparator +
Solução: valor + cSeparator +
Valor Atribuido: valor + cSeparator +
Valor anterior: valor + cSeparator +
Id origem: valor + cSeparator +
Id campo origem: valor + cSeparator +
Id form erro: valor + cSeparator +
Id campo erro: valor + cSeparator +
Id Erro: valor
Veja também
GetErrorMessage, SetErrorMessage
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Codigo do submodelo | X | ||
cIdField | Caracteres | Codigo/Nome do atributo da folha de dados | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Codigo do submodelo que terá uma atribuicao | X | ||
cIdField | Caracteres | Codigo/Nome do atributo da folha de dados | X |
entre os submodelos de dados do objeto modelo, garante a carga dos dados e a correta atualização das chaves estrangeiras
durante a execução do método FWCommit.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Codigo do submodelo do Modelo de destino do relacionamento | X | ||
aRelation | Array | Estrutura de relacionamento [n] [n][1] ExpC: ID do campo do submodelo origem [n][2] ExpC: ID do campo do submodelo destino | X | ||
cOrderBy | Caracteres | Ordem de apresentação |
Static Function ModelDef()
Local oModel
Local oStruZA1:= FWFormStruct(1,'ZA1')
Local oStruZA2 := FWFormStruct( 1, 'ZA2')
oModel := FWFormModel():New('COMP021',,,{|oModel| commit()},{|oModel| cancel()})
oModel:AddFields('ZA1MASTER',,oStruZA1)
oModel:AddGrid( 'ZA2DETAIL', 'ZA1MASTER', oStruZA2)
oModel:SetRelation( 'ZA2DETAIL', { { 'ZA2_FILIAL', 'xFilial( "ZA2" )' }, { 'ZA2_MUSICA', 'ZA1_MUSICA' } }, ZA2->( IndexKey( 1 ) ) )
Return oModel
Static Function commit()
Return
Static Function cancel()
Return
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Codigo do submodelo de destino do relacionamento | X |
[1][n][1] IdField do submodelo de destino
[2] IdField ou expressão do submodelo de destino
[2] Ordem de relacionamento no padrão ISAM.
das rotinas automáticas, web-services, relatórios, etc... Não é necessário informar uma para
cada submodelo, a Primary Key é definida somente para o primeiro submodelo do tipo FormField.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
aPK | Array | Array unidimensional com o ID dos campos | X |
Se a tabela do submodelo for um metadado e possuir chave primária informada no SX2, não é necessário
fazer uso desse método pois o MVC irá considerar o que está declarado no SX2.
definir como serão inicializadas as informações do modelo.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
nOperation | Numérico | Indica a operação que será realizada com o modelo, sendo: [1] View [3] Insert [4] Update [5] Delete | X |
1 - View
3 - Insert
4 - Update
5 - Delete
6 - only Update
O TReport tem as seções e células baseado nos submodelos e estrutura
de dados.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cPergunte | Caracteres | Id do grupo de perguntas do relatório | |||
bImpress | Bloco de Código | Bloco de código do controle de fluxo de impressão. Deve retornar verdadeiro para imprimir, não recebe nenhum parametro. | |||
aFields | Array | Informe a lista de campos que deve ser impressa, no formato [1] Id do submodelo [2] Id do campo [3] Picture [4] ComboBox |
Static Function ModelDef()
Local oStruZA1 := FWFormStruct( 1, 'ZA1')
Local oStruZA2 := FWFormStruct( 1, 'ZA2')
Local oModel
oModel := MPFormModel():New( 'COMP022M')
oModel:AddFields( 'ZA1MASTER', NIL, oStruZA1 )
oModel:AddGrid( 'ZA2DETAIL', 'ZA1MASTER', oStruZA2)
oModel:SetRelation( 'ZA2DETAIL', { { 'ZA2_FILIAL', 'xFilial( "ZA2" ) ' } , { 'ZA2_MUSICA', 'ZA1_MUSICA' } } , ZA2->( IndexKey( 1 ) ) )
Return oModel
Static Function ViewDef()
Local oModel := ModelDef()
Local oView
Local oStr1:= FWFormStruct(2, 'ZA1')
Local oStr2:= FWFormStruct(2, 'ZA2')
oView := FWFormView():New()
oView:SetModel( oModel )
oView:AddField('ZA1MASTER' , oStr1)
oView:AddGrid('ZA2DETAIL' , oStr2)
oView:CreateHorizontalBox( 'BOXFORM2', 50)
oView:CreateHorizontalBox( 'BOXFORM4', 50)
oView:SetOwnerView('ZA1MASTER','BOXFORM2')
oView:SetOwnerView('ZA2DETAIL','BOXFORM4')
oView:AddUserButton("Imprimir TReport","",{|oView| print(oView)})
Return oView
Static Function Print(oView)
Local oModel := oView:GetModel()
Local oReport
oReport := oModel:ReportDef()
oReport:PrintDialog()
Return
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
lTotal | Lógico | Se verdadeiro o relatório deve ter totalização. | .T. |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
bBloco | Bloco de Código | Code-Block a ser chamado |
bBloco := {|oModel| MinhaFunc(oModel)}
oModel:SetActivate(bBloco)
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
bBloco | Bloco de Código | Code-Block a ser chamado |
bBloco := {|oModel| MinhaFunc(oModel)}
oModel:SetDeActivate(bBloco)
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.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
bBloco | Bloco de Código | Code-Block a ser chamado | X |
bBloco := {|oModel| MinhaFunc(oModel)}
oModel:SetVldActivate(bBloco)
não obrigatório, podendo realizar a gravação dos dados sem preenche-lo
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Codigo do submodelo | X | ||
lOp | Lógico | Valor verdadeiro para deixar o submodelo opcional | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Identificador do submodelo | X |
Se um submodelo é onlyquery e possui submodelos abaixo dele, os filhos serão
gravaveis por padrão. Mesmo o pai sendo onlyquery, os filhos irão
fazer a gravação, exceto se o(s) submodelo(s) filho for definido como
setonlyquery verdadeiro.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Codigo do submodelo | X | ||
lOp | Lógico | Se verdadeiro faz com que o submodelo não seja gravado. | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Codigo do submodelo | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Identificação do submodelo | X | ||
cIdField | Caracteres | Codigo/Nome do atributo da folha de dados | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Identificador do submodelo que será analisado | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Identificador do Submodelo | X | ||
cIdField | Caracteres | Codigo/Nome do atributo da folha de dados | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
oOtherModel | Objeto | objeto do tipo FWFormModel ou MPFormModel | X | ||
lGetID | Logico | Se verdadeiro retorna os IDs dos dados das alterações, e considera a troca de Id como um alteração tambem.Caso o modelo não tenha ID de dado ou a linha for nova (no caso de grid), voltara o ID 0 | .F. |
Retorno
Array contendo as diferenças de dados encontradas entre os dois modelos. Em cada linha do array vai conter uma das estruturas abaixo, de acordo com o tipo do submodelo, field ou grid:
Field:
[n]
[n][1] - ExpC: Id do Formulario
[n][2] - ExpC: Tipo (F)
[n][3] - SubArray com os campos alterados
[n][3][1] - ExpC: ID do campo
[n][3][2] - ExpX: Valor do Modelo(self)
[n][3][3] - ExpX: Valor do modelo passado no segundo parametro
[n][4] - ExpN: Operação do modelo
Se lGetID == .T.
[n][5] - {Id do dado de origem, Id do dado destino(modelo passado via parametro}
Grid:
[n][1] - ExpC: Id do subModelo
[n][2] - ExpC: Tipo (G)
[n][3] - SubArray com os campos alterados
[n][3][1] - ExpN: Número da linha no submodelo do Model
[n][3][2] - ExpC: Operação da linha (3 - Inclusão , 4 - Alteração ou 5 - Exclusão )
[n][3][3][1] - ExpC: ID do Campo
[n][3][3][1] - ExpX: Valor do Modelo(self)
[n][3][3][1] - ExpC: Valor do modelo passado no segundo parametro
Se lGetID == .T.
[n][3][4] - {Id do dado de origem, Id do dado destino(modelo passado via parametro}
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cIdForm | Caracteres | Identificador do submodelo | X | ||
cIdField | Caracteres | Identificador do campo | X |
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 cancelamento anterior e sim adiciona a validação no final | .F. |
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. |
Quando o model é por demanda, os dados do submodelo não serão carregados
de uma vez no activate. Conforme eles forem manipulados eles serão
carregados. O método é útil em modelos que contem muitos submodelos
e que podem ficar lentos devido a grande quantidade de dados.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
lOnDemand | Lógico | Se verdadeiro a carga será por demanda | .T. |
da operação.
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
nProcess | Numérico | Valor a ser atribuido ao processo | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cWKDef | Caracteres | Código do processo | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cWKVersDef | Caracteres | Versão do processo | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cWKNumProces | Caracteres | Número da solicitação de processo | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cWKNumState | Caracteres | Número da atividade | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cWKCurrentState | Caracteres | Número da atividade atual | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cWKCompany | Caracteres | Número da empresa | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cWKUser | Caracteres | Código do usuario | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cWKUserEmail | Caracteres | E-mail do usuario | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cWKCompletTask | Caracteres | true/false | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cWKNextState | Caracteres | Número da atividade | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cWKCardId | Caracteres | Código do formulário | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
cWKFormId | Caracteres | Código da definição de formulário | X |
Nome | Tipo | Descrição | Default | Obrigatório | Referência |
nIndexOrder | Numérico | Ordem | X |