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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.03.2012, 21:40   #1  
ZooY is offline
ZooY
Участник
Аватар для ZooY
 
379 / 46 (2) +++
Регистрация: 24.06.2008
Адрес: Россия, Москва
Angry Даты в CRM 2011
Коллеги, помогите разобраться, я чета просто в ступоре.
Есть CRM 2011, есть веб-приложение (запускаю его локально со своего компа).
Получаю значение даты из сущности, пробую делать это аж тремя разными способами: библиотеки microosft.xrm.sdk, SOAP-сервис, REST-сервис. Во всех случаях получаю дату в UTC... Как так? Почему UTC? Почему это не локальная дата пользователя и как таки получить локальную дату?
Старый 27.03.2012, 21:50   #2  
Konstantin Katsovich is offline
Konstantin Katsovich
Участник
Аватар для Konstantin Katsovich
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
243 / 57 (2) ++++
Регистрация: 22.10.2008
Адрес: Israel
код в студию
__________________
Читайте SDK!!!
Старый 27.03.2012, 21:58   #3  
ZooY is offline
ZooY
Участник
Аватар для ZooY
 
379 / 46 (2) +++
Регистрация: 24.06.2008
Адрес: Россия, Москва
X++:
protected void Page_Load(object sender, EventArgs e)
{
	const string DOMAIN = "...";
	const string USER = "...";
	const string PASS = "...";
	const string ORG_NAME = "...";
	const string CRM_SERVER_URL = "http://.../" + ORG_NAME;
	var eventId = new Guid("044220DB-1230-DE11-9DEE-00304894FA2D");
	const string EVENT_ENTITY_NAME = "new_event";
	const string ATTR_NAME = "new_startdate";
	var eventColumns = new ColumnSet(new[] { ATTR_NAME });

	var query = new QueryExpression("new_event") { ColumnSet = eventColumns, Criteria = new FilterExpression { FilterOperator = LogicalOperator.And } };
	var condition = new ConditionExpression("new_eventid", ConditionOperator.Equal, new object[] { eventId });
	query.Criteria.Conditions.Add(condition);

	var queryString = @"
<fetch mapping='logical' version='1.0'>
<entity name='new_event'>
<attribute name='new_startdate' />
<filter>
	<condition attribute='new_eventid' operator='eq' value='" + eventId + @"' />
</filter>
</entity>
</fetch>";

	DateTime date;
	using (var service = CreateDllCrmService(CRM_SERVER_URL, ORG_NAME, DOMAIN, USER, PASS))
	{
		var @event = service.Retrieve(EVENT_ENTITY_NAME, eventId, eventColumns);
		date = @event.GetAttributeValue<DateTime>(ATTR_NAME);
		
		var events = service.RetrieveMultiple(query);
		date = events.Entities[0].GetAttributeValue<DateTime>(ATTR_NAME);
		
		events = service.RetrieveMultiple(new FetchExpression(queryString));
		date = events.Entities[0].GetAttributeValue<DateTime>(ATTR_NAME);		
	}
	{
		var client = CreateOrganizationServiceClient(DOMAIN, USER, PASS);

		var @event = client.Retrieve(EVENT_ENTITY_NAME, eventId, eventColumns);
		date = @event.GetAttributeValue<DateTime>(ATTR_NAME);
		
		var events = client.RetrieveMultiple(query);
		date = events.Entities[0].GetAttributeValue<DateTime>(ATTR_NAME);

		events = client.RetrieveMultiple(new FetchExpression(queryString));
		date = events.Entities[0].GetAttributeValue<DateTime>(ATTR_NAME);

		client.Close();
	}
	{
		var context = CreateOrganizationDataServiceContext(CRM_SERVER_URL, ORG_NAME, DOMAIN, USER, PASS);

		var events = (from evt in context.New_EventSet where evt.New_EventId == eventId select evt).ToArray();
		date = events[0].New_StartDate.Value;
	}
}


