Показать сообщение отдельно
Старый 14.06.2007, 05:08   #12  
Михаил Петрович 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 суть запроса ведь не поменяется?..

На предложение "возьми да и проверь" могу ответить лишь отказом ибо почему-то даже при известных данных без изменений этот запрос выдает пустую результирующую табличку...
Хотя подозреваю, что где-то что-то не так делаю :-)