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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.05.2009, 18:21   #1  
s_s_a is offline
s_s_a
Участник
 
8 / 10 (1) +
Регистрация: 04.03.2009
Список методов таблицы
Добрый день!
Товарищи знатоки, как получить список методов таблицы? А, если возможно, то и параметры для каждого из методов?
Старый 27.05.2009, 18:38   #2  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
1. Перейти на таблицу и посмотреть.
2. Джоб
ИмяТаблицы переменнаяИмяТаблцы
;
переменнаяИмяТаблцы. <-точка по точке - выпадут все динамические методы и поля
переменнаяИмяТаблцы:: <-по второму двоеточию - выпадут все статические методы
пробел -ктрл - ввод - а вы в самом методе.

Прочитайте основы разработки, для начала.

С Уважением,
Георгий
Старый 27.05.2009, 19:09   #3  
s_s_a is offline
s_s_a
Участник
 
8 / 10 (1) +
Регистрация: 04.03.2009
Не правильно задал вопрос...
Мне программно нужно получить список методов любой указанной таблицы.
Например через класс SysDictTable можно получить список полей таблицы.
Старый 27.05.2009, 19:12   #4  
s_s_a is offline
s_s_a
Участник
 
8 / 10 (1) +
Регистрация: 04.03.2009
Нашел... Всем спасибо
Старый 28.05.2009, 10:10   #5  
zZ_TOP_Zz is offline
zZ_TOP_Zz
int 20h
Аватар для zZ_TOP_Zz
 
143 / 24 (1) +++
Регистрация: 26.02.2007
Адрес: Санкт -Петербург
Ну раз нашли, делитесь кодом ))))
__________________
It's just my Unhopelessnessabilityerism
Trying to debug my mind
Старый 28.05.2009, 10:43   #6  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Думаю, примерно так:
X++:
static void classMethodInfo(Args _args)
{
    SysDictClass    sysDictClass;
    DictMethod      dictMethod;
    counter         methodCount, varCount;
    str             parmsStr;
    ;

    sysDictClass = new SysDictClass(classnum(RunBaseBatch));

    setPrefix(sysDictClass.name());

    methodCount = sysDictClass.objectMethodCnt();

    while (methodCount)
    {
        dictMethod = sysDictClass.objectMethodObject(methodCount);

        if (dictMethod)
        {
            parmsStr = '';

            for (varCount = dictMethod.parameterCnt(); varCount >= 1; varCount --)
            {
                parmsStr += strFmt("%1 %2, ", dictMethod.parameterType(varCount), dictMethod.parameterName(varCount));
            }

            parmsStr = strdel(parmsStr, strlen(parmsStr) - 1, 2);

            info (strFmt ("%1 (%2)", dictMethod.name(), parmsStr));
        }

        methodCount --;
    }
}
Старый 28.05.2009, 10:49   #7  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Думаю, примерно так:
X++:
static void classMethodInfo(Args _args)
{
    SysDictClass    sysDictClass;
    DictMethod      dictMethod;
    counter         methodCount, varCount;
    str             parmsStr;
    ;

    sysDictClass = new SysDictClass(classnum(RunBaseBatch));

    setPrefix(sysDictClass.name());

    methodCount = sysDictClass.objectMethodCnt();

    while (methodCount)
    {
        dictMethod = sysDictClass.objectMethodObject(methodCount);

        if (dictMethod)
        {
            parmsStr = '';

            for (varCount = dictMethod.parameterCnt(); varCount >= 1; varCount --)
            {
                parmsStr += strFmt("%1 %2, ", dictMethod.parameterType(varCount), dictMethod.parameterName(varCount));
            }

            parmsStr = strdel(parmsStr, strlen(parmsStr) - 1, 2);

            info (strFmt ("%1 (%2)", dictMethod.name(), parmsStr));
        }

        methodCount --;
    }
}
Что бы народ не путался.
Изначально был вопрос про таблицы, для них нужно использовать SysDictTable, а не SysDictClass.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 28.05.2009, 10:55   #8  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от lev Посмотреть сообщение
Что бы народ не путался.
Изначально был вопрос про таблицы, для них нужно использовать SysDictTable, а не SysDictClass.
BINGO!
Для таблиц заменить SysDictClass на SysDictTable и classNum() на tablenum().
Всё остальное - 1:1
Старый 28.05.2009, 11:17   #9  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Думаю, примерно так:
X++:
static void classMethodInfo(Args _args)
{
    SysDictClass    sysDictClass;
    DictMethod      dictMethod;
    counter         methodCount, varCount;
    str             parmsStr;
    ;
 
    sysDictClass = new SysDictClass(classnum(RunBaseBatch));
 
    setPrefix(sysDictClass.name());
 
    methodCount = sysDictClass.objectMethodCnt();
 
    while (methodCount)
    {
        dictMethod = sysDictClass.objectMethodObject(methodCount);
 
        if (dictMethod)
        {
            parmsStr = '';
 
            for (varCount = dictMethod.parameterCnt(); varCount >= 1; varCount --)
            {
                parmsStr += strFmt("%1 %2, ", dictMethod.parameterType(varCount), dictMethod.parameterName(varCount));
            }
 
            parmsStr = strdel(parmsStr, strlen(parmsStr) - 1, 2);
 
            info (strFmt ("%1 (%2)", dictMethod.name(), parmsStr));
        }
 
        methodCount --;
    }
}
Небольшое дополнение :
1. данный код не учитывает статических методов, дополнил job DSPIC, чтобы статические методы учитывались
X++:
static void classMethodInfo(Args _args)
{
    SysDictClass    sysDictClass;
    DictMethod      dictMethod;
    counter         methodCount, varCount;
    str             parmsStr;
    ;
    sysDictClass = new SysDictClass(classnum(SysDictClass));
    setPrefix(sysDictClass.name());
    methodCount = sysDictClass.objectMethodCnt();
    while (methodCount)
    {
        dictMethod = sysDictClass.objectMethodObject(methodCount);
        if (dictMethod)
        {
            parmsStr = '';
            for (varCount = dictMethod.parameterCnt(); varCount >= 1; varCount --)
            {
                parmsStr += strFmt("%1 %2, ", dictMethod.parameterType(varCount), dictMethod.parameterName(varCount));
            }
            parmsStr = strdel(parmsStr, strlen(parmsStr) - 1, 2);
            info (strFmt ("%1 (%2)", dictMethod.name(), parmsStr));
        }
        methodCount --;
    }
 //SRF -->
    methodCount = sysDictClass.staticMethodCnt();
    while (methodCount)
    {
        dictMethod = sysDictClass.staticMethodObject(methodCount);
        if (dictMethod)
        {
            parmsStr = '';
            for (varCount = dictMethod.parameterCnt(); varCount >= 1; varCount --)
            {
                parmsStr += strFmt("%1 %2, ", dictMethod.parameterType(varCount), dictMethod.parameterName(varCount));
            }
            parmsStr = strdel(parmsStr, strlen(parmsStr) - 1, 2);
            info (strFmt ("%1 (%2)", dictMethod.name(), parmsStr));
        }
        methodCount --;
    }
//SRF <--
}
2. Данный код не работает в AX 3.0 SP2(он просто не компилируется, поскольку у dictMethod отсутсвует метод parameterName)

