Loading

Errore Operazione DML mista durante la creazione o l'aggiornamento dei record tramite Process Builder o regola di convalida

Data pubblicazione: Mar 3, 2021
Descrizione


Le operazioni DML relative a determinati sObjects, denominati a volte "oggetti di setup", non sono combinabili con operazioni DML relative ad altri sObjects all'interno della stessa transazione. Il motivo di questa restrizione è che alcuni sObjects influenzano l'accesso dell'utente ai record dell'organizzazione. Per evitare che le operazioni avvengano con autorizzazioni errate a livello di accesso, è necessario inserire o aggiornare questi tipi di sObjects in una transazione diversa. Ad esempio, non è possibile aggiornare un account e un ruolo utente in un'unica transazione.
 

Esempio 1: 

Se si utilizza un processo per cercare di fare entrambe le cose in un'unica transazione, viene visualizzato un messaggio di errore.

Errore: Si è verificato un errore nell'elemento myRule_1_A1 (FlowRecordCreate).
INSERT --- INSERT FAILED --- ERRORS : (MIXED_DML_OPERATION) L'operazione DML sull'oggetto di configurazione non è consentita fino a quando non si aggiorna un oggetto non di configurazione (o viceversa): Invoice_Statement__c, oggetto originale: Utente

Passaggi da riprodurre:

1. Creare un processo sull'oggetto utente
2. Impostare i criteri come Attivo | uguale | Vero
3. Impostare l'azione immediata come creazione di record sull'oggetto account.
4. Attivare il processo
5. Creare e attivare un nuovo utente.
 

Esempio 2: 

Se si usa una regola di convalida per tentare di aggiornare gli oggetti utente e contatto, come nel seguente caso d'uso:

  • Si dispone di un provider di autenticazione e di un RegistrationHandler per l'accesso degli utenti della community.
  • RegistrationHandler.updateUser() aggiorna l'oggetto utente.
  • L'utente utilizza una regola di convalida con una formula che punta a contatto.
  • In RegistrationHandler updateUser(), aggiorna l'oggetto utente.

Regola di convalida:

IF( Community_User_s_Account_ID__c== $Setup.COMM_Profile__c.BluIdAccountId__c , IF( OR(ProfileId== $Setup.COMM_Profile__c.FullAccessProfile__c ,ProfileId== $Setup.COMM_Profile__c.BasicProfileId__c) , true, false),false) Community_User_s_Account_ID__c è un campo formula in Utente che permette di ottenere il valore di "Contact.AccountId"


Al momento dell'accesso, l'utente riceverà un messaggio di errore:

"... non è possibile mescolare EntityObjects con UddInfos diversi all'interno di un'unica transazione: id = 003********"

o più specificamente:

"Non siamo in grado di farti accedere a causa del seguente errore.
ERROR_CREATING_USER: Formula di convalida "UserProfileSwitchRule" non valida (java.lang.IllegalStateException: Errore di programmazione: non è possibile mescolare EntityObjects con UddInfos diversi all'interno di un'unica transazione: id = 003**********"

Passaggi da riprodurre:

1. Accedere all'URL della Community - ad es., https://<instance-community-URL>/<community-name>/s
2. Fare clic sul pulsante [Accedi] nell'angolo in alto a destra
3. Accedere alla community utilizzando le credenziali nome utente e password di un utente autorizzato.
4. Viene generato l'errore di cui sopra

Risoluzione


Soluzione dell'esempio 1:

Quando l'azione viene eseguita all'interno della stessa transazione, aggiungere l'azione sotto l'azione pianificata. Questo posizionamento separa l'azione di aggiornamento o di creazione dalle azioni immediate. 

Azione pianificata è disponibile alle seguenti condizioni: 

L'impostazione dei criteri di valutazione è:

  • "Creato"
  • "Quando un record viene creato o modificato"
E l'opzione "Eseguire le azioni solo quando vengono apportate al record modifiche specifiche?" è abilitata sotto "Opzioni avanzate" nella pagina "Definisci i criteri per questo gruppo di azioni".

 

Soluzione dell'esempio 2: 

  • Quando si esegue una regola di convalida, in - FormulaTransactionObserver.lazyFetchTargetEntityObject(FormulaTransactionObserver.java:131) -
la formula di riferimento è "Contact.Account".
  • Carica il contatto nella stessa TransactionEntityObjectMap che ha "BlueID" come uddInfo del Provider di autenticazione.
 

IMPORTANTE: Questa implementazione NON è consentita come spiegato nel messaggio d'errore che contiene questo formato -

"...(java.lang.IllegalStateException: Errore di programmazione: non è possibile mescolare EntityObjects con UddInfo diversi all'interno di un'unica transazione: id = 003**********"

Si tratta di una limitazione della funzionalità esistente.
Nota: I Provider di autenticazione standard come Salesforce o Facebook non sono interessati da questa limitazione. Questi fornitori sono come l'implementazione personalizzata del caso d'uso descritto. È possibile utilizzare una soluzione alternativa per evitare oggetti misti provenienti dalle regole di convalida utente per i Provider di autenticazione personalizzati.

Ad esempio:

1. Commentare la dichiarazione che viene lanciata nell'handler registrazione nel Provider di autenticazione -- ad es., // update(u);
2. Modificare la regola di convalida per *non* mescolare gli oggetti entità di impostazione e non di impostazione come specificato nei riferimenti riportati di seguito.

Suggerimento (facoltativo): la disabilitazione della regola di convalida ne consente il funzionamento.

 

Riferimenti:

Numero articolo Knowledge

000382600

 
Caricamento
Salesforce Help | Article