2012-05-25 3 views
1

주어진 사용자가 읽기 권한을 가진 모든 계정을 쿼리하려면 어떻게해야합니까? 나는 "반 하위의 선택은 쿼리 ID 필드는 사용할 수 없습니다 조인 'recordId를'"다음을 시도했지만, 오류를 반환SalesForce : 사용자가 읽기 권한을 가진 쿼리 개체

User u = new User();  
Account[] account = [SELECT Name FROM Account a 
          WHERE Id IN 
          (
           SELECT RecordId 
           FROM UserRecordAccess 
           WHERE RecordId = :a.Id 
           AND UserId = :u 
           AND HasReadAccess = true 
          ) 
        ]; 

코드가 시스템으로 실행 예약 된 일괄 처리 작업의 일부로 실행되는 그래서 "공유와 함께"사용하는 것은 적용되지 않습니다.

감사

답변

2

세일즈 포스는 documentation recordId를 이상하게 보이는 선택 목록 필드가 있다고 말한다. 하위 목록에서 작동하지 않는 이유를 설명하는 선택 목록 필드 인 경우.

먼저 레코드 ID 집합을 만든 다음이 값을 사용하여 계정 쿼리를 필터링 할 수 있습니다.

Set<ID> sRecordIDs = [SELECT RecordID FROM UserRecordAccess WHERE UserId = :u AND HasReadAccess = True]; 

Account[] accs =[SELECT ID,Name FROM Account WHERE Id in :sRecordIDs]; 

UserRecordAccess의 레코드 수가 많으면 조정자 제한을 초과 할 수 있습니다. 당신은 계정이 작업을 수행하고자하는 경우

+0

제안 해 주셔서 감사합니다. 그러나 단일 쿼리로이 작업을 시도 할 때 응답으로 받아들이지 않을 것입니다. – Jon

0

당신이 시도 할 수 있습니다 : 당신은 사용자가 액세스 할 수있는 또는 소유 한 계정의 모든 레코드를 제공해야

User u = new User(); 
list<Account> accs = [select Id, Name from Account where Id in (select AccountId from AccountShare where UserOrGroupId = :u.Id) or OwnerId = :u.Id]; 

. 일반적인 경우 각 sObject는 일부 방식으로 축퇴되지 않는 한 (즉, 마스터 세부 정보의 세부 사항 인 경우) 자체에 대한 가시성을 나타내는 자체 '공유'sObject를가집니다.