OFFTOPIC : вообще если нужны только списки методов без параметров то для DAX 4.0(также для других версий) можно использовать static-методы класса sysPickList, например, чтобы получить список методов таблицы в DAX 4.0 достаточно вызвать ниже приведенный код
X++:
sysPickList::fillTablesMethodsMap(tableId)
Старый 28.05.2009, 11:57   #10  
s_s_a is offline
s_s_a
Участник
 
8 / 10 (1) +
Регистрация: 04.03.2009
Ну все нахрен этот встроенный отчетник Буду теперь через нормальные ситстемы печатать

Последний раз редактировалось s_s_a; 28.05.2009 в 12:06.
Старый 28.05.2009, 12:09   #11  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от s_s_a Посмотреть сообщение
Ну все нахрен этот встроенный отчетник Буду теперь через нормальные ситстемы печатать
Что за "встроенный отчетник"? Какие "нормальные системы"?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 28.05.2009, 12:21   #12  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Цитата:
X++:
...
for (varCount = dictMethod.parameterCnt(); varCount >= 1; varCount --)
{
    parmsStr += strFmt("%1 %2, ", dictMethod.parameterType(varCount), dictMethod.parameterName(varCount));
}
Не будет ли отображаемый список параметров метода при таком цикле идти в обратном порядке? или в данном контексте считаем что это не важно?

Добавлю своих 5 копеек для DAX 4.0:
X++:
static void jbTableMethodList(Args _args)
{
    void tableMethodList( TableId _tableId, boolean _isStatic = false )
    {
        DictTable       dictTable = new DictTable( _tableId ) ;
        DictMethod      dictMethod      ;
        
        Counter         methodCount     ;
        Counter         methodIdx       ;
        Counter         varIdx          ;
        
        str             methodNameTxt   ;
        str             varListTxt      ;
        ;

        if( !dictTable )
            return ;

        setPrefix( strfmt( "%1 - %2 methods", dictTable.name(), _isStatic ? 'static' : 'instance' ) ) ;
        methodCount = _isStatic ? dictTable.staticMethodCnt() : dictTable.objectMethodCnt() ;
        for( methodIdx=1; methodIdx<=methodCount; methodIdx++ )
        {
            dictMethod = _isStatic ? dictTable.staticMethodObject( methodIdx ) : dictTable.objectMethodObject( methodIdx ) ;
            methodNameTxt = dictMethod.runMode() == ClassRunMode::Called ? '' : strfmt( "%1 ", dictMethod.runMode() ) ;
            methodNameTxt += strfmt( "%1 %2", extendedTypeId2DisplayName( dictMethod.returnType(), dictMethod.returnId() ), dictMethod.name() ) ;
            
            varListTxt = '' ;
            for( varIdx=1; varIdx<=dictMethod.parameterCnt(); varIdx++ )
            {
                varListTxt += strfmt( "%1 %2%3, ",  extendedTypeId2DisplayName( dictMethod.parameterType( varIdx ), dictMethod.parameterId( varIdx ) ),
                                                    dictMethod.parameterName( varIdx )    ,
                                                    dictMethod.parameterOptional( varIdx ) ? ' (optional)' : '' ) ;
            }
            info( strfmt( "%1(%2)", methodNameTxt, strdel( varListTxt, strlen( varListTxt ), -2 ) ) ) ;
        }
    }
    ;

    info( 'Dict reflection: DictTable & DictMethod' ) ;
    tableMethodList( tableNum( InventTable), false ) ;
    tableMethodList( tableNum( InventTable ), true ) ;
}
Старый 28.05.2009, 12:23   #13  
s_s_a is offline
s_s_a
Участник
 
