Поле поиска с пользовательским фильтром не работает должным образом в UCI

1

У меня есть некоторый код 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
}
Теги:
dynamics-crm
microsoft-dynamics
dynamics-crm-uci

1 ответ

0

Вот суть того, как мы фильтруем поиски как в 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);
}

Обратите внимание, что я адаптировал этот код для простоты и конфиденциальности. Я не проверял это в его текущей форме.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню