2012-02-10 9 views
0

CRM 2011を前提としています。 Contactエンティティは、テキストフィールドの代わりにカスタムエンティティのCountryへの参照を使用するようにカスタマイズされました。新しい連絡先を作成する際には、国のフィールドをデフォルトでカナダに設定します。 DEVとTEST - 私たちは二つのサーバを持っているCRM 2011 - JScriptを使用してデフォルト値を設定

// set Country fields to Canada if not set 
    SetDefaultCountryCode('cga_address1country'); 

:私はそのような関数を呼び出すフォームの読み込み時に

  function SetDefaultCountryCode(countryFieldId) { 

       var _canadaId = "{FC167B4D-1C3B-E111-8904-F2EA3FE25706}"; 

       var countryControl = Xrm.Page.getAttribute(countryFieldId); 

       // only attempt the code if the control exists on the form 
       if (countryControl != null) { 
        var currentCountry = countryControl.getValue(); 

        // if country is not specified, then set it to the default one (Canada) 
        if (currentCountry == null) { 
         var defaultCountry = new Object(); 
         defaultCountry.entityType = "cga_country"; 
         defaultCountry.id = _canadaId; 
         defaultCountry.name = "Canada"; 
         var countryLookupValue = new Array(); 
         countryLookupValue[0] = defaultCountry; 

         countryControl.setValue(countryLookupValue); 
        } 
       } 
      } 

:私はそれを行い、以下の機能を持っています。このJScriptはDEVで正常に動作します。 TESTで実行すると、TEST内のカナダに異なるID(GUID)があるため、手動で作成すると機能しません。 DEVから国のエンティティ値をエクスポートし、GUIDを保持しているTESTでインポートできることを期待していました。残念ながら、これはうまくいかなかった。私はExcelファイルにデータをエクスポートし、国のGUIDを持っています。また、インポートする前にTEST内の既存の国レコードを削除します。インポートしようとするとインポートは成功しますが、レコードは作成されません。私がGuidを指定せずにExcelファイルに新しい行を追加すると、それがインポートされます。インポート機能はレコードのGUIDを保持するものではなかったようです。しかし、これはまた、GUIDに依存するため、スクリプトが機能しないことを意味します。

私はここで二つの質問があります。

  1. がGUIDを保存/インポートエンティティデータをエクスポートすることが可能ですか?

  2. DEVとTESTで同じGUIDを使用できない場合、どのようにJScriptを正しく動作させることができますか?

ご協力いただきありがとうございます。

+0

'Guid'をハードコーディングするのではなく、あなたが質問したことはありますか? –

答えて

6

GUIDをハードコードして、その問題を発見したことは非常に悪いことです。 上記のとおり、同じGUIDを使用することはできませんが、同じ名前を使用しています。したがって、JScriptとjQueryを使用して国の名前を照会してGUIDを取得する必要があります。クライアント側(またはエンティティフォーム)からの情報をretireveするために

  1. 私たちは、RESTエンドポイント(ブラウザでのテスト)を消費/使用されます。
  2. アップロードjQueryライブラリ。
  3. アップロードJson2ライブラリ。
  4. jQueryライブラリのAJAX関数を使用します。
  5. エンティティ、列、条件を定義します。

解決策REST Endpointを照会します。

http://yourHostName/yourOrg/XRMServices/2011/OrganizationData.svc/new_CountrytSet?$select=new_Name,new_CountryId&$filter=new_Name eq 'Canada' 

、このURLを取り、あなたの実際の値をsubsituteしてブラウザに貼り付けて、あなたはレスポンスがXML形式で返されることがわかります。エラーがある場合は、エンティティ名とその属性がcase senisitveであることを確認してください。

結果を確認した後、このURLをAJAX呼び出しを使用して呼び出します。

$.ajax({ 
       type: "GET", 
       contentType: "application/json; charset=utf-8", 
       datatype: "json", 
       url: 'http://yourHostName/yourOrg/XRMServices/2011/OrganizationData.svc/new_CountrytSet?$select=new_Name,new_CountryId&$filter=new_Name eq 'Canada'', 
       beforeSend: function (XMLHttpRequest) { 
        //Specifying this header ensures that the results will be returned as JSON.    
        XMLHttpRequest.setRequestHeader("Accept", "application/json"); 
       }, 
       success: function (data) { 
        if (data.d && data.d.results) { 
         //var _canadaId = "{FC167B4D-1C3B-E111-8904-F2EA3FE25706}"; no longer be used 
         var _canadaId = data.d.results[0].ContactId; 

         // now we have the GUID of Canada, now I can continue my process 

        } 

       }, 
       error: function (XmlHttpRequest) { 

        alert("Error : " + XmlHttpRequest.status + ": " + XmlHttpRequest.statusText + ": " + JSON.parse(XmlHttpRequest.responseText).error.message.value); 
       } 

      }); 