8 / 10 (1) +
Регистрация: 04.03.2009
А как в Аксапте сделать неполомав рук сложную форму? ТТН, например?

Вот я и озадачился. Прикрутил StimulSoft Report. И через BusinessConnector.Net пхаю в него данные. Работает быстро. А уж разработка самих форм ваааще песня!

Первая версия собранных мной костылей требует некоторой ручной работы. Вот решил доавтоматизировать чуток
Старый 28.05.2009, 12:26   #14  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от s_s_a Посмотреть сообщение
А как в Аксапте сделать неполомав рук сложную форму? ТТН, например?

Вот я и озадачился. Прикрутил StimulSoft Report. И через BusinessConnector.Net пхаю в него данные. Работает быстро. А уж разработка самих форм ваааще песня!

Первая версия собранных мной костылей требует некоторой ручной работы. Вот решил доавтоматизировать чуток
Что то я не совсем понял... Тема вроде про то, как получить список методов таблицы
... Причем тут репорты аксаптовские??
Про то что сделать в аксаптовском репорте сложную печатную форму - это мука, полностью согласен!
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 28.05.2009, 12:35   #15  
s_s_a is offline
s_s_a
Участник
 
8 / 10 (1) +
Регистрация: 04.03.2009
Получить данные из АХ сторонее приложение (в данном случае сторонний Генератор Отчетов) может и через базу напрямую, наверное. Но ведь таблицы могут выводить и какие-то расчитанные налету данные через методы. Вот, чтоб руками их не указывать, а получать список и использовать как поля в отчетнике, мне и понадобилась ваша помощь.

Если кто заинтересуется, могу подробней расписать...
Старый 28.05.2009, 13:08   #16  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Распишите, интересно послушать идею. Но боюсь - это утопие.
Старый 28.05.2009, 13:28   #17  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
до кучи

X++:
    XInfo                   xInfo = new XInfo();
    TreeNode                obj;
    int                     i, j;
    TreeNodeIterator        it;
    DictMethod              method;
    str                     source;
    container               con;
    str                     prmType, prmName, prmDefValue;
    ;
    obj =  xInfo.rootNode();
    obj = obj.AOTfindChild('Data Dictionary');
    obj = obj.AOTfindChild('Tables');
    obj = obj.AOTfindChild('AddressTrans_RU');
    obj = obj.AOTfindChild('Methods');
    setprefix("EmplLedger_RU");
    it = obj.AOTiterator();
 
    obj = it.next();
    while (obj)
    {
        setprefix(obj.AOTname());
        source = obj.AOTgetSource();
        source = strrem(source, "\n");
        i = strscan(source, "(", 1, 999);
        source = substr(source, i+1, strscan(source, ")", 1, 999)-i-1);
        con = source ? str2con(source, ",", true) : connull();
        if (conlen(con))
        for (i = 1; i <= conlen(con); i++)
        {
            source = strLRTrim(conpeek(con, i));
            j = strscan(source, " ", 1, 999);
            prmType = strLRTrim(substr(source, 1, j-1));
            source = strLRTrim(substr(source, j+1, 999));
            j = strscan(source, "=", 1, 999) ? strscan(source, "=", 1, 999) : strscan(source, " ", 1, 999) ;
                prmName = strLRTrim(substr(source, 1, j ? j-1 : 999));
 
            info(strfmt("%1 - %2", prmType, prmName));
        }
        else
            info("Нет параметров");
        obj = it.next();
    }
Работает одинаково, что в 3-ке, что в 4-ке.
При желании можно вытащить и значение по умолчанию
Теги
sysdicttable

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Лукап, отображающий список полей определённой таблицы Damn DAX: Программирование 7 17.09.2010 18:00
Пересоздание таблицы при синхронизации Serg16 DAX: Администрирование 1 26.08.2009 13:55
Вставка строк в таблицы Аксапты сторонними средствами Андре DAX: База знаний и проекты 1 07.05.2009 16:49
Методы таблицы в DataSources (DAX4) Qaz Qwerty DAX: Программирование 2 16.06.2008 10:11
Получение из поля Map кода поля реальной таблицы, к ней привязанной (Mappings) vey DAX: Функционал 5 16.03.2005 11:16

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

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

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