Erro no parâmetro FWFormModel: A estrutura principal obrigatoriamente não pode ser uma estrutura que não sofre modificações

Olá, tenho uma rotina em MVC, modelo pai filho, onde ao efetuar INCLUSÃO dá o erro abaixo

THREAD ERROR ([8024], luiz.poleza, ARM103NB008) 11/10/2019 16:24:29 erro no parâmetro FWFormModel: A estrutura principal obrigatoriamente não pode ser uma estrutura que não sofre modificações. on FWFORMMODEL:COMMITDATA(FWFORMMODEL.PRX) 12/07/2019 17:27:31 line : 2235

Consegui identificar que isso ocorre quando eu não preencho/altero um dos campos do cabeçalho, porém não é necessário, pois são informações como numeração sequencial (uso getsxenum), data/hora e usuário que incluiu. Tudo já traz preenchido pelo inicializador padrão do campo.

Se eu vou em um dos campos apago e preencho denovo (mesmo com os mesmos dados) então ele salva com sucesso e sem erro.

Alguém teria uma solução? pois realmente não é necessário alterar o cabeçalho, eu já trago ele todo preenchido

Luiz, esse erro é gerado quando o modelo não sofreu alterações, como é feita essa carga de dados? Consegue colocar anexo o código?

Sim, exatamente, isso acontece quando o cabeçalho não sofre alterações. O problema é que o cabeçalho tem 5 campos no total, sendo 4 obrigatórios. Todos os 4 obrigatórios, já são preenchidos automaticamente (valor inicial configurado no dicionario/configurador). São campos de data, hora, usuario e filial, e são apenas visualizar. o quinto campo, que não é obrigatorio, é “observações”. se o usuário não clica nele e digita nada, dá esse erro. Se entra no campo, digita qualquer caracter e apaga (mesmo confirmando em branco) então funciona… bizarro

Boa noite, Luiz!

Como está a configuração dos campos? Algum deles está marcado como obrigatório? Se não, poderia marcar e fazer um novo teste?

Tenho os seguintes campos no cabeçalho

  • Numeração sequencial (getsxneum)
  • data
  • hora
  • status (“01 - incluido manual”)
  • usuario da inclusao
  • observações

TODOS os campos, com exceção das observações, estão marcados obrigatórios, apenas VISUALIZAR, e já preenchem automaticamente pela própria configuração do campo no configurador

e é exatamente este o problema: se eu não preencho nada no observações (ou preencho e apago, para gravar em branco) ele dá esse errorlog
na prática, só funciona se alguem digitar alguma coisa no campo observações ou digitar e apagar

Tiveram alguma solução ?

Opa, tbm gostaria de saber se teve alguma solução ou se fizeram alguma “gambis” para isso funcionar

Alguém com solução para esse caso ?

Coloque uma validação em algum campo da Grid que atualize um campo do cabeçalho como a Hora, por exemplo. Com isso o cabeçalho terá recebido uma alteração e a gravação será bem sucedida.

Utilize o seguinte recurso, e atribua pelo menos um campo do cabeçalho:

// Função chamada na abertura da tela oView:SetAfterViewActivate({|oView| IniCpos(oView)} )

Static Function IniCpos(oView)

Local nOperation := oView:GetOperation() Local oModel := FWModelActive() Local oModelZCI := oModel:GetModel("ZCIMASTER")

If nOperation == 3

// oModelZCI:LoadValue("ZCI_NUM" , GetSXENum("ZCI", "ZCI_NUM") ) oModelZCI:LoadValue("ZCI_EMISSA" , dDataBase )

// oModelZCI:LoadValue("ZCI_CODIGO" , U_SSFIN26O() ) // oModelZCI:LoadValue("ZCI_TABELA" , 'ZCI' ) // oModelZCI:LoadValue("ZCI_CHAVE" , FwFldGet('ZCI_CODIGO') )

ElseIf nOperation == 4 .and. lAtesto

// cTipoAtesto := ZCI->ZCI_TPATES

// // inicializo alguns campos do cabeçalho da proposta // oModelZCI:LoadValue("ZCI_USAT" , __cUserId ) // oModelZCI:LoadValue("ZCI_NMUSAT", POSICIONE('US0', 1,XFILIAL('US0')+ZCI_USAT,'US0_USUARI') ) // oModelZCI:LoadValue("ZCI_DTAT" , U_SSGetDate() ) // oModelZCI:LoadValue("ZCI_JUSTIF", cJustificativa )

// atualizo a View oView:Refresh()

EndIf Return

Para contornar esse problema, eu criei um campo falso na ModelDef na estrutura que apresentava o erro:


oStruCab:addField("Fake","Fake",'FAKE','C',1,0)

Depois na ViewDef adicionei essa linha onde eu crio uma funçãozinha que vai preencher o campo falso criado


oView:setCloseOnOk({|oView| fCloseView(oView) })

A minha funçãozinha é essa, onde CAB é o id do meu submodelo (meu cabeçalho, no caso):


static function fCloseView(oView as object)
    local oModel := oView:getModel("CAB")
    oModel:loadValue("FAKE","1")
return .T.

Preenchi o campo falso (que chamei de FAKE) com o conteúdo "1" (podia ser qualquer coisa, como 'x' por exemplo). Não criei esse campo na estrutura da View porque eu não queria que ele mostrasse em tela para o usuário.