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

Результаты опроса: Нужен ли .Net Аксапте?
Конечно нужен, это ведь дополнительные возможности. 32 84.21%
Все что надо можно через DLL делать и не мучиться. 3 7.89%
Знал бы прикуп жил бы в Сочи. 3 7.89%
Голосовавшие: 38. Вы ещё не голосовали в этом опросе

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.06.2008, 13:52   #41  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Пробую получить список объектов.
X++:
static void Mel_RSGetReportParameter2(Args _args)
{
    Microsoft.Dynamics.ReportingServices.ReportingService2005   ReportingServices = new Microsoft.Dynamics.ReportingServices.ReportingService2005();
    Microsoft.Dynamics.ReportingServices.CatalogItem            catalogItem;
    Microsoft.Dynamics.ReportingServices.ReportParameter        reportParameter;
    System.Net.ICredentials cred = CLRInterop::staticInvoke("System.Net.CredentialCache", "get_DefaultCredentials");

    System.Exception                                            exception;
    System.Array                                                ar;
    System.Uri                                                  url = new System.Uri('http://ax-dev/ReportServer');
    str         name;
    ;

    try
    {
        ReportingServices.set_WebServiceUrl('http://ax-dev/ReportServer');
        ReportingServices.set_Credentials(cred);
        ReportingServices.ListChildren('/',true);
    }
    catch (Exception::CLRError)
    {
        info('Ошибка .NET');
        exception = CLRInterop::getLastException();
        name = exception.ToString();
        info (name);
 
    }

    info('Конец');

}
А получаю ошибку. Судя по ошибке ему не нравиться вариант с передачей в качестве параметра '/'. В SRSProxy вызывается именно так, делал по аналогии. Что может не нравиться?
Цитата:
Info Сообщение (15:48:06) Ошибка .NET
Info Сообщение (15:48:06) System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: Client found response content type of '', but expected 'text/xml'.
The request failed with an empty response.
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at Microsoft.Dynamics.ReportingServices.ReportingService2005.ListChildren(String Item, Boolean Recursive)
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at ClrBridgeImpl.InvokeClrInstanceMethod(ClrBridgeImpl* , ObjectWrapper* objectWrapper, Char* pszMethodName, Int32 argsLength, ObjectWrapper** arguments, Boolean* isException)
Info Сообщение (15:48:06) Конец
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 18.06.2008, 14:02   #42  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
С помощью рефлектора можно посмотреть на класс "Microsoft.Dynamics.ReportingServices.Proxy" (который предоставляется в SRSProxy). В нем в функции SetServerUrl есть такая строчка:
X++:
if (!url.EndsWith("ReportService2005.asmx"))
{
    url = Path.Combine(url, "ReportService2005.asmx");
}
Так что, похоже, нужно писать:
X++:
ReportingServices.set_WebServiceUrl('http://ax-dev/ReportServer/ReportService2005.asmx');
Старый 19.06.2008, 08:06   #43  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Thumbs up ОЛЕ...ОЛЕ-ОЛЕ-ОЛЕ Россия-молодец
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Так что, похоже, нужно писать:
X++:
ReportingServices.set_WebServiceUrl('http://ax-dev/ReportServer/ReportService2005.asmx');
Очередной рубеж пройден) Как хорошо когда есть толковый знаток).
Вроде прорыв, создал массив и сохранил в него значения... и опять руки опускаются(
X++:
static void RSGetReportParameter2(Args _args)
{
    Microsoft.Dynamics.ReportingServices.ReportingService2005   ReportingServices = new Microsoft.Dynamics.ReportingServices.ReportingService2005();
    Microsoft.Dynamics.ReportingServices.CatalogItem            catalogItem;
    Microsoft.Dynamics.ReportingServices.ItemTypeEnum           itemTypeEnum;
    Microsoft.Dynamics.ReportingServices.ReportParameter        reportParameter;
    System.Net.ICredentials cred = CLRInterop::staticInvoke("System.Net.CredentialCache", "get_DefaultCredentials");

    System.Exception                                            exception;
    System.Array                                                ar;
    str         name;
    int         i,arLength;
    str         type;
    ;

    try
    {
        ReportingServices.set_WebServiceUrl('http://ax-dev/ReportServer/ReportService2005.asmx');
        ReportingServices.set_Credentials(cred);
        ar = ReportingServices.ListChildren('/',true);
        arLength = ar.get_Length();
        for (i=0; i< arLength; i++)
        {
            catalogItem = ar.GetValue(i);
            name = catalogItem.GetHashCode(); // Также доступны GetType(); toString(); Equals()
            info (strfmt('%1 - %2',i,name));

        }
        info (name);
    }
    catch (Exception::CLRError)
    {
        info('Ошибка .NET');
        exception = CLRInterop::getLastException();
        name = exception.ToString();
        info (name);

    }

    info('Конец');

}
Смотрю через Reflector и вижу кучу интересующих меня свойств у CatalogItem и все они public как то: Path, Name и т.д. Но доступа к ним нет почему то?
Что делать ума не приложу. Посмотрел в SystemDocumentation ничего по смыслу подходящего нет(
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 19.06.2008, 09:16   #44  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Кстати кто знает что делает метод Equals()? Он вроде есть у всех объектов CLRObject
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 19.06.2008, 10:38   #46  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от KingPeas Посмотреть сообщение
Смотрю через Reflector и вижу кучу интересующих меня свойств у CatalogItem и все они public как то: Path, Name и т.д. Но доступа к ним нет почему то?
Что делать ума не приложу. Посмотрел в SystemDocumentation ничего по смыслу подходящего нет(
Проблема в том, что CatalogItem предоставляет не свойства, а поля. Очевидно, доступ к ним в Аксапте представляет очередную проблему.
А как ты пользовался SRSProxy? Получал xml?

Цитата:
Сообщение от KingPeas Посмотреть сообщение
Кстати кто знает что делает метод Equals()? Он вроде есть у всех объектов CLRObject
Обычно он проверяет равенство объектов. В зависимости от реализации он может проверять равенство по содержимому объектов, а может сравнивать только ссылки (указывают ли переменные на один объект).

PS. Так как в Аксапте исходники CLRInterop::staticInvoke я посмотреть не могу, не мог бы ты здесь их выложить. Тогда, возможно, некоторые проблемы можно было бы решить теми же методами, как они реализуются разработчиками Аксапты.
Старый 19.06.2008, 11:06   #47  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Проблема в том, что CatalogItem предоставляет не свойства, а поля. Очевидно, доступ к ним в Аксапте представляет очередную проблему.
А как ты пользовался SRSProxy? Получал xml?
SRSProxy реализован через COM и listChildren возвращает там действительно XML, а дальше идет его разбор средствами аксапты без лишней нервотрепки. Да вот только ReportingServices.ListChildren возвращает CLRObject в виде массива значений, подозреваю что тот же XML но как его оттуда выцарапать не знаю...
Пробовал перевести все через com сделать по аналогии, через Com не могу добраться до статического свойста Credentials...

Цитата:
Сообщение от RumataEstor Посмотреть сообщение
PS. Так как в Аксапте исходники CLRInterop::staticInvoke я посмотреть не могу, не мог бы ты здесь их выложить. Тогда, возможно, некоторые проблемы можно было бы решить теми же методами, как они реализуются разработчиками Аксапты.
Данный метод находится в закрытой части ядра SystemDocumentation и просмотреть его не так просто? во всяком случае как это сделать я не знаю.
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 19.06.2008, 11:11   #48  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Вообще чувствуешь себя как слепой котенок. Тычешься-тычешься в попытках понять как же оно должно работать, натыкаешься на глухие стены... Где же хваленая интеграция с .Net если инструменты для работы с оной неизвестно где искать??? Энумы извлекаются так, статические свойства так, поля получать неизвестно как... вопросов однозначно больше ответов
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 19.06.2008, 11:30   #49  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
я бы попробовал через reflection http://msdn.microsoft.com/en-us/libr....getvalue.aspx
За это сообщение автора поблагодарили: RumataEstor (1).
Старый 19.06.2008, 11:32   #50  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Найти способы доступа к полям из Аксапты не получилось.

Можно попробовать этот массив выгрузить в XML
X++:
System.Array ar = ReportingServices.ListChildren('/',true);
System.IO.StringWriter w = new System.IO.StringWriter();
System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(ar.GetType(),
          "http://schemas.microsoft.com/sqlserver/2005/06/30/reporting/reportingservices");
ser.Serialize(w, ar);
w.Flush();
str result = w.ToString();

Последний раз редактировалось RumataEstor; 19.06.2008 в 11:39.
Старый 19.06.2008, 11:37   #51  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от belugin Посмотреть сообщение
я бы попробовал через reflection http://msdn.microsoft.com/en-us/libr....getvalue.aspx
Точно. Можно так:
X++:
Microsoft.Dynamics.ReportingServices.CatalogItem            catalogItem;
//...
str path = catalogItem.GetType().GetField("Path").GetValue(catalogItem);
Старый 19.06.2008, 11:38   #52  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
типа
X++:
System.Type t;
    System.Reflection.FieldInfo f;
    Object o;
;
    t = x.GetType();
    f = t.GetField("field");
    o = f.GetValue(x);
    info(o.toString());
}
За это сообщение автора поблагодарили: KingPeas (1).
Старый 19.06.2008, 12:11   #53  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Цитата:
Сообщение от belugin Посмотреть сообщение
типа
X++:
System.Type t;
    System.Reflection.FieldInfo f;
    Object o;
;
    t = x.GetType();
    f = t.GetField("field");
    o = f.GetValue(x);
    info(o.toString());
}
Класс, работает, наконец то)))
Всем кто помогал покорить .Net огромное спасибо. Чтобы я без вашей помощи делал ума не приложу. Сажусь изучать .Net, не сомневаюсь что он еще пригодится.

