Skip to content

Comment savoir si un champ fait partie d’un champ d’adresse composé et n’est donc pas autorisé

Solution:

Il existe un moyen simple de déterminer si le champ est un champ réel ou une partie d’un champ composé.

Il existe deux tables dans Salesforce qui correspondent aux champs composés et à ses composants.

Si un champ peut être trouvé dans la table FieldDefinition, il s’agit d’un champ réel (autorisé). Si un champ est introuvable dans la table FieldDefinition, mais peut être trouvé dans la table EntityParticle, il fait partie d’un champ composé et non d’un champ indépendant séparé.

Ainsi, vous pouvez facilement détecter si le champ fait partie d’un champ composé en effectuant une requête.

SELECT BusinessOwnerId,BusinessStatus,ControllingFieldDefinitionId,DataType,Description,DeveloperName,DurableId,EntityDefinitionId,ExtraTypeInfo,Id,IsApiFilterable,IsApiGroupable,IsApiSortable,IsCalculated,IsCompactLayoutable,IsCompound,IsFieldHistoryTracked,IsHighScaleNumber,IsHtmlFormatted,IsIndexed,IsListFilterable,IsListSortable,IsListVisible,IsNameField,IsNillable,IsPolymorphicForeignKey,IsSearchPrefilterable,IsWorkflowFilterable,Label,LastModifiedById,LastModifiedDate,Length,MasterLabel,NamespacePrefix,Precision,PublisherId,QualifiedApiName,ReferenceTargetField,ReferenceTo,RelationshipName,RunningUserFieldAccessId,Scale,SecurityClassification,ServiceDataTypeId,ValueTypeId FROM FieldDefinition where DurableId = 'Contact.MailingStreet'

ou, tout simplement,

SELECT DeveloperName,DurableId,EntityDefinitionId FROM FieldDefinition where DurableId = 'Contact.MailingStreet'

Étant donné que cette requête ne renvoie aucun résultat,

entrez la description de l'image ici

cela signifie qu’il n’y a pas de définition de champ avec le nom MailingStreet au Contact.

Pour être sûr qu’il n’y a pas de tel champ si vous essayez d’adopter cette logique pour les champs personnalisés, vous pouvez modifier les critères de filtre pour inclure QualifiedApiName

SELECT DurableId FROM FieldDefinition where EntityDefinitionId = 'Contact' AND QualifiedApiName="MailingStreet"

entrez la description de l'image ici

Alors que pour un champ réel comme l’adresse postale, la requête similaire renverrait le résultat

entrez la description de l'image ici

Pour rechercher toutes les parties de champ des champs composés, interrogez la table EntityParticle.

SELECT ByteLength,DataType,DefaultValueFormula,DeveloperName,Digits,DurableId,EntityDefinitionId,ExtraTypeInfo,FieldDefinitionId,Id,InlineHelpText,IsApiFilterable,IsApiGroupable,IsApiSortable,IsAutonumber,IsCalculated,IsCaseSensitive,IsCompactLayoutable,IsComponent,IsCompound,IsCreatable,IsDefaultedOnCreate,IsDependentPicklist,IsDeprecatedAndHidden,IsDisplayLocationInDecimal,IsEncrypted,IsFieldHistoryTracked,IsHighScaleNumber,IsHtmlFormatted,IsIdLookup,IsLayoutable,IsListVisible,IsNameField,IsNamePointing,IsNillable,IsPermissionable,IsUnique,IsUpdatable,IsWorkflowFilterable,IsWriteRequiresMasterRead,Label,Length,Mask,MaskType,MasterLabel,Name,NamespacePrefix,Precision,QualifiedApiName,ReferenceTargetField,ReferenceTo,RelationshipName,RelationshipOrder,Scale,ServiceDataTypeId,ValueTypeId FROM EntityParticle where EntityDefinitionId = 'Contact' and IsCompound = false AND FieldDefinitionId IN (
SELECT DurableId FROM 
FieldDefinition
where IsCompound = true)

Étant donné que vous pouvez trouver l’enregistrement MailingStreet dans ces résultats, vous pouvez confirmer qu’il fait vraiment partie du champ composé.
entrez la description de l'image ici

Je pense encore mieux de vérifier la propriété `IsComponent’ seule.

SELECT DataType,DeveloperName,DurableId,EntityDefinitionId,FieldDefinitionId,IsComponent,IsCompound,Label,Name,QualifiedApiName
FROM EntityParticle
where EntityDefinitionId = 'Contact' and IsComponent = true

Cette requête est donc plus simple et renvoie les mêmes 23 résultats.

entrez la description de l'image ici

Il est même possible d’exécuter une requête pour renvoyer cet enregistrement sans connaître son filtrage DurableId par QualifiedApiName, Name ou Label comme ceci :

SELECT DataType,DeveloperName,DurableId,EntityDefinitionId,FieldDefinitionId,IsComponent,IsCompound,Label,Name,QualifiedApiName
FROM EntityParticle
where EntityDefinitionId = 'Contact' AND QualifiedApiName="MailingStreet"

entrez la description de l'image ici

En outre, une autre façon de savoir si le champ est un composant d’un champ composé sans effectuer de requêtes SOQL consiste à vérifier la méthode getCompoundFieldName() sur le résultat fieldDescribe. Il renvoie un nom de champ composé pour un composant d’un champ composé et renvoie null dans les autres cas.

System.debug(LoggingLevel.ERROR, '@@@ v: ' + Test__c.Geolocation__Latitude__s.getDescribe().getCompoundFieldName() );
System.debug(LoggingLevel.ERROR, '@@@ v: ' + Test__c.Geolocation__c.getDescribe().getCompoundFieldName() );
System.debug(LoggingLevel.ERROR, '@@@ v: ' + Contact.MailingStreet.getDescribe().getCompoundFieldName() );
System.debug(LoggingLevel.ERROR, '@@@ v: ' + Contact.MailingAddress.getDescribe().getCompoundFieldName() );

entrez la description de l'image ici

Alors au lieu de vérifier Contact.MailingStreet.getDescribe().isPermissionable() tu peux vérifier Contact.MailingStreet.getDescribe().isPermissionable() && Contact.MailingStreet.getDescribe().getCompoundFieldName() == null



Articles Similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *