Loading

Erreur « Impossible de changer le type de champ » pour le champ de numérotation automatique

Date de publication: Dec 20, 2024
Description

La modification du type de données d'un champ de numérotation automatique référencé dans du code Apex renvoie l'erreur suivante :

Erreurs de validation lors de la sauvegarde des enregistrements. Des erreurs de validation personnalisées ont eu lieu lors de la sauvegarde des enregistrements concernés. La première erreur de validation rencontrée était « Impossible de modifier le type de champ d'un champ personnalisé référencé dans une classe ou un déclencheur Apex : AutoNumberTestMsg".

Généralement, ce type de problème se produit lors d'une migration de données vers une nouvelle organisation, s'il existe un champ de numérotation automatique et qu'il est référencé dans des déclencheurs et du code Apex. Cependant, pour charger ce champ, vous devez définir le type sur Texte, le charger, puis le modifier de nouveau. Le code Apex empêchera toutefois le changement du type de données. 
 
Certains des problèmes de déploiement Force.com les plus complexes auxquels sont confrontés les clients impliquent des champs personnalisés de type Numérotation automatique. Les valeurs de ces champs ne peuvent pas être mises à jour sans définir provisoirement leur type sur Texte. Cependant, si le champ est référencé dans du code Apex, le type ne peut pas du tout être modifié !
Il est possible de contourner ce problème à l'aide d'une requête SOQL dynamique, et des méthodes get() et put().
Résolution

Pour illustrer cette technique, créez un objet personnalisé AutoNumberTest__c de test. L'objet doit avoir un champ personnalisé unique appelé « autonumber__c » de type Numérotation automatique. Après avoir créé l'objet, vous pouvez essayer de démontrer qu'il est possible de faire passer librement le type du champ Autonumber__c de Numérotation automatique à Texte, puis de nouveau à Numérotation automatique, ce qui permet d'autoriser les mises à jour nécessaires dans le cadre de la conversion ou des récupérations. Notez que cette technique ne s'applique pas au champ Nom standard défini sur Numérotation automatique. Les champs de nom sont traités différemment des champs personnalisés, et l'attribut de numérotation automatique du champ de nom peut être modifié sans rencontrer de problèmes avec la vérification de type du compilateur Apex. Élaborez maintenant un déclencheur après l'insertion ou la mise à jour d'un objet AutoNumberTest__c qui référence la colonne autonumber__c. L'exemple de code ci-dessous utilise le champ pour créer un objet Note et le joindre à l'objet AutoNumberTest__c.
 
trigger AutoNumberTestMsg      on AutoNumberTest__c (after insert, after update) {  List newNotes = new List();  pour (AutoNumberTest__c a : Trigger.new ) {    Note msg = new Note(      parentId = a.id,      title = '' + a.autonumber__c,      body = '' + a    );    newNotes.add(msg);  }  insert newNotes;}
 
Ce code itère toutes les nouvelles valeurs dans le lot de déclencheurs, crée un objet Note contenant une représentation de chaîne de l'objet AutoNumberTest__c et, après avoir mis en boucle tous les objets, insère les nouvelles notes dans une seule instruction DML. (L'expression '' + a.autonumber__c renvoie une représentation de chaîne du champ de la valeur autonumber__c.) Après avoir créé ce déclencheur, la tentative de modification du type de colonne Numérotation automatique entraîne l'erreur suivante :
 
Erreurs de validation lors de la sauvegarde des enregistrements
Des erreurs de validation personnalisées ont eu lieu
lors de la sauvegarde des enregistrements concernés. La première
erreur de validation rencontrée était « Impossible de modifier le type de champ d'un
champ personnalisé référencé dans une classe ou un déclencheur Apex :
AutoNumberTestMsg".
 
Dans cet exemple, il est facile de commenter le code existant, de modifier le type de champ pour gérer les valeurs de données, puis de supprimer les commentaires sur le code. Ces actions sont rarement faciles et parfois presque impossibles lorsqu'il s'agit d'une promotion ou lorsque le code dépendant est plus complexe.
L'introduction dans la version Winter '09 des méthodes Object.get() et Object.put() offre une nouvelle alternative. Nous pouvons remplacer l'expression a.autonumber__c par g.get('autonumber__c') et échapper le compilateur !
Le nouveau déclencheur est le suivant :
 
trigger AutoNumberTestMsg      on AutoNumberTest__c (after insert, after update) {  List newNotes = new List();  pour (AutoNumberTest__c a : Trigger.new ) {    Note msg = new Note(      parentId = a.id,      title = '' + a.get('autonumber__c'),      body = '' + a    );    newNotes.add(msg);  }  insert newNotes;}
 
Il est maintenant possible de modifier le type de la colonne autonumber__c sans générer d'erreur.
Bien entendu, cette modification nous expose à une nouvelle classe d'erreurs d'exécution que le compilateur aurait normalement empêchées. Par exemple, si nous changeons le nom d'API du champ autonumber__c sans changer le déclencheur, le code entraîne une exception d'exécution.
Dans des situations plus réalistes, les modifications requises sont généralement plus complexes et présentent des risques plus importants de problèmes d'exécution.
Par exemple, si nous utilisons une expression SOQL telle que :
List aList =    [select id, autonumber__c from AutoNumberTest__c];
 
Nous rencontrerons la même restriction appliquée par le compilateur en modifiant le type du champ de numérotation automatique. Nous devons utiliser une requête SOQL dynamique et la méthode Database.query() afin d'éviter la référence directe du compilateur au champ.
 
List aList =    Database.query('select id, autonumber__c from AutoNumberTest__c');
 
Le fait de passer à des requêtes SOQL dynamiques peut être complexe et plus difficile à gérer. (Avec la version Spring '09, nous pouvons utiliser l'interpolation « : » dans les requêtes SOQL dynamiques, ce qui facilite la tâche.) Cependant, dans les cas où il est nécessaire de modifier provisoirement un champ Numérotation automatique pour effectuer des mises à jour, le fait de passer à des requêtes SOQL dynamiques est beaucoup plus facile que de gérer les contraintes qui étaient nécessaires par le passé !  

Voir aussi : 
Modifications des champs de numérotation automatique standard
Numéro d’article de la base de connaissances

000385947

 
Chargement
Salesforce Help | Article