private OrganizationServiceProxy CreateDllCrmService(string crmServerUrl, string orgName, string domain, string user, string pass)
{
	var serverAndOrgName = crmServerUrl.EndsWith(orgName) ? crmServerUrl : crmServerUrl + "/" + orgName;
	var orgServiceUri = new Uri(serverAndOrgName + "/XRMServices/2011/Organization.svc");
	var orgConfiguration = ServiceConfigurationFactory.CreateConfiguration<IOrganizationService>(orgServiceUri);
	var credentials = new ClientCredentials();
	credentials.Windows.ClientCredential = new NetworkCredential(user, pass, domain);
	return new OrganizationServiceProxy(orgConfiguration, credentials);
}


private OrganizationServiceClient CreateOrganizationServiceClient(string domain, string user, string pass)
{
	var client = new OrganizationServiceClient();
	client.ClientCredentials.UserName.UserName = domain + @"\" + user;
	client.ClientCredentials.UserName.Password = pass;
	return client;
}


private atcContext CreateOrganizationDataServiceContext(string crmServerUrl, string orgName, string domain, string user, string pass)
{
	var serverAndOrgName = crmServerUrl.EndsWith(orgName) ? crmServerUrl : crmServerUrl + "/" + orgName;
	var context = new atcContext(new Uri(String.Format("{0}/xrmservices/2011/organizationdata.svc/",
		serverAndOrgName), UriKind.Absolute)) { Credentials = new NetworkCredential(user, pass, domain) };
	return context;
}
Собственно я испробовал все возможные варианты получения данных. Радует что результат одинаковый во всех случаях, но почему он именно такой?
Во всех случаях возвращается дата в UTC, о чем говорит свойство Kind даты, а также сверка с тем, что реально храниться в SQL.
Старый 27.03.2012, 22:04   #4  
Konstantin Katsovich is offline
Konstantin Katsovich
Участник
Аватар для Konstantin Katsovich
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
243 / 57 (2) ++++
Регистрация: 22.10.2008
Адрес: Israel
Попробуйте поискать в Entity.FormattedValues Property

И ещё вопрос: У вас какой Time Zone?
__________________
Читайте SDK!!!
Старый 27.03.2012, 22:06   #5  
ZooY is offline
ZooY
Участник
Аватар для ZooY
 
379 / 46 (2) +++
Регистрация: 24.06.2008
Адрес: Россия, Москва
Цитата:
Сообщение от Konstantin Katsovich Посмотреть сообщение
И ещё вопрос: У вас какой Time Zone?
+4 Москва и прочее
Старый 27.03.2012, 22:21   #6  
Konstantin Katsovich is offline
Konstantin Katsovich
Участник
Аватар для Konstantin Katsovich
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
243 / 57 (2) ++++
Регистрация: 22.10.2008
Адрес: Israel
Цитата:
Сообщение от ZooY Посмотреть сообщение
+4 Москва и прочее
У того юзера с полномочиями которого вы обращаетесь к серверу?
__________________
Читайте SDK!!!
Старый 28.03.2012, 00:58   #7  
g.Naukovych is offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Регистрация: 23.03.2011
Если получать данные из фильтрованных представлений, то дата будет в том поясе, от какого пользователя вы запускаетесь. Если получать из нефильтрованных представлений то будет время по грнивичу. Вы получаетее данные от имени пользователя. Какой у негочасовой пояс, то время и будет.
__________________
Мой блог https://procrm.tv
Старый 28.03.2012, 02:13   #8  
ZooY is offline
ZooY
Участник
Аватар для ZooY
 
379 / 46 (2) +++
Регистрация: 24.06.2008
Адрес: Россия, Москва
Цитата:
Сообщение от g.Naukovych Посмотреть сообщение
Если получать данные из фильтрованных представлений, то дата будет в том поясе, от какого пользователя вы запускаетесь. Если получать из нефильтрованных представлений то будет время по грнивичу. Вы получаетее данные от имени пользователя. Какой у негочасовой пояс, то время и будет.
Все это я и так знаю, но почему такая разница при том что пользователь один и тот же и представление тоже одно и тоже?..
Старый 28.03.2012, 11:29   #9  
g.Naukovych is offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Регистрация: 23.03.2011
Может кто-то перевел время для этого пользователя. У вас должно быть +4, а было -8 разница в 12 часов. Может ошибся кто-нибудь из настроки?
__________________
Мой блог https://procrm.tv
Старый 28.03.2012, 12:59   #10  
ZooY is offline
ZooY
Участник
Аватар для ZooY
 
