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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.06.2012, 15:38   #1  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
? Параметр COM-метода - Enum
Пожалуйста, помогите решить задачку (сломал себе всю голову уже).
Есть следующий метод:
PHP код:
public string GetDocflowsList(DocFlowStatusstatus = new DocFlowStatus?(), DateTimedate = new DateTime?(), DocFlowDirectiondirection = new DocFlowDirection?()) 
DocFlowStatus это:
PHP код:
public enum DocFlowStatus
{
    
Fail,
    
CompletedWithWarning,
    
Sending,
    
WaitingForAnswer,
    
Succeed

Axapta 3.0

как же все-таки передать из аксапты enum-параметр в COM-метод?
Спасибо.

Последний раз редактировалось Roman777; 25.06.2012 в 15:49.
Старый 26.06.2012, 10:03   #2  
Deepoint is offline
Deepoint
Участник
SAP
 
60 / 14 (1) ++
Регистрация: 01.04.2011
Записей в блоге: 1
У меня были такие же проблемы с передачей Map во внешнюю обработку.
В итоге не найдя подходящего решения (не ясно какой тип ставить в стороннем коде так что бы аксапта поняла). В итоге пришлось делать запил. В Вашем случае, например так:
X++:
COM service = new COM("4E4CC63D-84CB-4c7a-AA97-85126917E2DA");
result = service.test(enum2int(ABC::A));
info(strfmt("%1", result));
В стороннем методе обрабатывать каждое значение enum:
X++:
public enum ABC { None = 0, A, B, C }
public string test(int en)
{
     string ret;

     if (en == (int)ABC.A)
         ret ="A";
     if (en == (int)ABC.B)
         ret = "B";
     if (en == (int)ABC.C)
         ret = "C";
     if (en == (int)ABC.None)
         ret = "None";
     return ret;
}
Еще могу посоветовать эту статью. Немного не так как Вам нужно, но вероятно поможет.

Последний раз редактировалось Deepoint; 26.06.2012 в 10:26.
Старый 26.06.2012, 10:24   #3  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
Дело в том, что стороннее приложение от меня не зависит,
в качестве параметра enum методу необходим класс COM, которого нет (или я не знаю как его найти) как зарегистрированного COM-ообъекта. Или как-то можно попробовать сделать COM-объект на основе system.enum, но это уже сборка .NET, ее как COM объект создать не удается.
Старый 26.06.2012, 15:25   #4  
Deepoint is offline
Deepoint
Участник
SAP
 
60 / 14 (1) ++
Регистрация: 01.04.2011
Записей в блоге: 1
.Net сборку можно зарегистрировать в системе как COM объект. Для этого надо в настройках, в сведениях о сборке проставить идентификатор GUID(делал с помощью GUIDgen) и сделать её видимой для COM.
После этого сборку надо зарегистрировать в системе(regasm). Она становится доступной по GUID из кода аксапты.
Выше и есть .net библиотека которая используется как COM.
X++:
COM service = new COM("4E4CC63D-84CB-4c7a-AA97-85126917E2DA");
Только в самом коде библиотеки несколько наворотов надо делать - реализовать интерфейс класса который собственно в сборке работает.
Например:
X++:
namespace test
{
    [Guid("C70456F3-D4F7-431b-9205-A8B4C2743BA6")]
    public interface IMyClass
    {
        [DispId(1)]
        string test_message();
     }

