2

リボンボタンからJavaScriptを実行しています。実行したいのは、作成しているレコードを保存し、すぐにそのGUIDをコードのGUIDとして使用することです。試行するたびに、レコードが保存された後にGUIDを要求していても、GUIDがnullに戻ります。保存した後でボタンを再試行すると、ボタンは機能しますが、保存しているときとは異なります。

これを行う方法はありますか?

function RibbonButton_AddProduct()
{
  //Save the Record
  Xrm.Page.data.entity.save();

  LoadProductCreate();
}

function LoadProductCreate()
{
  var serverUrl;
  var errorMessage = "Context to retrieve the Server URL is not available.";
  if (typeof GetGlobalContext != "undefined"){
     serverUrl = GetGlobalContext().getServerUrl();
  } else {
  if (typeof Xrm != "undefined"){
    serverUrl = Xrm.Page.context.getServerUrl();
  } else {
    alert(errorMessage);
    return;
  }
}
if (serverUrl.match(/\/$/)){
   serverUrl = serverUrl.substring(0, serverUrl.length - 1);
}     

var recordId = Xrm.Page.data.entity.getId();

alert(recordId);
var url = serverUrl + "/main.aspx?etc=10030&extraqs=%3f_CreateFromId%3d%"+recordId
  +"%257d%26_CreateFromType%3d10029%26etc%3d10030%26"
  +"pagemode%3diframe%26preloadcache%3d1345465354543&pagetype=entityrecord";
window.open(url);
}
4

3 に答える 3

9

この問題を解決するための別のアプローチを次に示します。

あなたがやろうとしているのは、「システムに逆らって作業する」ことです。つまり、2つの保存ボタンを効果的に作成しています。リボンボタンにIDが必要な場合の残りのCrmでは、最初にレコードを保存する必要があります。たとえば、保存されていないレコードでダイアログボタンまたはワークフローボタンを使用することはできません。また、保存されていないレコードに「新規/既存」を追加することもできません。

したがって、私の解決策は、保存されていないフォームのボタンを無効にし、ユーザーにレコードを手動で保存してから、ボタンの使用を許可することです。これは、Crmの使用方法であり、Crmの残りの部分の使用方法です。仕事。

システムに逆らって作業するべきではありません。システムを使用する必要があります。変更するのではなく、カスタマイズおよび拡張する製品があります。

これが要件を満たさない場合は、フラグを設定するというGregの提案(1)を使用することをお勧めしますが、少し厄介に聞こえますが、これは本質的に必要な要件です。

于 2012-08-20T17:14:42.967 に答える
4

次の2つのいずれかを試すことができます。

  1. フォームに非表示のブール属性(「new_launchProductCreate」など)を追加し、保存する前にコードで設定してから、onLoadで読み取ります。

    • Entity.Attributes作成前に値を設定する(したがって、データベースにコミットする可能性がある)代わりに、レコードがユーザーに返されるときにコレクションにブール値を挿入する、レコードの「作成」ステップに対して登録されたプラグインを作成できます。。これにより、値がデータベースに保持され、フォームが読み込まれるたびに実行されるのを防ぐことができます。

    • 代わりに、AJAXを使用して、onLoadコードを起動するときに値をリセットし、フォームが読み込まれるたびにトリガーされないようにすることができます。

  2. レコードGUIDを手動で割り当て、AJAXを使用してレコードを保存し、新しいGUIDを使用して新しいウィンドウをポップしてから、元のフォームを再読み込みします(フォームが「未保存」状態にならないようにするため)。

于 2012-08-20T15:30:13.750 に答える
2

これをすぐに確認できないため、間違っていることが判明するリスクがあります...ページを保存してからリロードする必要があります。

に格納されてXrm.Page.data.entity.getId()いる値は、ページの読み込み/初期化時に設定されるため、を呼び出した後にアクセスしても更新されませんSave()

また、ページをリロードするときに機能するのもそのためです。

おそらく、saveを呼び出してから、独自のクエリ文字列変数を追加してウィンドウをリロードし、このイベントが発生したことを示すことができますか?

例えば

function DoSomething() {
    //do your stuff 
    Xrm.Page.data.entity.save();

    //something like - sure someone can do better!
    window.location = window.location.href + '&foo=bar';
}

次に、このonFormLoadのようなものを登録します

function OnLoad() {
    var queryStringParms = Xrm.Page.context.getQueryStringParameters();
    //test to see if your query string param exists here
    for (var i in queryStringParams) {
        //if you find query string, do extra processing here
    }
}
于 2012-08-20T17:16:24.583 に答える