In Salesforce, the only way to control fields visibility by a page layout is to create several layouts and assign them to profiles.

But sometimes, users with the same role mustn’t see specific fields.

Let’s take an use case :

Each sales representative in a company have their own accounts. A sales representative can create a related record from his account such as a Project (a custom object in my example).

Everyone can see all accounts and all linked projects : this is the purpose of a CRM 360° view. Account and Project objects are public read-only.
BUT I need that some Project fields have a restricted visibility : eg total amount or the margin on the project. The need is that these fields are only visible to the sale representative who owns the record and to some users with specific roles.

What is the solution without creating a Visual Force page ?

FOUND SOLUTION : creating a formula field for each field which need to be hidden.

This field will copy the value of the field needed to be hidden, and display the value  « 0.00 » if the user’s role does not give him the right to see it.
For example, I want the field « Total Amount » on Project object to be  visible only for the record owner and for users with « East sales team » « and » Director, Direct Sales  » roles.
A formula field with a currency type can be created :

IF (OR ($ UserRole.Name = « East sales team »
$ UserRole.Name = « Director, Direct Sales »
$ User.Id = ownerid)
Total_Amount__c,
0)

An user with the Eastern Sales role can see the field value :  

articlescreen1


An other user, with the “Western sales team » role will see the  value “0,00” displayed :

articlescreen2

Now, let’s remove the total amount field from the layout !

Version française

Comment masquer des champs d’un layout selon les rôles ?

Dans Salesforce, la seule possibilité de contrôler les présentations de page (les layouts) est de créer plusieurs layouts pour un objet, que l’on attribue ensuite à des profils.

Mais des utilisateurs ayant le même rôle ne doivent pas toujours voir les mêmes champs sur un objet.

Prenons un exemple :

Les commerciaux d’une société ont leur propre portefeuille client. Chaque commercial est propriétaire des comptes qu’il gère. A partir d’un compte, le commercial peut créer des enregistrements liés, par exemple des projets (qui sera un objet personnalisé).

Tout le monde peut voir les comptes des autres et les projets liés : c’est le but d’une vue client à 360° dans un CRM. Les objets Compte et Projet sont en public read only.

Par contre, je souhaite que certains champs de mon objet Projet aient une visibilité réduite : par exemple le montant ou encore la marge réalisée sur ce projet. En fait, je veux que ces champs soient uniquement visibles pour le commercial qui est propriétaire du projet et pour d’autres utilisateurs ayant des rôles particuliers.

Comment faire sans passer par une page Visual Force ?

SOLUTION TROUVEE :  créer un champ formule pour chaque champ “à masquer”.

Ce champ va recopier la valeur du champ à masquer, ou afficher la valeur  “0,00” si le rôle de l’utilisateur ne lui en donne pas le droit.

Par exemple, je veux que mon champ “Total Amount” sur mon objet personnalisé Projet, soit visible uniquement pour le propriétaire de l’enregistrement et pour les rôles “Eastern Sales Team” ” et “Director, Direct Sales”.

Le champ à créer ici est un champ formule (type currency) :

IF(OR($UserRole.Name = « Eastern Sales Team « ,

$UserRole.Name = « Director, Direct Sales »,

$User.Id = OwnerId ),

Total_Amount__c  ,

0)

Un utilisateur ayant le rôle Eastern Sales Team voit  bien la valeur de ce champ :

articlescreen1

Un autre utilisateur, qui a un rôle “Western Sales team” verra la valeur “0,00” s’afficher :

articlescreen2

 

Il ne me reste plus qu’à retirer le champ Total amount du layout, et afficher le champ formule Total Amount Copy.