|
27.03.2012, 21:40 | #1 |
Участник
|
Даты в CRM 2011
Коллеги, помогите разобраться, я чета просто в ступоре.
Есть CRM 2011, есть веб-приложение (запускаю его локально со своего компа). Получаю значение даты из сущности, пробую делать это аж тремя разными способами: библиотеки microosft.xrm.sdk, SOAP-сервис, REST-сервис. Во всех случаях получаю дату в UTC... Как так? Почему UTC? Почему это не локальная дата пользователя и как таки получить локальную дату? |
|
27.03.2012, 21:50 | #2 |
Участник
|
код в студию
__________________
Читайте SDK!!! |
|
27.03.2012, 21:58 | #3 |
Участник
|
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 |
Участник
|
__________________
Читайте SDK!!! |
|
27.03.2012, 22:06 | #5 |
Участник
|
|
|
27.03.2012, 22:21 | #6 |
Участник
|
У того юзера с полномочиями которого вы обращаетесь к серверу?
__________________
Читайте SDK!!! |
|
28.03.2012, 00:58 | #7 |
Участник
|
Если получать данные из фильтрованных представлений, то дата будет в том поясе, от какого пользователя вы запускаетесь. Если получать из нефильтрованных представлений то будет время по грнивичу. Вы получаетее данные от имени пользователя. Какой у негочасовой пояс, то время и будет.
|
|
28.03.2012, 02:13 | #8 |
Участник
|
Цитата:
Сообщение от g.Naukovych
Если получать данные из фильтрованных представлений, то дата будет в том поясе, от какого пользователя вы запускаетесь. Если получать из нефильтрованных представлений то будет время по грнивичу. Вы получаетее данные от имени пользователя. Какой у негочасовой пояс, то время и будет.
|
|
28.03.2012, 11:29 | #9 |
Участник
|
Может кто-то перевел время для этого пользователя. У вас должно быть +4, а было -8 разница в 12 часов. Может ошибся кто-нибудь из настроки?
|
|
28.03.2012, 12:59 | #10 |
Участник
|
|
|
28.03.2012, 13:32 | #11 |
Участник
|
Может быть менялось время на самом сервере. а потом его назад установили?
|
|
28.03.2012, 14:50 | #12 |
Участник
|
В общем опытным путем установлено... В CRM есть какой то баг с часовыми поясами пользователя. Если даты отображаются неправильно пользователю нужно сделать следующее: войти в свои настроки и выставить правильный часовой пояс. Если уже стоит правильный пояс. нужно сменить его на другой, а потом установить опять правильный.
Собственно получилось вот что... все о чем я писал ранее было на одном сервере. Решил все проверить на другом, где стоит точная копия первого. Запросом получил несколько дат в локальном формате и в UTC. Даты плясали как хотели, например две одинаковые даты в UTC на час отличались в локальном формате (чего в нормальных условиях просто не может быть). Вошел в настройки пользователя, перерещелкнул часовой пояс и все заработало как положено. Только вот ModifiedOn сущности UserSettings не обновился почему то и остался таким же как был раньше. Видимо действительно вчера когда я боролся с первым сервером я таки обновил часовой пояс в настройках (или скорее просто обновил запись UserSettings, потому что часовой пояс там стоял правильный), и все заработало как положено. |
|
|
За это сообщение автора поблагодарили: a33ik (1), griefon (1). |
29.03.2012, 08:15 | #13 |
Участник
|
Наблюдал такой же баг у себя на сервере, он проявляется в случае если был установлен 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 |
Участник
|
Это не баг, это фича, за которую разработчиков нужно просто четвертовать... В большинстве случаев пересчет дат в зависимости от часовых поясов не требуется. Это и нужно то только для задачь и звонков, да и то сомнительно...
|
|
29.03.2012, 12:42 | #15 |
Участник
|
Тут получается так. Если часы неважны, то надо всегда добавлять 12 часов, т.е. чтобы было 12 часов пополудни. А вот, если важны...
|
|
29.03.2012, 13:10 | #16 |
Участник
|
Мы решили делать плагин, который при сохранении добавлял к дате часовой пояс пользователя изменившего поле.
|
|
29.03.2012, 14:17 | #17 |
Участник
|
Цитата:
Сообщение от ZooY
..
Собственно получилось вот что... все о чем я писал ранее было на одном сервере. Решил все проверить на другом, где стоит точная копия первого. Запросом получил несколько дат в локальном формате и в UTC. Даты плясали как хотели, например две одинаковые даты в UTC на час отличались в локальном формате (чего в нормальных условиях просто не может быть). |
|
04.04.2012, 01:56 | #18 |
Участник
|
Цитата:
в 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 |
Участник
|
Подскажите мне как получить дату записи через 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 |
Участник
|
Цитата:
Сообщение от spectr
Подскажите мне как получить дату записи через SOAP или REST в часовом поясе юзера с помощью javascript, а то я может что-то упустил в SDK.
А то я получаю их через REST в UTC и потом начинается танцы с бубном, делаю запрос в user_settings достаю смещения и тд. конвертирую дату в нужный GMT, но пока пашет только для часовых поясов без перехода на летнее зимнее время. Теперь решил сделать для всех часовых поясов функцию так уже голова болит от вычислений и путаницы в UTC sql, GMT юзера и GMT толи UTC компа. Может есть что-то готовое или функция в SDK ? |
|
Теги |
crm2011 |
|
|