CRM 2013: добавление записи в соответствующий раздел
У меня проблема с crm 2013. Я использую fetchXML для фильтрованного (например) счета для выставления счетов. Когда наша команда работает с CRM 2011 все работает нормально, но мы переходим на CRM 2013 и имеем проблему с add related Project.
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 . это очень плохо для нашего проекта.
Может быть, кто-нибудь может помочь мне в этом вопросе...
2 ответа:
Вы должны изменить свою функцию
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
- объект со свойствамиcallback
,gridTypeCode
,roleOrd
,relName
: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 }
Я не смог сделать вышеприведенную рекомендацию для работы. Я думаю, что это мое непонимание того, как определить объект "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]);
В качестве обходного пути я нашел следующее решение:
Главное отличие между приведенной выше рекомендацией и рекомендацией пола Нивелара есть следующее
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, похоже, работает.
Ура!