|  09.10.2008, 15:20 | #1 | 
| Участник | Связь одинаковых DS 
			
			Всем привет! Туго соображаю чтото, не могу понять как связать два датасорса на основе CustTrans на форме, чтобы в результате выбрались записи которые есть и в 1м и 2м ds. Условия фильтрация для каждого ds свои... Подскажите пож-та, никак не доходит до меня   | 
|  | 
|  09.10.2008, 15:29 | #2 | 
| Участник | 
			
			Предполагаю, что по RecId (queryBuildDataSource.addLink())
		 | 
|  | 
|  09.10.2008, 15:38 | #3 | 
| Участник | 
			
			ну а как это написать? таблица то одна - CustTrans qbdCustTransCredit.addLink(fieldnum(CustTrans, RecId), fieldnum(CustTrans, RecId)); так чтоли?? | 
|  | 
|  09.10.2008, 15:42 | #4 | 
| Moderator | |
|  | 
|  09.10.2008, 15:47 | #5 | 
| Участник | 
			
			А sql запрос составить сможете? Чтоб было понятнее чёго вы хотите. 
				__________________ Энергия молодых и неравнодушных способна изменить мир к лучшему. | 
|  | 
|  09.10.2008, 15:56 | #6 | 
| Moderator | 
			
			breakpoint, кстати, да, полезно было бы. А то Иван на линк столкнул, я повёлся, а вам, похоже, объединение нужно? типа UNION в SQL? P.S. Хотя нет, наверное, обычный INNER JOIN.... Это я уже на реплику miklenew повелся - типа "раз он про скуль переспросил, значит не всё так просто!"   | 
|  | 
|  09.10.2008, 16:11 | #7 | 
| Участник | 
			
			Выкладываю форму, нужно чтобы выбирались только те записи которые есть в обеих таблицах
		 | 
|  | 
|  09.10.2008, 16:14 | #8 | 
| Участник | 
			
			Вам нужно использоваться третий параметр метода addLink _parentDataSourceName. Так как у вас 2 одинаковых датасорса, у них должны быть разные имена. Соответственно, на втором датасорсе в init добавляете link, и там указываете название первого ds | 
|  | 
|  09.10.2008, 16:42 | #9 | 
| Участник | 
			
			у меня нет в link 3го параметра... ax 3 sp3 | 
|  | 
|  09.10.2008, 16:51 | #10 | 
| Moderator | 
			
			У меня тоже. Поэтому: "ТОВАРИСЧ! ДЕЛАЙ ЧЕРЕЗ RANGE!"   Как-то так: X++: qbr = qbdCustTransCredit.addRange(fieldnum(CustTrans, RecId)) qbr.value('(RecId==CustTransDebit.RecId)'); // и чтобы юзера вдруг не разрушили, но видели qbr.status(RangeStatus::Locked); | 
|  | 
|  09.10.2008, 16:56 | #11 | 
| Участник | 
			
			Ааа.  Тогда вам сюда: http://www.axaptapedia.com/Expressions_in_query_ranges Секция "WHERE clauses referencing fields from multiple tables" | 
|  | 
|  09.10.2008, 17:20 | #12 | 
| Moderator | 
			
			Глянул в проект. По-моему всё-таки попахивает UNION, так как: X++: qbdCustTransDebit.addRange(fieldnum(CustTrans, AmountCur)).value('>0'); qbdCustTransCredit.addRange(fieldnum(CustTrans, AmountCur)).value('<0'); | 
|  | 
|  09.10.2008, 18:04 | #13 | 
| Участник | 
			
			имеется ввиду то что должны МЫ и НАМ, да и неважно как называется на самом деле...
		 | 
|  | 
|  09.10.2008, 20:11 | #14 | 
| Участник | 
			
			Если как Gustav предложил не получиться, можно  1) Добавить на форму третий датасорс. 2) Снять результат с первого и воторого датасорса закинуть во временную таблицу. В качестве временной таблицы использовать табл переменную CustTrans только перед этим поставить setTmp() 3) Поставить кодом CustTrans.setTmp(); CustTrans.setTmpData(локал перем); Только редактировать в этой форме ничего не сможем и если кнопки будете на этой форме делать не расчитывайте на recId или см здесь Временная таблица. 
				__________________ Энергия молодых и неравнодушных способна изменить мир к лучшему. | 
|  | 
|  10.10.2008, 08:34 | #15 | 
| Administrator | Цитата: Вы ж во временную табличку пихаете все записи (а значит их выбираете и вставляете) - а их сколько там? 500 тыс, 1 млн? А для вывода на экран выбираются только визуально видимые записи+15 вверх+15 вниз записей (точные цифры не помню - может не 15, а 30 - но порядок тот же). Причем - это кол-во не зависит от общего кол-ва записей в таблице. Так что - лучше в этой задаче не связываться со временными таблицами, а добить выборку из постоянных. Ну или отказаться от реализации задачи в том виде - в котором изначально хотелось. 
				__________________ Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 10.10.2008 в 08:39. | 
|  | 
|  10.10.2008, 09:23 | #16 | 
| Участник | Цитата: 
		
			Сообщение от sukhanchik
			   Вы ж во временную табличку пихаете все записи (а значит их выбираете и вставляете) - а их сколько там? 500 тыс, 1 млн? А для вывода на экран выбираются только визуально видимые записи+15 вверх+15 вниз записей (точные цифры не помню - может не 15, а 30 - но порядок тот же). Причем - это кол-во не зависит от общего кол-ва записей в таблице. X++: void clicked() { QueryRun queryRun; Table1 TableLoc; ; super(); queryRun = Table1_ds.queryRun(); TableLoc = queryRun.getNo(1); info(TableLoc.Field1); while (queryRun.next()) { TableLoc = queryRun.getNo(1); info(TableLoc.Field1); } } 
				__________________ Энергия молодых и неравнодушных способна изменить мир к лучшему. | 
|  | 
|  10.10.2008, 09:40 | #17 | 
| Administrator | 
			
			Да, но насколько я понимаю - данные хотя и будут отфильтрованы - но все равно (конечно в зависимости от фильтра) - их будет на порядок больше - чем визуально видно на экране - так?
		 
				__________________ Возможно сделать все. Вопрос времени | 
|  | 
|  10.10.2008, 09:49 | #18 | 
| Участник | 
			
			Не уловил. Почему их будет на экране меньше, чем после снятия QueryRun?
		 
				__________________ Энергия молодых и неравнодушных способна изменить мир к лучшему. | 
|  | 
|  10.10.2008, 15:01 | #19 | 
| Участник | 
			
			Красивое решение нашлось при помощи Views и двух строк кода   Всем спасибо! | 
|  |