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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.08.2010, 00:23   #1  
Krom is offline
Krom
Участник
 
28 / 10 (1) +
Регистрация: 10.02.2010
Post cannot call because it is a web method
Здравствуйте!
Столкнулся со следующей проблемой:
Если я в плагине запрашиваю данные и создаю
BusinessEntity[] buss = service.RetrieveMultiple(query).BusinessEntities;
После делаю update либо Create сущности:
service.Update((BusinessEntity)salesOrder);
А после делаю опять запрос и апдейт (уже другой сущности, но в том же плагине), то на
BusinessEntity[] плагин падает с ошибкой cannot call because it is a web method

Если я сначала запрашиваю и создаю 2 BusinessEntity[], а потом делаю апдейт первой, потом второй - то на втором service.Update плагин падает с той же ошибкой.
Вопрос в следующем: может быть нужно как-то освобождать сервис грубо говоря "закрывать сессию"?
Или ошибка в другом?
Старый 09.08.2010, 00:32   #2  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
1. Попытайтесь более структурированно излагать свои мысли. Честно сказать - сумбурный вопрос.
2. Если покажете код - будет проще разобраться.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 09.08.2010, 10:18   #3  
Krom is offline
Krom
Участник
 
28 / 10 (1) +
Регистрация: 10.02.2010
Согласен думаю по коду будет проще понять в чем проблема:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
using SDK = Microsoft.Crm.Sdk;
using pluginUpdateKursperescheta.CrmSdk;


namespace pluginUpdateKursperescheta
{
    public class onUpdateKp : SDK::IPlugin
    {
        public void Execute(SDK.IPluginExecutionContext context)
        {
            CrmAuthenticationToken token = new CrmAuthenticationToken();
            token.AuthenticationType = 0;
            token.OrganizationName = context.OrganizationName;

            CrmService service = new CrmService();
            RegistryKey regkey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\MSCRM");

            service.Url = String.Concat(regkey.GetValue("ServerUrl").ToString(), "/2007/crmservice.asmx");
            service.CrmAuthenticationTokenValue = token;
            service.UseDefaultCredentials = true;

            //-----------------------------------------------------------------------------------------

            SDK::DynamicEntity currentKp = context.PostEntityImages["KpIm"] as SDK::DynamicEntity;
            try
            {
                if (currentKp.Properties.Contains("new_kursperesheta"))
                {
                    ColumnSet cols = new ColumnSet()
                    {
                        Attributes = new string[] { "new_wholeamount" }
                    };

                    ConditionExpression cond = new ConditionExpression()
                    {
                        AttributeName = "quoteid",
                        Operator = ConditionOperator.Equal,
                        Values = new object[] { ((SDK::Key)currentKp.Properties["quoteid"]).Value }
                    };

                    FilterExpression filt = new FilterExpression()
                    {
                        Conditions = new ConditionExpression[] { cond }
                    };
                    QueryExpression query = new QueryExpression()
                    {
                        ColumnSet = cols,
                        EntityName = EntityName.quotedetail.ToString(),
                        Criteria = filt,
                    };
                    BusinessEntity[] buss = service.RetrieveMultiple(query).BusinessEntities;
                    decimal wholeamount = 0;
                    foreach (var item in buss)
                    {
                        wholeamount += ((quotedetail)item).new_wholeamount.Value;
                    }
                    ColumnSet colsTemp = new ColumnSet() { Attributes = new string[] { "new_temp_salesorderid" } };
                    ConditionExpression condTemp = new ConditionExpression() 
                    {
                        AttributeName = "new_quoteid",
                        Operator = ConditionOperator.Equal,
                        Values = new object[] {((SDK::Key)currentKp.Properties["quoteid"]).Value }
                    };
                    FilterExpression filTemp = new FilterExpression() 
                    {
                        Conditions = new ConditionExpression[] { condTemp }  
                    };
                    QueryExpression queryTemp = new QueryExpression() 
                    {
                        ColumnSet = colsTemp,
                        EntityName = EntityName.new_temp_salesorder.ToString(),
                        Criteria = filTemp
                    };
                    BusinessEntity[] bussTemp = service.RetrieveMultiple(queryTemp).BusinessEntities;
                    if (bussTemp.Length > 0) 
                    {
                        new_temp_salesorder tempSales = new new_temp_salesorder();
                        tempSales.new_temp_salesorderid = new Key() { Value = ((new_temp_salesorder)bussTemp[0]).new_temp_salesorderid.Value };
                        tempSales.new_quoteid = ((SDK::Key)currentKp.Properties["quoteid"]).Value.ToString();
                        tempSales.new_totallineitemamount = new CrmMoney() { Value = wholeamount };
                        tempSales.new_discountamount = new CrmMoney() { Value = wholeamount - (wholeamount * ((SDK::CrmDecimal)currentKp.Properties["discountpercentage"]).Value / 100) };
                        tempSales.new_totaltax = new CrmMoney() { Value = tempSales.new_discountamount.Value * Convert.ToDecimal(0.18) };
                        tempSales.new_totalamount = new CrmMoney() { Value = tempSales.new_totaltax.Value + tempSales.new_discountamount.Value };
                        service.Update((BusinessEntity)tempSales);
                    }
                    else
                    {
                        new_temp_salesorder tempSales = new new_temp_salesorder();
                        tempSales.new_temp_salesorderid = new Key();
                        tempSales.new_name = ((SDK::Key)currentKp.Properties["quoteid"]).Value.ToString();
                        tempSales.ownerid = new Owner() { Value = ((SDK::Lookup)currentKp.Properties["createdby"]).Value };
                        tempSales.new_quoteid = ((SDK::Key)currentKp.Properties["quoteid"]).Value.ToString();
                        tempSales.new_totallineitemamount = new CrmMoney() { Value = wholeamount };
                        tempSales.new_discountamount = new CrmMoney() { Value = wholeamount - (wholeamount * ((SDK::CrmDecimal)currentKp.Properties["discountpercentage"]).Value / 100) };
                        tempSales.new_totaltax = new CrmMoney() { Value = tempSales.new_discountamount.Value * Convert.ToDecimal(0.18) };
                        tempSales.new_totalamount = new CrmMoney() { Value = tempSales.new_totaltax.Value + tempSales.new_discountamount.Value };

// тут падает service.Create((BusinessEntity)tempSales)	Cannot call 'pluginUpdateKursperescheta.CrmSdk.CrmService.Create(pluginUpdateKursperescheta.CrmSdk.BusinessEntity)' because it is a web method.

                        service.Create((BusinessEntity)tempSales);
                    }
                }
            }
            catch (System.Web.Services.Protocols.SoapException ex)
            {
                throw new SDK::InvalidPluginExecutionException(
                   String.Format("An error occurred in the {0} plug-in.", this.GetType().ToString()), ex);
            }
        }
    }
}

