none
Как сделать в поле сумму данных с других полей? RRS feed

  • Вопрос

  • Добрый день, при настройке MS CRM 4.0 возникла необходимость суммировать данные из 4-х полей и итог выводить в другом поле (в этой же форме). Вопрос как это можно реализовать (в общем в CRM нужны функции Excel :-)) ?
    28 апреля 2009 г. 16:45

Ответы

  • Спасибо, проверим. Тогда ещё вопрос, как сделать выполнение условия "Если". Ситуация следующая: нужно присвоить статус организации в зависимости от набранных баллов. Примерно так: Если в "поле 1" значение = 5, то в "поле 2" должно быть "Золото" "поле 1" значение = 4, то в "поле 2" должно быть "Серебро" "поле 1" значение = 3, то в "поле 2" должно быть "Бронза" "поле 1" значение = 1-2, то в "поле 2" должно быть "Новый клиент"
    Примерно такой код:

    var val = crmForm.all.<поле 1>.DataValue;
    var result = '';
    
    switch (val)
    {
    	case 5:
    		result = 'Золото';
    		break;
    	case 4:
    		result = 'Серебро';
    		break;
    	case 3:
    		result = 'Бронза';
    		break;
    	case 2:
    	case 1:
    		result = 'Новый клиент';
    		break;
    }
    
    crmForm.all.<поле 2>.DataValue = result;

    Истина открывается подготовленному уму. Мой блог - http://a33ik.blogspot.com
    • Предложено в качестве ответа Andrii ButenkoMVP 29 апреля 2009 г. 17:46
    • Помечено в качестве ответа Андрей Лапин 3 мая 2009 г. 14:12
    29 апреля 2009 г. 16:52
  • Здравствуйте, Андрей.

    Для таких вычислений уж лучше использовать математику. Она тут просто прослеживается.

    var val = crmForm.all.new_summocenok.DataValue;
    
    if (val == 0)
    	val = 1;
    var result = 5 - Math.ceil(val);
    crmForm.all.new_jobperspectiva.DataValue = result;
    


    По идее должно работать.

    Но если нет, воспользуйтесь менее утончённым кодом:

    var val = crmForm.all.new_summocenok.DataValue;
    
    var result = '';
    if (val >= 0 && val <= 1)
    	result = '4';
    else if (val > 1 && val <= 2)
    	result = '3';
    else if (val > 2 && val <= 3)
    	result = '2';
    else if (val > 3 && val <= 4)
    	result = '1';
    
    crmForm.all.new_jobperspectiva.DataValue = result;
    



    Truth opens to prepared mind. My blog - http://a33ik.blogspot.com