379 / 46 (2) +++
Регистрация: 24.06.2008
Адрес: Россия, Москва
Цитата:
Сообщение от g.Naukovych Посмотреть сообщение
Может кто-то перевел время для этого пользователя. У вас должно быть +4, а было -8 разница в 12 часов. Может ошибся кто-нибудь из настроки?
Посмотрел на ModifiedOn пользователя (сущность SystemUser)... Его обновляли очень давно.
Старый 28.03.2012, 13:32   #11  
g.Naukovych is offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Регистрация: 23.03.2011
Может быть менялось время на самом сервере. а потом его назад установили?
__________________
Мой блог https://procrm.tv
Старый 28.03.2012, 14:50   #12  
ZooY is offline
ZooY
Участник
Аватар для ZooY
 
379 / 46 (2) +++
Регистрация: 24.06.2008
Адрес: Россия, Москва
В общем опытным путем установлено... В CRM есть какой то баг с часовыми поясами пользователя. Если даты отображаются неправильно пользователю нужно сделать следующее: войти в свои настроки и выставить правильный часовой пояс. Если уже стоит правильный пояс. нужно сменить его на другой, а потом установить опять правильный.

Собственно получилось вот что... все о чем я писал ранее было на одном сервере.
Решил все проверить на другом, где стоит точная копия первого.
Запросом получил несколько дат в локальном формате и в UTC. Даты плясали как хотели, например две одинаковые даты в UTC на час отличались в локальном формате (чего в нормальных условиях просто не может быть).
Вошел в настройки пользователя, перерещелкнул часовой пояс и все заработало как положено. Только вот ModifiedOn сущности UserSettings не обновился почему то и остался таким же как был раньше.
Видимо действительно вчера когда я боролся с первым сервером я таки обновил часовой пояс в настройках (или скорее просто обновил запись UserSettings, потому что часовой пояс там стоял правильный), и все заработало как положено.
За это сообщение автора поблагодарили: a33ik (1), griefon (1).
Старый 29.03.2012, 08:15   #13  
SLK is offline
SLK
Участник
 
67 / 19 (1) ++
Регистрация: 23.08.2006
Наблюдал такой же баг у себя на сервере, он проявляется в случае если был установлен CRM сервер, созданы пользователи, у пользователей настроены часовые пояса, а потом установлен последний Rollup исправляющий проблемы с часовыми поясами. Облегчить страдания по обновлению часовых поясов всех пользователей поможет эта утилита.

У меня наблюдается другой баг или фича. Я создал контакт и заполнил в нем Дату рождения 06.08.1959, я нахожусь в часовом поясе +6 UTC, поэтому в поле birthdateutc сохранилось значение 1959-08-05 18:00:00.000. Другой пользователь находящийся в часовом поясе +4 UTC открывает карточку контакта и видит Дату рождения 05.08.1959. Я уже попробовал переназначить запись с себя на этого пользователя не помогло.
За это сообщение автора поблагодарили: ZooY (1).
Старый 29.03.2012, 10:25   #14  
ZooY is offline
ZooY
Участник
Аватар для ZooY
 
379 / 46 (2) +++
Регистрация: 24.06.2008
Адрес: Россия, Москва
Это не баг, это фича, за которую разработчиков нужно просто четвертовать... В большинстве случаев пересчет дат в зависимости от часовых поясов не требуется. Это и нужно то только для задачь и звонков, да и то сомнительно...
Старый 29.03.2012, 12:42   #15  
kalina is offline
kalina
Участник
MCBMSS
 
25 / 16 (1) ++
Регистрация: 12.07.2011
Адрес: Израиль
Тут получается так. Если часы неважны, то надо всегда добавлять 12 часов, т.е. чтобы было 12 часов пополудни. А вот, если важны...
Старый 29.03.2012, 13:10   #16  
SLK is offline
SLK
Участник
 
67 / 19 (1) ++
Регистрация: 23.08.2006
Мы решили делать плагин, который при сохранении добавлял к дате часовой пояс пользователя изменившего поле.
Старый 29.03.2012, 14:17   #17  
lode is offline
lode
Участник
Аватар для lode
 
