18.10.2016, 15:52 | #1 |
Участник
|
Разминка. Принять в метод map или таблицу
Чиста разминка для ума. Совершенно программистская задача.
для определенности, пусть будет https://github.com/mazzy-ax/SysCustVend Хочу сделать некий метод, который принимает либо map, либо таблицу. В этот метод хочу передать инициализированный или неинициализированный map. что-то типа такого X++: str TheUltimateQuestionOfLifeTheUniverseAndEverything(anytype mapOrTable) { if( /* Deep Thought question: mapOrTable is CustVendTable */ ) return 'nirvana'; return '42'; } static void main(Arga args) { CustTrans ctr; VendTrans vtr; CustVendTrans mapTr; CustVendTrans mapTrInit = vtr; CustTable ct; VendTable vt; CustVendTable mapT; CustVendTable mapTinit = ct; debug::assert('42' == TheUltimateQuestionOfLifeTheUniverseAndEverything (ctr)); debug::assert('42' == TheUltimateQuestionOfLifeTheUniverseAndEverything (vtr)); debug::assert('42' == TheUltimateQuestionOfLifeTheUniverseAndEverything (maptr)); debug::assert('42' == TheUltimateQuestionOfLifeTheUniverseAndEverything (maptrInit)); debug::assert('42' == TheUltimateQuestionOfLifeTheUniverseAndEverything (ct)); debug::assert('42' == TheUltimateQuestionOfLifeTheUniverseAndEverything (vt)); debug::assert('nirvana' == TheUltimateQuestionOfLifeTheUniverseAndEverything (mapTinit)); debug::assert('nirvana' == TheUltimateQuestionOfLifeTheUniverseAndEverything (mapT)); } какие минимальные действия нужно сделать в условии? какой тип у аргумента метода будет достаточен? все-таки anytype - это как-то уж очень. Последний раз редактировалось mazzy; 18.10.2016 в 17:13. |
|
18.10.2016, 16:14 | #2 |
Участник
|
Нужно отличить именно НЕ инициализированный Map? Тогда Common и sysDictTable.isMap()
X++: static void test(Args _args) { CustVendTrans custVendTrans; Common common; SysDictTable sysDictTable; CustTrans custTrans; ; //custVendTrans = custTrans; common = custVendTrans; sysDictTable = new SysDictTable(common.TableId); if (sysDictTable) { info(strFmt('%1',sysDictTable.isMap())); } info(strFmt('%1', common.TableId)); }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
18.10.2016, 16:17 | #3 |
Участник
|
Цитата:
угу. поэтому и не уточнял. а есть способ который работал бы и для инициализированного, и для неинициализированного? 2. isMap хорош, когда метод четко знает какой именно мап в него приходит а если допустимо передавать разные мапы? как узнать какой именно пришел в common? делать switch на tablenum? |
|
18.10.2016, 16:30 | #4 |
Участник
|
Цитата:
Если нам надо знать, что именно мы получили, и от этого строить обработку, то именно что switch на tablenum. Нам же все-равно надо будет как-то организовать ветвление кода в зависимости от полученного параметра. Или о чем тогда речь?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
18.10.2016, 16:41 | #5 |
Участник
|
Цитата:
"для определенности, пусть будет https://github.com/mazzy-ax/SysCustVend" предположим я хочу, чтобы метод возвратил признак "Клиент", если на вход поданы таблицы/мапы, связанные с клиентами, и возвратил "Поставщик", если на вход поданы таблицы/мапы связанные с поставщиками. пример вызова в разными объектами я написал выше. как отличить один неинициализированный мап от другого в методе? как отличить один инициализированный мап от другого, если они ссылаются на одни и те же таблицы. например, первый мап - на custTrans, vendTrans, а второй мап - на custTrans, vendTrans, emplTrans. =================== повторюсь, что это всего лишь разминка для ума. и часть совсем другой задачи, из которой я и вытащил собственно вопрос. скорее всего, задачу я полностью переформулирую. но на вопрос хотелось бы знать ответ, если он есть конечно. |
|
18.10.2016, 16:46 | #6 |
Участник
|
Ага. Но если Map еще не инициализирован, то мы никак не можем заранее сказать, какой именно таблицей он будет инициализирован. Клиентом или поставщиком. Нет данных
А вот если он инициализирован, то,... а нам действительно надо знать, что это именно map?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
18.10.2016, 17:11 | #7 |
Участник
|
нет конечно, реальную задачу я переформулирую, чтобы обойтись и без этого )))
а вот для себя хотелось бы понять - есть ли способ "действительно знать". я чуток подправил псевдокод, чтобы было понятно где и какой именно результат хотелось бы получить X++: str TheUltimateQuestionOfLifeTheUniverseAndEverything(anytype mapOrTable) { if( /* Deep Thought question: mapOrTable is CustVendTable */ ) return 'nirvana'; return '42'; } static void main(Arga args) { CustTrans ctr; VendTrans vtr; CustVendTrans mapTr; CustVendTrans mapTrInit = vtr; CustTable ct; VendTable vt; CustVendTable mapT; CustVendTable mapTinit = ct; debug::assert('42' == TheUltimateQuestionOfLifeTheUniverseAndEverything (ctr)); debug::assert('42' == TheUltimateQuestionOfLifeTheUniverseAndEverything (vtr)); debug::assert('42' == TheUltimateQuestionOfLifeTheUniverseAndEverything (maptr)); debug::assert('42' == TheUltimateQuestionOfLifeTheUniverseAndEverything (maptrInit)); debug::assert('42' == TheUltimateQuestionOfLifeTheUniverseAndEverything (ct)); debug::assert('42' == TheUltimateQuestionOfLifeTheUniverseAndEverything (vt)); debug::assert('nirvana' == TheUltimateQuestionOfLifeTheUniverseAndEverything (mapTinit)); debug::assert('nirvana' == TheUltimateQuestionOfLifeTheUniverseAndEverything (mapT)); } Последний раз редактировалось mazzy; 18.10.2016 в 17:15. |
|
18.10.2016, 17:17 | #8 |
Участник
|
В AX3.0 удалось сделать такой пример. В AX2009 он не работает.
Приведенный ниже джоб выдает представление объектов в виде xml. Вызовите у объекта метод xml() и распарсите атрибут "name" в узле xml "Record". И войдите в "нирвану", если название узла будет "CustVendTrans" См. рисунок. http://www.axforum.info/forums/attac...4&d=1476800120 X++: static void Job806(Args _args) { CustTrans ctr; VendTrans vtr; CustVendTrans mapTr; CustVendTrans mapTrInit = vtr; CustTable ct; VendTable vt; CustVendTable mapT; CustVendTable mapTinit = ct; void ultimate(object mapOrTable) { ; info(mapOrTable.xml()); } ; ultimate (ctr); ultimate (vtr); ultimate (maptr); ultimate (maptrInit); ultimate (ct); ultimate (vt); ultimate (mapTinit); ultimate (mapT); } Последний раз редактировалось Ace of Database; 18.10.2016 в 17:23. |
|
|
За это сообщение автора поблагодарили: mazzy (5). |
18.10.2016, 17:22 | #9 |
Участник
|
|
|
18.10.2016, 17:28 | #10 |
Участник
|
|
|
18.10.2016, 17:36 | #11 |
Участник
|
Пример бесполезен
Для НЕ инициализированных Map имя вполне можно получить и через DictTable. А для инициализированных Map и Ваш пример возвращает имя таблицы, а не имя Map PS: Чтобы пример заработал в старших версиях замените Object на Common
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
18.10.2016, 17:37 | #12 |
Участник
|
Второй вариант, который работает в AX2009
Для CustVendTrans получается значение "Номер счета: ," X++: static void Job806(Args _args) { CustTrans ctr; VendTrans vtr; CustVendTrans mapTr; CustVendTrans mapTrInit = vtr; CustTable ct; VendTable vt; CustVendTable mapT; CustVendTable mapTinit = ct; void ultimate(common mapOrTable) { ; info(strfmt("%1", mapOrTable.caption())); } ; ultimate (ctr); ultimate (vtr); ultimate (maptr); ultimate (maptrInit); ultimate (ct); ultimate (vt); ultimate (mapTinit); ultimate (mapT); } |
|
18.10.2016, 17:39 | #13 |
Участник
|
|
|
18.10.2016, 17:46 | #14 |
Участник
|
Цитата:
Map проявляет свою сущность интерфейса через предоставление стороннему коду названий и базовых типов полей, а также сигнатур экземплярных табличных методов. Map проявляет свою сущность разделяемого класса через реализацию логики экземплярных табличных методов. Из вышесказанного следует несколько выводов:
Цитата:
Резюме: в представленной постановке задачи код должен работать не с anytype и не с Map, а с Common и использовать API отражения для получения нужной информации. Анализ Common.TableId в коде ничем не хуже анализа Map.TableId Последний раз редактировалось gl00mie; 18.10.2016 в 19:43. Причина: стилистика |
|
|
За это сообщение автора поблагодарили: mazzy (5). |
18.10.2016, 17:47 | #15 |
Участник
|
|
|
18.10.2016, 17:47 | #16 |
Участник
|
Может, я чего-то не понимаю, но почему нельзя "по старинке"
X++: static void test(Args _args) { CustTrans ctr; VendTrans vtr; CustVendTrans mapTr; CustVendTrans mapTrInit = vtr; CustTable ct; VendTable vt; CustVendTable mapT; CustVendTable mapTinit = ct; void ultimate(common mapOrTable) { DictTable dictTable; ; dictTable = new dictTable(mapOrTable.TableId); info(dictTable.name()); //info(dictTable.label()); } ; ultimate (ctr); ultimate (vtr); ultimate (maptr); ultimate (maptrInit); ultimate (ct); ultimate (vt); ultimate (mapTinit); ultimate (mapT); }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
18.10.2016, 17:55 | #17 |
Участник
|
Цитата:
Чем это отличается от XML() и caption()?
Последний раз редактировалось Ace of Database; 18.10.2016 в 17:58. Причина: поправил оформление цитаты |
|
18.10.2016, 17:59 | #18 |
Участник
|
А есть ли возможность модифицировать Mapы? если да, то можно, например, перекрыть "бесполезный" метод toString() и возвращать "nirvana"
|
|