You need to sign in to do that
Don't have an account?
EdCode
Alternative to the "Sharing" standard button on Page Layout
Hi,
I need to know why is a Account record visible by a User.
I usually leverage the standard "Sharing" button provided by Salesforce Classic.
But, my client has a Visualforce page associated with Account instead of Page Layout, so I cannot use this "Sharing" button.
Also, when going to Lightning, the button is not available in Lightning yet.
When I SOQL query the AccountShare obj. and query the columns Account.Name, AccountAccessLevel, RowCause, UserOrGroup.Name, the information returned by this query is "system context", not "User Context" which is what I really need.
What alternative solution can you think of?
Thank you
I need to know why is a Account record visible by a User.
I usually leverage the standard "Sharing" button provided by Salesforce Classic.
But, my client has a Visualforce page associated with Account instead of Page Layout, so I cannot use this "Sharing" button.
Also, when going to Lightning, the button is not available in Lightning yet.
When I SOQL query the AccountShare obj. and query the columns Account.Name, AccountAccessLevel, RowCause, UserOrGroup.Name, the information returned by this query is "system context", not "User Context" which is what I really need.
What alternative solution can you think of?
Thank you
'Sharing' button is not available in Lightning Experience as per https://help.salesforce.com/articleView?id=000339349&type=1&mode=1
For workarounds, you can refer https://salesforcediaries.com/2019/11/06/sharing-button-in-lightning-experience/
The behavior your are seeing with SOQL query the AccountShare obj is working as designed
a) Standard controllers are executed using permission level = user mode (respect the permissions, field-level security) and sharing level = user mode (sharing rules of the current user are enforced)
b) Custom controllers and extensions are executed using permission level = system mode (in which the object and field-level permissions of the current users are ignored). The optional "sharing" clause used will define the sharing level, that's it, if "with sharing" is selected sharing level = user mode (sharing rules of the current user are enforced), otherwise sharing rules for the user will be ignored.
c) In the context of System.runAs(), permission level = user mode is forced and sharing level = user mode (outside of the context of a controller or in the context of a controller if without sharing is not specified) and system mode (in the context of a controller if without sharing is specified).
Example:
-----------
Test:
@istest
private class TestingUserContext {
public static testmethod void test1() { User u = [select id from user where id = '005200000012QNO']; system.debug([select count() from account]);
System.runas(u) {
system.debug([select count() from account]); UserMode um = new UserMode(); system.debug(um.myCount); } } }
Controller:
public without sharing class UserMode { public Integer myCount { get { Integer i = [select count() from contact]; return i; } set; } }
Debug logs:
09:26:03.496 (496272000)|CODE_UNIT_STARTED|[EXTERNAL]|01p20000000MFFQ|TestingUserContext.test1
...
09:26:03.986 (986055000)|SOQL_EXECUTE_BEGIN|[5]|Aggregations:0|select count() from account
09:26:03.989 (989357000)|SOQL_EXECUTE_END|[5]|Rows:45 // ##### sharing level = system mode on line 5
09:26:04.104 (1104790000)|USER_DEBUG|[5]|DEBUG|45
09:26:04.304 (1304631000)|SOQL_EXECUTE_BEGIN|[7]|Aggregations:0|select count() from account
09:26:04.417 (1417404000)|SOQL_EXECUTE_END|[7]|Rows:2 // ##### sharing level = user mode (system.runas()) on line 6
09:26:04.417 (1417692000)|USER_DEBUG|[7]|DEBUG|2
09:26:04.428 (1428437000)|METHOD_ENTRY|[1]|01p20000000MFFV|UserMode.UserMode()
...
09:26:04.437 (1437482000)|SOQL_EXECUTE_BEGIN|[4]|Aggregations:0|select count() from contact
09:26:04.491 (1491438000)|SOQL_EXECUTE_END|[4]|Rows:34 // ##### sharing level = system mode (without sharing used)
Anudeep