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

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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.06.2008, 14:18   #61  
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   #62  
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   #63  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Или хотя бы проверить, есть ли в ReportingServices такой метод.
Метод есть, он его предлагает для выбора. А вот что ему не ясно... через рефлекшн попробую
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 19.06.2008, 15:22   #64  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Попробовал, та же ругань. Ругается еще и на 5 параметр, попробовал поэксперементировать с ним и создал массив System.Array но не помогло(
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 19.06.2008, 15:27   #65  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
А булевы переменные в .NET нормально отправляются? Может, дело в System.Boolean?

PS. Хотя в том же ListChildren используется bool и ничего страшного.

Последний раз редактировалось RumataEstor; 19.06.2008 в 15:30.
Старый 20.06.2008, 08:20   #66  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Red face
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
А булевы переменные в .NET нормально отправляются? Может, дело в System.Boolean?

PS. Хотя в том же ListChildren используется bool и ничего страшного.
Залез в содержимое файла В итоге вот что нашел в схеме XML. Судя по всему описание параметров вызываемых ReportingServices.

PHP код:
- <s:element name="GetReportParameters">
- <
s:complexType>
- <
s:sequence>
  <
s:element minOccurs="0" maxOccurs="1" name="Report" type="s:string" /> 
  <
s:element minOccurs="0" maxOccurs="1" name="HistoryID" type="s:string" /> 
  <
s:element minOccurs="1" maxOccurs="1" name="ForRendering" type="s:boolean" /> 
  <
s:element minOccurs="0" maxOccurs="1" name="Values" type="s0:ArrayOfParameterValue" /> 
  <
s:element minOccurs="0" maxOccurs="1" name="Credentials" type="s0:ArrayOfDataSourceCredentials" /> 
  </
s:sequence>
  </
s:complexType>
  </
s:element>
+ <
s:complexType name="ArrayOfParameterValue">
- <
s:sequence>
  <
s:element minOccurs="0" maxOccurs="unbounded" name="ParameterValue" nillable="true" type="s0:ParameterValue" /> 
  </
s:sequence>
  </
s:complexType>
- <
s:complexType name="ParameterValue">
- <
s:complexContent mixed="false">
- <
s:extension base="s0:ParameterValueOrFieldReference">
- <
s:sequence>
  <
s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" /> 
  <
s:element minOccurs="0" maxOccurs="1" name="Value" type="s:string" /> 
  <
s:element minOccurs="0" maxOccurs="1" name="Label" type="s:string" /> 
  </
s:sequence>
  </
s:extension>
  </
s:complexContent>
  </
s:complexType>
  <
s:complexType name="ParameterValueOrFieldReference" /> 
- <
s:complexType name="ArrayOfDataSourceCredentials">
- <
s:sequence>
  <
s:element minOccurs="0" maxOccurs="unbounded" name="DataSourceCredentials" nillable="true" type="s0:DataSourceCredentials" /> 
  </
s:sequence>
  </
s:complexType>
- <
s:complexType name="DataSourceCredentials">
- <
s:sequence>
  <
s:element minOccurs="0" maxOccurs="1" name="DataSourceName" type="s:string" /> 
  <
s:element minOccurs="0" maxOccurs="1" name="UserName" type="s:string" /> 
  <
s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string" /> 
  </
s:sequence>
  </
s:complexType
А вот так listChildren выглядит
-
PHP код:
<s:element name="ListChildren">
- <
s:complexType>
- <
s:sequence>
  <
s:element minOccurs="0" maxOccurs="1" name="Item" type="s:string" /> 
  <
s:element minOccurs="1" maxOccurs="1" name="Recursive" type="s:boolean" /> 
  </
s:sequence>
  </
s:complexType>
  </
s:element
Так что похоже дело в двух последних параметрах. Какие будут идеи?
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 20.06.2008, 09:13   #67  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
X++:
    System.Type                     t2;
    ;
    t2 = CLRInterop::Null("System.Array");
    info (t2.ToString());
Любопытно, зачем указывается тип объекта при определении NULL если в итоге посмотреть t2.ToString() какого типа он нельзя.
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 20.06.2008, 11:00   #68  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
В схеме ясно написано, что параметров 5, один из которых обязательный. Но ты же работаешь не напрямую с сервисами через SOAP, а используешь .NET обертку, которая предоставляет свой интерфейс. Вот на него и надо смотреть.

