|
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 - НЕ РАБОТАЕТ, вылезает унылое декартово произведение. |
|