| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			 
			
			В одном гриде связаны два датасорса по OuterJoin  
		
		
		
		
		
		
		
	таблица "Действие" и таблица "Детализация действия". В обеих таблицах есть поле Комментарий. Задача в гриде сделать поле в котором будет показан Комментарий из таблицы "Детализация действия", а в случае если "Детализация действия" - не существует показать Комментарий из таблицы "Действие" Как такое реализовать? И реализуемо ли это вообще? Мозг сломал  
		 | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			У табличного буфера есть методы joinChild()/joinParent(), по ним можно получить связанный черезе запрос буфер другой таблицы.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Logger (3). | |
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А не лучше ли создать новый display метод на таблице с детализацией? 
		
		
		
		
		
		
		
		
			X++: display Comment comment() { ActionTable actionTable; Comment comment; if (this.Comment != '') { comment = this.Comment; } else { select firstonly Comment from actionTable where this.ActionId == actionTable.ActionId; comment = actiontable.Comment; } return comment; } Последний раз редактировалось Stitch_MS; 10.10.2013 в 14:04. Причина: протупил  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Stitch_MS
			 
 
			А не лучше ли создать новый display метод на таблице с детализацией? 
		
	X++: display Comment comment() { ActionTable actionTable; Comment comment; if (this.Comment != '') { comment = this.Comment; } else { select firstonly Comment from actionTable where this.ActionId == actionTable.ActionId; comment = actiontable.Comment; } return comment; } условие вывода скорее такое X++: if (this.RecId) { comment = this.Comment; } else { select firstonly Comment from actionTable where this.ActionId == actionTable.ActionId; comment = actiontable.Comment; //но в том-то и беда что записи this в этом случае нет - this.ActionId всегда будет "" }  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			joinChild()/joinParent(), не нашел как достучаться из дисплейметода на датасорсе 
		
		
		
		
		
		
		
	пытался X++: display Comment(ActionDetailTable _actionDetailTable)
{
    ActionTable actionTable;
    ;
    
actionTable = _actionDetailTable.dataSource().cursor().joinParent();
} | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			В SQL это было бы так: 
		
		
		
		
		
		
		
	X++: select isNull(detailTable.Comment, actionTable.Comment) as comment from actionTable left outer join detailTable on actionTable.ActionId = detailTable.ActionId  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
А в обратном направлении идти пробовали? display Comment(ActionTable _actionTable) { ActionDetailTable actionDetailTable; ; actionDetailTable= _actionTable.dataSource().cursor().joinChild(); if (actionDetailTable.Comment ........ } Последний раз редактировалось Stitch_MS; 10.10.2013 в 15:11. Причина: опечатка  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 NavAx 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Для понимания работы  joinChild()/joinParent() 
		
		
		
		
		
		
		
	X++: static void Job51(Args _args) { InventTable InventTable, InventTableParent; InventSum InventSum; int i; ; while select InventTable join InventSum where InventSum.ItemId == InventTable.ItemId { i++; InventTableParent = InventSum.joinParent(); print(InventTable.RecId == InventTableParent.RecId); if (i >= 10) { break; } } } X++: display Comment(ActionDetailTable _actionDetailTable)
{
    ActionTable actionTableLocal;
    ;
    
    actionTableLocal = _actionDetailTable.joinParent();
    ....
} | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
   Курсор datasource'а - это текущая выбранная на гриде запись, к которой кнопки привязаны и проч., а display-методы отображают данные для кучи записей на гриде, именно поэтому display-методу на datasource передается буфер, для которого он должен что-то отобразить, и который может не быть текущей выбранной записью. Поэтому надо, во-первых, дергать метод joinChild на действии, а не joinParent на детализации, а во-вторых, дергать на переданном буфере, а не на курсоре formDS. Я вот щас на коленке сделал форму CustTable outer join CustTrans, где display-методом вывожу либо CustTrans.RecId, если он есть, либо CustTable.RecId. Вот код метода:X++: display Description test(CustTable _custTable) { CustTrans ct = _custTable.joinChild(); RecId id = ct.RecId ? ct.RecId : _custTable.RecId; Description ret = strfmt('%1 %2', id, ct.RecId ? 'trans' : 'table'); return ret; }  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: ex3em (1). | |
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			  Ура!! Заработало, Спасибо что указали где искать. не заметил что у входного параметра сразу есть joinChild()/joinParent(). Вот и начал извращенно лезть правой рукой к левому уху ![]() на OuterJoin если из чилд датасорса лезть по _actionDetailTable.joinParent(); не получается, похоже из-за отсутствия в чилде записи. а вот наоборот получилось. В паренте метод и из него лезть к чилду и проверять есть у него RecId - если есть то коммент чилда. Иначе комент парента. Огромное человеческое спасибо всем  
		 | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
|
| За это сообщение автора поблагодарили: gl00mie (1). | |