Плагин Dynamics 365 CRM - Невозможно задать два поля параметра NULL в управляемом решении - PullRequest
1 голос
/ 06 ноября 2019

У меня есть 2 среды: DEV & TEST. Я хочу добиться функциональности, как указано ниже:

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, но по неизвестной причине он NOT сохраняет значение NULL в среде TEST.

Для поддержки этого я добавил новый плагин CRM, в котором я создал два обработчика:

Создать плагин ==> PreValidation
Обновить плагин ==> PreValidation

В обоих этих плагинах я использую логику, как показано ниже:

// 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, когда я обновляю поле электронной почты, автоматически устанавливается значение TRUE Phone Allowed тоже поле, хотя оно не изменилось, и я внешне установил его в NULL в плагине CRM. И есть еще 5 таких полей, на которые влияют аналогичным образом.

Те же изменения работают нормально в среде DEV, но не в среде TEST.

ПРИМЕЧАНИЕ. Я перекрестно подтвердил, что все изменениясреды DEV перенесены в управляемое решение, и оно есть в среде TEST.

ОБНОВЛЕНИЕ 1:

Сегодня я пытался отладить изменение JavaScript в TEST окружение, и благодаря этому оно корректно обновило записи. Но когда я закрыл отладчик и протестировал тот же сценарий с новой записью, он снова обновил все записи !!

ОБНОВЛЕНИЕ 2:

Поскольку вызывается моя функция JavaScriptдля события onLoad, чтобы он мог установить значение NULL, но похоже, что он не может найти элемент управления или что-то еще, и именно поэтому он работает во время отладки, но не в обычном режиме.

Ниже приведена функция Javascript, которая запускается событием onLoad:

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");
        }
    }
}

Любая помощь в том, как заставить мою функцию ждать загрузки всех элементов управления в форме в событии onLoad?

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Как вы знаете, CRM Two не достаточно хорош для хранения NULL или обработки его как логического поля с поддержкой NULL. Либо иметь глобальный или локальный набор параметров (это допускает NULL) с двумя значениями - это позволит начинать запись со значения NULL и без необходимости javascript или плагина для массирования данных каждый раз.

В любом случае скрипт будетне срабатывает, когда происходит импорт данных или что-то вне платформы, например, вызовы web api - так что плагин - хороший выбор.

0 голосов
/ 07 ноября 2019

Обнаружена проблема.

Это правда, что Управляемому решению не удалось сохранить значение NULL для поля two option type. Хотя это было возможно сделать в неуправляемом решении.

Наряду с этим я обнаружил, что событие onLoad не выполнялось после события onSave в JavaScript, и это было причиной проблемы.

СледовательноВ качестве решения я добавил, что я добавил событие onChange в поле modifiedon формы, и оно работает как масло.

PS: я не использую OptionSet вместо поля TwoOptionSetтак, что поля по умолчанию должным образом используются клиентом для всех остальных встроенных функций.

...