AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.06.2010, 09:34   #1  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Создание запроса программно
Задача определить корреспонденцию балансовых с забалансовыми счетами.
В плане счетов ввела галки Балансовый/Забалансовый.
Идею условие с чем может корреспондировать на плане счетов не предлагать, по некоторым причинам не подходит.

Пишу код

X++:
    Query qryLTbl1;
    QueryRun qrunLTbl1;
    QueryBuildDataSource qbdsLTbl1;
    QueryBuildRange qbrOutBalance1;
    LedgerTable _LTbl1Q;

    QueryBuildDataSource qbdsLT1;
    QueryBuildRange qbrPeriod1;
    QueryBuildRange qbrPeriodType1;
    QueryBuildRange qbrType1;
    QueryBuildRange qbrAccountNum1;
    QueryBuildRange qbrD_C;
    QueryBuildRange qbrBalanceC1;
    LedgerTrans _LTQ1;

    QueryBuildDataSource qbdsLT2;
    LedgerTrans _LTQ2;
    QueryBuildRange qbrD_C2;

    QueryBuildDataSource qbdsLTbl2;
    QueryBuildRange qbrOutBalance2;
    LedgerTable _LTbl2Q;

    str 254 _periodLT;
    str 254 _periodCode;

   qryLTbl1  = new Query();
        qbdsLTbl1 = qryLTbl1.addDataSource(tablenum(LedgerTable),'lbdt2');
        qbrOutBalance1 =  qbdsLTbl1.addRange(fieldnum(LedgerTable,OutBalance));
        qbrOutBalance1.value(enum2str(NoYes::Yes));

        qbdsLT1 = qbdsLTbl1.addDataSource(tablenum(LedgerTrans),'lbdt20');
        qbdsLT1.fetchMode(JoinMode::INNERJOIN);
        qbdsLT1.relations(true);
        qbdsLT1.addLink(fieldnum(LedgerTrans, accountNum), fieldnum(LedgerTable, accountNum));
        qbrPeriod1 =  qbdsLT1.addRange(fieldnum(LedgerTrans,TransDate));
        _periodLT = Date2str(fromdate,12,2,2,2,2,2)+'..'+Date2str(todate,12,2,2,2,2,2);
        qbrPeriod1.value(_periodLT);
        qbrPeriodType1 =  qbdsLT1.addRange(fieldnum(LedgerTrans,PeriodCode));
        qbrPeriodType1.value(enum2str(PeriodCode::Regular));
        qbrD_C =  qbdsLT1.addRange(fieldnum(LedgerTrans,Crediting));
        qbrD_C.value(enum2str(NoYes::No));

        qbdsLT2 = qbdsLT1.addDataSource(tablenum(LedgerTrans),'lbdt21');
        qbdsLT2.fetchMode(JoinMode::INNERJOIN);
        qbdsLT2.relations(false);
        qbdsLT2.addLink(fieldnum(LedgerTrans, accountNum), fieldnum(LedgerTrans, accountNum));
        qbdsLT2.addLink(fieldnum(LedgerTrans, BondBatch_RU), fieldnum(LedgerTrans, BondBatch_RU));
        qbdsLT2.addLink(fieldnum(LedgerTrans, BondBatchTrans_RU), fieldnum(LedgerTrans, BondBatchTrans_RU));

        qbrD_C2 =  qbdsLT2.addRange(fieldnum(LedgerTrans,Crediting));
        qbrD_C2.value(enum2str(NoYes::Yes));
        qbdsLTbl2 = qbdsLT2.addDataSource(tablenum(LedgerTable),'lbdt211');
        qbrOutBalance2 =  qbdsLTbl2.addRange(fieldnum(LedgerTable,OutBalance));
        qbrOutBalance2.value(enum2str(NoYes::No));
        qbdsLTbl2.fetchMode(JoinMode::INNERJOIN);
        qbdsLTbl2.addLink(fieldnum(LedgerTrans, accountNum), fieldnum(LedgerTable, accountNum));

        qrunLTbl1 = new QueryRun(qryLTbl1);
        while (qrunLTbl1.next())
        {
        info ('11');
        }
Не работает.

Итоговый запрос выглядит так
SELECT * FROM LedgerTable

WHERE ((OutBalance = Да))

JOIN * FROM LedgerTrans WHERE LedgerTable.AccountNum = LedgerTrans.AccountNum AND LedgerTable.AccountNum = LedgerTrans.AccountNum
AND ((TransDate>=01.05.10 AND TransDate<=30.06.10)) AND ((PeriodCode = Обычный))
AND ((Crediting = Нет))


