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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.06.2007, 05:08   #1  
Михаил Петрович is offline
Михаил Петрович
Участник
 
20 / 10 (1) +
Регистрация: 21.03.2007
Продолжаем эпопею с фактурами dsExecuteMarkup() класса FactureEditLinesEngineVend_RU

В методе
X++:
public void dsExecuteMarkup()
{
    MarkupTrans      markupCursor = markupDS.cursor();
    VendInvoiceJour  tJour        = vendInvoiceJourDS.cursor();
    VendInvoiceTrans tTrans;

    super();

    select markupCursor
        where   markupCursor.CustVendPosted_RU                         &&
              ! markupCursor.ItemPosted_RU
    exists join tTrans
        where (
               markupCursor.TransTableId  == tTrans.TableId            &&
               markupCursor.TransRecId    == tTrans.RecId              &&
               tTrans.PurchID             == tJour.PurchId             &&
               tTrans.InvoiceId           == tJour.InvoiceId           &&
               tTrans.InvoiceDate         == tJour.InvoiceDate         &&
               tTrans.NumberSequenceGroup == tJour.NumberSequenceGroup &&
               tTrans.InternalInvoiceId   == tJour.InternalInvoiceId
              )
              ||
              (
               markupCursor.TransTableId  == tJour.TableId             &&
               markupCursor.TransRecId    == tJour.RecId
              );
}
Происходит "прогулка" по VendInvoiceTrans и estimated cost запроса становится буквально от 5000 до 58200 - пока большей "стоимости" sql мониторинг не выдавал.

Так вот теоретический вопрос:

Почему в подзапросе начинается проверка вида

X++:
       markupCursor.TransTableId  == tTrans.TableId            &&
               markupCursor.TransRecId    == tTrans.RecId   
           

               markupCursor.TransTableId  == tJour.TableId             &&
               markupCursor.TransRecId    == tJour.RecId
Особенно первая часть до "или"... Мы ж вроде как ищем данные в tTrans, а не наоборот...

То есть

X++:
        tTrans.TableId  == markupCursor.TransTableId            &&
                tTrans.RecId  == markupCursor.TransRecId
Или нет?..

А вот сам sql запрос

X++:
SELECT A.TRANSTABLEID,A.TRANSRECID,A.LINENUM,A.MARKUPCODE,
A.CURRENCYCODE,A.VALUE,A.TAXAMOUNT,A.POSTED,A.VOUCHER,
A.TRANSDATE,A.TXT,A.TAXGROUP,A.TAXITEMGROUP,A.MARKUPCATEGORY,
A.TAXAUTOGENERATED,A.TAXWRITECODE,A.MODULECATEGORY,A.ORIGRECID,
A.ORIGTABLEID,A.MODULETYPE,A.DEL_FULLYINVOICED,A.KEEP,
A.CALCULATEDAMOUNT,A.FACTUREDAMOUNT_RU,A.CUSTVENDPOSTED_RU,
A.ITEMPOSTED_RU,A.TAXVALUEVAT_RU,A.TAXAMOUNTVAT_RU,
A.TAXAMOUNTEXCISE_RU,A.TAXVATTYPE_RU,A.SOURCETABLEID,
A.SOURCERECID,A.MARKUPALLOCATEAFTER,A.INVENTTRANSID,A.RECID FROM MARKUPTRANS A WHERE ((A.DATAAREAID='ret') AND ((A.CUSTVENDPOSTED_RU<>0) AND ((A.ITEMPOSTED_RU=0)))) 

AND EXISTS (SELECT 'x' FROM VENDINVOICETRANS B WHERE 
((B.DATAAREAID='ret') AND (((((([COLOR="Red"]
((A.TRANSTABLEID=492) [/COLOR]A[COLOR="#ff0000"]ND
 (A.TRANSRECID=B.RECID[/COLOR])) AND (B.PURCHID='         ???00019730'))
 AND (B.INVOICEID='               15548')) AND 
(B.INVOICEDATE={ts '2005-10-02 00:00:00.000'})) AND 
(B.NUMBERSEQUENCEGROUP=' ')) AND
 (B.INTERNALINVOICEID='         ???00013750')) [COLOR="#ff0000"]OR ((A.TRANSTABLEID=491) AND (A.TRANSRECID=277411563))[/COLOR]))) 
ORDER BY A.DATAAREAID,A.TRANSRECID,A.TRANSTABLEID,A.LINENUM OPTION(FAST 1)
Если вынести эту проверку до exist join суть запроса ведь не поменяется?..

На предложение "возьми да и проверь" могу ответить лишь отказом ибо почему-то даже при известных данных без изменений этот запрос выдает пустую результирующую табличку...
Хотя подозреваю, что где-то что-то не так делаю :-)
Старый 15.06.2007, 15:18   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Михаил Петрович Посмотреть сообщение
Почему в подзапросе начинается проверка вида
X++:
               markupCursor.TransTableId  == tTrans.TableId            &&
               markupCursor.TransRecId    == tTrans.RecId   
           

               markupCursor.TransTableId  == tJour.TableId             &&
               markupCursor.TransRecId    == tJour.RecId
Особенно первая часть до "или"... Мы ж вроде как ищем данные в tTrans, а не наоборот...
Потому что в TSQL пишется
Код:
select  *
from    markupTrans      m
join    vendInvoiceTrans t
on      m.transTableId = t.tableId  and
        m.transRecId   = t.recId
т.е. в JoinCondition первым идет поле из "левой" таблицы.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Помогите с запросом Antonuch DAX: Программирование 4 21.06.2007 15:46
Помогите с запросом leshy DAX: Программирование 40 31.05.2007 14:51
Помогите с запросом.. DarkBear DAX: Программирование 2 15.08.2005 13:38
Помогите с SQL запросом malex DAX: Программирование 8 26.07.2005 13:43
Пожалуйста, помогите с запросом chel DAX: Программирование 19 12.07.2004 11:53

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

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

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