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

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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.06.2008, 09:16   #1  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Кстати кто знает что делает метод Equals()? Он вроде есть у всех объектов CLRObject
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 19.06.2008, 10:38   #3  
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   #4  
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   #5  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Вообще чувствуешь себя как слепой котенок. Тычешься-тычешься в попытках понять как же оно должно работать, натыкаешься на глухие стены... Где же хваленая интеграция с .Net если инструменты для работы с оной неизвестно где искать??? Энумы извлекаются так, статические свойства так, поля получать неизвестно как... вопросов однозначно больше ответов
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 19.06.2008, 11:30   #6  
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:37   #7  
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:32   #8  
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:38   #9  
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   #10  
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   #11  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от KingPeas Посмотреть сообщение
Класс, работает, наконец то)))
Всем кто помогал покорить .Net огромное спасибо. Чтобы я без вашей помощи делал ума не приложу. Сажусь изучать .Net, не сомневаюсь что он еще пригодится.

О сколько нам открытий чудных
Готовят сборки от .Net
Спасения в советах мудрых
За это Вам большой РАХМЕТ.
Было здесь такое сообщение:
Цитата:
Сообщение от Link Посмотреть сообщение
ИМХО лучше не мучаться, написать dll и уже ее подключить в Аксапту.
Это и в будуещем пригодиться.
Думаю, такое решение - самое быстрое (и в скорости кодинга, и в скорости выполнения). Да и писать можно на чем больше нравится.
Старый 19.06.2008, 13:04   #12  
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:08   #13  
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, 12:57   #14  
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:06   #15  
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:18   #16  
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   #17  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Может, ошибка в типе переменной? Уверен, что ReportingServices типа Microsoft.Dynamics.ReportingServices.ReportingService2005? Уж с методами все должно быть нормально, ведь ListChildren нормально отрабатывает.
Старый 19.06.2008, 14:18   #18  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
:(
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Уверен, что ReportingServices типа Microsoft.Dynamics.ReportingServices.ReportingService2005? Уж с методами все должно быть нормально, ведь ListChildren нормально отрабатывает.
Тип правильный. Во первых в определении явно указываю
X++:
Microsoft.Dynamics.ReportingServices.ReportingService2005   ReportingServices = new Microsoft.Dynamics.ReportingServices.ReportingService2005();
Во вторых специально ввел для проверки в месте вызова
X++:
 info (ReportingServices.ToString());
возвращает
Microsoft.Dynamics.ReportingServices.ReportingService2005
так что ошибка непонятно где( Может у кого есть возможность в 2009 посмотреть код, там вроде описание необходимых параметров есть, возможно и ошибки более детальные выдаются...
Вот результирующий код
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;
    SRSItemTypeEnum                                             ItemType;
    System.Net.ICredentials cred = CLRInterop::staticInvoke("System.Net.CredentialCache", "get_DefaultCredentials");

    System.Exception                                            exception;
    System.Array                                                ar, ar2, arEmpty;
    System.Text.StringBuilder                                   sb = new System.Text.StringBuilder();
    System.Uri                                                  url = new System.Uri('http://ax-dev/ReportServer');
    str         name,
                path;
    int         i, j, arLength, arLength2, typeElement;
    str         type;

    anytype getFieldValue(CLRObject _object, str  _fieldName)
    {
        System.Type                     t;
        System.Reflection.FieldInfo     fieldInfo;
        ;

        t = _object.GetType();
        fieldInfo = t.GetField(_fieldName);
        return fieldInfo.GetValue(_object);

    }
    ;

    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);
            path = getFieldValue(catalogItem,"Path");
            name = getFieldValue(catalogItem,"Name");
            typeElement = getFieldValue(catalogItem,"Type");
            ItemType = typeElement;
            info (strfmt('%1 - %2 (%3)',ItemType, path, name));
            ar2 = ReportingServices.GetReportParameters(path, null, false, null, null);
            arLength2 = ar2.get_Length();
            for (j = 0; j < arLength2; j++)
            {
                reportParameter = ar2.GetValue(j);
                name = getFieldValue(reportParameter,"Name");
                info(strFmt('--Параметр %1',name));
            }

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

    }

    info('Конец');

}
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 19.06.2008, 14:39   #19  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Можно снова попробовать решлекшеном.
X++:
ReportingServices.GetType().InvokeMember("GetReportParameters",
               ClrInterop:: parseClrEnum("System.Reflection.BindingFlags", "InvokeMethod"),
               null,
               ReportingServices,
               [path, null, false, null, null]).
Или хотя бы проверить, есть ли в ReportingServices такой метод.
Старый 19.06.2008, 15:03   #20  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Или хотя бы проверить, есть ли в ReportingServices такой метод.
Метод есть, он его предлагает для выбора. А вот что ему не ясно... через рефлекшн попробую
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Теги
.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, время: 05:16.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.