Quando é gerado um valor de numeração automática

Sep 02 2020

Eu preciso usar um Auto Numbercampo para definir o valor do Namecampo para um valor composto deAUTO_NUMBER - NAME - DOB

Eu tenho um Auto_Number__ccampo e um before insertgatilho que obtém o valor máximo:

private List<Opportunity> getMax() {
    return [SELECT Auto_Number__c FROM Opportunity ORDER BY Auto_Number__c DESC NULLS LAST LIMIT 1];
}

E o incrementa.

Mas isso nem sempre funciona.

As condições da corrida fizeram com que os recordes terminassem com o mesmo número.

Gostaria de saber quando o novo Auto Numbervalor está realmente disponível para um determinado registro, então posso usá-lo para renomear o registro. já que a documentação Triggers e Order of Execution não menciona isso.

Além disso, eu estaria aberto a quaisquer outras soluções sugeridas para esse problema.

Respostas

4 sfdcfox Sep 01 2020 at 23:20

A numeração automática é atribuída no mesmo momento em que o ID é atribuído, ou seja, na etapa em que ocorre o primeiro commit e o registro é recarregado do banco de dados. No entanto, isso significa que as coisas podem estar em andamento quando você tenta obter o valor máximo. Use FOR UPDATE se quiser forçar uma espera para garantir a sincronicidade:

private List<Opportunity> getMax() {
    return [SELECT Auto_Number__c FROM Opportunity ORDER BY Auto_Number__c DESC NULLS LAST LIMIT 1 FOR UPDATE];
}

Observe que isso pode causar falha na inserção de alguns registros e exigir outro salvamento se demorar mais de 10 segundos.