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 и двух строк кода
Всем спасибо! |
|