發表文章

目前顯示的是有「SOQL」標籤的文章

如何在 SOQL 中將日期照著年份或月份分組 How to group by year or month in SOQL?

範例 SELECT count(id), CALENDAR_YEAR(createddate )  FROM Opportunity  group by CALENDAR_YEAR(createddate )  其它你可能不知道但很好用的 SOQL 函數 Count_Distinct() HOUR_IN_DAY() GROUPING() <---用來算 subtotal 的 參考資料 Aggregate Functions https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_agg_functions.htm Date Functions https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_date_functions.htm

抓出 Queue 裡面所有的 User / Get All Users in a Queue

想抓出 Queue 裡面所有的 User? 在最簡單的情況下,queue 裡面裝的如果全是 user ,那就只要用 SOQL 去撈即可。 但是有一點超乎直覺的是,當我們要從 Group 裡抓出 GroupMember,只要 SELECT GroupId,Id,UserOrGroupId FROM GroupMember WHERE GroupId = '00Gxxxxxxxxxxxxxxx' 可是 Salesforce 裡不但沒有 QueueMember 這個 object,甚至也沒有 Queue 這個 object。不知道要去哪裡查 queue Id。 蛤?為什麼 queue 沒有 object? 因為所謂的 queue,其實就是一種特別的 group。 所以上面那行 SOQL 是完全通用的。 SELECT GroupId,Id,UserOrGroupId FROM GroupMember WHERE GroupId = '00Gxxxxxxxxxxxxxxx' 此處 criteria 的 GroupId,其實代表的也是 queue 的 Id。 queue 的 Id,的確也是 00G 開頭的,是貨真價實的 Group 無誤。 那如果想撈的目標 group 裡面不單只有 user 怎麼辦? 如果 group 裡全都是直接裝著 user record,那上面的 SOQL 就很夠用了。但是 Group 裡面除了直接裝 user,還有可能也裝著別的 sub group。 這時候你就需要往下挖一層,再做一次: SELECT GroupId,Id,UserOrGroupId FROM GroupMember WHERE GroupId = ' sub_group_id ' (視情況需要,你可能要不斷地挖上好幾層,直到沒有 sub group 為止) 更複雜一點的情況是: group 裡還可以裝 UserRole。 而且 UserRole 還會有一個對應 00G  開頭的 Id,以致於它躲在 GroupMember 裡的時候,看起來就是一個普通的 Group。結果你嘗試用 UserRole 的 00G Id 一撈, SELECT GroupId,Id,UserOrGroupId FROM GroupMember WHERE ...

如何大規模地更新各 profile 對於某個 object 的 record type 的存取權限 How to mass update record type visibility for every profile?

圖片
情境說明 之前有一篇談到 如何快速用 SOQL 撈出哪些 Profile / Permission Set 有權限對某特定 Object 做 Create/Read/Update/Delete 那篇的主題是針對 object record的 CRUD 在討論。但今天我們有另一個不同的面向要處理:如何大規模地查看或更新各 profile 對於某個 object 的 record type 的存取權限。 這又是一個獨立的設定了。不是 record 層級的設定,也不是 Field-Level Security 的設定。是 Record Type 的設定。 若只是要更動一兩個 profile 的 record type access permission 倒也不難,網頁上滑鼠點一點即可。但如果今天我們需要大模模更動呢? 例如我們有某一個既有的Opportunity Record Type,想要一次開給所有 Profile 都能有存取權限。或是反過來,想要讓僅一兩個 Profile 擁有存取權限,其它通通都不準看到。 難道我們要一個個點進每一個 Profile 去慢慢檢查、慢慢設定嗎? 此處提供一個沒那麼辛苦的解法。 解法概念 用 SFDX 下載 Profile and Record Type 的 XML 檔 用 Visual Studio Code 尋找、大量取代 Deploy 回 Salesforce 解法細節     第0步,把Visual Studio Code 和 SFDX 環境設定好。 用 SFDX 下載 Profile and Record Type 的 XML 檔 準備同時包含 Profile 和 RecordType的 XML package.xml <? xml version = "1.0" encoding = "UTF-8" standalone = "yes" ?> < Package xmlns = "http://soap.sforce.com/2006/04/metadata" > < types > < members > * </ members > ...

