27.05.2009, 18:21 | #1 |
Участник
|
Список методов таблицы
Добрый день!
Товарищи знатоки, как получить список методов таблицы? А, если возможно, то и параметры для каждого из методов? |
|
27.05.2009, 18:38 | #2 |
Модератор
|
1. Перейти на таблицу и посмотреть.
2. Джоб ИмяТаблицы переменнаяИмяТаблцы ; переменнаяИмяТаблцы. <-точка по точке - выпадут все динамические методы и поля переменнаяИмяТаблцы:: <-по второму двоеточию - выпадут все статические методы пробел -ктрл - ввод - а вы в самом методе. Прочитайте основы разработки, для начала. С Уважением, Георгий |
|
27.05.2009, 19:09 | #3 |
Участник
|
Не правильно задал вопрос...
Мне программно нужно получить список методов любой указанной таблицы. Например через класс SysDictTable можно получить список полей таблицы. |
|
27.05.2009, 19:12 | #4 |
Участник
|
Нашел... Всем спасибо
|
|
28.05.2009, 10:10 | #5 |
int 20h
|
Ну раз нашли, делитесь кодом ))))
__________________
It's just my Unhopelessnessabilityerism Trying to debug my mind |
|
28.05.2009, 10:43 | #6 |
Боец
|
Думаю, примерно так:
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 |
Ищущий знания...
|
Цитата:
Сообщение от 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 |
Боец
|
|
|
28.05.2009, 11:17 | #9 |
Участник
|
Цитата:
Сообщение от 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 <-- } OFFTOPIC : вообще если нужны только списки методов без параметров то для DAX 4.0(также для других версий) можно использовать static-методы класса sysPickList, например, чтобы получить список методов таблицы в DAX 4.0 достаточно вызвать ниже приведенный код X++: sysPickList::fillTablesMethodsMap(tableId) |
|
28.05.2009, 11:57 | #10 |
Участник
|
Ну все нахрен этот встроенный отчетник Буду теперь через нормальные ситстемы печатать
Последний раз редактировалось s_s_a; 28.05.2009 в 12:06. |
|
28.05.2009, 12:09 | #11 |
Ищущий знания...
|
Что за "встроенный отчетник"? Какие "нормальные системы"?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
28.05.2009, 12:21 | #12 |
Участник
|
Цитата:
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 |
Участник
|
А как в Аксапте сделать неполомав рук сложную форму? ТТН, например?
Вот я и озадачился. Прикрутил StimulSoft Report. И через BusinessConnector.Net пхаю в него данные. Работает быстро. А уж разработка самих форм ваааще песня! Первая версия собранных мной костылей требует некоторой ручной работы. Вот решил доавтоматизировать чуток |
|
28.05.2009, 12:26 | #14 |
Ищущий знания...
|
Цитата:
Сообщение от s_s_a
А как в Аксапте сделать неполомав рук сложную форму? ТТН, например?
Вот я и озадачился. Прикрутил StimulSoft Report. И через BusinessConnector.Net пхаю в него данные. Работает быстро. А уж разработка самих форм ваааще песня! Первая версия собранных мной костылей требует некоторой ручной работы. Вот решил доавтоматизировать чуток ... Причем тут репорты аксаптовские?? Про то что сделать в аксаптовском репорте сложную печатную форму - это мука, полностью согласен!
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
28.05.2009, 12:35 | #15 |
Участник
|
Получить данные из АХ сторонее приложение (в данном случае сторонний Генератор Отчетов) может и через базу напрямую, наверное. Но ведь таблицы могут выводить и какие-то расчитанные налету данные через методы. Вот, чтоб руками их не указывать, а получать список и использовать как поля в отчетнике, мне и понадобилась ваша помощь.
Если кто заинтересуется, могу подробней расписать... |
|
28.05.2009, 13:08 | #16 |
Боец
|
Распишите, интересно послушать идею. Но боюсь - это утопие.
|
|
28.05.2009, 13:28 | #17 |
MCTS
|
до кучи
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(); } При желании можно вытащить и значение по умолчанию |
|
Теги |
sysdicttable |
|
|