Участник
Регистрация: 28.11.2005
Адрес: Москва
|
Цитата:
Сообщение от mazzy
следуя за российским кодом вы плохому учитесь.
Т.е. вместо того, чтобы делать по аналогии, скажем, с RLedgerSheetEngine_Turnover*, надо делать два идентичных класса и два идентичных Query на поставщиков/покупателей?.. Зачем же тогда те же Map'ы для таблиц придумали?.. Или учиться плохому - это именно использовать подстановки кодов полей, а использовать Map'ы - это нормально (видел кучу классов в SYS-слое, которые так делают)? Или же надо делать два идентичных Query и один класс, который выбирает их в зависимости от ситуации и обрабатывает через Map'ы CustVend*?..
Мне просто интересно: как обычно поступают в случае обработки данных по покупателям/поставщикам: ограничиваются только использованием Map CustVend*, а Query строят отдельно в AOT, или же позволяют себе параметрическое задание таблиц/полей для программно создаваемого Query вместо жесткого прописывания их в коде?
Цитата:
Я же написал:
Цитата:
В Query вы прицепили две таблицы к одной ведущей. Порядок обхода будет другим. См. Руководство разработчика. Раздел по ключевому слову "Sequencing of retrieved records".
Посмотрим, что написано в руководстве:
PHP код:
??????????????
?DataSource A?
??????????????
? ??????????????
????DataSource B?
? ??????????????
? ??????????????
????DataSource C?
??????????????
In an inner join, the records to be fetched in following sequence:
A1, B1, C1, A2, B2, C3..... An, Bn, Cn
In an exist join, the records to be fetched in following sequence:
A1, A2, A3, A4..... An
Из этого можно сделать вывод, что в моем случае, поскольку GatewayOrg* цепляется к VendTrans через NonExistsJoin, то записи VendTable и ExtCodeValueTable вообще не будут выбраны...
Впрочем, это натолкнуло на кое-какие мысли, в результате чего запрос-таки заработал, как надо Я просто прицепил GatewayOrgRef не к VendTrans, а к VendTable:
PHP код:
VendTrans
?ij?VendTable
?ij??ExtCodeValueTable
?nej?GatewayOrgRef
?ij?GatewayOrganization
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
|