AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.10.2011, 11:50   #1  
andrey. is offline
andrey.
Участник
 
7 / 10 (1) +
Регистрация: 04.10.2011
Определение давности заказа (CRM2011)
Коллеги, добрый день!
Подскажите, пожалуйста, по такому вопросу: мне необходимо определить давность заказа в месяцах (Текущая дата - дата создания заказа). Для этого в форму заказа добавлено поле orderAge. C определением текущего месяца вроде все ясно.
Подскажите, как получить значение даты заказа и для какого события регистрировать плагин. Заранее спасибо!

П.С. CRM2011, ниже приведенный код использовал для Retrieve, Pre-operation.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
// Microsoft Dynamics CRM namespace(s)
using Microsoft.Xrm.Sdk;
using System.ServiceModel;
using Microsoft.Xrm.Sdk.Query;


namespace CRMTestPlugIn
{
public class TestPlugIn : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
// Obtain the execution context from the service provider.
Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));

if (context.Depth == 1)
{

IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

// Obtain the target entity from the input parmameters.
EntityReference entity = (EntityReference)context.InputParameters["Target"];

//OrderAge
ColumnSet cols = new ColumnSet(new String[] { "new_orderage"});
var order = service.Retrieve("salesorder", entity.Id, cols);
if (order != null)
{
if (order.Attributes.Contains("new_orderage") == false)
{

var todayMonth = DateTime.Today.Month + DateTime.Today.Year * 12;
order.Attributes.Add("new_orderage", todayMonth.ToString());
}
else
{
var todayMonth = DateTime.Today.Month + DateTime.Today.Year * 12;
order["new_orderage"] = todayMonth.ToString();
}
service.Update(order);
}

}
}
}//end class
}//end name space
Старый 04.10.2011, 12:46   #2  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Цитата:
Сообщение от andrey. Посмотреть сообщение
давность заказа в месяцах (Текущая дата - дата создания заказа). Подскажите, как получить значение даты заказа и для какого события регистрировать плагин.

Код:
                    var todayMonth = DateTime.Today.Month + DateTime.Today.Year * 12;
                        order.Attributes.Add("new_orderage", todayMonth.ToString());
                    }
                    else
                    {
                        var todayMonth = DateTime.Today.Month + DateTime.Today.Year * 12;
                        order["new_orderage"] = todayMonth.ToString();
                    }
Если не вдаваться в вопрос "зачем вам это?" то возраст заказа явно должен вычисляться по иной формуле. Что-то вроде

Код:
DateTime today =  DateTime.Today;
DateTime orderDate = order["CreatedOn"];

TimeSpan age = today - orderDate;
int months = age.TotalDays / 30;
Код писал от руки, так что не обессудьте.
Что касается события на которое регистрировать плагин, то тут уж совсем не ясно что вам нужно! Вы хотите чтобы это поле отображалось в списках и на формах или хранилось в системе? Ввиду того, что оно по своей природе вычисляемое, я бы вообще написал сервис, который раз в месяц будет обновлять таблицу заказов, причем через SQL!
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 04.10.2011, 13:32   #3  
andrey. is offline
andrey.
Участник
 
7 / 10 (1) +
Регистрация: 04.10.2011
Артем,
давность заказа я собирался вычислять как

ColumnSet cols1 = new ColumnSet(new String[] { "new_orderage", "createdon"});
var order1 = service.Retrieve("salesorder", entity.Id, cols1);
if (order1 != null)
{
if (order1.Attributes.Contains("new_orderage") == false)
{
var todayMonth = DateTime.Today.Month + DateTime.Today.Year * 12;
var createdMonth = ((DateTime)entityObject.Attributes["createdon"]).Month+ ((DateTime)entityObject.Attributes["createdon"]).Year*12;
var MonthDif = todayMonth - createdMonth ;
order1.Attributes.Add("new_orderage", MonthDif.ToString());
}
else
{
var todayMonth = DateTime.Today.Month + DateTime.Today.Year * 12;
var createdMonth = ((DateTime)entityObject.Attributes["createdon"]).Month+ ((DateTime)entityObject.Attributes["createdon"]).Year*12;
var MonthDif = todayMonth - createdMonth ;
order1["new_orderage"] = createdMonth.ToString();
}
service.Update(order1);

В исходном посте приводил пример для вычисления текущего месяца. Проблема у меня была с вычислением месяца для даты заказа.

Попробую последовать Вашему совету. Спасибо!
Старый 04.10.2011, 13:59   #4  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Не уверен, что я вам чем-то помог, но пожалуйста.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 04.10.2011, 14:12   #5  
andrey. is offline
andrey.
Участник
 
7 / 10 (1) +
Регистрация: 04.10.2011
Я думал использовать Workflow для пересчета давности заказов по расписанию, но, видимо, хранимую процедуру будет использовать проще и логичнее.
Старый 04.10.2011, 14:14   #6  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от andrey. Посмотреть сообщение
Я думал использовать Workflow для пересчета давности заказов по расписанию, но, видимо, хранимую процедуру будет использовать проще и логичнее.
И ансапортнее. Советовал бы написать внешний сервис для выполнения этого пересчёта через вебсервисы. Понятно, что не будет работать для закрытых ордеров, но зато всё чистенько.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 04.10.2011, 14:25   #7  
andrey. is offline
andrey.
Участник
 
7 / 10 (1) +
Регистрация: 04.10.2011
Ок, попробую посмотреть оба варианта. Спасибо!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Microsoft CRM: Dynamics CRM2011 outlook client features Blog bot Dynamics CRM: Blogs 0 04.12.2010 14:11
Microsoft CRM: CRM2011 new Features Blog bot Dynamics CRM: Blogs 0 22.11.2010 14:11
Плагин на создании Заказа Krom Dynamics CRM: Разработка 4 04.08.2010 14:48
Отправка e-mail из сохраненного заказа с данными об организации и продуктами из заказа datfi Dynamics CRM: Разработка 27 14.09.2009 10:56
Отлавливание смены цены заказа в salesorderdetail ZooY Dynamics CRM: Разработка 6 10.09.2009 15:05

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:11.