如何下載Event Log File / How to Download EventLogFile

 這一篇會用三言兩語簡述一下Event Log File的概念,然後列一些 document 及resource 供參。 重點提要 Salesforce 有一個 object 叫做 EventLogFile。存放著 Event Log File 的 record SOQL sample:  SELECT EventType,Id,LogDate FROM EventLogFile 注意:這裡存的是 Log File 的 record,並不是 Log 本身。如果想要細看 Log ,需要把 Log File 下載下來。 依照你付給 Salesforce 的費用多寡,能查看的歷史 Log 範圍也有所不同。從一天到三十天不等。 The event types you can access and how long the files remain available depends on your Salesforce edition. - Developer Edition organizations have free access to all log types with 1-day data retention. - Enterprise, Unlimited, and Performance Edition organizations have free access to the insecure external assets, login, logout, and total API usage event log files with 1-day data retention. For an extra cost, you can access all log file types with 30-day data retention. 不同類型的 Log 會分門別類存放,可用 EventType 做篩選。有約50種 EventType。在此列出常用的幾種: ApexExecution ApexTrigger KnowledgeArticleView LightningPageView PackageInstall Report ReportExport Search VisualforceRequest Log File 下載方式...

Workbench Error: Parent relationship queries are disabled in Workbench

圖片
Error 症狀  Parent relationship queries are disabled in Workbench: Case.foo__c Due to issues rendering query results, parent relationship queries are disabled by default. If you understand these limitations, parent relationship queries can be enabled under Settings. Alternatively, parent relationship queries can be run with REST Explorer under the Utilities menu without issue. 解法 Solution 從workbench上方的選單進Setting 捲到下方把這個勾起來:Allows SOQL Parent Relationship Queries

如何快速用 SOQL 撈出哪些 Profile / Permission Set 有權限對某特定 Object 做 Create/Read/Update/Delete

案例情境 想找出哪些 Profile / Permission Set 有權限在 TSN__c  這個 object create record. 操作步驟 步驟一 SELECT Parent.label, PermissionsCreate,SobjectType  FROM ObjectPermissions  WHERE SobjectType = 'TSN__c' AND PermissionsCreate = true order by Parent.label 補充說明: ParentId這一欄存的為 0PS 開頭的 Id,可以代表對應的 Profile 或 Permission Set。 若對應的是 Permission Set,則SELECT Parent.Label 可以直接顯示出該 Permission Set 的名稱。 若對應的是 Profile,則 Parent.Label 欄位會顯示出該 Profile 的 Id (00e開頭的Id)。 步驟二 拿著步驟一得到的 Profile Id,再去進行二次 Query: SELECT Id, Name  FROM Profile  WHERE Id IN ('00e0B000000FXXXXXX', '00e0B000000FYYYYYY', '00e4T000000MZZZZZZ') 步驟三 (optional) 若需要進一步查看這些 Profile / Permission 下有哪些個體 User,則可再 query User object 或 PermissionSetAssignment object。

如何在 Visual Studio Code 或是 PowerShell下指令來 query data 並存成 CSV檔? How to query data by SOQL and save it as a csv by SFDX?

