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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.09.2013, 14:35   #1  
_sharky_ is offline
_sharky_
Участник
 
4 / 10 (1) +
Регистрация: 16.09.2013
DAX 2009 SP1 Business Connector: SEHException при вызове CallStaticClassMethod
Приветствую. Пытаюсь вызывать static метод аксапты из внешнего C#-пового приложения через Business Connector, в данном методе делается выборка из таблицы с последующей записью результата в Xml (XmlDocument), при вызове на стороне программки получаю SEHException.
Код:
в AxCore_CallStatic(Char* , Char* , tagVARIANT* , Int32 , tagVARIANT* )
в Microsoft.Dynamics.BusinessConnectorNet.Axapta.CallStaticClassMethod(String className, String methodName, Object[] paramList)
в RevSvc.AxConnector.CallAxMethod(String className, String methodName, Object[] parameters)
Покопавшийсь в инете нашел статейку на MSDN, в которой сказано что надо обновить AX (поставить SP1), но он уже установлен. Версия коннектора 5.0.1500.4570.

Что можно сделать в этом случае? возращать контейнер не вариант, т.к. при 200000 элементах преобразование внутри коннектора выполняется около часа.

P.S. Методы, где не используется XMLDocument вызываются из Business Connector'a прекрасно
Старый 16.09.2013, 15:23   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
У вас вызываемый статический метод ведь, скорее всего, на сервере XML-ку формирует? А обратно возвращается именно Xml (строка) или же XmlDocument (ссылка на серверный объект)? Если просто из Аксапты джобиком дернуть этот же метод, нормально отрабатывает?
Старый 17.09.2013, 07:42   #3  
_sharky_ is offline
_sharky_
Участник
 
4 / 10 (1) +
Регистрация: 16.09.2013
Цитата:
Сообщение от gl00mie Посмотреть сообщение
У вас вызываемый статический метод ведь, скорее всего, на сервере XML-ку формирует?
Имeнно.
Цитата:
Сообщение от gl00mie Посмотреть сообщение
А обратно возвращается именно Xml (строка) или же XmlDocument (ссылка на серверный объект)?
Возвращатся string-овоe представление XmlDocument'a

Цитата:
Сообщение от gl00mie Посмотреть сообщение
Если просто из Аксапты джобиком дернуть этот же метод, нормально отрабатывает?
Джобиком эта функция прекрасно вызывается и возвращает требуемый результат
Старый 17.09.2013, 10:16   #4  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Активно использую коннектор .Net для возврата XML и подобных проблем не замечено, думаю тут нужно смотреть уже конкретно ваш код статического метода и С#, опубликуйте.
Старый 17.09.2013, 14:39   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от _sharky_ Посмотреть сообщение
Возвращатся string-овоe представление XmlDocument'a. Джобиком эта функция прекрасно вызывается и возвращает требуемый результат
А на какого размера XML-документах это все валится, любого или только на больших (>4Mb)? И если на больших, то джобиком вы тоже большой документ генерите или же просто мелкий тестовый?
Старый 18.09.2013, 09:11   #6  
_sharky_ is offline
_sharky_
Участник
 
4 / 10 (1) +
Регистрация: 16.09.2013
Цитата:
Сообщение от handy-comp Посмотреть сообщение
Активно использую коннектор .Net для возврата XML и подобных проблем не замечено, думаю тут нужно смотреть уже конкретно ваш код статического метода и С#, опубликуйте.
Ax:
X++:
public server static container mel_getInventTableWithBarcodeListXml(RBOID _rboid, RBOItemHierarchy _rboitemhierarchy)
{
    InventTable         inventTable;
    InventItemBarcode  inventItemBarcode;
    container           con = connull();
    XmlDocument         ItmXml;
    XmlElement          ItmRoot;
    XmlElement          ItmNode;
    XmlElement          ItmField;

    XmlDocument         BarXml;
    XmlElement          BarRoot;
    XmlElement          BarNode;
    XmlElement          BarField;
    ;
    ItmXml = XmlDocument::newBlank();
    BarXml = XmlDocument::newBlank();
    ItmRoot = ItmXml.createElement(@"DocumentElement");
    BarRoot = BarXml.createElement(@"DocumentElement");
    ItmXml.appendChild(ItmRoot);
    BarXml.appendChild(BarRoot);
    
    while select inventTable
    where inventTable.InventStatus == DKL_InventStatus::Active
    && (_rboItemHierarchy == RBOItemHierarchy::BusinessGroup
    && inventTable.MEL_BusinessGroup == _rboid)
    
    || (_rboitemhierarchy == RBOItemHierarchy::DivisionGroup
    && inventTable.MEL_DivisionGroup == _rboid)
    
    || (_rboitemhierarchy == RBOItemHierarchy::RetailDepartment
    && inventTable.MEL_ItemDepartment == _rboid)
    
    || (_rboitemhierarchy == RBOItemHierarchy::RetailGroup
    && inventTable.MEL_RetailGroup == _rboid)
    {
        ItmNode = ItmXml.createElement(@"I");
        ItmRoot.appendChild(ItmNode);
        
        ItmField = ItmXml.createElement(@"ItemId");
        ItmField.innerText(inventTable.ItemId);
        ItmNode.appendChild(ItmField);
        
        ItmField = ItmXml.createElement(@"Description");
        ItmField.innerText(inventTable.ItemName);
        ItmNode.appendChild(ItmField);
        
        ItmField = ItmXml.createElement(@"Article");
        ItmField.innerText(inventTable.MEL_Article);
        ItmNode.appendChild(ItmField);
        
        ItmField = ItmXml.createElement(@"Price");
        ItmField.innerText(num2str(inventTable.dkl_baseRetailPrices().BasePrice, 0, 8, 1, 0));
        ItmNode.appendChild(ItmField);
        
        while select inventItemBarcode
        where inventItemBarcode.itemId == inventTable.ItemId
        {
            BarNode = BarXml.createElement(@"B");
            BarRoot.appendChild(BarNode);
            
            BarField = BarXml.createElement(@"ItemId");
            BarField.innerText(inventTable.ItemId);
            BarNode.appendChild(BarField);
            
            BarField = BarXml.createElement(@"Barcode");
            BarField.innerText(inventItemBarcode.itemBarCode);
            BarNode.appendChild(BarField);
        }
    }
    con = [ItmXml.toString(), BarXml.toString()];
    return con;
}
в C# использую собственную обёртку для BusinessConnector'a
Код:
//вызов 
object Ret = ax.CallAxMethod("PosIsTransactionService", "mel_getInventTableWithBarcodeListXml", new object[] { BusinessGroup, ItemHierarchy });

