SetPrimaryKey em MVC

Boa tarde!

Estou com uma dúvida quanto ao método SetPrimaryKey usado pela classe FwFormModel

Caso eu criar um formulário onde a tabela não possua X2_UNICO e informe a chave primária por esse método, o sistema não acata e continua permitindo o usuário informar cadastros duplicados.

Segue exemplo da definição do modelo:


Static Function ModelDef
Local oModel    := Nil
Local oStruct   := FwFormStruct(1, 'ZAB')

    oModel := MpFormModel():New('TMSA01MVC',/*PreValid*/,/*Valid*/,/*Commit*/)

    oModel:AddFields('ModelMaster',, oStruct)
    oModel:SetPrimaryKey({'ZAB_FILIAL', 'ZAB_ANOMES'})    
    oModel:GetModel('ModelMaster'):SetDescription('Custo de Frete e Logístico')

    oModel:SetDescription('Cadastro de Frete e Custo Logístico')

Return(oModel)

Sei que é possível definir uma validação para o campo ZAB_MESANO para que o campo faça essa validação, mas fiquei com dúvida quanto ao funcionamento desse método.

Alguém saberia me explicar por quê deu errado?


Cenário 1:


oModel:SetPrimaryKey({'ZAB_FILIAL', 'ZAB_ANOMES'})
SX2->X2_UNICO = ''

Sistema permite a inclusão de registros duplicados.

Cenário 2:


oModel:SetPrimaryKey({'ZAB_FILIAL', 'ZAB_ANOMES'})
SX2->X2_UNICO = 'ZAB_FILIAL+ZAB_ANOMES'

Sistema NÃO permite a inclusão de registros duplicados, gerando o error log: Cannot insert duplicate key row in object 'dbo.ZAB010' with unique index 'ZAB010_UNQ'. The duplicate key value is ( , 201910, 0)


Na documentação está descrito da seguinte maneira: 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.

Minha dúvida é: Se a origem for metadado, a chave primária sempre irá considerar o campo X2_UNICO e irá ignorar esse método ou só irá considerar o campo X2_UNICO se o mesmo estiver preenchido?

Pois com base nesse teste, o sistema está considerando o campo X2_UNICO sempre, independente se está preenchido ou não. Ignorando o conteúdo do método.

Grato pela atenção.

Porque não preencher o X2_UNICO?

Quando existe o X2_UNICO, qual o comportamento? Pois quando existe, o método chamado é mesmo.

Bom dia! Quando existe o X2_UNICO, o sistema não permite a inclusão do registro duplicado. Quando o mesmo está em branco, o sistema permite incluir mais de um registro com a mesma chave.

Mas como é essa parte que não permite, o que é apresentado? É exibido um help? Qual help?

É exibido um error log: Cannot insert duplicate key row in object ‘dbo.XXX010’ with unique index ‘XXX010_UNQ’. The duplicate key value is (XX,XXXXX).

Hum… Deixa eu ver se eu entendi, se você faz o SetPrimaryKey na “mão”, ele permite incluir registros duplicados, caso exista o X2_UNICO, ele permite mas gera um error.log?

Efetuei uma melhoria na minha explicação inicial, mas seria isso mesmo.

Mesmo sem o X2_UNICO o Setprimarykey cria uma chave unica para a tabela onde estiver utilizando este modelo de dados. Se no seu caso, isso não estiver funcionando pode ser algum problema de build, pois eu tenho casos como este funcionando.

Bom dia, Paulo! Acredito que seja algum problema da build mesmo, pois quando preencho o X2_UNICO a validação funciona, mas quando removo, o sistema permite incluir registros duplicados normalmente. Mesmo informando a SetPrimaryKey no modelo.