    // Events 
    [Guid("BD5E8C93-E078-4732-B841-2DD415C470A8"),
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IMyEvents
    {
    }
   
    [Guid("4E4CC63D-84CB-4c7a-AA97-85126917E2DA"),
    
    ClassInterface(ClassInterfaceType.None),
    ComSourceInterfaces(typeof(IMyEvents))]
    public class MyClass : IMyClass
    {       
        public MyClass()
        {            

        }        
        public string test_message()
        {
            return "ОК!";
        }   
}
Старый 26.06.2012, 16:06   #5  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
Попробую объяснить по-другому.
Есть dll, исходников которой у меня нет (собственно они и не нужны).
В dll есть метод, на вход которого нужно передать значение enum в виде COM-объекта DocFlowStatus (это тип, который объевлен в dll).
К dll имеется пример ее использования в виде html-странички, в которой этот метод успешно вызывается так:
PHP код:
    function getDocflowsList() {
        
wrap(function () {
            var 
date = new Date();
            
date.setDate(date.getDate() - 1); 

            $(
docflowsList).val(
                    
Client.getDocflowsList($(docflowStatus).val(), date, $(docflowDirection).val())
                );
        });
    }

                    <
td>Состояние</td>
                    <
td>
                        <
select id="docflowStatus">
                            <
option value="Succeed" selected="selected">Выполнен</option>
                            <
option value="Sending">В процессе отправки</option>
                            <
option value="WaitingForAnswer">В ожидании ответа</option>
                            <
option value="CompletedWithWarning">Завершен с предупреждением</option>
                            <
option value="Fail">Завершен с ошибкой</option>
                        </
select>
                    </
td
Старый 27.06.2012, 12:16   #6  
Deepoint is offline
Deepoint
Участник
SAP
 
60 / 14 (1) ++
Регистрация: 01.04.2011
Записей в блоге: 1
Задача стоит обмен со сторонней системой?
Старый 27.06.2012, 13:06   #7  
b_nosoff is offline
b_nosoff
Читатель
Аватар для b_nosoff
MCP
MCBMSS
 
197 / 143 (5) +++++
Регистрация: 01.12.2004
Адрес: Msk
Записей в блоге: 13
Цитата:
Сообщение от Roman777 Посмотреть сообщение
В dll есть метод, на вход которого нужно передать значение enum в виде COM-объекта DocFlowStatus (это тип, который объевлен в dll).
К dll имеется пример ее использования
могу ошибаться, но мне показалось, что приведенный кусок кода скармливает указанному методу строковое значение...
__________________
Axapta non erubescit
Старый 27.06.2012, 13:08   #8  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
Цитата:
Сообщение от Deepoint Посмотреть сообщение
Задача стоит обмен со сторонней системой?
Да. Такском-файлер.
Старый 27.06.2012, 13:09   #9  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
Цитата:
Сообщение от b_nosoff Посмотреть сообщение
могу ошибаться, но мне показалось, что приведенный кусок кода скармливает указанному методу строковое значение...
Была попытка скормить и строку и целое число - не работает и ошибку не пишет. Вернее метод возвращает набор данных, но не отфильтрованный по входящим параметрам метода
Старый 27.06.2012, 14:21   #10  
Deepoint is offline
Deepoint
Участник
SAP
 
60 / 14 (1) ++
Регистрация: 01.04.2011
Записей в блоге: 1
Загрузил COM библиотеку такскома.
В студии можно выдернуть этот злосчастный тип данных, но для того что бы переменную этого типа использовать надо свою библиотеку делать, что как я предполагаю, не вариант...

Последний раз редактировалось Deepoint; 27.06.2012 в 14:30.
Старый 27.06.2012, 14:34   #11  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
Цитата:
Сообщение от Deepoint Посмотреть сообщение
Загрузил COM библиотеку такскома.
В студии можно выдернуть этот злосчастный тип данных, но для того что бы переменную этого типа использовать надо свою библиотеку делать, что как я предполагаю, не вариант...
А как то можно создать COM-вариант 'system.enum' в аксапте?
Старый 27.06.2012, 16:52   #12  
Deepoint is offline
Deepoint
Участник
SAP
 
60 / 14 (1) ++
Регистрация: 01.04.2011
Записей в блоге: 1
Пытался по всякому. К сожалению как Com-объект создать у меня не получилось. Как CLRObject создается, но для Ax 3.0 не подойдет за отсутствием References, если мне память не изменяет.
Старый 04.07.2012, 15:26   #13  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
Удалось передать параметры в виде строки.
До этого не получалось из-за того, что я варьировал только первым параметром (статус документа) – делал его целым и строковым,
в то время как третий параметр (направление документооборота) у меня оставался целочисленным:
PHP код:
    xmlString api.GetDocFlowsList("4"_fromDate"1"); 
За это сообщение автора поблагодарили: gl00mie (2).
Старый 04.07.2012, 17:29   #14  
Deepoint is offline
Deepoint
Участник
SAP
 
60 / 14 (1) ++
Регистрация: 01.04.2011
Записей в блоге: 1
Да, есть такое. Почему-то все возвращаемые переменные (в оболочке, которая пинает обмен, через api стороннего разработчика) возвращаются в виде строк. Хотя на стороне сервера прописаны int, double и т.д.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибка при вызове COM-метода koraman DAX: Программирование 8 23.10.2014 09:57
emeadaxsupport: Content news: May Blog bot DAX Blogs 0 01.06.2012 01:11
DynamicsAxSCM: Visualizing Security in Microsoft Dynamics AX 2012 Blog bot DAX Blogs 0 29.08.2011 13:11
Kurt Hatlevik: Sneak preview of the WMS E&E Blog bot DAX Blogs 0 04.05.2009 14:05
Com Connector и вызов статического метода Gorlum DAX: Программирование 2 11.08.2005 01:39

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

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

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