Wann wird ein Auto-Number-Wert generiert?

Sep 02 2020

Ich muss ein Auto NumberFeld verwenden, um den Wert des NameFeldes auf einen zusammengesetzten Wert von zu setzenAUTO_NUMBER - NAME - DOB

Ich habe ein Auto_Number__cFeld und einen before insertTrigger, der den Maximalwert erhält:

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

Und erhöht es.

Das funktioniert aber nicht immer.

Die Rennbedingungen haben dazu geführt, dass die Rekorde dieselbe Nummer haben.

Ich möchte wissen, wann der neue Auto NumberWert für einen bestimmten Datensatz tatsächlich verfügbar ist, damit ich ihn zum Umbenennen des Datensatzes verwenden kann. da dies in der Dokumentation zu Auslösern und Ausführungsreihenfolge nicht erwähnt wird.

Ich wäre auch offen für andere Lösungsvorschläge für dieses Problem.

Antworten

4 sfdcfox Sep 01 2020 at 23:20

Die automatische Nummer wird zum gleichen Zeitpunkt zugewiesen, zu dem die ID zugewiesen wird, dh in dem Schritt, in dem das erste Festschreiben erfolgt und der Datensatz aus der Datenbank neu geladen wird. Dies bedeutet jedoch, dass Dinge während des Flugs sein können, wenn Sie versuchen, den Maximalwert zu erhalten. Verwenden Sie FOR UPDATE, wenn Sie eine Wartezeit erzwingen möchten, um die Synchronität sicherzustellen:

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

Beachten Sie, dass dies dazu führen kann, dass einige Datensätze nicht eingefügt werden können und erneut gespeichert werden müssen, wenn Sie länger als 10 Sekunden brauchen.