Последний раз редактировалось Krom; 09.08.2010 в 10:58.
Старый 09.08.2010, 14:45   #4  
Гуревич Денис is offline
Гуревич Денис
Участник
Лучший по профессии 2009
 
228 / 67 (3) ++++
Регистрация: 04.08.2008
Адрес: Москва
Код:
service.Create((BusinessEntity)tempSales);
А зачем Вы к BusinessEntity приведение делаете? Это лишне.
__________________
Опыт позволяет ошибаться гораздо увереннее.
Старый 09.08.2010, 15:19   #5  
Krom is offline
Krom
Участник
 
28 / 10 (1) +
Регистрация: 10.02.2010
Проблему, к сожалению, это не решает.
Возможно и лишнее
Старый 09.08.2010, 16:55   #6  
ZooY is offline
ZooY
Участник
Аватар для ZooY
 
379 / 46 (2) +++
Регистрация: 24.06.2008
Адрес: Россия, Москва
Не очень понятно, а накой вы в плагине таким вот способом создаете экземпляр сервиса, почему не делаете так:
X++:
ICrmService service = context.CreateCrmService(true);
Может проблема как раз в этом?
И как регистрируете плагин, на какой событие, какой сущности и что в плане синхронности?
Старый 09.08.2010, 18:26   #7  
Гуревич Денис is offline
Гуревич Денис
Участник
Лучший по профессии 2009
 
228 / 67 (3) ++++
Регистрация: 04.08.2008
Адрес: Москва
Да тут вообще жуткая каша из неймспейсов.
Надо было пользоваться либо только классами веб-сервиса, либо (что правильнее) только Microsoft.Crm.Sdk. А как сейчас это компилится, я даже не представляю.
__________________
Опыт позволяет ошибаться гораздо увереннее.
Старый 10.08.2010, 15:19   #8  
Krom is offline
Krom
Участник
 
28 / 10 (1) +
Регистрация: 10.02.2010
Ошибка была тут:
tempSales.ownerid = new Owner() { Value = ((SDK::Lookup)currentKp.Properties["createdby"]).Value };
Понял, что если выдает ошибку такого типа, значит какой-то атрибут не нравится.
По поводу неймспейсов: их всего 2. Web Service тянет кастомные сущности.
Честно говоря по-другому я не умею. Когда-то показали такую схему, так и работаю
Если покажите аналогичный функционал, используя только Microsoft.Crm.Sdk буду очень благодарен
Старый 10.08.2010, 15:34   #9  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от Krom Посмотреть сообщение
Ошибка была тут:
tempSales.ownerid = new Owner() { Value = ((SDK::Lookup)currentKp.Properties["createdby"]).Value };
Понял, что если выдает ошибку такого типа, значит какой-то атрибут не нравится.
По поводу неймспейсов: их всего 2. Web Service тянет кастомные сущности.
Честно говоря по-другому я не умею. Когда-то показали такую схему, так и работаю
Если покажите аналогичный функционал, используя только Microsoft.Crm.Sdk буду очень благодарен
DynamicEntity предоставляют возможность не использовать WebReference. Рекомендую.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 10.08.2010, 16:05   #10  
Krom is offline
Krom
Участник
 
28 / 10 (1) +
Регистрация: 10.02.2010
Ясно, буду пробовать, спасибо.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Доступ к данным из IFD CRM ZooY Dynamics CRM: Разработка 20 31.03.2010 11:18
Microsoft Dynamics CRM Team Blog: CRM Online: ‘Contact Us’ Web Form Made Easy Blog bot Dynamics CRM: Blogs 0 20.05.2009 05:05
Microsoft Dynamics CRM Team Blog: List Web Part for Microsoft Dynamics CRM 4.0 Deployment Scenarios Blog bot Dynamics CRM: Blogs 0 30.01.2009 22:05
Microsoft Dynamics CRM Team Blog: List Web Part for Microsoft Dynamics CRM 4.0: Understanding Connections Blog bot Dynamics CRM: Blogs 0 20.01.2009 02:07
Microsoft Dynamics CRM Team Blog: Announcing List Web Part for Microsoft Dynamics CRM 4.0 Blog bot Dynamics CRM: Blogs 0 18.12.2008 06:06

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

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

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