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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.03.2014, 00:34   #1  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
? Некорректная работа notExists join
Всем привет!

Как такое может быть?
(Извиняюсь что много текста, просто показываю все варианты что я перепробовал).

X++:
static void Job69(Args _args)
{
    AM_SalesParmBatchSeq    parmseq, invSeq;
    AM_SalesBAtchSeq        salesSeq;

    InventTransid  _inventTransid = "LT01125843";
    ParmId         _parmId        = "01354429_sys";

    int cnt;
    ;

    ttsBegin;

    delete_from invSeq
        where invSeq.parmid         == _parmid;

    select count(recId) from salesSeq
        where salesSeq.InventTransId == _inventTransid
            && !salesSeq.InvoiceId
            notexists join parmseq
            where parmseq.InventTransId == salesSeq.InventTransId
            && parmseq.InventBatchId == salesSeq.InventBatchId
            && parmseq.sequenceNum  == salesSeq.sequenceNum
            && parmseq.ParmId   == _parmid;
            
    info(int2str(salesSeq.RecId)); // 184
    
    While select salesSeq
        where salesSeq.InventTransId == _inventTransid
            && !salesSeq.InvoiceId
            notexists join parmseq
            where parmseq.InventTransId == salesSeq.InventTransId
            && parmseq.InventBatchId == salesSeq.InventBatchId
            && parmseq.sequenceNum  == salesSeq.sequenceNum
            && parmseq.ParmId   == _parmid
    {
            cnt++;
    }

    info(int2str(cnt)); // 184
    cnt = 0;

    While select salesSeq
        order by InventBatchId, SequenceNumber // !!!
        where salesSeq.InventTransId == _inventTransid
            && !salesSeq.InvoiceId
            notexists join parmseq
            where parmseq.InventTransId == salesSeq.InventTransId
            && parmseq.InventBatchId == salesSeq.InventBatchId
            && parmseq.sequenceNum  == salesSeq.sequenceNum
            && parmseq.ParmId   == _parmid
    {
            invSeq.clear();
            invSeq.InventTransId  = _inventTransid;
            invSeq.InventBatchId  = salesseq.InventBatchId;
            invSeq.SequenceNumber = salesseq.SequenceNumber;
            invSeq.parmid         = _parmid;
            invSeq.insert();

            cnt++;
    }

    info(int2str(cnt)); // 184
    cnt = 0;
    
    delete_from invSeq
        where invSeq.parmid         == _parmid;
    
    While select salesSeq
        where salesSeq.InventTransId == _inventTransid
            && !salesSeq.InvoiceId
    {
        select firstonly parmseq
            where parmseq.InventTransId == salesSeq.InventTransId
            && parmseq.InventBatchId == salesSeq.InventBatchId
            && parmseq.sequenceNum  == salesSeq.sequenceNum
            && parmseq.ParmId   == _parmid;
            
        if (! parmSeq)
        {
            invSeq.clear();
            invSeq.InventTransId  = _inventTransid;
            invSeq.InventBatchId  = salesseq.InventBatchId;
            invSeq.SequenceNumber = salesseq.SequenceNumber;
            invSeq.parmid         = _parmid;
            invSeq.insert();

            cnt++;
        }
    }

    info(int2str(cnt)); // 184
    cnt = 0;

    delete_from invSeq
        where invSeq.parmid         == _parmid;

    While select salesSeq
        // order by InventBatchId, SequenceNumber // !!!
        where salesSeq.InventTransId == _inventTransid
            && !salesSeq.InvoiceId
            notexists join parmseq
            where parmseq.InventTransId == salesSeq.InventTransId
            && parmseq.InventBatchId == salesSeq.InventBatchId
            && parmseq.sequenceNum  == salesSeq.sequenceNum
            && parmseq.ParmId   == _parmid
    {
            invSeq.clear();
            invSeq.InventTransId  = _inventTransid;
            invSeq.InventBatchId  = salesseq.InventBatchId;
            invSeq.SequenceNumber = salesseq.SequenceNumber;
            invSeq.parmid         = _parmid;
            invSeq.insert();

            cnt++;
    }

    ttsAbort;

    info(int2str(cnt)); // 100 (или 70)
}
PHP код:
Message (11:22:17 pm)
184
184
184
184
100 
Т.е. последний цикл каким-то образом не хочет видеть ещё 84 записи.
Вероятно это как-то связано с SQL сервером, но у меня идеи закончились уже куда смотреть.
Может кто-то сталкивался?

DAX 2009 5.0.1500.1670
SQL Server 2008 10.50.2500

Уровень изоляции - как положено, read_committed_snapshot.

Причём, пока я не поигрался немного с индексом (а именно прописал а потом удалил кластерный индекс у AM_SalesParmBatchSeq таблицы в AOT) вместо 100 в последнем цикле выдавалось 70.

Пробовал воспроизвести на новых упрощённых таблицах - не получилось.

Спасибо!
__________________
Zhirenkov Vitaly
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX2009. Не используйте NotExists Wamr DAX: Программирование 7 16.09.2020 21:45
Вложенные Notexists Join в запросе McArrow DAX: Программирование 4 13.02.2014 12:53
addicted2ax: Dynamics AX 2012 & SQL Server 2008R2: Cross Join vs. Inner Join – Houston we have *NO* Problem Blog bot DAX Blogs 0 20.12.2012 20:11
Не работают 2 notexists join savel DAX: Программирование 13 23.07.2004 13:49
Некорректная работа сопоставления проводок Garic DAX: Функционал 5 23.04.2003 16:45
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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