В общем так... вот код, который формирует запрос (он несколько изменился) :
X++:
q = new Query();
qbds_lb = q.addDataSource(tableNum(LedgerBalancesDimTrans));
qbds_lbbuf = qbds_lb.addDataSource(tableNum(LedgerBalancesDimTrans));
qbds_lbbuf.relations( false );
qbds_lbbuf.joinMode(JoinMode::NoExistsJoin);
qbds_lb.orderMode(OrderMode::GroupBy);
qbds_lb.addSortField(fieldId);
qbr = qbds_lb.addRange(fieldNum(LedgerBalancesDimTrans, TransDate));
qbr.value(SysQuery::range(DateNull(), dateEndMth(ledgerJournalDistribTable.Period)));
qbr = qbds_lbbuf.addRange(fieldNum(LedgerBalancesDimTrans, TransDate));
qbr.value(SysQuery::range(DateNull(), dateEndMth(ledgerJournalDistribTable.Period)));
if (LedgerDistribByAlg.OffsetAccountNum)
{
qbr = qbds_lb.addRange(fieldNum(LedgerBalancesDimTrans, AccountNum));
qbr.value(SysQuery::value(LedgerDistribByAlg.OffsetAccountNum));
qbr = qbds_lbbuf.addRange(fieldNum(LedgerBalancesDimTrans, AccountNum));
qbr.value(SysQuery::value(LedgerDistribByAlg.OffsetAccountNum));
}
if (LedgerDistribByAlg.BaseAccountNum)
{
qbr = qbds_lb.addRange(fieldNum(LedgerBalancesDimTrans, AccountNum));
qbr.value(SysQuery::value(LedgerDistribByAlg.BaseAccountNum));
qbr = qbds_lbbuf.addRange(fieldNum(LedgerBalancesDimTrans, AccountNum));
qbr.value(SysQuery::value(LedgerDistribByAlg.BaseAccountNum));
}
switch (_dimensionNumber)
{
case 1:
if (ledgerDistribByAlg.DimLedgerDistribByAlg[1])
{
qbr = qbds_lb.addRange(fieldName2Id(tableNum(LedgerBalancesDimTrans), "dimension[1]"));
qbr.value(ledgerDistribByAlg.DimLedgerDistribByAlg[1]);
qbr = qbds_lbbuf.addRange(fieldName2Id(tableNum(LedgerBalancesDimTrans), "dimension[1]"));
qbr.value(ledgerDistribByAlg.DimLedgerDistribByAlg[1]);
}
break;
case 2:
if (ledgerDistribByAlg.DimLedgerDistribByAlg[2])
{
qbr = qbds_lb.addRange(fieldName2Id(tableNum(LedgerBalancesDimTrans), "dimension[2]"));
qbr.value(ledgerDistribByAlg.DimLedgerDistribByAlg[2]);
qbr = qbds_lbbuf.addRange(fieldName2Id(tableNum(LedgerBalancesDimTrans), "dimension[2]"));
qbr.value(ledgerDistribByAlg.DimLedgerDistribByAlg[2]);
}
break;
case 5:
if (ledgerDistribByAlg.DimLedgerDistribByAlg[3])
{
qbr = qbds_lb.addRange(fieldName2Id(tableNum(LedgerBalancesDimTrans), "dimension[5]"));
qbr.value(ledgerDistribByAlg.DimLedgerDistribByAlg[3]);
qbr = qbds_lbbuf.addRange(fieldName2Id(tableNum(LedgerBalancesDimTrans), "dimension[5]"));
qbr.value(ledgerDistribByAlg.DimLedgerDistribByAlg[3]);
}
break;
}
ds1 = strfmt("%1.%2", qbds_lb.name(), fieldName);
ds2 = strfmt("%1.%2", qbds_lbbuf.name(), fieldName);
queryExression = strfmt("((NOT(%2 = %1)) AND ((%2 = %1) OR (NOT(%1 = ''))))", ds1, ds2 );
qbr = qbds_lbbuf.addRange(fieldId);
qbr.value(queryExression);
qR = new QueryRun(q);
// qR.reset();
while (qR.next())
{
lb = qR.getNo(1);
// . . .
// Something to do
// . . .
}
Вот полученый запрос:
Код:
SELECT * FROM LedgerBalancesDimTrans
GROUP BY LedgerBalancesDimTrans.Dimension[5] ASC
WHERE ((TransDate<=30.11.2005)) AND
((AccountNum = 25.0200) OR (AccountNum = 20.0100))
NOTEXISTS JOIN *
FROM LedgerBalancesDimTrans
WHERE ((TransDate<=30.11.2005)) AND
((AccountNum = 25.0200) OR (AccountNum = 20.0100)) AND
((((NOT(LedgerBalancesDimTrans_1_1.dimension[5] = LedgerBalancesDimTrans_1.dimension[5])) AND
((LedgerBalancesDimTrans_1_1.dimension[5] = LedgerBalancesDimTrans_1.dimension[5]) OR
(NOT(LedgerBalancesDimTrans_1.dimension[5] = ''))))))
И при этом не работает. получаю сообщения а-ля
Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 0.
Попробовал практически все варинаты... так и не работает... Как это Аксапта парсит такие запросы.... или это вообще сделать не реально? (тогда нужно действовать напрямую)
Если убрать строки
X++:
qbr = qbds_lbbuf.addRange(fieldId);
qbr.value(queryExression);
- все работает... т.е. ошибки нет, но и запрос отрабатывает не корректно.