簡體   English   中英

Dynamics 365 CRM 插件 - 無法在托管解決方案中設置兩個選項字段 NULL

[英]Dynamics 365 CRM Plugin - Unable to set two option field NULL in managed solution

我有 2 個環境:開發和測試。 我想實現如下所述的功能:

if (fields.email.getValue() == null) {
    fields.emailAllowed.setValue(null);
    fields.emailAllowed.setRequiredLevel("required");
}
else {
    fields.emailAllowed.setRequiredLevel("none");
}

if (fields.phone.getValue() == null) {
    fields.phoneAllowed.setValue(null);
    fields.phoneAllowed.setRequiredLevel("required");
}
else {
    fields.phoneAllowed.setRequiredLevel("none");
}

此 JavaScript 代碼在 DEV 環境中運行良好,但由於某些未知原因,它沒有在 TEST 環境中保存 NULL 值。

為了支持這一點,我添加了一個新的 CRM 插件,我在其中創建了兩個處理程序:

創建插件 ==> 預驗證
更新插件 ==> 預驗證

在這兩個插件中,我使用的邏輯如下:

// Gets PreImage & Target Image combined
public void Execute()
{
    var combinedTarget = GetCombinedTarget();

    if (combinedTarget == null)
    {
        // log & throw error
    }
    
    MapEmailField(combinedTarget);
    MapPhoneField(combinedTarget);
}

private void MapEmailField(combinedTarget)
{
    // if Email is NULL and EmailAllowed IS NULL
    if(combinedTarget.Metadata.Attributes.Email != null && combinedTarget.Metadata.Attributes.EmailAllowed == null)
    {
        //log & throw error
    }
    else if(combinedTarget.Metadata.Attributes.Email == null)
    {
        combinedTarget.Metadata.Attributes.EmailAllowed = null; // To save NULL value into CRM field
    }
}

// same method for phone field mapping

// save the record

現在在 CRM UI 中,當我更新 email 字段時,它也會自動將 TRUE 值設置為Phone Allowed字段,即使它沒有更改並且我已經在 CRM 插件中外部設置了 NULL 還有 5 個這樣的領域也以同樣的方式受到影響。

相同的更改在 DEV 環境中運行良好,但在 TEST 環境中卻不行。

注意:我已經交叉驗證了 DEV 環境的所有更改都已移至托管解決方案中,並且在 TEST 環境中。

更新 1:

我今天嘗試在TEST環境中調試 JavaScript 更改,並通過它正確更新了記錄。 但是當我關閉調試器並使用新記錄測試相同的場景時,它再次更新了所有記錄!

更新 2:

由於我的 JavaScript function 也在 onLoad 事件中被調用,因此它可以設置 NULL 值,但在常規模式下看起來它無法找到原因,但它是調試的原因。

下面是在 onLoad 事件中執行的 Javascript function:

function handleAllowedFields(dataField, allowedField) {

    return function () {
        if (dataField == null || allowedField == null) {
            return;
        }

        if (dataField.getValue() == null) {
            allowedField.setValue(null);
            allowedField.setRequiredLevel("none");
            allowedField.controls.forEach(function (c) {
                c.setDisabled(true);
            });
        } else {
            // If dataField is having a value, then contact preference fields
            // can have an value as Allow OR DoNotAllow ONLY.
            allowedField.controls.forEach(function (c) {
                c.setDisabled(false);
            });
            allowedField.setRequiredLevel("required");
        }
    }
}

關於如何讓我的 function 等到所有控件在 onLoad 事件中加載到表單上的任何幫助?

如您所知,CRM 兩個選項不足以存儲 NULL 或將其視為可 NULL 的 boolean 字段。 具有兩個值的全局或本地選項集(這允許 NULL) - 這將允許使用 NULL 值開始記錄,並且不需要 javascript 或插件每次都按摩數據。

無論如何,當數據導入發生或平台外的任何東西(如 web api 調用)時,腳本不會觸發 - 所以插件是不錯的選擇。

發現問題。

托管解決方案確實無法為two option type字段保存 NULL 值。 雖然它能夠在非托管解決方案中做到這一點。

除此之外,我發現在 JavaScript 中的 onSave 事件之后沒有執行 onLoad 事件,這就是問題背后的原因。

因此,我作為解決方案所做的是在表單上的modifiedon字段中添加了一個 onChange 事件,它就像黃油一樣工作。

PS:我沒有使用OptionSet而不是TwoOptionSet字段,以便客戶可以正確使用默認字段來處理其他所有內置功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM