| 
			
			 | 
		#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.  | 
| 
	
 | 
| 
			
			 | 
		#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)); } 
				__________________ 
		
		
		
		
	- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря...  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
угу. поэтому и не уточнял. а есть способ который работал бы и для инициализированного, и для неинициализированного? 2. isMap хорош, когда метод четко знает какой именно мап в него приходит а если допустимо передавать разные мапы? как узнать какой именно пришел в common? делать switch на tablenum?  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Если нам надо знать, что именно мы получили, и от этого строить обработку, то именно что switch на tablenum. Нам же все-равно надо будет как-то организовать ветвление кода в зависимости от полученного параметра. Или о чем тогда речь? 
				__________________ 
		
		
		
		
	- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря...  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
"для определенности, пусть будет https://github.com/mazzy-ax/SysCustVend" предположим я хочу, чтобы метод возвратил признак "Клиент", если на вход поданы таблицы/мапы, связанные с клиентами, и возвратил "Поставщик", если на вход поданы таблицы/мапы связанные с поставщиками. пример вызова в разными объектами я написал выше. как отличить один неинициализированный мап от другого в методе? как отличить один инициализированный мап от другого, если они ссылаются на одни и те же таблицы. например, первый мап - на custTrans, vendTrans, а второй мап - на custTrans, vendTrans, emplTrans. =================== повторюсь, что это всего лишь разминка для ума. и часть совсем другой задачи, из которой я и вытащил собственно вопрос. скорее всего, задачу я полностью переформулирую. но на вопрос хотелось бы знать ответ, если он есть конечно.  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Ага. Но если Map еще не инициализирован, то мы никак не можем заранее сказать, какой именно таблицей он будет инициализирован. Клиентом или поставщиком. Нет данных 
		
		
		
		
		
		
			А вот если он инициализирован, то,... а нам действительно надо знать, что это именно map? 
				__________________ 
		
		
		
		
	- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря...  | 
| 
	
 | 
| 
			
			 | 
		#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.  | 
| 
	
 | 
| 
			
			 | 
		#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). | |
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Пример бесполезен  
		
		
		
		
		
		
			![]() Для НЕ инициализированных Map имя вполне можно получить и через DictTable. А для инициализированных Map и Ваш пример возвращает имя таблицы, а не имя Map PS: Чтобы пример заработал в старших версиях замените Object на Common 
				__________________ 
		
		
		
		
	- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря...  | 
| 
	
 | 
| 
			
			 | 
		#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); }  | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Map проявляет свою сущность интерфейса через предоставление стороннему коду названий и базовых типов полей, а также сигнатур экземплярных табличных методов. Map проявляет свою сущность разделяемого класса через реализацию логики экземплярных табличных методов. Из вышесказанного следует несколько выводов: 
 Цитата: 
	
![]() Резюме: в представленной постановке задачи код должен работать не с anytype и не с Map, а с Common и использовать API отражения для получения нужной информации. Анализ Common.TableId в коде ничем не хуже анализа Map.TableId  
		Последний раз редактировалось gl00mie; 18.10.2016 в 19:43. Причина: стилистика  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: mazzy (5). | |
| 
			
			 | 
		#15 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#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). | |
| 
			
			 | 
		#17 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Чем это отличается от XML() и caption()?
		
	 
 
		Последний раз редактировалось Ace of Database; 18.10.2016 в 17:58. Причина: поправил оформление цитаты  | 
| 
	
 | 
| 
			
			 | 
		#18 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А есть ли возможность модифицировать Mapы? если да, то можно, например, перекрыть "бесполезный" метод toString() и возвращать "nirvana"
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
	
	 | 
	
| Опции темы | Поиск в этой теме | 
| Опции просмотра | |
		
  |