JOIN * FROM LedgerTrans WHERE LedgerTrans.AccountNum = LedgerTrans.AccountNum AND LedgerTrans.BondBatch_RU = LedgerTrans.BondBatch_RU
AND LedgerTrans.BondBatchTrans_RU = LedgerTrans.BondBatchTrans_RU
AND ((Crediting = Да))

JOIN * FROM LedgerTable
WHERE LedgerTrans.AccountNum = LedgerTable.AccountNum
AND ((OutBalance = Нет))
Старый 05.06.2010, 10:21   #2  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Вроде бы логика запроса понятна. Данные удовлетворяющие этому запросу имеются? Попробуйте сначала переписать его на обычном select. Несколько замечаний к построению запроса:
Цитата:
Сообщение от Arahnid Посмотреть сообщение
X++:
        qbrOutBalance1.value(enum2str(NoYes::Yes));
вместо enum2str используйте queryValue

Цитата:
Сообщение от Arahnid Посмотреть сообщение
X++:
qbdsLT1.fetchMode(JoinMode::INNERJOIN);
здесь нужно не fetchMode, а joinMode

Цитата:
Сообщение от Arahnid Посмотреть сообщение
X++:
qbdsLT1.relations(true);
qbdsLT1.addLink(fieldnum(LedgerTrans, accountNum), fieldnum(LedgerTable, accountNum));
Если включили relations(true), то link задавать не нужно.

Цитата:
Сообщение от Arahnid Посмотреть сообщение
X++:
        qbrPeriod1 =  qbdsLT1.addRange(fieldnum(LedgerTrans,TransDate));
        _periodLT = Date2str(fromdate,12,2,2,2,2,2)+'..'+Date2str(todate,12,2,2,2,2,2);
        qbrPeriod1.value(_periodLT);
Используйте qbrPeriod1.value(SysQuery::range(fromdate, todate));
За это сообщение автора поблагодарили: RVS (1).
Старый 05.06.2010, 19:20   #3  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Тут проблема в том, что таблицы одинаковые. Данные точно есть.

X++:
        _LTbl1 = null;
        _LT2 = null;
        _LT1 = null;
        _LTbl2 = null;

        while select _LTbl1
        join _LT1
        join _LT2
        join _LTbl2
        where 
        _LT1.AccountNum == _LTbl1.AccountNum &&
        _LTbl1.OutBalance == NoYes::Yes &&
        _LT1.PeriodCode == PeriodCode::Regular &&

        _LT2.BondBatchTrans_RU == _LT1.BondBatchTrans_RU &&
        _LT2.BondBatch_RU == _LT1.BondBatch_RU &&
        _LT2.RecId != _LT1.RecId &&
        
        _LTbl2.OutBalance == NoYes::No &&
        _LT2.AccountNum == _LTbl2.AccountNum
        {
            info (_LT2.Voucher);
        }
работает

Последний раз редактировалось Arahnid; 05.06.2010 в 19:45.
Старый 07.06.2010, 13:01   #4  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
А нужен ли линк по полю AccountNum ?
X++:
        qbdsLT2.addLink(fieldnum(LedgerTrans, accountNum), fieldnum(LedgerTrans, accountNum));

Цитата:
Сообщение от Arahnid Посмотреть сообщение
Итоговый запрос выглядит так
SELECT * FROM LedgerTable

WHERE ((OutBalance = Да))

JOIN * FROM LedgerTrans WHERE LedgerTable.AccountNum = LedgerTrans.AccountNum AND LedgerTable.AccountNum = LedgerTrans.AccountNum
AND ((TransDate>=01.05.10 AND TransDate<=30.06.10)) AND ((PeriodCode = Обычный))
AND ((Crediting = Нет))


JOIN * FROM LedgerTrans WHERE LedgerTrans.AccountNum = LedgerTrans.AccountNum AND LedgerTrans.BondBatch_RU = LedgerTrans.BondBatch_RU
AND LedgerTrans.BondBatchTrans_RU = LedgerTrans.BondBatchTrans_RU
AND ((Crediting = Да))

JOIN * FROM LedgerTable
WHERE LedgerTrans.AccountNum = LedgerTable.AccountNum
AND ((OutBalance = Нет))
P.S. В while select, который Вы привели этого условия нет
__________________
Sergey Nefedov
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Создание запроса куба с двумя одинаковыми таблицами. Gait DAX: Программирование 4 17.09.2008 14:19
Использование формы в качестве диалога vs создание диалога программно Lucky13 DAX: Программирование 3 30.05.2008 13:09
Теория: Создание отчета в виде Запроса Arahnid DAX: Программирование 6 14.11.2007 16:37
Создание нового запроса на основе старого matew DAX: Программирование 1 23.07.2007 13:52
создание закупки программно z_av DAX: Программирование 4 11.04.2003 12:46

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 11:12.