12.01.2009, 13:05 | #1 |
Участник
|
OZKA's DAX Journal: Join между временной и постоянной таблицей через QueryRun.
Источник: http://ozka-lemming.blogspot.com/200...-queryrun.html
============== Однажды, отлаживая нетривиальный код, наткнулся на subj. Не зная про эту «фичу», я долго удивлялся почему запрос возвращает такой странный набор данных!?! Ниже приведен простенький Job-ик, который демонстрирует существование этой возможности в DAX. В иерархии запроса временная таблица должна быть первым источником данных. X++: static void JoinTmpTablesOnQuery(Args _args) { LedgerTrans ledgerTrans; LedgerTable ledgerTableTmp; int i; int transCnt = 20; Query query = new Query(); QueryBuildDataSource qbdsTable = query.addDataSource(tableNum(LedgerTable)); QueryBuildDataSource qbds2Trans = qbdsTable.addDataSource(tableNum(LedgerTrans)); QueryRun queryRun; ; qbds2Trans.relations(true); ledgerTableTmp.setTmp(); ledgerTableTmp.data(LedgerTable::find("02.010")); ledgerTableTmp.insert(); ledgerTableTmp.data(LedgerTable::find("01.030")); ledgerTableTmp.insert(); queryRun = new QueryRun(query); queryRun.setCursor(ledgerTableTmp, 1); i = 0; while (queryRun.next()) { ledgerTableTmp = queryRun.getNo(1); ledgerTrans = queryRun.getNo(2); info(strfmt("AccountNum %1 , AmountCur %2 , (tmpRecId %3 , regRecId %4)", ledgerTableTmp.AccountNum, ledgerTrans.AmountCur, ledgerTableTmp.RecId, ledgerTrans.RecId)); i++; if (transCnt && i == transCnt) break; } } Источник: http://ozka-lemming.blogspot.com/200...-queryrun.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
14.01.2009, 15:28 | #2 |
Moderator
|
Lemming, а расскажите чуть подробнее и не так загадочно?
Что должно происходить? Я грешным делом подумал, что можно наконец-то полноценно связать временную таблицу с постоянной, т.е. фильтровать постоянную таблицу по временному набору. Но в выводимых результатах что-то этого не заметил... Спасибо. |
|
14.01.2009, 15:53 | #3 |
Участник
|
В приведенном джобике(если я конечно не сошел с ума ) запрос LedgerTable и LedgerTrans должен выводить проводки только по тем счетам, которые попали во временную таблицу LedgerTransTmp. (см. queryRun.setCursor(ledgerTableTmp, 1);
Job писал в DAX 4, но должно отработать и в 3-ке(в свое время увидел именно в ней). Или джоб так хитро отрабатывает только у меня? |
|
14.01.2009, 16:17 | #4 |
MCITP
|
Да нет, с queryRun.setCursor действительно работает.. На 3.0 тоже.
__________________
Zhirenkov Vitaly |
|
14.01.2009, 16:20 | #5 |
MCITP
|
__________________
Zhirenkov Vitaly |
|
14.01.2009, 16:27 | #6 |
Участник
|
Ну да, было дело, спрашивал, а вот то что их можно так хитро заджоинить, временную с постоянной через queryRun, я не знал
upd: Врочем так тоже можно, хотя это наверное многие знают. X++: ledgerTableTmp.data(LedgerTable::find("01.030")); ledgerTableTmp.insert(); while select ledgerTableTmp join ledgerTrans where ledgerTrans.AccountNum == ledgerTableTmp.AccountNum { info(ledgerTrans.AccountNum); } return; Последний раз редактировалось Lemming; 14.01.2009 в 16:32. |
|
14.01.2009, 16:33 | #7 |
Moderator
|
Цитата:
Получается, не у всех... У меня на 3.0, SP4, двухзвенка, Oracle 10g - НЕ РАБОТАЕТ, вылезает унылое декартово произведение. |
|
14.01.2009, 16:43 | #8 |
Участник
|
Цитата:
X++: while select ledgerTrans join ledgerTableTmp where ledgerTableTmp.AccountNum == ledgerTrans.AccountNum { info(ledgerTransTmp.AccountNum); } return; |
|
14.01.2009, 16:58 | #9 |
MCITP
|
Цитата:
Цитата:
Или что вы тут хотели сказать?
__________________
Zhirenkov Vitaly |
|
14.01.2009, 17:01 | #10 |
MCITP
|
Цитата:
Сообщение от Lemming
А вот временную с постоянной, когда постоянная идет "вверху" запроса
X++: while select ledgerTrans join ledgerTableTmp where ledgerTableTmp.AccountNum == ledgerTrans.AccountNum { info(ledgerTransTmp.AccountNum); } return;
__________________
Zhirenkov Vitaly |
|
14.01.2009, 17:11 | #11 |
Участник
|
У меня отработало аналогично джобу из оригинального поста. В общем, в любом раскладе, судя по такой неустойчивости к версиям и СУБД, лучше не забавляться с такими связками в реальных проектах.
|
|
14.01.2009, 17:24 | #12 |
MCITP
|
Цитата:
Ещё прикол: X++: i = 0; while select ledgerTableTmp join ledgerTrans where ledgerTrans.AccountNum == ledgerTableTmp.AccountNum { info('1:' + ledgerTrans.AccountNum); i++; if (transCnt && i == transCnt) break; } i = 0; while select ledgerTrans join ledgerTableTmp where ledgerTrans.AccountNum == ledgerTableTmp.AccountNum { info('2:' + ledgerTrans.AccountNum); i++; if (transCnt && i == transCnt) break; } i = 0; while select ledgerTableTmp join ledgerTrans where ledgerTrans.AccountNum == ledgerTableTmp.AccountNum { info('3:' + ledgerTrans.AccountNum); i++; if (transCnt && i == transCnt) break; } При этом 1 посылает к СУБД запрос (гы ) следующего вида: PHP код:
2 - делает нормальное декартово произведение 3 - не выполняется вообще (ни запроса, ни инфо)! (именно после выполнения 2, т.к. 1 - выполняется) 15 мин. голову ломал... бред какой-то...
__________________
Zhirenkov Vitaly |
|
14.01.2009, 17:34 | #13 |
Участник
|
Опа, точно! Я тоже наткнулся на подобное - вроде только что работало, а тут бамс и перестало. Переключил еще раз компанию, в которой у меня правильные для теста счета были(хотя в ней и был), отработало. Судя по всему, жутко неустойчивая фича.
|
|