Все ответы

  • Добрый день, при настройке MS CRM 4.0 возникла необходимость суммировать данные из 4-х полей и итог выводить в другом поле (в этой же форме). Вопрос как это можно реализовать (в общем в CRM нужны функции Excel :-)) ?
    На каждое из полей поставьте обработчик на событие OnChange и в обработчиках пропишите примерно следующий код (код приведён когда поля имеют тип numeric или decimal) подставив свои названия полей из карточки:

    crmForm.all.<поле результат>.DataValue =
    (crmForm.all.<поле1>.DataValue == null ? 0 : crmForm.all.<поле1>.DataValue) +
    (crmForm.all.<поле2>.DataValue == null ? 0 : crmForm.all.<поле2>.DataValue) +
    (crmForm.all.<поле3>.DataValue == null ? 0 : crmForm.all.<поле3>.DataValue) +
    (crmForm.all.<поле4>.DataValue == null ? 0 : crmForm.all.<поле4>.DataValue);
    Поясню что делается:
    если поле не заполнено, то crmForm.all.<поле>.DataValue - вернёт null, поэтому конструкция crmForm.all.<поле>.DataValue == null ? 0 : crmForm.all.<поле>.DataValue - вернёт 0 если поле не заполнено и значение, если заполнено.

    Истина открывается подготовленному уму. Мой блог - http://a33ik.blogspot.com
    • Предложено в качестве ответа Andrii ButenkoMVP 29 апреля 2009 г. 17:45
    28 апреля 2009 г. 17:34
  • Спасибо, проверим. Тогда ещё вопрос, как сделать выполнение условия "Если". Ситуация следующая: нужно присвоить статус организации в зависимости от набранных баллов. Примерно так: Если в "поле 1" значение = 5, то в "поле 2" должно быть "Золото" "поле 1" значение = 4, то в "поле 2" должно быть "Серебро" "поле 1" значение = 3, то в "поле 2" должно быть "Бронза" "поле 1" значение = 1-2, то в "поле 2" должно быть "Новый клиент"
    29 апреля 2009 г. 16:29
  • Спасибо, проверим. Тогда ещё вопрос, как сделать выполнение условия "Если". Ситуация следующая: нужно присвоить статус организации в зависимости от набранных баллов. Примерно так: Если в "поле 1" значение = 5, то в "поле 2" должно быть "Золото" "поле 1" значение = 4, то в "поле 2" должно быть "Серебро" "поле 1" значение = 3, то в "поле 2" должно быть "Бронза" "поле 1" значение = 1-2, то в "поле 2" должно быть "Новый клиент"
    Примерно такой код:

    var val = crmForm.all.<поле 1>.DataValue;
    var result = '';
    
    switch (val)
    {
    	case 5:
    		result = 'Золото';
    		break;
    	case 4:
    		result = 'Серебро';
    		break;
    	case 3:
    		result = 'Бронза';
    		break;
    	case 2:
    	case 1:
    		result = 'Новый клиент';
    		break;
    }
    
    crmForm.all.<поле 2>.DataValue = result;

    Истина открывается подготовленному уму. Мой блог - http://a33ik.blogspot.com
    • Предложено в качестве ответа Andrii ButenkoMVP 29 апреля 2009 г. 17:46
    • Помечено в качестве ответа Андрей Лапин 3 мая 2009 г. 14:12
    29 апреля 2009 г. 16:52
  • Вопрос не по теме этого поста, но всё же, - ситуация следующая:
    есть "форма 1" с полями "1", "2", "3"
    и "форма 2" также с полями "1", "2", "3" 
    Нужно, чтобы при создании "формы 2" его поля были уже заполненны данными из полей "формы 1" соответственно.

  • Вопрос не по теме этого поста, но всё же, - ситуация следующая:
    есть "форма 1" с полями "1", "2", "3"
    и "форма 2" также с полями "1", "2", "3" 
    Нужно, чтобы при создании "формы 2" его поля были уже заполненны данными из полей "формы 1" соответственно.


    Если объекты, соответствующие формам 1 и 2 связаны соотношением один-ко-многим, то можно использовать сопоставление.
    Уточнение - у вас одновременно открыты обе формы? Одна открывается из другой?
    MCT
    Модератор
  • Формы одновременно не открыты, т.е. в "форму 1" один раз заносятся данные, закрывается и больше не открывается пока данные не устаревают. А при создании "формы 2" эти данные автоматически должны заноситься в поля этой формы (это коэффициенты, которые участвуют в расчетах). 

  • Здесь возможны варианты. Самый простой способ (не требующий программирования) - применение workflow. Недостатки - задержка выполнения и довольно сильные ограничения на изменения данных в связанных записях. Последней недостаток обходится с помощью custom action (подключаемая dll, в которую заложено исполнение вашей бизнес-логики).
    Второй способ - разработка plug-in-а, который будет запускаться событием.


    MCT
    Модератор
  • Добрый день. Вы не подскажете как можно получить произведение двух полей на одной форме, результат выводить в третьем поле? Пример: в форме "Возможная сделка", в поле "Доход предполагаемый" (тип поля money) введено значение, при изменении значения  другого поля "Вероятность" (тип поля decimal) в результирующем поле "Взвешенный доход" (тип поля money) необходимо, чтобы выдавался результат?

    Пробовала сделать по аналогии как вы описали, добавила три поля, ну для теста назвала их ver - результирующее, ver1 и ver2 - два множителя, все поля с типом decimal.  

    На каждое из полей поставила обработчик на событие OnChange и в обработчиках прописала следующий код:
    crmForm.all.<ver>.DataValue =
    (crmForm.all.<ver1>.DataValue == null ? 0 : crmForm.all.<ver1>.DataValue) *
    (crmForm.all.<ver2>.DataValue == null ? 0 : crmForm.all.<ver2>.DataValue);

    Но к сожалению этим ничего не добилась, только при закрытии формы выводится стандартное сообщение об ошибке в Microsoft Dynamics CRM.

    Также пробовала вместо "*" поставить "+", как вы и писали, но тоже ничего не получилось, подскажите пожалуйста где я ошиблась? Заранее благодарю.
  • Здравствуйте.

    Если вы вставляли именно такой код, как указали, то естественно он работать не будет. Под <ver> - подразумевалось что необходимо вставить название поля в терминах MS CRM.

    Чтото вроде:

    crmForm.all.new_destinationfield.DataValue =
    (crmForm.all.new_sourcefield1.DataValue == null ? 0 : crmForm.all.new_sourcefield1.DataValue) *
    (crmForm.all.new_sourcefield2.DataValue == null ? 0 : crmForm.all.new_sourcefield2.DataValue);

    Посмотрите в аттрибутах отображаемой сущности - посмотрите как называются поля - нужны именно названия полей, а не их названия.
    Истина открывается подготовленному уму. Мой блог - http://a33ik.blogspot.com
    • Предложено в качестве ответа Andrii ButenkoMVP 6 мая 2009 г. 16:20
  • Спасибо вам огромное все получилось.
  • Доброго дня всем.
    a33ik, делаю вроде как надо, но результата нет, подскажите что не так с кодом? (Вопрос с начала темы)


    var val = crmForm.all.new_summocenok.DataValue;
    var result = '';

    switch (val)
    {
    case 4:
    case 3.9:
    case 3.8:
    case 3.7:
    case 3.6:
    case 3.5:
    case 3.4:
    case 3.3:
    case 3.2:
    case 3.1:
     result = '1';
     break;
    case 3:
    case 2.9:
    case 2.8:
    case 2.7:
    case 2.6:
    case 2.5:
    case 2.4:
    case 2.3:
    case 2.2:
    case 2.1:
     result = '2';
     break;
    case 2:
    case 1.9:
    case 1.8:
    case 1.7:
    case 1.6:
    case 1.5:
    case 1.4:
    case 1.3:
    case 1.2:
    case 1.1:
     result = '3';
     break;
    case 1:
    case 0.9:
    case 0.8:
    case 0.7:
    case 0.6:
    case 0.5:
    case 0.4:
    case 0.3:
    case 0.2:
    case 0.1:
    case 0.0:
     result = '4';
     break;
    }

    crmForm.all.new_jobperspectiva.DataValue = result;

  • Здравствуйте, Андрей.

    Для таких вычислений уж лучше использовать математику. Она тут просто прослеживается.

    var val = crmForm.all.new_summocenok.DataValue;
    
    if (val == 0)
    	val = 1;
    var result = 5 - Math.ceil(val);
    crmForm.all.new_jobperspectiva.DataValue = result;
    


    По идее должно работать.

    Но если нет, воспользуйтесь менее утончённым кодом:

    var val = crmForm.all.new_summocenok.DataValue;
    
    var result = '';
    if (val >= 0 && val <= 1)
    	result = '4';
    else if (val > 1 && val <= 2)
    	result = '3';
    else if (val > 2 && val <= 3)
    	result = '2';
    else if (val > 3 && val <= 4)
    	result = '1';
    
    crmForm.all.new_jobperspectiva.DataValue = result;
    



    Truth opens to prepared mind. My blog - http://a33ik.blogspot.com
  • Дополнение к вопросу, a33ik, использую этот код:

    var val = crmForm.all.new_summocenok.DataValue;

    var result = '';
    if (val >= 0 && val <= 1)
    result = '4';
    else if (val > 1 && val <= 2)
    result = '3';
    else if (val > 2 && val <= 3)
    result = '2';
    else if (val > 3 && val <= 4)
    result = '1';

    crmForm.all.new_jobperspectiva.DataValue = result;

    Да значения выставляются, но только после того как в это поле что-то попытаешься ввести, т.е. при попытке изменения значения. А нельзя чтоб значения выставлялись одновременно с изменением зависимого поля?
  • Здравствуйте, Андрей.

    Можно попытаться добавить следующий скрипт на OnLoad карточки:

    var formField = document.getElementById("new_summocenok");
    formField.attachEvent("onkeyup", lKeyDown);
    function lKeyDown(e)  
    {
    	var thisfield= document.getElementById("new_summocenok");
    	if (thisfield.DataValue != null)
    	{
    		var val = thisfield.DataValue;
    
    		var result = '';
    		if (val >= 0 && val <= 1)
    			result = '4';
    		else if (val > 1 && val <= 2)
    			result = '3';
    		else if (val > 2 && val <= 3)
    			result = '2';
    		else if (val > 3 && val <= 4)
    			result = '1';
    
    		crmForm.all.new_jobperspectiva.DataValue = result;
    	}
    }
    Отладить не могу, пишу по памяти, так что заранее извините за ошибки, если допустил.


    Truth opens to prepared mind. My blog - http://a33ik.blogspot.com
    • Предложено в качестве ответа Andrii ButenkoMVP 13 мая 2009 г. 10:41
  • Спасибо, но это не помогло :(
  • Спасибо, но это не помогло :(

    Здравствуйте, Андрей.

    Я протестировал на более простом примере и у меня прекрассно заработало. Вы точно добавили указанный скрипт в OnLoad карточки, а не в OnChange поля?
    Truth opens to prepared mind. My blog - http://a33ik.blogspot.com
  • Точно в OnLoad , может не работает, потому что в OnLoad уже есть другой код. В общем вот что есть:

    crmForm.all.new_ves1.DataValue = 10
    crmForm.all.new_ves2.DataValue = 1.5
    crmForm.all.new_ves3.DataValue = 1.5
    crmForm.all.new_ves4.DataValue = 1.5
    crmForm.all.new_ves5.DataValue = 0.9
    crmForm.all.new_ves6.DataValue = 0.9
    crmForm.all.new_ves7.DataValue = 0.9
    crmForm.all.new_ves8.DataValue = 0.9
    crmForm.all.new_ves9.DataValue = 0.9
    crmForm.all.new_ves10.DataValue = 0.5
    crmForm.all.new_ves11.DataValue = 0.5

    var formField = document.getElementById("new_summocenok");
    formField.attachEvent("onkeyup", lKeyDown);
    function lKeyDown(e) 
    {
    var thisfield= document.getElementById("new_summocenok");
    if (thisfield.DataValue != null)
    {
    var val = thisfield.DataValue;

    var result = '';
    if (val >= 0 && val <= 1)
    result = '4';
    else if (val > 1 && val <= 2)
    result = '3';
    else if (val > 2 && val <= 3)
    result = '2';
    else if (val > 3 && val <= 4)
    result = '1';

    crmForm.all.new_jobperspectiva.DataValue = result;
    }
    }


    Как думаете?

  • Здравствуйте, Андрей.

    После каждой из строк crmForm.all.new_ves1.DataValue = 10 надо ставить ; вероятно изза этого не работает.

    Должно получиться как то так:

    crmForm.all.new_ves1.DataValue = 10;
    crmForm.all.new_ves2.DataValue = 1.5;
    crmForm.all.new_ves3.DataValue = 1.5;
    crmForm.all.new_ves4.DataValue = 1.5;
    crmForm.all.new_ves5.DataValue = 0.9;
    crmForm.all.new_ves6.DataValue = 0.9;
    crmForm.all.new_ves7.DataValue = 0.9;
    crmForm.all.new_ves8.DataValue = 0.9;
    crmForm.all.new_ves9.DataValue = 0.9;
    crmForm.all.new_ves10.DataValue = 0.5;
    crmForm.all.new_ves11.DataValue = 0.5;
    var formField = document.getElementById("new_summocenok");
    formField.attachEvent("onkeyup", lKeyDown);
    function lKeyDown(e) 
    {
    var thisfield= document.getElementById("new_summocenok");
    if (thisfield.DataValue != null)
    {
    var val = thisfield.DataValue;

    var result = '';
    if (val >= 0 && val <= 1)
    result = '4';
    else if (val > 1 && val <= 2)
    result = '3';
    else if (val > 2 && val <= 3)
    result = '2';
    else if (val > 3 && val <= 4)
    result = '1';

    crmForm.all.new_jobperspectiva.DataValue = result;
    }
    }

    Truth opens to prepared mind. My blog - http://a33ik.blogspot.com
  • Не обновляет.
    А от типа поля не может зависеть, у меня "new_jobperspectiva" тип nvarchar
    а "new_summocenok" тип decimal
  • Здравствуйте, Андрей.

    Я один в один смоделировал ситуацию. Поле decimal и на него вешается обработчик и обновляется текстовое поле. Перед этим есть присвоения. У меня работает.
    Truth opens to prepared mind. My blog - http://a33ik.blogspot.com