29.07.2009, 14:50 | #1 |
Участник
|
RetrieveMultiple
Хочу вытащить записи по значению атрибута. Пробовал 2 разных кода:
ConditionExpression condition = new ConditionExpression(); condition.AttributeName = "new_ExtID"; condition.Operator = ConditionOperator.Equal; condition.Values = new string[] { ExtID }; FilterExpression filter = new FilterExpression(); filter.FilterOperator = LogicalOperator.And; filter.Conditions = new ConditionExpression[] { condition }; QueryExpression query = new QueryExpression(); query.EntityName = EntityName.account.ToString(); query.ColumnSet = new AllColumns(); query.Criteria = filter; BusinessEntityCollection Customer = service.RetrieveMultiple(query); и QueryByAttribute query = new QueryByAttribute(); query.ColumnSet = new AllColumns(); query.EntityName = EntityName.account.ToString(); query.Attributes = new string[] { "new_ExtID" }; query.Values = new string[] { ExtID }; BusinessEntityCollection Customer = service.RetrieveMultiple(query); где "new_ExtID" искомый атрибут, ExtID - входящее значение. Запускаю через расширенную SQL процедуру, работает 7-8 минут, затем выдает ошибку: The request was aborted: The request was canceled. |
|
29.07.2009, 15:02 | #2 |
Чайный пьяница
|
Цитата:
Сообщение от vital.mih
Хочу вытащить записи по значению атрибута. Пробовал 2 разных кода:
ConditionExpression condition = new ConditionExpression(); condition.AttributeName = "new_ExtID"; condition.Operator = ConditionOperator.Equal; condition.Values = new string[] { ExtID }; FilterExpression filter = new FilterExpression(); filter.FilterOperator = LogicalOperator.And; filter.Conditions = new ConditionExpression[] { condition }; QueryExpression query = new QueryExpression(); query.EntityName = EntityName.account.ToString(); query.ColumnSet = new AllColumns(); query.Criteria = filter; BusinessEntityCollection Customer = service.RetrieveMultiple(query); и QueryByAttribute query = new QueryByAttribute(); query.ColumnSet = new AllColumns(); query.EntityName = EntityName.account.ToString(); query.Attributes = new string[] { "new_ExtID" }; query.Values = new string[] { ExtID }; BusinessEntityCollection Customer = service.RetrieveMultiple(query); где "new_ExtID" искомый атрибут, ExtID - входящее значение. Запускаю через расширенную SQL процедуру, работает 7-8 минут, затем выдает ошибку: The request was aborted: The request was canceled. При формировании RetrieveMultipleRequest укажите RetrieveDynamicEntity - true. Кроме того напишите, пожалуйста, какого типа аттрибут new_ExtID. Если это лукап - тогда в качестве параметров для фильтрации надо использовать GUID, а не строку. Кроме того попытайтесь таким образом объявить фильтр: query.Values = new object[] { ExtID };
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
29.07.2009, 19:59 | #3 |
Участник
|
new_ExtID nvarchar, хорошо попробую как вы описали.
|
|
30.07.2009, 13:22 | #4 |
Участник
|
а еще такой вопрос, что возвратит retrieve если не найдет записей, удовлетворяющих условию?
|
|
30.07.2009, 13:26 | #5 |
Чайный пьяница
|
BusinessEntityCollection с количеством записей в коллекции равным 0.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
30.07.2009, 14:08 | #6 |
Участник
|
RetrieveMultipleRequest request = new RetrieveMultipleRequest();
ColumnSet cols = new ColumnSet(); cols.Attributes = new string[] { "new_ExtID","accountid" }; ConditionExpression condition = new ConditionExpression(); condition.AttributeName = "new_ExtID"; condition.Operator = ConditionOperator.Like; condition.Values = new string[] { ExtID }; FilterExpression filter = new FilterExpression(); filter.FilterOperator = LogicalOperator.And; filter.Conditions = new ConditionExpression[] { condition }; QueryExpression query = new QueryExpression(); query.EntityName = "account"; query.ColumnSet = cols; query.Criteria = filter; request.Query = query; request.ReturnDynamicEntities = true; // Execute the request. RetrieveMultipleResponse response = (RetrieveMultipleResponse)service.Execute(request); //Выводим коллекцию значений BusinessEntityCollection Customer = response.BusinessEntityCollection; Test = Customer.ToString(); Я знаю, что в базе значений с таким условием нет, правильно ли я ожидаю увидеть test=0, или же здесь необходимо написать функцию типа if exists? |
|
30.07.2009, 14:13 | #7 |
Чайный пьяница
|
Если так, то используйте такой код:
Test = Customer.BusinessEntities.Count.ToString();
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
30.07.2009, 14:18 | #8 |
Участник
|
Error 1 'System.Array' does not contain a definition for 'Count' and no extension method 'Count' accepting a first argument of type 'System.Array' could be found (are you missing a using directive or an assembly reference?)
|
|
30.07.2009, 14:33 | #9 |
Чайный пьяница
|
Цитата:
В таком случае Count поменяйте на Length.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
30.07.2009, 14:46 | #10 |
Участник
|
все так же, процедура висит
|
|
30.07.2009, 14:52 | #11 |
Чайный пьяница
|
Вы можете привести полный код для исследования?
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
30.07.2009, 14:59 | #12 |
Участник
|
using System;
using System.Collections.Generic; using System.Text; using System.Data.Sql; using Microsoft.SqlServer.Server; using DiasToCrm.CrmWebService; namespace DiasToCrm { public static class Proxy { [SqlProcedure()] public static void AddCustomerToCrm(string ExtID, string Name, string INN, int RelationshipType, string Phone1, string Phone2, string Phone3, string email, out string Test, out string ErrorMessage, out string Ret_Error) { Test = String.Empty; ErrorMessage = String.Empty; // по дефолту ошибок нет Ret_Error=String.Empty; try { // Set up the CRM Service. CrmAuthenticationToken token = new CrmAuthenticationToken(); token.AuthenticationType = 0; token.OrganizationName = "ServiceDesk"; CrmService service = new CrmService(); service.Url = "http://crm:5555/ServiceDesk/mscrmservices/2007/crmservice.asmx"; service.CrmAuthenticationTokenValue = token; service.Credentials = System.Net.CredentialCache.DefaultCredentials; QueryByAttribute query = new QueryByAttribute(); query.ColumnSet = new AllColumns(); ; query.EntityName = EntityName.account.ToString(); query.Attributes = new string[] { "new_ExtID" }; query.Values = new string[] { "111" }; RetrieveMultipleRequest request = new RetrieveMultipleRequest(); request.Query = query; request.ReturnDynamicEntities = true; //Выводим коллекцию значений try { RetrieveMultipleResponse response = (RetrieveMultipleResponse)service.Execute(request); BusinessEntityCollection Customer = response.BusinessEntityCollection; Test = Customer.BusinessEntities.Length.ToString(); } catch (Exception Ret_ex) { Ret_Error = Ret_ex.Message; } } catch (Exception ex) { ErrorMessage = ex.Message; } } } } Я максимально упростил процедуру и создал аккаунт с атрибутом new_ExtID=111. Последний раз редактировалось vital.mih; 30.07.2009 в 15:07. |
|
30.07.2009, 15:12 | #13 |
Чайный пьяница
|
Цитата:
Сообщение от vital.mih
using System;
using System.Collections.Generic; using System.Text; using System.Data.Sql; using Microsoft.SqlServer.Server; using DiasToCrm.CrmWebService; namespace DiasToCrm { public static class Proxy { [SqlProcedure()] public static void AddCustomerToCrm(string ExtID, string Name, string INN, int RelationshipType, string Phone1, string Phone2, string Phone3, string email, out string Test, out string ErrorMessage, out string Ret_Error) { Test = String.Empty; ErrorMessage = String.Empty; // по дефолту ошибок нет Ret_Error=String.Empty; try { // Set up the CRM Service. CrmAuthenticationToken token = new CrmAuthenticationToken(); token.AuthenticationType = 0; token.OrganizationName = "ServiceDesk"; CrmService service = new CrmService(); service.Url = "http://crm:5555/ServiceDesk/mscrmservices/2007/crmservice.asmx"; service.CrmAuthenticationTokenValue = token; service.Credentials = System.Net.CredentialCache.DefaultCredentials; QueryByAttribute query = new QueryByAttribute(); query.ColumnSet = new AllColumns(); ; query.EntityName = EntityName.account.ToString(); query.Attributes = new string[] { "new_ExtID" }; query.Values = new string[] { "111" }; RetrieveMultipleRequest request = new RetrieveMultipleRequest(); request.Query = query; request.ReturnDynamicEntities = true; //Выводим коллекцию значений try { RetrieveMultipleResponse response = (RetrieveMultipleResponse)service.Execute(request); BusinessEntityCollection Customer = response.BusinessEntityCollection; Test = Customer.BusinessEntities.Length.ToString(); } catch (Exception Ret_ex) { Ret_Error = Ret_ex.Message; } } catch (Exception ex) { ErrorMessage = ex.Message; } } } } Я максимально упростил процедуру и создал аккаунт с атрибутом new_ExtID=111. service.Url = "http://crm:5555/ServiceDesk/mscrmservices/2007/crmservice.asmx"; на service.Url = "http://crm:5555/mscrmservices/2007/crmservice.asmx";
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
30.07.2009, 15:14 | #14 |
Участник
|
пробовал, причем всегда так было, я только что для проверки вставил ServiceDesk
|
|
30.07.2009, 15:19 | #15 |
Участник
|
а есть возможность другим способом проверить существуют ли записи с заданным значением new_extid? Вот, например, ретрив одного значения по гуиду работает прекрасно. Но моя задача заключается в проверке наличия ранее созданных аккаунтов. Соответсвенно, если аккаунт был создан ранее - апдейтим, если ретрив возвращает ноль - создаем.
Есть конечно вариант создавать внешнюю таблицу, где связывать ExtID аккаунта с гуидом в СРМ и проверять наличие связи, но это менее желательный вариант. Последний раз редактировалось vital.mih; 30.07.2009 в 15:30. |
|
30.07.2009, 15:37 | #16 |
Чайный пьяница
|
Судя по всему - вы пытаетесь создать сборку с классом, который будет использоваться непосредственно в SQL Server. Пробовали написать простую консоль, которая выполняет этот код?
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
30.07.2009, 15:44 | #17 |
Участник
|
нет не пробовал, пусть даже заработает, то что? мне в любом случае данные из SQL отправлять.
|
|
30.07.2009, 15:54 | #18 |
Чайный пьяница
|
А можете объяснить зачем? Это так - в целях самообразования.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
30.07.2009, 16:00 | #19 |
Участник
|
Скорее всего я чего-нить не догоняю... Необходимо из базы данных отправить данные в СРМ, как подключиться к веб сервисам СРМ иначе кроме как с помощью расширенной процедуры я не знаю.
|
|
30.07.2009, 16:06 | #20 |
Чайный пьяница
|
Ээээ. А не проще ли написать 100% работающую консоль, которая из базы при помощи .Net средств (SqlConnection и т.п.) - вытянет данные в DataSet, а дальше будет их выгружать в Microsoft CRM?
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
Теги |
c#, webservice |
|
Похожие темы | ||||
Тема | Ответов | |||
RetrieveMultiple и сущности НЕдефаултной организации | 16 | |||
Быстродействие CrmService | 16 |
|