//Обёртка
public object CallAxMethod(string className, string methodName, params object[] parameters)
        {
            if (AxConn == null)
                return null;
            object res = null;
            try
            {
                log.Write("AxConn.CallAxMethod({0}, {1})", className, methodName);
                res = AxConn.CallStaticClassMethod(className, methodName, parameters);
            }
            catch (BusinessConnectorException bex)
            {
                log.Write("AxConn.Logon BusinessConnectorException: {0} {1}", bex.ToString(), bex.Message);
                log.Write("AxConn.Logon BusinessConnectorException stack: {0}", bex.StackTrace);
                return null;
            }
            catch (Exception ex)
            {
                log.Write("AxConn.CallAxMethod Exception: {0} {1}", ex.ToString(), ex.Message);
                log.Write("AxConn.CallAxMethod Exception stack: {0}", ex.StackTrace);
                return null;
            }
            return res;
        }
Цитата:
Сообщение от gl00mie Посмотреть сообщение
А на какого размера XML-документах это все валится, любого или только на больших (>4Mb)? И если на больших, то джобиком вы тоже большой документ генерите или же просто мелкий тестовый?
Джобиком большой объем не пробовал, но <4Mb свободно собирает

P.S. Не пинайте сильно, я только учусь

Последний раз редактировалось _sharky_; 18.09.2013 в 09:15.
Старый 18.09.2013, 10:16   #7  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Я бы не стал использовать аксаптовский контейнер для возврата значений, это довольно специфичный тип данных, но если уж так хочется, тогда в C# надо использовать тип данных AxaptaContainer.
Возвращайте XML в виде текста.
Для теста попробуйте переделать свой статический метод на возврат XML в виде string одного из ваших XML документов, должно работать.
Старый 18.09.2013, 10:26   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от _sharky_ Посмотреть сообщение
Джобиком большой объем не пробовал, но <4Mb свободно собирает
Дык ить!.. В этом-то и загвоздка: в 2009-й есть ограничение в 4Мб на размер данных, передаваемых по значению, см., например, Падает клиент при прикреплении файла, поэтому на маленьких объемах может прокатывать, а на больших - падать. А вообще, лучше включите трассировку на клиенте и на сервере и воспроизведите падение - по трассировке потом (с помощью TraceParcer'а) можно будет точно локализовать, в каком именно месте валится обработка.
Старый 18.09.2013, 11:53   #9  
_sharky_ is offline
_sharky_
Участник
 
4 / 10 (1) +
Регистрация: 16.09.2013
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Дык ить!.. В этом-то и загвоздка: в 2009-й есть ограничение в 4Мб на размер данных, передаваемых по значению, см., например, Падает клиент при прикреплении файла, поэтому на маленьких объемах может прокатывать, а на больших - падать. А вообще, лучше включите трассировку на клиенте и на сервере и воспроизведите падение - по трассировке потом (с помощью TraceParcer'а) можно будет точно локализовать, в каком именно месте валится обработка.
Возможно вы не совсем верно меня поняли, У меня в любом случае при обращении к данному методу через Business Connector на стороне программки высыпается SEHException. Причем до аксаптовского метода даже не доходит. Я в принципе нашел решение, но на будущее хотелось бы знать как не плодить методы в колл-стеке
X++:
public static container mel_getInventTableWithBarcodeList(RBOID _rboid, RBOItemHierarchy _rboitemhierarchy)
{
    return PosIsTransactionService::mel_getInventTableWithBarcodeListXml(_rboid, _rboitemhierarchy);
}
Теги
business connector, sehexception

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axforum blogs: Квест: Подружим Dynamics Ax 2009 Sp1 RU7 c SharePoint Foundation 2010 Blog bot DAX Blogs 4 16.10.2017 17:50
Падает AOS MS DAX 2009 SP1 RU6 Daiver DAX: Администрирование 21 14.02.2011 09:59
Проблема запуска клиента DAX 2009 SP1 (safe mode) polygris DAX: Программирование 6 19.01.2010 12:32
emeadaxsupport: List of fixes that improve performance of certain features in Dynamics AX 2009 Blog bot DAX Blogs 0 13.10.2009 19:06
DAX 2009 SP1 + MS SQL Server 2008 xshaman DAX: Администрирование 7 10.12.2008 12:26

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

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

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