Попробуй посмотреть рефлектором на этот метод в сборке. Может быть, в той версии, которая у тебя, этот метод имеет другую сигнатуру либо вообще отличается названием.

Если же с этим все нормально, то я даже не знаю, что можно посоветовать. Ведь не может же быть такого, чтобы одни методы виделись, а другие нет. Ведь оба они объявлены public и разницы между ними быть не может.

Может, все-таки попробовать сделать все необходимое на C#, а в Аксапте использовать простейшие методы?
Старый 20.06.2008, 12:16   #69  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Попробуй посмотреть рефлектором на этот метод в сборке. Может быть, в той версии, которая у тебя, этот метод имеет другую сигнатуру либо вообще отличается названием.
Посмотрел, разницы не видно) Вроде такая же сборка как и у тебя
PHP код:
public ReportParameter[] GetReportParameters(string Reportstring HistoryIDbool ForRenderingParameterValue[] ValuesDataSourceCredentials[] Credentials);
 
Declaring TypeMicrosoft.Dynamics.ReportingServices.ReportingService2005 
Assembly
Microsoft.Dynamics.ReportingServicesVersion=4.0.0.0 
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Может, все-таки попробовать сделать все необходимое на C#, а в Аксапте использовать простейшие методы?
Ну если ничего не добьюсь то так и придется сделать... здесь уже скорей спортивный азарт победить систему
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 20.06.2008, 12:41   #70  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от KingPeas Посмотреть сообщение
X++:
    System.Type                     t2;
    ;
    t2 = CLRInterop::Null("System.Array");
    info (t2.ToString());
Любопытно, зачем указывается тип объекта при определении NULL если в итоге посмотреть t2.ToString() какого типа он нельзя.
Мне кажется, здесь ты забыл GetType(). Ты получил null типа System.Array и присвоил его переменной типа System.Type. В принципе, такое присвоения вообще должно давать ошибку совместимости типов, так как System.Array ни является наследником System.Type, ни имеет implicit (забыл как по-русски) методов приведения к нему.

Цитата:
Сообщение от KingPeas Посмотреть сообщение
Ну если ничего не добьюсь то так и придется сделать... здесь уже скорей спортивный азарт победить систему
Ну, если тебе нравится бег с препятствиями высотой больше твоего роста - то нормально. Я еще с Аксаптой не работал, но уже чувствую, что Visual Studio у меня не будет лежать мертвым грузом.

Последний раз редактировалось RumataEstor; 20.06.2008 в 12:45.
Старый 20.06.2008, 13:06   #71  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Talking
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Мне кажется, здесь ты забыл GetType(). Ты получил null типа System.Array и присвоил его переменной типа System.Type. В принципе, такое присвоения вообще должно давать ошибку совместимости типов, так как System.Array ни является наследником System.Type, ни имеет implicit (забыл как по-русски) методов приведения к нему.
Попробовал через объект CLR.
PHP код:
            obj CLRInterop::Null("System.Array");
            
t2 obj.GetType();
            
info (t2.ToString()); 
Выдает ошибку в момент исполнения что obj не определен.
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Ну, если тебе нравится бег с препятствиями высотой больше твоего роста - то нормально. Я еще с Аксаптой не работал, но уже чувствую, что Visual Studio у меня не будет лежать мертвым грузом.
Обычно работа в Аксапте не требует прыгать выше головы). Особая нужда возникает только при работе со сторонними приложениями (такими как RS2005 и т.п.) Оно и понятно интеграция никогда не давалась легко. В целом имеющихся в Аксапте инструментов с лихвой хватает для того чтобы реализовать большинство задач учета и анализа. Честно скажу извращаться пришлось только когда приходилось работать во вне Аксапты, то бишь когда выгружали в ворд и делали это через свой механизм выгрузки в XML шаблоны и сейчас когда сближаю RS и DAX. А так 99% задач MorphX берет с легкостью.
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 23.06.2008, 07:56   #72  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Господа знатоки .Net неужели нет идей как победить коварный метод GetReportParameters? Я уверен все дело в передаваемых параметрах, подобные ошибки были когда пытался передавать неправильные аргументы в другие методы. Но там получить объекты типа URL или Credentials было все же проще, я их создавал. А как здесь создать пустой массив элементов определенного типа не представляю(
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 23.06.2008, 11:04   #73  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
А если создавать объекты типа System.Array? Не CLRInterop::Null, а именно
X++:
System.Array params = GetReportParameters("Zzz", "", false,
          new System.Array(), new System.Array());
