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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.10.2008, 20:39   #1  
maclai is offline
maclai
Участник
 
14 / 11 (1) +
Регистрация: 09.10.2008
Angry Generic SQL error.
Доброе время суток, уважаемые коллеги)
Третий день не могу справиться с ошибкой Generic SQL error. Смотрел по форуму , есть Такое с репорт сервером, но не мой случай.
Если сталкивались - поможите!
Задача: плагин на пост-криейт квот (у меня СРМ 4.0 на англицком) создает строки квоте продактс(квоте детайлс) на основании данных из родительской (для квот) опортюнити.
Вот код, создающий строки из существующих продуктов. Прайс лист учтен, входящие данные полностью корректны. Комменты не убираю, просто что бы было видно какие методы использовались.

Код:
 
#region Create quotedetails
if (_newQuoteProp != null)
{
 
try
{
foreach (DictionaryEntry cDe in _newQuoteProp)
{
if (cDe.Value.ToString() == "")
{
continue;
}
else
{
quotedetail existProduct = new quotedetail();
 
//add product & unit
LookupProperty uomid = Factory.GetUnitLookup(service);
LookupProperty productid = Factory.GetProductLookup(service, cDe.Key.ToString());
 
if (uomid != null && productid != null)
{
existProduct.uomid = uomid.Value;
//existProduct.uomid.name = uomid.Name;
existProduct.productid = productid.Value;
//existProduct.productid.name = productid.Name;
// for dynamic entity
//existProduct.Properties.Add(uomid);
//existProduct.Properties.Add(productid);
}
 
//DynamicEntity existProduct = new DynamicEntity();
//existProduct.Name = "quotedetail";
//existProduct.Properties.Add(new StringProperty("quantity", "1"));
//existProduct.Properties.Add(quoteId);
//Microsoft.Crm.Sdk.StringProperty p = new StringProperty("priceperunit", cDe.Value.ToString());
//existProduct.Properties.Add(p);
//CrmBoolean c = new CrmBoolean(true);
//CrmBooleanProperty cPrice = new CrmBooleanProperty("ispriceoverridden", c);
//CrmBooleanProperty cProduct = new CrmBooleanProperty("isproductoverridden", c);
//existProduct.ispriceoverridden = cPrice.Value;
//existProduct.ispriceoverridden.name = cPrice.Name;
//existProduct.isproductoverridden = cProduct.Value;
//existProduct.isproductoverridden.name = cProduct.Name;
 
 
//CrmNumber n = new CrmNumber(lineNumber);
//CrmNumberProperty N = new CrmNumberProperty("lineitemnumber", n);
//existProduct.lineitemnumber = N.Value;
LookupProperty quoteId = new LookupProperty("quoteid", new Lookup("quote", quoteGUID));
existProduct.quoteid = quoteId.Value;
//existProduct.quoteid.name = quoteId.Name;
 
CrmDecimal dec = new CrmDecimal(1);
CrmDecimalProperty quant = new CrmDecimalProperty("quantity", dec);
existProduct.quantity = quant.Value;
 
 
CrmMoney money = new CrmMoney(Convert.ToDecimal(cDe.Value.ToString()));
CrmMoneyProperty priceperUnit = new CrmMoneyProperty("priceperunit", money);
existProduct.priceperunit = priceperUnit.Value;
existProduct.description = cDe.Key.ToString().Remove(0, 3);
 
//existProduct.productdescription = cDe.Key.ToString().Remove(0,3);
//existProduct.owninguser = new UniqueIdentifier(context.UserId);
 
 
// create of transactioncurrencyid not allowed!!!
//LookupProperty taci = new LookupProperty("transactioncurrencyid", new Lookup("transactioncurrency", new Guid(((Lookup)entity.Properties["transactioncurrencyid"]).Value.ToString())));
//existProduct.transactioncurrencyid = taci.Value;
//existProduct.transactioncurrencyid.name = taci.Name;
 
//TargetCreateQuoteDetail target = new TargetCreateQuoteDetail();
////TargetCreateDynamic target = new TargetCreateDynamic();
//target.QuoteDetail = existProduct;
//CreateRequest create = new CreateRequest();
//create.Target = target;
//CreateResponse responce = (CreateResponse)service.Execute(create);
 
 
Guid quotedetailId = service.Create(existProduct);
 
//Guid k = service.Create(existProduct);
//KeyProperty k = new KeyProperty("quotedetailid", new Key());
//existProduct.quotedetailid.Value = k;
//Guid quotedetailId = responce.id;
lineNumber++;
 
// Don't forget check if quotedetail exist!
}
}
}
catch (System.Web.Services.Protocols.SoapException e)
{
throw new Exception ("Wrong plugin execution!\n" + e.Message + "\n" + e.StackTrace + e.Data);
}
}
 
#endregion Create quotedetails
Прлучаемые ошибки:
InnerText "\n 0x80044150\n Generic SQL error.\n Platform\n"
Старый 14.10.2008, 13:59   #2  
Гуревич Денис is offline
Гуревич Денис
Участник
Лучший по профессии 2009
 
228 / 67 (3) ++++
Регистрация: 04.08.2008
Адрес: Москва
Приведите код, где переменная service объявляется и присваивается.

И ещё вопрос сразу - на какой Pipeline зарегистрирован плагин?
Старый 15.10.2008, 00:37   #3  
maclai is offline
maclai
Участник
 
