1

現在、CRM 2013 オンプレミスの開発環境を持っています。私のカスタム エンティティでは、次の 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());
};

私がやろうとしていること:

  • オプション セット値の変更時にビジネス プロセス フローを変更する

オプションセットを切り替えた後のコードの動作:

  • 実際の切り替えを行うためのカスタム ワークフローの起動 (正常に動作します。選択したワークフローを実際にユーザーに表示するには、更新が必要です)
  • 特定のフィールドを必要としない (入力されていない場合、更新が発生しないようにする)
  • フォームの保存 (正しいビジネス プロセス フローを表示するために更新した後、値が保存されなかったため、オプション セットの値が設定されませんでした)
  • 「まだ保存していません」というポップアップが表示されないようにします。(これはもう必要ない可能性が高い)
  • 保存せずにフォームを汚れないように設定しました

ほとんどのステップを requests 変数に入れているのはなぜですか?

  • フォームを更新する前に、これらの値が確実に発生するようにしたかったのです。これを間違って行っているか、効率的ではない可能性が非常に高いです。

何がうまくいったか:

  • 私の CRM 2013 オンプレミス テスト環境では、すべてが期待どおりに機能しました。
  • 保存
  • リフレッシュ
  • 正しいビジネス プロセス フローとステージ

CRM 2013 オンラインの問題:

  • 保存と更新が機能しない
  • 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);

上部に投稿されたコードを段階的にデバッグすると、then .when、.apply、および .always が取得されますが、内部のすべてがスキップされます。それは常にそれが常に実行されることを意味すると思います...

私がしようとすると:

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

コードをステップ実行すると、保存がヒットします。しかし、ヒットした後、内部のすべてをスキップし、IE(Chromeが機能しているように見えるため、主にテストしていました...)が完全にクラッシュします。エラーは正確にはポップアップしません。「IE が動作を停止しました」という警告です。

StackOverflow で同様の問題が 1 件見られましたが、受け入れられた回答がないか、まったく機能しなかった回答がありました。前の 2 つの段落の直前の Xrm.Page.data.save() 関数は、回答の 1 つからのサンプルです。結果に変化がなく、テスト目的で簡単にフォローおよびステップ実行できる非常に単純なサンプル。

私はまた、グーグル(私の親友)と私の問題をBingedしました. 別のサイト (マイクロソフトのサイトだと思います) のもう 1 つの投稿には、まったく応答がありませんでした。書かれていることから、StackOverflow の投稿と同じ人物だと思います。

それが私のコードであろうと他のものであろうと、問題への洞察は大歓迎です。

tl;dr JavaScript の保存と更新が CRM 2013 Online で機能しない

4

2 に答える 2

5

私がやったのは、Xrm.Page.data.save の直前に setTimeout を設定することでした。フィールドが変更された直後、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);

新しく作成されたレコードの保存後にレコードの ID を取得します。タイムアウト外または保存前にそれを使用すると、新しいレコードが開かれます (基本的に保存 + 新規)。

これについてもっと効率的な方法がある場合は、私に知らせてください。あなたの答えが正しいものとして選択されます。

編集:
以下のコードは、実際にはより良いバージョンです。以前のコードでは、Save と Save&Close を実行したため、Save が 2 回発生し、別のプロジェクトのロジックが台無しになりました。

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

ここで、openEntityForm は、レコードを閉じてから再度開く前に保存しています。これは、保存と更新に最も近いものです。

于 2014-04-28T20:42:43.257 に答える
0

次のコードは、「modifiedon」フィールドの「onchange」イベントに関連付ける必要があります。「modifiedon」フィールドは、フォームが保存された後に常に更新されます。したがって、「保存」をクリックすると、次の関数を使用してフォームがリロードされます。

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

「modifiedon」の説明については、http://dynamicscrmtouch.wordpress.com/2014/07/05/onload-event-not-triggered-after-save-on-crm-2013/を参照してください。

フォームの非表示フィールドとして「modifiedon」を追加する必要があることを忘れていました。

乾杯!

于 2014-09-12T20:12:01.560 に答える