CRM 2013 JavaScript сохранить и обновить сбои

В настоящее время у меня есть среда разработки для CRM 2013 On-Premise. В моем пользовательском объекте выполняется следующий код JavaScript:

function UpdateBPF() {
    var requests = [];
    requests.push(Xrm.Page.getAttribute('description').setRequiredLevel('none'));
    requests.push(Xrm.Page.getAttribute('categoryid').setRequiredLevel('none'));
    requests.push(Xrm.Page.getAttribute('priority').setRequiredLevel('none'));
    requests.push(Xrm.Page.getAttribute('initialtype').setValue(1));
    requests.push(Xrm.Page.data.save());
    requests.push(event.returnValue = false);

    $.when.apply(undefined, requests).always(function () {
        Xrm.Page.data.setFormDirty(false);
        RefreshForm();
    });
};

function RefreshForm() {
    Mscrm.ReadFormUtilities.openInSameFrame(window._etc, Xrm.Page.data.entity.getId());
};

Что я пытаюсь сделать:

  • Изменение потока бизнес-процессов при изменении значения набора параметров

Что мой код делает после переключения набора параметров:

  • Запуск собственного рабочего процесса для фактического переключения (работает нормально, мне требуется обновление, чтобы фактически отобразить выбранный рабочий процесс для пользователя)
  • Не требует определенных полей (предотвращение обновления, если оно не заполнено)
  • Сохранение формы (после обновления для отображения правильного потока бизнес-процессов значения никогда не сохранялись, поэтому значение параметра не было установлено)
  • Предотвращение появления всплывающего окна "Вы еще не сохранены". (Хорошая возможность, мне это больше не нужно)
  • Я установил форму, чтобы не грязный после не сохранения

Почему я помещаю большинство шагов в переменную запросов?

  • Я хотел, чтобы эти значения обязательно появились перед обновлением формы. Скорее всего, я делаю это неправильно или неэффективно.

Что сработало:

  • В моей тестовой среде CRM 2013 все работало, как и ожидалось.
  • Сохранить
  • обновление
  • Правильный бизнес-процесс и этап

Выпуск для CRM 2013 Online:

  • Сохранение и обновление не работают
  • IE 9,10,11 и FireFox полностью аварийно завершают работу. Хром в порядке.
  • Отключение автосохранения не имеет значения

Что я пытался сохранить:

  • Xrm.Page.data.save()
  • Xrm.Page.data.entity.save()

Что я пробовал для обновления:

  • Xrm.Page.data.refresh()
  • Mscrm.ReadFormUtilities.openInSameFrame(window._etc, Xrm.Page.data.entity.getId())
  • Xrm.Utility.openEntityForm("service_ticket", Xrm.Page.data.entity.getId(), null)
  • var url = Xrm.Page.context.getClientUrl(); window.open(url + "/main.aspx?etn=ticket&pagetype=entityrecord&id=" + Xrm.Page.data.entity.getId() + "&newWindow=false", "_blank", null, false);

Когда я отлаживаю шаг за шагом код, размещенный сверху, он получает тогда.when, .apply и. Всегда, но пропускает все внутри. Я думаю, это всегда означает, что это всегда работает...

Когда я пытаюсь:

Xrm.Page.data.save().then(
    function () {
        alert('Save worked, refresh');
        Xrm.Page.data.refresh();
    },
    function () {
        alert('Save failed!');
    }
);

Проход по коду приводит к сохранению. Но после этого он пропускает все внутри, а затем IE(который я в основном тестировал, потому что кажется, что Chrome работает...) полностью вылетает. Ошибка не всплывает точно, это скорее предупреждение о том, что IE перестал работать.

Я видел 1 подобную проблему в Stackru без принятого ответа или ответа, который не работал для меня вообще. Функция Xrm.Page.data.save() непосредственно перед двумя предыдущими абзацами была примером одного из ответов. Супер простой образец, за которым было легко следить и проходить тестирование без изменений в результате.

Я также гуглил (мой лучший друг) и даже разогнал мою проблему. Еще одна публикация на другом сайте, я полагаю, на сайте Microsoft, вообще не получила ответов. Исходя из того, что было написано, я предполагаю, что это был тот же человек, что и для сообщения Stackru.

Любое понимание проблемы, будь то мой код или что-то еще, очень ценится.

Сохранение и обновление JavaScript не работает для CRM 2013 Online

2 ответа

Решение

В итоге я установил setTimeout перед Xrm.Page.data.save. Похоже, что что-то происходит непосредственно после изменения поля и непосредственно перед моим JavaScript. Это могут быть бизнес-правила (но я их изначально отключил, поэтому есть вероятность, что это не так).

В любом случае, что я сделал, чтобы решить мою проблему, это заключил функцию сохранения в короткий промежуток времени, а затем использовал Xrm.Utility.openEntityForm, чтобы "обновить" всю страницу, так как я бы предпочел не использовать неподдерживаемые

Mscrm.ReadFormUtilities.openInSameFrame(window._etc, Xrm.Page.data.entity.getId())

Ниже приведен фрагмент кода, который я использовал:

setTimeout(function () {
    Xrm.Page.data.save().then(
        function () {
            var id = Xrm.Page.data.entity.getId();
            var entityLogicalName = Xrm.Page.data.entity.getEntityName();
            Xrm.Utility.openEntityForm(entityLogicalName, id);
        },
        function () {
            alert('Save failed! Please refresh the form.');
        });
}, 500);

Я получаю идентификатор записи после сохранения вновь созданных записей. Вне тайм-аута или до сохранения происходит открытие новой записи (по существу, сохранение + новая).

Если есть более эффективный способ сделать это, пожалуйста, дайте мне знать, и я выберу ваш ответ (если он работает) в качестве правильного.

РЕДАКТИРОВАТЬ:
Код ниже на самом деле является лучшей версией. Предыдущий код, который я делал, был "Сохранить" и "Сохранить и закрыть", дважды вызывая "Сохранить", что испортило мою логику для другого проекта

setTimeout(function () {
    var id = Xrm.Page.data.entity.getId();
    var entityLogicalName = Xrm.Page.data.entity.getEntityName();
    Xrm.Utility.openEntityForm(entityLogicalName, id);
}, 500);

Здесь openEntityForm сохраняет запись перед закрытием и открытием снова, ближе всего я могу получить Save & Refresh.

Следующий код должен быть связан с событием "onchange" поля "updatedon". Поле 'updatedon' ВСЕГДА обновляется после сохранения формы. Поэтому после нажатия кнопки "Сохранить" форма перезагружается с помощью следующей функции.

function ReloadFormAfterSave(eventArgs) {
var formId = Xrm.Page.ui.getFormType();
alert(formId);
if (formId == "2") { // in my case, I only want the reload to occur when updating
    setTimeout(function () {
        var id = Xrm.Page.data.entity.getId();
        var entityLogicalName = Xrm.Page.data.entity.getEntityName();
        Xrm.Utility.openEntityForm(entityLogicalName, id);
    }, 500);
}
}

Обратитесь к http://dynamicscrmtouch.wordpress.com/2014/07/05/onload-event-not-triggered-after-save-on-crm-2013/ для объяснения "модифицированного".

Я забыл упомянуть, что вам нужно будет добавить "модифицированное" в качестве скрытого поля в вашей форме.

Ура!

Другие вопросы по тегам