О сколько нам открытий чудных
Готовят сборки от .Net
Спасения в советах мудрых
За это Вам большой РАХМЕТ.
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 19.06.2008, 12:54   #54  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от KingPeas Посмотреть сообщение
Класс, работает, наконец то)))
Всем кто помогал покорить .Net огромное спасибо. Чтобы я без вашей помощи делал ума не приложу. Сажусь изучать .Net, не сомневаюсь что он еще пригодится.

О сколько нам открытий чудных
Готовят сборки от .Net
Спасения в советах мудрых
За это Вам большой РАХМЕТ.
Было здесь такое сообщение:
Цитата:
Сообщение от Link Посмотреть сообщение
ИМХО лучше не мучаться, написать dll и уже ее подключить в Аксапту.
Это и в будуещем пригодиться.
Думаю, такое решение - самое быстрое (и в скорости кодинга, и в скорости выполнения). Да и писать можно на чем больше нравится.
Старый 19.06.2008, 12:57   #55  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Ох рано я обрадовался. Попробовал получить параметры как это делается в примерах
Сначала так
X++:
ar2 = ReportingServices.GetReportParameters( '/ABCD_New/ABCD_New', null, false, null,null);
потом так
X++:
            ar2 = ReportingServices.GetReportParameters( '/ABCD_New/ABCD_New',
                                                        CLRInterop::Null("System.String"),
                                                        false, 
                                                        CLRInterop::Null("Microsoft.Dynamics.ReportingServices.Microsoft.Dynamics.ReportingServices.DataSourceCredentials"),
                                                        CLRInterop::Null("Microsoft.Dynamics.ReportingServices.CatalogItem"));