14 / 11 (1) +
Регистрация: 09.10.2008
Service создается из CrmService, схема создагия проверена в других плагинах - работает нормально, только в данном случае пишет "unable to process request". Код выложу завтра. Плагин подписан на Child pipline.
Старый 15.10.2008, 10:06   #4  
maclai is offline
maclai
Участник
 
14 / 11 (1) +
Регистрация: 09.10.2008
вот код создания сервиса:

Код:
 
 internal static CrmService GetCrmService(IPluginExecutionContext context, Boolean flag)
        {
            CrmAuthenticationToken authToken = new CrmAuthenticationToken();
            authToken.AuthenticationType = 0;
            authToken.OrganizationName = context.OrganizationName;
 
            if (flag)
                authToken.CallerId = context.UserId;
            else
                authToken.CallerId = context.InitiatingUserId;
            CrmService service = new CrmService();
            service.CrmAuthenticationTokenValue = authToken;
            service.UseDefaultCredentials = true;
            //service.Credentials = System.Net.CredentialCache.DefaultCredentials;
 
            CorrelationToken corToken = new CorrelationToken();
            corToken.CorrelationId = context.CorrelationId;
            corToken.CorrelationUpdatedTime = context.CorrelationUpdatedTime;
            corToken.Depth = context.Depth;
            Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\MSCRM");
            service.Url = String.Concat(regkey.GetValue("ServerUrl").ToString(), "/2007/crmservice.asmx");
            service.CorrelationTokenValue = corToken;
            return service;
        }
Старый 15.10.2008, 14:42   #5  
Гуревич Денис is offline
Гуревич Денис
Участник
Лучший по профессии 2009
 
228 / 67 (3) ++++
Регистрация: 04.08.2008
Адрес: Москва
А объект quote создается вручную? из формы?
Старый 15.10.2008, 16:17   #6  
maclai is offline
maclai
Участник
 
14 / 11 (1) +
Регистрация: 09.10.2008
да, новая квот из объекта оппортюнити
Старый 15.10.2008, 16:42   #7  
Гуревич Денис is offline
Гуревич Денис
Участник
Лучший по профессии 2009
 
228 / 67 (3) ++++
Регистрация: 04.08.2008
Адрес: Москва
А зачем тогда plugin регистрить на child pipeline?
За это сообщение автора поблагодарили: maclai (1).
Старый 15.10.2008, 18:31   #8  
AndreyS is offline
AndreyS
Moderator
Сотрудники Microsoft Dynamics
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
283 / 61 (3) ++++
Регистрация: 18.05.2006
Лучше всего (и, наверное, правильней) открыть запрос в поддержку
Что может быть и чем попробовать полечить:
1. Увеличить таймаут в реестре (OleDbTimeout, ExtendedTimeout). Если ключей в ветке нет, создать. Как - поищите в базе знаний.
2. Поискать причину в SQL - SQL Profiler-ом.
3. Перенести все в Parent Pipeline (процентов на 70 уверен, что это поможет).

Но, как уже говорил - лучше в саппорт.
За это сообщение автора поблагодарили: maclai (1).
Старый 16.10.2008, 10:56   #9  
maclai is offline
maclai
Участник
 
14 / 11 (1) +
Регистрация: 09.10.2008
Кстати, вспомнил! При регистрации на парент пайплайн плагин просто НЕ работал!
Я сам грешу на БД, т.к. для работы с другой организацией приходится каждый раз перезаливать бэкап. Если после перехода на профешинал не устаканится - открою колл в поддержку(

Последний раз редактировалось maclai; 16.10.2008 в 12:12.
Старый 28.10.2008, 10:18   #10  
maclai is offline
maclai
Участник
 
14 / 11 (1) +
Регистрация: 09.10.2008
Проблему то я решил: вынес все на вебпаидж, вызвал без открытия - создает строки как стаханов.
Однако вопрос: на парент пайплайне плагин не вызывылся - видимо при криэйте квот нельзя криэйтить другие сущности?; на чайлд пайплайне плагин имел конфликт при обработке криеита сервисом - видимо здесь вам не место для криэйтов).
В то же в время в СДК указывается в Supported Messages for Plug-ins возможность создания(

Вопрос новичка к профессионалам: плагин работает быстрее сервиса, не нужно бегать за кредентиалс - почему же приходится так выкручиваться и обходить рекомендованную производителем методику?
Есть какая то литература по данному вопросу?

Последний раз редактировалось maclai; 28.10.2008 в 10:28.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Microsoft Dynamics CRM Team Blog: Error Reporting in CRM Blog bot Dynamics CRM: Blogs 0 24.03.2009 00:05
Мир CRM: Улучшение Dynamics CRM 4.0 производительности и безопасности данных под SQL Server 2008 Blog bot Dynamics CRM: Blogs 0 03.02.2009 02:07
Мир CRM: Новости об одной из составляющих работы Dynamics CRM - Microsoft SQL Server Blog bot Dynamics CRM: Blogs 0 03.11.2008 06:18
ansle: Выпущен SQL Server 2008 Blog bot Dynamics CRM: Blogs 1 07.08.2008 10:34
Microsoft Dynamics CRM Team Blog: Accessing a SQL Database from a Microsoft Dynamics CRM Plug-in Blog bot Dynamics CRM: Blogs 0 14.07.2008 13:05
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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