Поле поиска с пользовательским фильтром не работает должным образом в UCI
У меня есть некоторый код JS, который создает пользовательский фильтр с использованием некоторых критериев, а затем добавляет его в поле поиска в форме. Когда этот код запускается и запускается в первый раз, он работает правильно; правильные результаты появляются. Но если вы измените критерии пользовательского фильтра (измените одно из полей в форме, которую команда createCustomFilter использует для создания fetchxml), то результаты поиска не будут отображаться, когда должны появиться результаты.
Эта проблема возникает только в новом унифицированном интерфейсе. Я протестировал этот же код в веб-интерфейсе, и эта проблема не возникает; код работает правильно.
Я думаю, что ранее примененный фильтр не удаляется? Вот почему никаких результатов не появляется. Есть ли обходной путь, который позволил бы этому работать в UCI?
Пожалуйста, порекомендуйте.
var filter;
function OnFieldChange(executionContext) {
var formContext = executionContext.getFormContext();
if (filter != "" && filter != null) {
formContext.getControl("test_lookupfield").removePreSearch(lookupCustomFilter);
}
filter = createCustomFilter(executionContext);
formContext.getControl("test_lookupfield").addPreSearch(lookupCustomFilter);
}
function lookupCustomFilter(executionContext) {
var formContext = executionContext.getFormContext();
formContext.getControl("test_lookupfield").addCustomFilter(filter);
}
function createCustomFilter(executionContext) {
//creates a custom fetchxml filter that has been tested and is correct
}
2 ответа
Вот суть того, как мы фильтруем поиски как в UCI, так и в Legacy UI в системе v9.1:
//Legacy UI uses custom views, UCI only custom filters
views.push({
id: '{' + getRandomGuid().toUpperCase() + '}',
fetchXml: '' +
'<fetch mapping="logical" distinct="true" version="1.0">' +
'<entity name="product">' +
'<attribute name="productid" />' +
'<attribute name="productnumber" />' +
'<attribute name="name" />' +
'<attribute name="description" />' +
'<order attribute="productnumber" descending="false" />' +
'<filter type="and">' +
'<condition attribute="new_pricelevelid" operator="eq" value="' + myGuid + '" />' +
'</filter>';
'</entity>' +
'</fetch>',
layoutXml: '' +
'<grid name="resultset" object="' + productTypeCode + '" jump="name" select="0" icon="0" preview="0">' +
'<row name="result" id="productid">' +
'<cell name="name" width="125" />' +
'<cell name="description" width="400" />' +
'</row>' +
'</grid>',
name: 'Custom Product View',
recordType: productTypeCode,
Type: "0"
});
var CustomFilter = '<filter type="and">' +
'<condition attribute="new_pricelevelid" operator="eq" value="' + myGuid + '" />' +
'</filter>';
try {
var lookupParameters = {};
lookupParameters.entityTypes = ['quote'];
lookupParameters.defaultEntityType = 'quote';
//lookupParameters.defaultViewId = views[0].id;
lookupParameters.allowMultiSelect = false;
//Xrm.Internal.isUci() is unsupported!
if (Xrm.Internal.isUci() ) {
//Filter on UCI
if (CustomFilter != null) {
lookupParameters.filters = [{ filterXml: CustomFilter }];
}
}
else {
//Filter on Legacy UI
lookupParameters.customViews = [views[0]];
lookupParameters.viewIds = [views[0].id];
lookupParameters.defaultViewId = views[0].id;
}
//Use OOB CRM lookup w/ Custom Filter.
Xrm.Utility.lookupObjects(lookupParameters).then(
function (selectedItems) {
callback.call(scope, ifNull(selectedItems, []));
},
function (error) {
if (error != null) {
Xrm.Utility.alertDialog(error.message);
}
});
}
catch (e) {
Xrm.Utility.alertDialog(e.message);
}
Обратите внимание, что я адаптировал этот код для простоты и конфиденциальности. Я не проверял это в его текущей форме.
Вы можете попробовать этот пример кода.
var demoLAB = demoLAB || {};
var classId;
demoLAB.Stuedent = {
Form: {
Load: function (executionContext) {
'use strict';
var formContext = executionContext.getFormContext();
this.attachEvents(executionContext);
},
attachEvents: function (executionContext) {
'use strict';
var formContext = executionContext.getFormContext();
var form = demoLAB.Stuedent.Form;
// Student Change Event
formContext.getAttribute("demo_studentId").addOnChange(form.studentOnChange);
},
studentOnChange: function (executionContext) {
'use strict';
var formContext = executionContext.getFormContext();
var form = demoLAB.Stuedent.Form;
if (formContext.getAttribute("demo_studentId").getValue() != null) {
var studentId = formContext.getAttribute("demo_studentId").getValue()[0].id.slice(1, -1);
// Retrive current student current class
Xrm.WebApi.retrieveRecord("student", studentId, "?$select=_classId_value").then(
function success(studentResult) {
classId = studentResult._classId_value;
// Add presearch for teacher
formContext.getControl("demo_teacherId").addPreSearch(form.filterTeacher);
},
function (error) {
}
);
}
},
// Call back function for teacher
filterTeacher: function (executionContext) {
'use strict';
var formContext = executionContext.getFormContext();
var teacherFilter = "<filter type='and'><condition attribute='demo_classId' operator='eq' value='" + classId + "'/></filter>";
formContext.getControl("demo_teacherId").addCustomFilter(teacherFilter, "teacher");
},
}
};