本篇參考:https://help.salesforce.com/s/articleView?id=sf.fields_creating_global_picklists.htm&type=5
當我們建立Picklist 欄位時,比如很多表很多欄位都會用到同樣的 picklist value時,我們通常會使用 Global Picklist。入口為 set up搜尋 picklsit以後選擇 Picklist Value Sets然後針對業務上需要的場景,進行欄位建立以及picklist value維護。
當我們建立picklist型別欄位,可以選擇基於 global picklist還是基於換行的手動輸入。
我們以這兩個型別進行metadata檢視
針對 Code_By_Customize__c,此欄位透過換行方式去輸入。
<?xml version="1.0" encoding="UTF-8"?> <CustomField xmlns="http://soap.sforce.com/2006/04/metadata"> <fullName>Code_By_Customize__c</fullName> <externalId>false</externalId> <label>Code By Customize</label> <required>false</required> <trackFeedHistory>false</trackFeedHistory> <type>Picklist</type> <valueSet> <restricted>true</restricted> <valueSetDefinition> <sorted>true</sorted> <value> <fullName>AAA</fullName> <default>false</default> <label>AAA</label> </value> <value> <fullName>BBB</fullName> <default>false</default> <label>BBB</label> </value> <value> <fullName>CCC</fullName> <default>false</default> <label>CCC</label> </value> <value> <fullName>DDD</fullName> <default>false</default> <label>DDD</label> </value> <value> <fullName>EEE</fullName> <default>false</default> <label>EEE</label> </value> <value> <fullName>FFF</fullName> <default>false</default> <label>FFF</label> </value> <value> <fullName>GGG</fullName> <default>false</default> <label>GGG</label> </value> </valueSetDefinition> </valueSet> </CustomField>
針對Code_By_Global_List__c,此欄位用於選擇指定的picklist value set。
<?xml version="1.0" encoding="UTF-8"?> <CustomField xmlns="http://soap.sforce.com/2006/04/metadata"> <fullName>Code_By_Global_List__c</fullName> <externalId>false</externalId> <label>Code By Global List</label> <required>false</required> <trackFeedHistory>false</trackFeedHistory> <type>Picklist</type> <valueSet> <restricted>true</restricted> <valueSetName>Code</valueSetName> </valueSet> </CustomField>
Picklist Value Set的好處是一個地方維護,其他地方引用就好,維護方便,並且如果針對這個 picklist value有變更,只需要改動一個地方,其他的便會自動的使用最新的版本的值。
壞處往往也來源於好處,因為繫結的太狠,所以當最開始的設計滿足了 picklist value set的需求,picklist欄位都繫結了同樣的picklist value set,後續如果有其他的需要要求有一些新增一個欄位值,有一些不新增的時候,便帶來了特別大的痛苦(不要以為是小機率事件,隨著時間推移,需求增多,這種往往是會發生的,除非設計人員最開始就會告知有此種風險)。比如現在需要新增一個 III的值,有一些欄位需要,有一些不需要,這種就很難處理。
一旦發生了這種情況,兩種解決方案。
1. 刪除原有欄位,新建欄位(需要先註釋掉所有的欄位的引用)。這種解決方案在部署的時候同樣痛苦,因為無論是change set還是 ant方式都無法直接部署上去,會報錯:Error: Cannot set picklist values when a global picklist is referenced on the field
參考:https://success.salesforce.com/issues_view?id=a1p3A0000008g7wQAA (類似錯誤)
只能先將生產或者其他環境的刪除,然後在做部署。除此以外,當刪除操作以後,還會影響以前報表(如果有報表使用了此欄位,刪除再重新建立,原有報表內容不會自動的追加回來)
2. 需要保證使用 global picklist value set的欄位所在的表擁有 record type. 當 picklist value set中新建 value時,下方會選擇是否將新加的值預設給引用到 picklist value set的表的所有 record type,可以先將它反選,然後對於需要的欄位,進行配置即可。這個也需要前提條件,就是保證表有record type。
總結:使用與否都是雙刃劍,當時滿足的需求,隨著後續的變更可能改修成本更高,所以使用以前想好場景,想好後續如果擴充套件所需要的解決方案。針對 global picklist value set的使用,個人建議還是當前表有 record type情況下使用,否則後續容易出現上述型別的潛在風險,並且後續的改動成本以及部署成本會增加。篇中有錯誤歡迎指出,有不懂歡迎留言。