salesforce零基礎學習(一百二十六) Picklist Value Set 優缺點和使用探討

2023-03-06 06:01:12

本篇參考: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情況下使用,否則後續容易出現上述型別的潛在風險,並且後續的改動成本以及部署成本會增加。篇中有錯誤歡迎指出,有不懂歡迎留言。