Что-то непонятное , параметров 5. Ругается Класс не содержит эту функцию, обычно такой результат когда вызов неправильно идет. У кого будут какие идеи?
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 19.06.2008, 13:04   #56  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Думаю, такое решение - самое быстрое (и в скорости кодинга, и в скорости выполнения). Да и писать можно на чем больше нравится.
Рад бы писать, да к сожалению практически кроме MorphX ничем не владею. Стаж работы в качестве программиста скромный около 3 лет и все это время в Аксапте. Потихоньку осваиваю XML, SQL. Приходилось с VBA ковыряться, но там все на порядок проще было по офисным приложениям. Сейчас скорей всего придется VisualBasic .Net изучать. Для себя немного разбирался с HTML и ActionScript для Flash.
Так что не судите слишком строго) И потом если оно должно работать, так ведь стоит разбираться, тем более что AX2009 говорят очень связан с .Net
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 19.06.2008, 13:06   #57  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Во втором варианте, наверное, должны быть типы "System.Array", так как в декларации написаны массивы:
public ReportParameter[] GetReportParameters(string Report, string HistoryID, bool ForRendering, ParameterValue[] Values, DataSourceCredentials[] Credentials);

Параметров действительно 5, метод вроде бы называется верно. Может, у тебя переменная ReportingServices в этот момент уже другое значение принимает? Проверь ее тип с помощью метода GetType().
Старый 19.06.2008, 13:08   #58  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от KingPeas Посмотреть сообщение
Рад бы писать, да к сожалению практически кроме MorphX ничем не владею. Стаж работы в качестве программиста скромный около 3 лет и все это время в Аксапте. Потихоньку осваиваю XML, SQL. Приходилось с VBA ковыряться, но там все на порядок проще было по офисным приложениям. Сейчас скорей всего придется VisualBasic .Net изучать. Для себя немного разбирался с HTML и ActionScript для Flash.
Так что не судите слишком строго) И потом если оно должно работать, так ведь стоит разбираться, тем более что AX2009 говорят очень связан с .Net
Лучше уж C#. Насколько я знаю, в ActionScript синтаксис похож на Java, а C# - это Java от Microsoft.
Старый 19.06.2008, 13:18   #59  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Во втором варианте, наверное, должны быть типы "System.Array", так как в декларации написаны массивы
И так пробовал на промежуточном шаге, тоже не помогает(
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Может, у тебя переменная ReportingServices в этот момент уже другое значение принимает?
Ну если бы в этот момент ругалось бы в момент исполнения, а так Аксапта ругается еще на синтаксис, до запуска дело не дошло.
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 19.06.2008, 13:39   #60  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Может, ошибка в типе переменной? Уверен, что ReportingServices типа Microsoft.Dynamics.ReportingServices.ReportingService2005? Уж с методами все должно быть нормально, ведь ListChildren нормально отрабатывает.
Теги
.net, отчет, reporting services

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как сделать фильтр по группе пользователей? Zabr DAX: Программирование 12 08.04.2009 11:40
jinx: Microsoft Dynamics AX - X++ und .NET (CLR) Arrays Blog bot DAX auf Deutsch 0 03.03.2009 03:08
Dynamics AX: Vista, IIS 7 and .Net BC Blog bot DAX Blogs 0 14.06.2007 10:00
Dynamics AX: .Net BC Custom App, One Step Back! [Connection] Blog bot DAX Blogs 0 07.06.2007 22:41
Что сделать, чтобы связанные Data Source обновились? Maxim Gorbunov DAX: Программирование 4 11.04.2005 17:40

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

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

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