13.10.2008, 20:39 | #1 |
Участник
|
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 |
Участник
|
Приведите код, где переменная service объявляется и присваивается.
И ещё вопрос сразу - на какой Pipeline зарегистрирован плагин? |
|
15.10.2008, 00:37 | #3 |
Участник
|
Service создается из CrmService, схема создагия проверена в других плагинах - работает нормально, только в данном случае пишет "unable to process request". Код выложу завтра. Плагин подписан на Child pipline.
|
|
15.10.2008, 10:06 | #4 |
Участник
|
вот код создания сервиса:
Код: 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 |
Участник
|
А объект quote создается вручную? из формы?
|
|
15.10.2008, 16:17 | #6 |
Участник
|
да, новая квот из объекта оппортюнити
|
|
15.10.2008, 16:42 | #7 |
Участник
|
А зачем тогда plugin регистрить на child pipeline?
|
|
|
За это сообщение автора поблагодарили: maclai (1). |
15.10.2008, 18:31 | #8 |
Moderator
|
Лучше всего (и, наверное, правильней) открыть запрос в поддержку
Что может быть и чем попробовать полечить: 1. Увеличить таймаут в реестре (OleDbTimeout, ExtendedTimeout). Если ключей в ветке нет, создать. Как - поищите в базе знаний. 2. Поискать причину в SQL - SQL Profiler-ом. 3. Перенести все в Parent Pipeline (процентов на 70 уверен, что это поможет). Но, как уже говорил - лучше в саппорт. |
|
|
За это сообщение автора поблагодарили: maclai (1). |
16.10.2008, 10:56 | #9 |
Участник
|
Кстати, вспомнил! При регистрации на парент пайплайн плагин просто НЕ работал!
Я сам грешу на БД, т.к. для работы с другой организацией приходится каждый раз перезаливать бэкап. Если после перехода на профешинал не устаканится - открою колл в поддержку( Последний раз редактировалось maclai; 16.10.2008 в 12:12. |
|
28.10.2008, 10:18 | #10 |
Участник
|
Проблему то я решил: вынес все на вебпаидж, вызвал без открытия - создает строки как стаханов.
Однако вопрос: на парент пайплайне плагин не вызывылся - видимо при криэйте квот нельзя криэйтить другие сущности?; на чайлд пайплайне плагин имел конфликт при обработке криеита сервисом - видимо здесь вам не место для криэйтов). В то же в время в СДК указывается в Supported Messages for Plug-ins возможность создания( Вопрос новичка к профессионалам: плагин работает быстрее сервиса, не нужно бегать за кредентиалс - почему же приходится так выкручиваться и обходить рекомендованную производителем методику? Есть какая то литература по данному вопросу? Последний раз редактировалось maclai; 28.10.2008 в 10:28. |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|