Loading

Errore "Impossibile modificare il tipo di campo" per il campo Numerazione automatica

Data pubblicazione: Dec 20, 2024
Descrizione

Se si modifica il campo Numerazione automatica in un altro tipo di dati a cui viene fatto riferimento nell'Apex code, si verifica l'errore seguente:

Errori di convalida durante il salvataggio dei record. Sono stati rilevati errori di convalida personalizzati durante il salvataggio dei record interessati. Il primo errore di convalida riscontrato era "Impossibile modificare il tipo di un campo personalizzato a cui si fa riferimento nella classe o nel trigger Apex: AutoNumberTestMsg".

In generale, questo tipo di problema si verifica quando si esegue una migrazione dei dati in una nuova organizzazione. Se è presente un campo Numerazione automatica a cui si fa riferimento nei trigger e nell'Apex code. Tuttavia, per caricare il campo è necessario modificare il tipo in Caricamento testo e poi modificare il campo. Tuttavia, l'Apex code impedisce la modifica del tipo di dati. 
 
Alcuni dei problemi più complessi di distribuzione di Force.com affrontati dal cliente riguardano i campi personalizzati di tipo Numerazione automatica. I valori in questi campi non possono essere aggiornati senza che il relativo tipo venga cambiato temporaneamente in Testo, ma se il campo viene richiamato nell'Apex code, il tipo non può essere modificato.
È possibile tuttavia utilizzare l'SOQL dinamico e i metodi get() e put().
Risoluzione

Per illustrare la tecnica, creare un oggetto personalizzato AutoNumberTest__c con cui provare. L'oggetto deve avere un singolo campo personalizzato denominato "autonumber__c" di tipo Numerazione automatica. Dopo aver creato l'oggetto, è possibile provare a dimostrare che il tipo del campo Autonumber__c può essere modificato liberamente da Numerazione automatica in Testo e di nuovo in Numerazione automatica, consentendo gli aggiornamenti necessari nell'ambito delle conversioni o dei recuperi. Tenere presente che ciò non si applica al campo Nome standard impostato come numero automatico. I campi nome sono trattati in modo diverso rispetto ai campi personalizzati e l'attributo di numerazione automatica del campo nome può essere modificato senza eseguire lo stesso controllo del tipo del compilatore Apex. Scriviamo ora un trigger dopo l'inserimento o l'aggiornamento di un oggetto AutoNumberTest__c che fa riferimento alla colonna autonumber__c. Il codice di esempio seguente utilizza il campo per creare un oggetto Nota e lo allega all'oggetto AutoNumberTest__c.
 
trigger AutoNumberTestMsg      on AutoNumberTest__c (after insert, after update) {  List newNotes = new List();  for (AutoNumberTest__c a : Trigger.new ) {    Note msg = new Note(      parentId = a.id,      title = '' + a.autonumber__c,      body = '' + a    );    newNotes.add(msg);  }  insert newNotes;}
 
Questo codice esegue un'iterazione in tutti i nuovi valori del batch di trigger, crea un nuovo oggetto Note contenente una rappresentazione stringa dell'oggetto AutoNumberTest__c e, dopo avere eseguito il loop in tutti gli oggetti, inserisce le nuove note in un'unica istruzione DML. L'espressione '' + a.autonumber__c restituisce una rappresentazione stringa del campo autonumber__c del valore. Dopo la creazione del trigger, il tentativo di modificare il tipo di colonna da Numerazione automatica genera il seguente errore:
 
Errori di convalida durante il salvataggio dei record
Si sono verificati errori di convalida personalizzati
durante il salvataggio dei record interessati. Il primo errore di convalida
rilevato era "Impossibile modificare il tipo di un campo
personalizzato cui si fa riferimento nella classe o nel trigger Apex:
AutoNumberTestMsg".
 
In questo esempio, è facile commentare il codice esistente, modificare il tipo di campo per eseguire la manutenzione dei valori dei dati e quindi eliminare i commenti al codice. Raramente è facile e a volte è quasi impossibile se è coinvolta una promozione o se il codice dipendente è più complesso.
L'introduzione dei metodi Object.get() e Object.put() nel rilascio Winter '09 offre una nuova alternativa. È possibile modificare l'espressione a.autonumber__c in g.get('autonumber__c') ed eseguire l'escape nel compilatore.
Il nuovo trigger è il seguente:
 
trigger AutoNumberTestMsg      on AutoNumberTest__c (after insert, after update) {  List newNotes = new List();  for (AutoNumberTest__c a : Trigger.new ) {    Note msg = new Note(      parentId = a.id,      title = '' + a.get('autonumber__c'),      body = '' + a    );    newNotes.add(msg);  }  insert newNotes;}
 
Ora è possibile modificare il tipo della colonna autonumber__c senza generare un errore.
Ovviamente questa modifica ci espone a una nuova classe di errori in fase di esecuzione che altrimenti il compilatore avrebbe impedito. Ad esempio, se ora si modifica il nome API del campo autonumber__c senza modificare anche il trigger, il codice determina un'eccezione in fase di esecuzione.
Nelle situazioni più realistiche, le modifiche richieste di solito sono più complesse e comportano rischi più significativi di problemi in fase di esecuzione.
Ad esempio, se si utilizza un'espressione SOQL come:
List aList =    [select id, autonumber__c from AutoNumberTest__c];
 
Verrà applicata la stessa restrizione impostata dal compilatore per la modifica del tipo del campo di numerazione automatica. È necessario ricorrere a una query SOQL dinamica e al metodo Database.query() per evitare il riferimento diretto del compilatore al campo.
 
List aList =    Database.query('select id, autonumber__c from AutoNumberTest__c');
 
Il passaggio alle query SOQL dinamiche può essere difficile da eseguire e ancora più difficile da gestire (con il rilascio Spring '09 è possibile utilizzare l'interpolazione ":" in SOQL dinamico, il che semplifica le operazioni. Tuttavia, nei casi in cui è necessario modificare temporaneamente un campo Numerazione automatica per consentire gli aggiornamenti, il passaggio a una query SOQL dinamica sarà molto più semplice di rispetto alle operazioni che si eseguivano in passato.  

Vedere anche: 
Modifica dei campi di numerazione automatica standard
Numero articolo Knowledge

000385947

 
Caricamento
Salesforce Help | Article