しかし、あなたはあなたのコードをフォームにコピーする前に、あなたは、フォームのロードLIBSに、このWebリソースを追加し、Webリソースとしてアップロードhere からのjQueryのlibをダウンロードする必要があります。ここで

は、フォームのLoadイベントハンドラに入れるべき完全なコードです:

var context = GetGlobalContext(); 

// retireve the invoice record id (Opened Form) 
var invoiceId = context.getQueryStringParameters().id; 
var customerId; 

//Retrieve the server url, which differs on-premise from on-line and 
//shouldn't be hard-coded. 
// this will return something like http://yourHostName/yourOrg 
var serverUrl = context.getServerUrl(); 


//The XRM OData end-point 
var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc"; 

var odataUri = serverUrl + ODATA_ENDPOINT; 

function SetDefaultCountryCode(countryFieldId, odataUri) { 

    odataUri = odataUri + '/ContactSet?$select=ContactId,FullName&$filter=FullName eq \'Ahmed Shawki\''; 
    $.ajax({ 
     type: "GET", 
     contentType: "application/json; charset=utf-8", 
     datatype: "json", 
     url: odataUri, 
     beforeSend: function (XMLHttpRequest) { 
      //Specifying this header ensures that the results will be returned as JSON.    
      XMLHttpRequest.setRequestHeader("Accept", "application/json"); 
     }, 
     success: function (data) { 
      if (data.d && data.d.results) { 
       //var _canadaId = "{FC167B4D-1C3B-E111-8904-F2EA3FE25706}"; no longer be used 
       var _canadaId = data.d.results[0].ContactId; 

       var countryControl = Xrm.Page.getAttribute(countryFieldId); 

       // only attempt the code if the control exists on the form 
       if (countryControl != null) { 
        var currentCountry = countryControl.getValue(); 

        // if country is not specified, then set it to the default one (Canada) 
        if (currentCountry == null) { 
         var defaultCountry = new Object(); 
         defaultCountry.entityType = "cga_country"; 
         defaultCountry.id = _canadaId; 
         defaultCountry.name = "Canada"; 
         var countryLookupValue = new Array(); 
         countryLookupValue[0] = defaultCountry; 

         countryControl.setValue(countryLookupValue); 
        } 
       } 
      } 

     }, 
     error: function (XmlHttpRequest) { 

      alert("Error : " + XmlHttpRequest.status + ": " + XmlHttpRequest.statusText + ": " + JSON.parse(XmlHttpRequest.responseText).error.message.value); 
     } 

    }); 

} 

もう一つは、フォーム上のボックス「最初のパラメータとしてパス実行コンテキスト」をチェックすることを忘れないでくださいプロパティ。

EDIT:フォームのロードイベントハンドラにjQueryライブラリを追加するだけでなく、Json2のlibをWebリソースとして追加します。

REST Endpointの詳細については、

+1

Dynamics CRMでサポートされている古いバージョンのIEにはネイティブがないため、Webリソースとして[json2](https://github.com/douglascrockford/JSON-js)も含める必要がありますJSONのサポート。 – ccellar

+0

Ops、私はJSONのlibに言及するのを忘れて、ccellarありがとう:) – Anwar

+0

この解決策もあまりにも機能します。ハードコーディングGUIDは良い習慣ではないと私は同意しますが、私は両方の環境で同じGUIDを保持できるという条件でこの特定のケースを正当化します。それは定数を使用するようなものです - 私はGUIDを取得する必要があるすべてのインスタンスでサービスを変更したりクエリを実行したりしません。後で再利用するためにGUIDを取得して保存する方法はありますか?ありがとう。 – user1201405

4

実際にネイティブではなく、自分のguidとともにレコードをエクスポートおよびインポートすることは可能です。データをエクスポートし、ターゲット環境のCRM APIを使用して同一のレコードを作成するアプリケーションを構築する必要があります。作成に有効でないフィールド(createdon、statecodeなど)をクリアして、同じGuidを指定するだけで済みます。 CRMはそのGUIDでレコードを作成します。

古い4.0 Configuration Data Toolがこれを行います。私はそれが2011年の組織に対して動作するかどうか思い出すことはできませんが、それは出発点になる可能性があります。

+0

ありがとうございます - 必要。ソースコードが付属しており、コンパイルする必要があります。このソリューションはVS 2008向けですが、VS 2010でコンパイルすることができ、CRM 2011と連携しました。もう一度おねがいします! – user1201405

関連する問題