13.02.2007, 11:17 | #5 |
Участник
|
Т.е. вместо того, чтобы делать по аналогии, скажем, с RLedgerSheetEngine_Turnover*, надо делать два идентичных класса и два идентичных Query на поставщиков/покупателей?.. Зачем же тогда те же Map'ы для таблиц придумали?.. Или учиться плохому - это именно использовать подстановки кодов полей, а использовать Map'ы - это нормально (видел кучу классов в SYS-слое, которые так делают)? Или же надо делать два идентичных Query и один класс, который выбирает их в зависимости от ситуации и обрабатывает через Map'ы CustVend*?..
Мне просто интересно: как обычно поступают в случае обработки данных по покупателям/поставщикам: ограничиваются только использованием Map CustVend*, а Query строят отдельно в AOT, или же позволяют себе параметрическое задание таблиц/полей для программно создаваемого Query вместо жесткого прописывания их в коде? Цитата:
Я же написал:
Цитата:
В Query вы прицепили две таблицы к одной ведущей. Порядок обхода будет другим. См. Руководство разработчика. Раздел по ключевому слову "Sequencing of retrieved records".
PHP код:
Впрочем, это натолкнуло на кое-какие мысли, в результате чего запрос-таки заработал, как надо Я просто прицепил GatewayOrgRef не к VendTrans, а к VendTable: PHP код:
X++: static void testJoins(Args _args) { VendTrans vt; VendTable vtbl; ExtCodeValueTable extcvt; QueryRun qr; Query query = new Query(); QueryBuildDataSource qbds, qbdsT; ExtCodeId extCodeId; ; extCodeId = (select firstonly ExtCodeId from ExtCodeTable where ExtCodeTable.ExtCodeTableId == tablenum(VendTable)).extcodeId; info(strfmt(@"For table '%1' ExtCodeId = '%2'", tablestr(VendTable), extCodeId)); qbds = query.addDataSource(tablenum(VendTrans)); qbds.addSortField(fieldnum(VendTrans, AccountNum)); qbds.addSortField(fieldnum(VendTrans, TransDate)); qbdsT = qbds.addDataSource(tablenum(VendTable)); qbdsT.fetchMode(QueryFetchMode::One2One); qbdsT.relations(false); qbdsT.addLink(fieldnum(VendTrans, AccountNum), fieldnum(VendTable, AccountNum)); qbds = qbdsT.addDataSource(tablenum(ExtCodeValueTable)); qbds.fetchMode(QueryFetchMode::One2One); qbds.addLink(fieldnum(VendTable, RecId), fieldnum(ExtCodeValueTable, ExtCodeRelationRecId)); qbds.addRange(fieldnum(ExtCodeValueTable, ExtCodeRelationTableId)).value(queryValue(tablenum(VendTable))); qbds.addRange(fieldnum(ExtCodeValueTable, ExtCodeId)).value(extCodeId); // filter out intercompany contragents qbds = qbdsT.addDataSource(tablenum(GatewayOrgRef)); qbds.joinMode(JoinMode::NoExistsJoin); qbds.fetchMode(QueryFetchMode::One2One); qbds.addLink(fieldnum(VendTrans, AccountNum), fieldnum(GatewayOrgRef, RefId)); qbds.addRange(fieldnum(GatewayOrgRef, RefType)).value(queryValue(SysActionRefTypes::Vend)); qbds = qbds.addDataSource(tablenum(GatewayOrganization)); qbds.fetchMode(QueryFetchMode::One2One); qbds.addLink(fieldnum(GatewayOrgRef, GatewayOrgId), fieldnum(GatewayOrganization, GatewayOrgId)); qbds.addRange(fieldnum(GatewayOrganization, InterCompanyOrg)).value(queryValue(NoYes::Yes)); qbds.addRange(fieldnum(GatewayOrganization, Active)).value(queryValue(NoYes::Yes)); qr = new QueryRun(query); while(qr.next()) { vt = qr.get(tablenum(VendTrans)); vtbl = qr.get(tablenum(VendTable)); extcvt = qr.get(tablenum(ExtCodeValueTable)); info(strfmt(@"%1 %2 name='%3', extCode='%4' %5", vt.TransDate, vt.AccountNum, vtbl.Name, extcvt.ExtCodeValue, (vt.Invoice ? vt.Invoice : vt.Txt))); } } Последний раз редактировалось gl00mie; 13.02.2007 в 11:20. Причина: typo |
|
Теги |
ax3.0, шаблон |
|
Похожие темы | ||||
Тема | Ответов | |||
Двойной Outer Join в Query | 2 | |||
Как сдлеать join по одной таблице, а курсор по другой | 9 | |||
Join в Query | 2 | |||
Вопрос по query и join | 2 | |||
Join трех таблиц (две к одной) | 25 |
|