FWModelActive() → oModelActive
Descrição
Retorna a referência ao último modelo utilizado. O modelo pode estar ativo ou não, assim como nulo. Deve-se fazer guardas do mesmo.
oModel := FWModelActive()
If oModel != nil .and. oModel:isActive()
Endif
Retorno
oModelActive → Objeto do Model ativo, o modelo também pode estar desativo e em algumas situações, também um valor nulo dado o valor ser uma referência.
Observações
A partir da LIB 20190319, ao efetuar a destruição ( método destroy ) do modelo ativo, o mesmo limpara a referência presente no retorno na função FWModelActive, portanto a mesma passará a retornar Nil e não mais um modelo destruído, evitando o falso positivo de um modelo válido.
3 Comentários
Rodrigo Alexandrino Pirolo
Acredito que deveriam alterar a descrição para "fornece o último objeto da classe FWFormModel que esteve ativo (mesmo após sendo utilizado o 'Destroy()'), para ser utilizado nas regras
de validação do sistema Microsiga Protheus.".
Pois do jeito que está hoje permite uma margem muito grande para erros no ERP inteiro!
Mauricio Pequim Junior
A descrição mais correta para essa função seria:
"Esta função fornece o último objeto da classe FWFormModel que esteve ativo, para ser utilizado nas regras de validação do sistema Microsiga Protheus."
Ainda se se utilize a sequência abaixo:
oModel:DeActivate()
oModel:Destroy()
oModel := Nil
e após se utilize um
oModel := FWModelActive()
o objeto oModel terá uma estrutura e será diferente de NIL ainda que o oModel, tecnicamente, deveria estar inativo.
Convém, nos casos de funções genéricas onde não se tem o controle de qual model vai estar ativo, a utilização da validação abaixo
oModel::IsActive()
para a utilização do mesmo.
Usuário desconhecido (norbertom)
Olá bom dia!
Na verdade ele retorna uma referência à última instância criada independente desta estar ativa e independente também de ter sido executado o método Destroy().
Aliás, por recomendação da Equipe do Frame, seria uma boa prática efetuar o seguinte tratamento:
oModel := FWModelActive()
If oModel:IsActive()
...
EndIf