前言 最近 workbench 經常出現 Application Error,令人抓狂。 (參考文章: workbench 一直出現 Application error ) 有一個不算是完美的替代方案,就是使用 Visual Studio Code 的 SOQL Query Builder ( Visual Studio Code now includes a SOQL Builder . Try it today!  ) 其中一個不完美的點就是,export csv/json 的時候只能匯出2000筆…… 這實在是個硬傷。 在此提供另一個不使用 workbench 也不用 Query Builder,一樣可以匯出 csv 的方法。 做法 請打開 PowerShell (可以在 VS Code 裡的 terminal,也可以直接在 Windows 開 PowerShell。 並修改以下 sample code後執行: sfdx force:data:soql:query -q "SELECT Id FROM Contact  WHERE createddate = last_n_days:1" -r "csv" -u <Salesforce Username> | out-file -encoding utf8 "Latest Contact.csv" 即可。

快速查詢有哪些 Permission Set 有開啟了某 Apex Class/Visualforce Page 的權限

情境  假設我現有一個 Visualforce Page 叫做 MyVFPage,而有一個 user 打開這一頁會出現權限不足的錯誤頁面。所以我需要開權限給他。 而我已知曾經有某一個 Permission Set 有包含到這個 Visualforce Page Access,所以我理應不需要再重新 create 一個新的 Permission Set,只要找到舊的這個 Permission Set 並 assign 給該 user 即可。 但是我忘記這個既有的 Permission Set 叫什麼名字了…… 目前有數十個上百個 Permission Set,我總不能一個一個點開來檢查確認吧。 有沒有快速的查詢方法呢? 解法 1. 取得該 Visualforce Page的 Id SELECT Id, Name FROM ApexPage WHERE Name = 'MyVFPage' 2. 拿 Visualforce Page 的 Id 再去  SetupEntityAccess query SELECT Id, ParentId, SetupEntityId, SetupEntityType FROM SetupEntityAccess  WHERE SetupEntityId = '<MyVFPage Id>' 此時的 ParentId 即是答案,是包含了該 page access 權限的所有 Permission Set/Profile。 但 Id 不易閱讀理解,可以再做下一步驟取得 Name。 3. 拿 0PS 開頭的 Id 去 PermissionSet query,即可得到名稱。 SELECT Description, Id, Name Profile.name, Type FROM PermissionSet  WHERE  Id IN ('0PSXXXXXXXXXXXXXXX', ' 0PSXXXXXXXXXXXXXXX ', ' 0PSXXXXXXXXXXXXXXX ') 

快速查詢某個 User 是否對某個 Object 具有 Create/Read/Update/Delete 權限 (SELECT FROM UserEntityAccess)

圖片
以查詢某個user對 Account 和 Contact 的權限為例: SELECT DurableId,EntityDefinitionId,IsCreatable,IsDeletable,IsEditable,IsReadable,IsUpdatable  FROM UserEntityAccess  WHERE UserId = '<UserId>' AND EntityDefinitionId IN ('Account','Contact') 如果要查的是 Custom Object,則需要先找出該 Object 的 DurableId: SELECT DurableId FROM EntityDefinition where QualifiedApiName = 'CustomObject__c' 得到 DurableId 後,再到 UserEntityAccess 去 Query: SELECT DurableId,EntityDefinitionId,IsCreatable,IsDeletable,IsEditable,IsReadable,IsUpdatable  FROM UserEntityAccess  WHERE UserId = '<UserId>' AND EntityDefinitionId LIKE '<DurableId >%' 

你知道 Feature License 的 Flow User,它的API name是什麼嗎?

前情提要 要能夠 Run Flow,是需要特別的權限的。它是一個 Feature License,就像是 Knowledge User, Marketing User, Service Cloud User, etc.一樣,可以在 User page 上去把 Flow User 勾起來即可獲得這個 License。 在Company Information裡面就可以看到各Feature License消耗的數量,但如果想要更進一步了解到底是哪些 User 用掉了這個 License,該怎麼做呢? 是的,非常直覺的做法,就是透過 SOQL 去到 User object 做個 Query: SELECT {Flow User} FROM User WHERE {Flow User} = TRUE 那麼,到底要 SELECT 什麼 Field 呢? 選擇題 User object裡的field也沒幾個,我列幾個出來,你就從裡面猜一個吧。 UserPermissionsAvantgoUser UserPermissionsCallCenterAutoLogin UserPermissionsChatterAnswersUser UserPermissionsInteractionUser UserPermissionsKnowledgeUser UserPermissionsLiveAgentUser UserPermissionsMarketingUser UserPermissionsOfflineUser UserPermissionsSFContentUser UserPermissionsSupportUser UserPermissionsWorkDotComUserFeature 以上皆非 解答 先來個防雷頁,以免有人需要思考一下。 . . . . . . . . . . . . . . . . . . . . . . . . 答案是UserPermissionsInteractionUser。 "Once you eliminate the impossible, whatever remains, no matter how improbable, must be the truth."  當你把所有不可能的選項都排除了,剩下的那個再怎...

如何以SOQL撈出資料來比對兩個Permission Set的異同

就這三個關鍵object: PermissionSet PermissionSetAssignment ObjectPermissions 有這三個object名稱,應該就夠自己摸索出來了。 這邊再提供幾個Salesforce官方的範例 SELECT Assignee.Name, PermissionSet.Id, PermissionSet.isOwnedByProfile, PermissionSet.Profile.Name, PermissionSet.Label FROM PermissionSetAssignment WHERE PermissionSetId IN ( SELECT ParentId FROM ObjectPermissions WHERE SObjectType = 'Account' AND PermissionsRead = true ) SELECT Id, SObjectType, PermissionsRead, Parent.label, Parent.IsOwnedByProfile FROM ObjectPermissions WHERE (ParentId IN ( SELECT PermissionSetId FROM PermissionSetAssignment WHERE Assignee.Name = 'John Doe' )) AND (PermissionsRead = true ) AND (SobjectType = 'Account' ) 參考資料在此 Using SOQL to Determine Your Force.com User’s Permissions

不要用把query/DML寫在迴圈裡,以避免超過系統限制的基本技巧範例

Trailhead教學-Bulk Apex  關於什麼是有效率的code,什麼是浪費資源的code。 其中解釋了: 在trigger中預設使用迴圈來處理bulk,而非逐筆record處理。 用inner query的技巧,直接獲得各account的related opportunity SELECT ... FROM ... WHERE ... IN ...(set)    例:[ SELECT Id , Name , CloseDate FROM Opportunity WHERE AccountId IN : Trigger . New ]。 也可以使用NOT IN,例: [ SELECT Id , Name FROM Account WHERE Id IN : Trigger . New AND Id NOT IN ( SELECT AccountId FROM Opportunity ) ] update/insert整個list,而不要逐筆record操作,以避免DML超過150的限制。