Продолжаем эпопею с фактурами 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 суть запроса ведь не поменяется?..
На предложение "возьми да и проверь" могу ответить лишь отказом ибо почему-то даже при известных данных без изменений этот запрос выдает пустую результирующую табличку...
Хотя подозреваю, что где-то что-то не так делаю :-)