Кстати, у класса System.Array есть статический метод
Код:
public static Array CreateInstance(Type elementType, int length);
Creates a one-dimensional Array of the specified Type and length, with zero-based indexing.
http://msdn.microsoft.com/en-us/library/zb3cfh7k.aspx

Думаю, в твоем случае, это выход.

Последний раз редактировалось RumataEstor; 23.06.2008 в 11:09.
Старый 24.06.2008, 12:57   #74  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
:(
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
А если создавать объекты типа System.Array?
new System.Array()[/XPP].
метод возвращает <Класс не содержит эту функцию.>
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Кстати, у класса System.Array есть статический метод
Код:
public static Array CreateInstance(Type elementType, int length);
Creates a one-dimensional Array of the specified Type and length, with zero-based indexing.
http://msdn.microsoft.com/en-us/library/zb3cfh7k.aspx

Думаю, в твоем случае, это выход.
это ничего не дает( Метод не принимает в качестве параметра array? или ошибка где то раньше в передаваемых параметрах
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 24.06.2008, 15:00   #75  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Так как в Аксапте нет метода получить тип без создания объекта typeof(Microsoft.Dynamics.ReportingServices.ParameterValue) (или я плохо искал), то придется создавать экземпляры необходимых классов.
Надеюсь, такой вариант прокатит:
X++:
Microsoft.Dynamics.ReportingServices.ParameterValue _ParamVal =
    new Microsoft.Dynamics.ReportingServices.ParameterValue();
System.Type TParamVal = _ParamVal.GetType();
System.Array EmptyParams = CLRInterop::staticInvoke("System.Array",
    "CreateInstance", TParamVal, 0);
Microsoft.Dynamics.ReportingServices.DataSourceCredentials _DSCred =
    new Microsoft.Dynamics.ReportingServices.DataSourceCredentials();
System.Type TDSCred = _DSCred.GetType();
System.Array EmptyDSCred = CLRInterop::staticInvoke("System.Array",
    "CreateInstance", TDSCred, 0);
System.Array params = ReportingServices.GetReportParameters("Zzz", "", false,
    EmptyParams, EmptyDSCred);

Последний раз редактировалось RumataEstor; 24.06.2008 в 15:54. Причина: Забыл объект указать
Старый 24.06.2008, 15:09   #76  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
X++:
System.Array params = GetReportParameters("Zzz", "", false,
    EmptyParams, EmptyDSCred);
У дураков мысли схожи)))) Не обижайся, но сделал все то же самое один в один. Ругается компилятор на эту строчку, даже откомпилировать не дает, сразу ошибку кидает. Ты перед getReportParameters забыл указать ReportingServices? или я опять чего то упустил?
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 24.06.2008, 15:53   #77  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от KingPeas Посмотреть сообщение
У дураков мысли схожи)))) Не обижайся, но сделал все то же самое один в один. Ругается компилятор на эту строчку, даже откомпилировать не дает, сразу ошибку кидает. Ты перед getReportParameters забыл указать ReportingServices? или я опять чего то упустил?
Блин. Конечно нужна. Вызываем метод у объекта типа Microsoft.Dynamics.ReportingServices.ReportingService2005.

Исправил.
Старый 24.06.2008, 15:56   #78  
KingPeas is offline
KingPeas
Участник
Аватар для KingPeas
 
163 / 35 (2) +++
Регистрация: 09.01.2007
Адрес: Россия, Новосибирск
ну вот у него и выскакивает ошибка при компиляции(... хоть бы в момент исполнения, тогда бы можно было посмотреть в чем ошибка, а так даже глянуть то не знаешь как чего аксапте не нравится
__________________
Хочу IQ как ICQ, ну или хотя бы ICQ как IQ.
Старый 24.06.2008, 16:01   #79  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Блин, тогда проще вообще SOAP-ом. Аксапта умеет HTTP запросы отправлять?
Старый 24.06.2008, 16:33   #80  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Блин, тогда проще вообще SOAP-ом. Аксапта умеет HTTP запросы отправлять?
http://www.axaptapedia.com/Webservice
Теги
.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, время: 21:21.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.