среда, 30 октября 2013 г.

Обновление родительского списка CRM 2011

Обновление родительского списка сущностей.

При разработке возникла проблема следующего плана:
Была реализована кнопка, по которой изменялся статус сущности, и карточка закрывалась. В этом случае данная запись все равно отображалась в общем списке, как открытая. 
Решением данной проблемы является обновление грида, в котором находится список сущностей. Поиске в интернете не дали ничего полезного, но тем не менее была найдена стандартная функция обновления родительского окна:

Mscrm.Utilities.refreshParentGrid(entityCode, entityId);

На мою кнопку был повешен следующий обработчик: 

var onButtonClick = function(){
                var entityCode = "4204";
                Mscrm.Utilities.refreshParentGrid(entityCode, Xrm.Page.data.entity.getId());
                 //Other code
}

В результате, по нажатию на кнопку происходит обновление родительского сабгрида.

понедельник, 21 октября 2013 г.

CRM 2011 Multilookup after Rollup 12

Стандартный функционал CRM 2011 не позволяет создавать Lookup, в котором можно выбрать сразу несколько элементов.
Поиск в интернете дал только одно решение, которое по каким-то причинам не работает в Rollup 12.
В результате, была найдено следующее решение:
Решается это при помощи JavaScript'a.
Алгоритм следующий:
1. Создается обычный лукап любого типа
2. Создается текстовое поле - для хранения списка GUID'ов. (текст, несколько строк)
3. Создается текстовое поле - для хранения названий элементов Lookup'a (текст, несколько строк)
4. При помощи JavaScript'а меняется аттрибут лукапа на multiple.
5. При выборе списка записей, выбранные GUID'ы сохраняются в наше текстовое поле.
6. При загрузке страницы, список GUID'ов и названий подгружается на форму.

На страницу добавляется следующая JS-функция:
var SetLookupAsMulti = function (lookupAttrName, guidsAttrName, namesAttrName) {

            var lookupElement = document.getElementById(lookupAttrName);

            var lookupAttribute = Xrm.Page.getAttribute(lookupAttrName);
            var guidsAttribute = Xrm.Page.getAttribute(guidsAttrName);
            var namesAttribute = Xrm.Page.getAttribute(namesAttrName);

            if ((typeof lookupElement == 'undefined') ||
            (typeof guidsAttribute == 'undefined') ||
            (typeof namesAttribute == 'undefined')) {
                return false;
            }

            var guidsAttributeValue = guidsAttribute.getValue();
            var namesAttributeValue = namesAttribute.getValue();

            var looklupType = lookupAttribute.getAttributeType();

            var SetSavedGuidsToLookup = function () {

                if ((guidsAttributeValue == null) ||
                    (namesAttributeValue == null)) {
                    return false;
                }

                var idsArray = [];
                var splittedGuids = guidsAttributeValue.split(";");
                var splittedNames = namesAttributeValue.split(";");
                var savedItem = crmForm.all[lookupAttrName].control.get_value();

                if (savedItem == null) {
                    return false;
                }

                var sampleItem = savedItem[0];

                for (var key in splittedGuids) {
                    var item = {};
                    for (itm_key in sampleItem) {
                        item[itm_key] = sampleItem[itm_key];
                    }
                    item.id = splittedGuids[key];
                    item.name = splittedNames[key];
                    if (item.id != "") {
                        idsArray.push(item);
                    }
                }

                if (idsArray.length == 0) {
                    return false;
                }

                lookupAttribute.setValue();
                crmForm.all[lookupAttrName].control.set_value(idsArray);
            };

            var onFormSave_Handler = function () {
                var lookupValue = crmForm.all[lookupAttrName].control.get_value();
                var guidsString = "";
                var namesString = "";
                if (typeof lookupValue == 'undefined') {
                    return false;
                }

                for (var key in lookupValue) {
                    guidsString += lookupValue[key].id + ";";
                    namesString += lookupValue[key].name + ";";
                }

                guidsAttribute.setValue(guidsString);
                namesAttribute.setValue(namesString);
                //                lookupAttribute.setValue();
                lookupElement.setAttribute("lookupstyle", "single");
                lookupElement.setAttribute("_lookupstyle", "single");
            };

            lookupElement.setAttribute("lookupstyle", "multi");
            lookupElement.setAttribute("_lookupstyle", "multi");

            SetSavedGuidsToLookup();

            Xrm.Page.data.entity.addOnSave(onFormSave_Handler);
        }

После этого, добавляется еще одна функция на onLoad:
function onLoad(){
SetLookupAsMulti("new_lookup","new_lookup_guids","new_lookup_names");
}
которая вешается на загрузку формы.
В результате, получается lookup с мульти-выбором для CRM 2011, работающий и с Rollup 12.