Показать сообщение отдельно
Старый 15.11.2005, 11:23   #17  
rkrivov is offline
rkrivov
Участник
Аватар для rkrivov
 
31 / 10 (1) +
Регистрация: 18.02.2005
Адрес: Москва
Angry Ну не работает эта з(а)раза
В общем так... вот код, который формирует запрос (он несколько изменился) :
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);
- все работает... т.е. ошибки нет, но и запрос отрабатывает не корректно.

Последний раз редактировалось rkrivov; 15.11.2005 в 12:01.