37 / 12 (1) ++
Регистрация: 23.03.2009
Адрес: Россия, Екатеринбург
Цитата:
Сообщение от ZooY Посмотреть сообщение
..
Собственно получилось вот что... все о чем я писал ранее было на одном сервере.
Решил все проверить на другом, где стоит точная копия первого.
Запросом получил несколько дат в локальном формате и в UTC. Даты плясали как хотели, например две одинаковые даты в UTC на час отличались в локальном формате (чего в нормальных условиях просто не может быть).
Скажите, а если эти две строки посмотреть в FilteredView сущности локальное время там тоже будет разным для одинаковых по utc дат?
Старый 04.04.2012, 01:56   #18  
ZooY is offline
ZooY
Участник
Аватар для ZooY
 
379 / 46 (2) +++
Регистрация: 24.06.2008
Адрес: Россия, Москва
Цитата:
Сообщение от lode Посмотреть сообщение
Скажите, а если эти две строки посмотреть в FilteredView сущности локальное время там тоже будет разным для одинаковых по utc дат?
Там было так, например беру 2 строки, в одной дата к примеру
в UTC - 01.01.2012 21:00, в локали - 02.01.2012 00:00
в другой по другому:
в UTC - 01.01.2012 21:00, в локали - 02.01.2012 01:00
То есть при одном и том же пользователе часовой пояс у одной записи как бы +3, а у другой +4
Старый 06.04.2012, 14:07   #19  
spectr is offline
spectr
Участник
Аватар для spectr
MCBMSS
Лучший по профессии 2014
 
287 / 70 (3) ++++
Регистрация: 19.10.2011
Адрес: Киев
Подскажите мне как получить дату записи через SOAP или REST в часовом поясе юзера с помощью javascript, а то я может что-то упустил в SDK.
А то я получаю их через REST в UTC и потом начинается танцы с бубном, делаю запрос в user_settings достаю смещения и тд. конвертирую дату в нужный GMT, но пока пашет только для часовых поясов без перехода на летнее зимнее время.
Теперь решил сделать для всех часовых поясов функцию так уже голова болит от вычислений и путаницы в UTC sql, GMT юзера и GMT толи UTC компа.

Может есть что-то готовое или функция в SDK ?

Последний раз редактировалось spectr; 06.04.2012 в 14:09.
Старый 09.04.2012, 10:31   #20  
ZooY is offline
ZooY
Участник
Аватар для ZooY
 
379 / 46 (2) +++
Регистрация: 24.06.2008
Адрес: Россия, Москва
Цитата:
Сообщение от spectr Посмотреть сообщение
Подскажите мне как получить дату записи через SOAP или REST в часовом поясе юзера с помощью javascript, а то я может что-то упустил в SDK.
А то я получаю их через REST в UTC и потом начинается танцы с бубном, делаю запрос в user_settings достаю смещения и тд. конвертирую дату в нужный GMT, но пока пашет только для часовых поясов без перехода на летнее зимнее время.
Теперь решил сделать для всех часовых поясов функцию так уже голова болит от вычислений и путаницы в UTC sql, GMT юзера и GMT толи UTC компа.

Может есть что-то готовое или функция в SDK ?
А что если использовать FormaеtedVelues (о чем уже говорили). Оно точно возвращает дату в часовом поясе пользователя. Точнее, в ответе SOAP же вроде возвращается не только само значение но и атрибутом его форматированное значение...
Теги
crm2011

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2011 Update Rollup 7 Blog bot Dynamics CRM: Blogs 0 27.03.2012 02:11
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2011 Update Rollup 4 Blog bot Dynamics CRM: Blogs 0 24.09.2011 01:16
Microsoft Dynamics CRM Team Blog: Microsoft Dynamics CRM 2011 ~ Online Test Drive Guide Blog bot Dynamics CRM: Blogs 0 05.08.2011 20:13
Все о Microsoft Dynamics CRM: Как установить Microsoft Dynamics CRM 2011 Beta Blog bot Dynamics CRM: Blogs 0 31.10.2010 15:08
CRM DE LA CREME! Configuring Microsoft Dynamics CRM 4.0 for Internet-facing deployment Blog bot Dynamics CRM: Blogs 0 18.08.2009 11:05

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

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

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