2014-03-12 32 views
3

我在使用crm 2013时遇到问题。我使用fetchXML作为过滤(例如)结算帐户。 当我们的团队使用CRM 2011时,所有工作都很好,但我们迁移到CRM 2013,并且在添加相关项目时遇到问题。CRM 2013:将记录添加到相关部分

retrieveRecord( 
       recordId, 
       "xxx_project", 
       null, 
       null, 
       function (result) { 
        var xId = (result.xxx_Customer) ? result.xxx_xCustomer : ""; 

        // Fetch to retrieve filtered data. 
        var fetch = 
        "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" + 
        " <entity name='xxx_billingaccount'>" + 
        " <attribute name='xxx_billingaccountid' />" + 
        " <attribute name='xxx_name' />" + 
        " <attribute name='statecode' />" + 
        " <attribute name='xxx_xid' />" + 
        " <order attribute='xxx_name' descending='false' />" + 
        " <filter type='and'>" + 
        "  <condition attribute='xxx_xid' operator='eq' value='" + xId + "' />" + 
        " </filter>" + 
        " </entity>" + 
        "</fetch>"; 

        // Columns to display in the custom view (make sure to include these in the fetch query). 
        var layout = "<grid name='resultset' object='1' jump='xxx_name' select='1' icon='0' preview='1'>" + 
        " <row name='result' id='xxx_billingaccountid'>" + 
        " <cell name='xxx_name' width='150' />" + 
        " <cell name='statecode' width='150' />" + 
        " <cell name='xxx_xid' width='150' />" + 
        " </row>" + 
        "</grid>"; 

        SDK.Entity.BillingAccount.displayFilteredLookupView(gridTypeCode, gridControl, fetch, layout, "Filtered by Customer ID Billing Accounts"); 
       }, 
       SDK.Entity.BillingAccount.errorHandler); 

displayFilteredLookupView: function (gridTypeCode, gridControl, fetch, layout, viewName) { 

     var viewId = "{3D02B064-4D8D-4E7C-B919-965D5D2C225D}"; 
     var relName = gridControl.GetParameter("relName"), 
      roleOrd = gridControl.GetParameter("roleOrd"); 

     // Creates the custom view object. 
     var customView = { 
      fetchXml: fetch, 
      id: viewId, 
      layoutXml: layout, 
      name: viewName, 
      recordType: gridTypeCode, 
      Type: 0 
     }; 

     // Pops the lookup window with our view injected. 
     var lookupItems = LookupObjects(null, "multi", gridTypeCode, 0, null, "", null, null, null, null, null, null, viewId, [customView], null, null, null, null, null, null, 1); 

     // Once the lookup window is closed, we need the parent record ID and ETC before associating selected records. 
     if (lookupItems && lookupItems.items.length > 0) { 
      var parent = GetParentObject(), 
       parentId = parent.id, 
       parentTypeCode = parent.objectTypeCode; 

      //associates the selected records 
      AssociateObjects(parentTypeCode, parentId, gridTypeCode, lookupItems, IsNull(roleOrd) || roleOrd == 2, "", relName); 
     } 

    }, 

当我正在寻找解决这一问题的路径,我觉得一个链接http://community.dynamics.com/crm/f/117/p/119416/248998.aspx。这对我们的项目来说非常糟糕。

也许任何人都可以帮我这个问题...

回答

4

你应该改变你的LookupObjects功能LookupObjectsWithCallback功能:

LookupObjectsWithCallback(callbackReference, null, "multi", gridTypeCode, 0, null, "", null, null, null, null, null, null, viewId, [customView], null, null, null, null, null, null, 1); 

而在这样的代码来调用它:

displayFilteredLookupView: function (gridTypeCode, gridControl, fetch, layout, viewName) { 

     var viewId = "{3D02B064-4D8D-4E7C-B919-965D5D2C225D}"; 
     var relName = gridControl.GetParameter("relName"), 
      roleOrd = gridControl.GetParameter("roleOrd"); 

     // Creates the custom view object. 
     var customView = { 
      fetchXml: fetch, 
      id: viewId, 
      layoutXml: layout, 
      name: viewName, 
      recordType: gridTypeCode, 
      Type: 0 
     }; 
     // Get all necessary parameters, that you want to pass into your callbackReference function. 
     SDK.Entity.BillingAccount.callbackReference.gridTypeCode = gridTypeCode; 
     SDK.Entity.BillingAccount.callbackReference.relName = relName; 
     SDK.Entity.BillingAccount.callbackReference.roleOrd = roleOrd; 

     // Pops the lookup window with our view injected. 
     LookupObjectsWithCallback(SDK.Entity.BillingAccount.callbackReference, null, "multi", gridTypeCode, 0, null, "", null, null, null, null, null, null, viewId, [customView], null, null, null, null, null, null, 1);     
    } 

如果您的SDK.Entity.BillingAccount.callbackReference是属性callbackgridTypeCoderoleOrdrelName

callbackReference: { 

    callback: function (lookupItems) { 

     // Once the lookup window is closed, we need the parent record ID and ETC before associating selected records.   
     if (lookupItems && lookupItems.items.length > 0) { 
      var parent = GetParentObject(), 
       parentId = parent.id, 
       parentTypeCode = parent.objectTypeCode; 

      //associates the selected records 
      AssociateObjects(parentTypeCode, parentId, SDK.Entity.BillingAccount.callbackReference.gridTypeCode, lookupItems, IsNull(SDK.Entity.BillingAccount.callbackReference.roleOrd) || SDK.Entity.BillingAccount.callbackReference.roleOrd == 2, "", SDK.Entity.BillingAccount.callbackReference.relName); 
     } 
    }, 
    gridTypeCode: null, 
    roleOrd: null, 
    relName: null 
} 
0

我无法使上述建议正常工作。我认为这是我对如何定义对象'callbackReference'缺乏理解。当我粘贴代码时,如上所述,Visual Studio抱怨。下面是代码,这是行不通的。

var locAssocObjAction1 = { 

    callback: function (lookupItems) { 

     //debugger; 
     // Once the lookup window is closed, we need the parent record ID and ETC before associating selected records.   
     if (lookupItems && lookupItems.items.length > 0) { 

      var parent = GetParentObject(), 
       parentId = parent.id, 
       parentTypeCode = parent.objectTypeCode; 

      //associates the selected records 
      AssociateObjects(parentTypeCode, parentId, params.gridTypeCode, lookupItems, IsNull(roleOrd) || roleOrd == 2, "", relName); 

     } 
     Xrm.Utility.alertDialog("Message on alert dialog", function() { }); 
    } 
} 

//pops the lookup window with our view injected 
LookupObjectsWithCallback(locAssocObjAction1, null, "multi", params.gridTypeCode, 0, null, "", null, null, null, null, null, null, viewId, [customView]); 

作为一种变通方法,我发现了以下解决方案:

http://www.magnetismsolutions.co.nz/blog/paulnieuwelaar/2014/04/21/filter-n-n-add-existing-lookup-dynamics-crm-2013

上述建议和保罗Niewelaar的之间的主要区别在于以下

var callbackRef = Mscrm.Utilities.createCallbackFunctionObject("locAssocObjAction", this, parameters, false); 

//pops the lookup window with our view injected 
LookupObjectsWithCallback(callbackRef, null, "multi", gridTypeCode, 0, null, "", null, null, null, null, null, null, viewId, [customView]); 

}

我不确定实现的是什么离子是'locAssocObjAction'。但是,N:N协会似乎工作。

干杯!